[已答复] 有关Stixels estimation的问题。附道路提取代码。

[复制链接]
荒草 发表于 2014-5-23 18:27:27
本帖最后由 荒草 于 2014-5-23 18:30 编辑

楼主最近在看《Stixels estimation without depth map computation》这篇论文。对于其中2.2节的Ground plane estimation一直没看懂,有哪位大神能帮忙看看么?顺便解释一下。我的理解是: 假如图片的大小为m×n, 视差范围为d: 0~15. 那么Cost Volume应该是m×n×16的三维矩阵。论文里讲到通过计算v-disparity来estimate ground plane。按照我对之前对v-disparity的理解的话,对于视差范围为0~15,就应该会求出16个v-disparity啊?这怎么来估计ground plane啊?与我之前实现的根据视差图来求v-disparity,进而估计ground plane不同啊。一直比较困惑。顺便共享一个由视差图来计算V-disparity图,进而计算ground plane的程序吧。主程序:其中d为已经计算好的视差图。
  1. maxdisp = double(max(max(d)));
  2. thr = 5;
  3. [vdisp, udisp] = u_v_disparity(d, thr);
  4. threshold = 1;
  5. [floorline, startPoint, endPoint, lines] = detectLine(vdisp, threshold);
  6. for j = 1: size(floorline,2)
  7.     for i = 1: size(d, 2)
  8.         if abs(d(floorline(2,j),i) - floorline(1,j)) < 3
  9.             d(floorline(2,j),i) = 0;
  10.         end
  11.     end
  12. end
  13. figure,imshow(cat(3,d,d,d)*5);
  14. %%
  15. max_val = max(max(d));
  16. sum_total = zeros(max_val, 1);
  17. for i = 1: size(d,1)
  18.     for j = 1: size(d,2)
  19.         if d(i,j) ~= 0
  20.             sum_total(d(i,j)) = sum_total(d(i,j)) + 1;
  21.         end
  22.     end
  23. end
  24. %%
  25. range = find(sum_total > 500);
  26. %%
  27. result1 = img_left;
  28. result2 = img_left;
  29. result3 = img_left;
  30. % SE = strel('disk', 1);
  31. for i = 1: length(range)
  32.     D = d;
  33.     mark_idx = d == range(i);
  34.     D(~mark_idx) = 0;
  35. %     D = imopen(D, SE);
  36.     CC = bwconncomp(D);
  37.     STATS = regionprops(CC, 'BoundingBox', 'Area', 'PixelIdxList');
  38.     for j = 1: length(STATS)
  39.         if STATS(j).BoundingBox(4) > 9 && STATS(j).Area > 100
  40. %             rectangle('Position', STATS(j).BoundingBox,...
  41. %                 'EdgeColor', 'r',...
  42. %                 'LineWidth', 2);
  43.             result1(STATS(j).PixelIdxList) = 255;
  44.             result2(STATS(j).PixelIdxList) = 0;
  45.             result3(STATS(j).PixelIdxList) = 0;
  46.         end
  47.     end
  48. end
  49. result = cat(3, result1, result2, result3);
  50. figure,imshow(result);
复制代码
求V-disparity的程序:
  1. function [vdisp, udisp] = u_v_disparity(disp, threshold)
  2. maxdisp = max(max(disp));

  3. vdisp = zeros(size(disp,1), maxdisp+1);
  4. udisp = zeros(maxdisp+1, size(disp,2));

  5. for i = 1: size(disp,2)
  6.     for j = 1: size(disp,1)
  7.         if disp(j,i) > threshold
  8.             vdisp(j,disp(j,i)) = vdisp(j,disp(j,i)) + 1;
  9.             udisp(disp(j,i),i) = udisp(disp(j,i),i) + 1;
  10.         end
  11.     end
  12. end

  13. end
