系列文章:
- 双目视觉(一)双目视觉系统
- 双目视觉(二)双目匹配的困难和评判标准
- 双目视觉(三)立体匹配算法
- 双目视觉(四)匹配代价
- 双目视觉(五)立体匹配算法之动态规划全局匹配
- 双目视觉(六)U-V视差
- 【项目实战】利用U-V视差进行地面检测
- 【项目实践】U-V视差路面检测之动态规划
前段时间写了一篇关于U-V视差理论的博客(双目视觉(六)U-V视差),这里主要讲讲U-V视差如何用在实践中。
目前代码还存在一些问题,上传代码与大家共享,如果有相关问题可以在评论区留言或者私信我,谢谢大家的支持。
代码连接:https://github.com/Xke1718He/U-V-disparity-detect-ground
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视差的估计通过对原视差图像进行水平投影而得到,统计原视差图中每行不同视差的数量,V视差图像如下所示。
3.地平面线的检测
有了V视差图,我们就可以提取V视差中的信息了,我们知道,原视差中的地面映射为了V视差中的斜线,根据这个映射关系,我们就需要将这条斜线检测出来。
-
阈值滤除
首先,我们进行阈值滤除,这里主要是滤除一些统计信息较低的噪点,一般地面或者障碍在V视差中的统计量都是比较多的。
-
LSD直线检测
直线检测的方法有很多,比如经典的霍夫变换,霍夫变换的变种,直线拟合等等,这里主要因为实效性,采用了LSD直线检测。
-
直线分类与合并
从上图可以看出,检测出来的直线有倾斜的,也有垂直的,我们检测的地面映射为倾斜的直线,障碍物映射为近乎垂直的线。
通过LSD检测出来的直线只要包含四个参数:线段的两个短点的x,y坐标,我们根据两端点的y坐标的差值,可以初略将直线分组,然后将斜线的这组线段进行合并。
首先,我们将权重设为线段的长度,线段越长,权重越大,接着遍历每一条未合并的直线,将其分到斜率最接近的那组线段,不断迭代。合并完后的线段可能不只一类,我们选择权重高的作为我们的最终直线。
-
直线的参数计算
通过我们合并得到的线段,我们可以计算直线的参数:斜率和偏移量。
-
直线的交点
为什么要统计每列和直线的交点呢?这里的交点是障碍物与地面的临界点,也就是我们原视差图地面的边界点的映射,这也是为了后续生成地面的mask做准备。
4.初始化地面的mask
刚才我们得到了V视差中,每列和地面斜线的交点,根据这个交点,我们可以得到初始的地面的mask。
5. RANSAC平面拟合
得到了地面的初始的mask,这个是不能直接应用的,因为里面含有一些噪点,这里我们采用RANSAC方法来估计平面参数。
RANSAC方法是一种在已知一组样本中,大多数正样本符合某模型,还参杂着一些负样本,然后去估计这些正样本符合的模型参数。
一般RANSAC方法主要包括如下几个步骤:
- 初始的样本:这里的样本从我们刚刚得到的mask中进行采样得到。
- 随机采样:得到了我们的样本后,我们随机选取样本点,这里选取3组点,但是这3组点需要满足一个要求:不能共线。
- 参数估计:对于平面的参数估计采用最小二乘法进行估计。
- 计算内点:通过参数估计得到了平面的参数,就需要统计样本中内点的数量。
- 判断内点数量:通过我们设置的迭代次数,选取内点数最大的平面参数作为最终的结果。
关于RANSAC的具体描述参考:RANSAC
6.提纯拟合平面
从上面可以看出,拟合出来后的平面还是包含有一些小的噪声块,但是我们需要的平面其实占据的大量的面积,可以通过寻找轮廓,然后找出最大的面积块,得到我们最终的地面的mask。
7.显示
8. 不足
- 在直线合并后的结果,可能因为分组的原因,造成权重最大的不是地面映射的斜线,而是其他的线段,这将造成后面的结果全错了。
- 提纯轮廓的时候,如果两个面积相当的轮廓中间断裂,那么只能找到一般的mask,而另外一般会缺失。
参考:
LSD:一种直线检测算法简介:LSD:一种直线检测算法简介_lsd算法_ChenLee_1的博客-CSDN博客
OpenCV: cv::ximgproc::FastLineDetector Class Reference
霍夫变换直线检测(Line Detection)原理及示例:霍夫变换直线检测(Line Detection)原理及示例_霍夫变换直线检测原理_leonardohaig的博客-CSDN博客
形状识别之直线检测:形状识别之直线检测_lsd检测和hough检测那个比较新_深海沙砾的博客-CSDN博客
基于线条特征的机场检测算法——LSD直线检测算法、平行线组提取和聚类:基于线条特征的机场检测算法——LSD直线检测算法、平行线组提取和聚类_直线聚类_GHelpU的博客-CSDN博客
OpenCV基础——threshold函数的使用:OpenCV基础——threshold函数的使用_cv::threshold_我不是校长的博客-CSDN博客
数学形态学运算——腐蚀、膨胀、开运算、闭运算:数学形态学运算——腐蚀、膨胀、开运算、闭运算_腐蚀膨胀_chaolei_9527的博客-CSDN博客
OpenCV图像直方图_leonardohaig的博客-CSDN博客
opencv3 绘制一维直方图-灰度直方图的绘制_opencv3 灰度直方图 判断图像是否_轩落_翼的博客-CSDN博客
opencv提取图片直方图的的波谷的的x值_jidushanzhu的博客-CSDN博客