前段时间写了一篇关于U-V视差理论的博客(双目视觉(六)U-V视差),这里主要讲讲U-V视差如何用在实践中。
1.U-V视差中的信息
首先,我们来看看在U-V视差中可以提取到的信息:
- U视差图:
- U视差图是对视差图像的U列进行统计,相当于垂直投影图像,有点类似于鸟瞰图。
- U视差图可以看作是视差图的俯视图,可以从中得到障碍物的位置信息。
- U视差图中主要由横线、斜线组成。
- 障碍物在图中表现为横线,当横线的倾斜角θ较小时,横线的长短代表障碍物的横向尺寸,横线越在图像的下方,视差越大,离相机越近,横线的列座标位置表明障碍物在图像中左右的位置。
- V视差图:
- V视差图是对视差图像的V行进行统计,相当于水平投影图像。
- V视差图可以看作是视差图的侧视图,也可以从中得到障碍物的位置信息。
- V视差图中主要由竖线、斜线组成。
- 障碍物在图中表现为竖线,当横线的倾斜角θ较小时,竖线的长短代表障碍物的纵向尺寸,竖线越在图像的右方,视差越大,离相机越近,竖线的行座标位置表明障碍物在图像中上下的位置。
- 地面在图中的表现为斜线,地面的障碍物(竖线)与斜线有一个交点,这个交点的行座标可以转化为原图中障碍物与低迷那平行的行座标。
根据V视差中的斜线,可以检测到原图像中的地面,根据U视差中的横线或者V视差中的竖线,可以找到原图中的障碍物的位置。
这里我们主要来看看如何实现可行驶区域的检测。
2.具体实现:
1.视差估计
对于视差的估计这里我使用的opencv中自带的SGBM方法,如果有更好的视差估计方法你也可以将这部分替换。
2.V视差的估计
V视差的估计通过对原视差图像进行水平投影而得到,统计原视差图中每行不同视差的数量。
3.地平面线的检测
有了V视差图,我们就可以提取V视差中的信息了,我们知道,原视差中的地面映射为了V视差中的斜线,那么我们就需要将这条斜线检测出来。
-
阈值滤除
进行阈值滤除主要滤除一些统计信息较低的点,因为一般地面或者障碍在V视差中的统计量都是比较多的。
-
LSD直线检测
直线检测的方法有很多,比如经典的霍夫变换,霍夫变换的变种,直线拟合等等,这里主要因为实效性,采用了LSD直线检测。
-
直线分类与合并
从上图可以看出,检测出来的直线有倾斜的,也有垂直的,我们检测的地面映射为倾斜的直线,障碍物映射为近乎垂直的线。
通过LSD检测出来的直线只要包含四个参数:线段的两个短点的x,y座标,我们根据两端点的y座标的差值,可以初略将直线分组。然后将斜线的这组线段进行合并,合并为一条直线。合并完后的直线可能不只一条,我们选择权重高的作为我们的最终直线。
-
直线的参数计算
通过我们合并得到的直线,我们可以计算直线的参数:斜率和偏移量。
-
直线的交点
为什么要统计每列和直线的交点呢?这里的交点是障碍物与地面的临界点,也就是我们原视差图地面的边界点的映射,这也是为了后续生成地面的mask做准备。
4.初始化地面的mask
刚才我们得到了V视差中,每列和地面斜线的交点,根据这个交点,我们可以得到初始的地面的mask。
5. RANSAC平面拟合
得到了地面的初始的mask,这个是不能直接应用的,因为里面含有一些噪点,这里我们采用RANSAC方法来估计平面参数。
一般RANSAC方法主要包括如下几个步骤:
- 初始的样本,这里需要保证正样本的数量大于负样本的。
- 随机采样。
- 参数估计。
- 计算内点。
- 判断内点数量。
6.提纯拟合平面
从上面可以看出,拟合出来后的平面还是包含有一些小的噪声块,但是我们需要的平面其实占据的大量的面积,可以通过寻找轮廓,然后找出最大的面积块。
7.显示
参考:
LSD:一种直线检测算法简介:https://blog.csdn.net/carson2005/article/details/9326847
霍夫变换直线检测(Line Detection)原理及示例:https://blog.csdn.net/leonardohaig/article/details/87907462
形状识别之直线检测:https://blog.csdn.net/liujiabin076/article/details/74917605
基于线条特征的机场检测算法——LSD直线检测算法、平行线组提取和聚类:https://blog.csdn.net/weixin_42647783/article/details/83352454
OpenCV基础——threshold函数的使用:https://blog.csdn.net/u012566751/article/details/77046445
数学形态学运算——腐蚀、膨胀、开运算、闭运算:https://blog.csdn.net/chaolei3/article/details/79618602
https://www.doc88.com/p-7196258438237.html
https://blog.csdn.net/leonardohaig/article/details/88240112
https://blog.csdn.net/qq_23880193/article/details/49669297
https://blog.csdn.net/jidushanzhu/article/details/68924719#commentBox
https://github.com/1zlab/1ZLAB_OpenCV_Laser_Cross
https://www.doc88.com/p-1486694512614.html