复制代码
检测直线的程序(这里偷了懒,直接用hough变换检测,用RANSAC检测,鲁棒性更好些):
  1. function [floorline, startPoint, endPoint, lines] = detectLine(vdisp, threhold)
  2. vdisp(vdisp < threhold ) = 0;
  3. vdisp = uint8(vdisp);
  4. level = graythresh(vdisp);
  5. v_BW = im2bw(vdisp, level);
  6. [H,T,R] = hough(v_BW);
  7. P  = houghpeaks(H, 1, 'threshold',ceil(0.1*max(H(:))));
  8. % Find lines
  9. lines = houghlines(v_BW, T, R, P, 'FillGap', 5500, 'MinLength', 30);
  10. startPoint = lines.point1;
  11. endPoint = lines.point2;
  12. line_param = cross([startPoint 1], [endPoint, 1]);
  13. line_param = line_param/line_param(2);
  14. % points = lineToBorderPoints(line_param, size(vdisp));
  15. % startPoint = [points(1) points(2)];
  16. % endPoint = [points(3) points(4)];
  17. length = endPoint(2) - startPoint(2);
  18. x = linspace(startPoint(1), endPoint(1), length);
  19. y = -line_param(3) - line_param(1)*x;
  20. floorline(1,:) = floor(x);
  21. floorline(2,:) = floor(y);

  22. % for k = 1:length(lines)
  23. %     xy = [lines(k).point1; lines(k).point2];
  24. %     plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
  25. %     
  26. %     % Plot beginnings and ends of lines
  27. %     plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
  28. %     plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
  29. % end

  30. end
复制代码
这是运行结果:
左右两幅图像:


视差图:


V-disparity以及直线检测,直线对应的就是路面



提取出的路面:

障碍物检测:

其中左右两幅图像以及视差图的计算来源于The KITTI Vision Benchmark Suite




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

11 条回复


laoqiuge 发表于 2014-12-13 15:54:55
您好,我最近一直在学习关于v-视差法检测障碍的一些知识,但在构建v-视差图的时候卡住了,因为我不是计算机专业科班出身,在基本能理解算法的基础上编出好的代码着实比较吃力,况且现在也没有非常好的学习资料,想请您能把完整的v-视差图构建以及u-v视差的源代码发我一份吗?看上面的主程序是缺乏这方面的函数定义的,谢谢!

laoqiuge 发表于 2014-12-13 16:06:25
不好意思看漏了,里面有u_v_disparity函数定义:L

荒草 发表于 2014-12-14 19:55:15
laoqiuge 发表于 2014-12-13 16:06
不好意思看漏了,里面有u_v_disparity函数定义

这个V视差图计算其实还是蛮简单的,主要是其中直线的检测,对于某些复杂的场景,有些困难

laoqiuge 发表于 2014-12-15 10:52:38
我运行程序出现如下错误:
Reference to non-existent field 'point1'.

Error in detectLine (line 10)
startPoint = lines.point1;

Error in main (line 6)
[floorline, startPoint, endPoint, lines] = detectLine(vdisp, threshold);

荒草 发表于 2014-12-16 01:21:38
laoqiuge 发表于 2014-12-15 10:52
我运行程序出现如下错误:
Reference to non-existent field 'point1'.

仔细查查原因啊。这个大概是没有检测到直线呗。没有检测到直线咋办?想办法检测出直线来。至于怎么想办法,就看你的了。

laoqiuge 发表于 2014-12-16 20:33:30
请问大哥,主程序里的“img_left”是关于左图像的校正参数矩阵吗,我运行程序是找不到指定文件的?

荒草 发表于 2014-12-16 21:21:14
本帖最后由 荒草 于 2014-12-16 21:22 编辑
laoqiuge 发表于 2014-12-16 20:33
请问大哥,主程序里的“img_left”是关于左图像的校正参数矩阵吗,我运行程序是找不到指定文件的? ...

img_left就是左图像啊。这里的左图像是灰度图。我那样写三个result主要是为了用红色来标注障碍物的,参考最后一个结果图

laoqiuge 发表于 2014-12-17 19:44:06
荒草 发表于 2014-12-16 21:21
img_left就是左图像啊。这里的左图像是灰度图。我那样写三个result主要是为了用红色来标注障碍物的,参考 ...

我试了一张图像,可是出现新的错误了,我改了后又出现问题,你能不能把源代码程序包发我一份,里面附加你的试验用图最好,邮箱:2379949446@qq.com.谢谢了~

荒草 发表于 2014-12-18 00:48:00
laoqiuge 发表于 2014-12-17 19:44
我试了一张图像,可是出现新的错误了,我改了后又出现问题,你能不能把源代码程序包发我一份,里面附加你 ...

其中左右两幅图像以及视差图的计算来源于The KITTI Vision Benchmark Suite。去这里下载吧。

jinpeifei 发表于 2015-1-15 16:39:37
楼主您好,我也在看《Stixels estimation without depth map computation》这篇论文,但是没有找到代码,请问您可以发一份给我吗?
非常感谢.
我的邮箱是jinpeifei@163.com

荒草 发表于 2015-1-16 00:13:40
jinpeifei 发表于 2015-1-15 16:39
楼主您好,我也在看《Stixels estimation without depth map computation》这篇论文,但是没有找到代码,请 ...

没有。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表