【项目实战】利用U-V视差进行地面检测

前段时间写了一篇关于U-V视差理论的博客(双目视觉(六)U-V视差),这里主要讲讲U-V视差如何用在实践中。

1.U-V视差中的信息

首先,我们来看看在U-V视差中可以提取到的信息:

  • U视差图:
  1. U视差图是对视差图像的U列进行统计,相当于垂直投影图像,有点类似于鸟瞰图。
  2. U视差图可以看作是视差图的俯视图,可以从中得到障碍物的位置信息。
  3. U视差图中主要由横线、斜线组成。
  4. 障碍物在图中表现为横线,当横线的倾斜角θ较小时,横线的长短代表障碍物的横向尺寸,横线越在图像的下方,视差越大,离相机越近,横线的列座标位置表明障碍物在图像中左右的位置
  • V视差图:
  1. V视差图是对视差图像的V行进行统计,相当于水平投影图像
  2. V视差图可以看作是视差图的侧视图,也可以从中得到障碍物的位置信息。
  3. V视差图中主要由竖线、斜线组成。
  4. 障碍物在图中表现为竖线,当横线的倾斜角θ较小时,竖线的长短代表障碍物的纵向尺寸,竖线越在图像的右方,视差越大,离相机越近,竖线的行座标位置表明障碍物在图像中上下的位置
  5. 地面在图中的表现为斜线,地面的障碍物(竖线)与斜线有一个交点,这个交点的行座标可以转化为原图中障碍物与低迷那平行的行座标。

根据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

https://docs.opencv.org/3.4.7/df/d4c/classcv_1_1ximgproc_1_1FastLineDetector.html#a10d3ce6ef6bce92818d1f919e2b2aa57

霍夫变换直线检测(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

https://www.doc88.com/p-7778764892199.html

https://stackoverrun.com/cn/q/5215019

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章