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

系列文章:

  1. 双目视觉(一)双目视觉系统
  2. 双目视觉(二)双目匹配的困难和评判标准
  3. 双目视觉(三)立体匹配算法
  4. 双目视觉(四)匹配代价
  5. 双目视觉(五)立体匹配算法之动态规划全局匹配
  6. 双目视觉(六)U-V视差
  7. 【项目实战】利用U-V视差进行地面检测
  8. 【项目实践】U-V视差路面检测之动态规划

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

目前代码还存在一些问题,上传代码与大家共享,如果有相关问题可以在评论区留言或者私信我,谢谢大家的支持。

代码连接:https://github.com/Xke1718He/U-V-disparity-detect-ground

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视差的估计通过对原视差图像进行水平投影而得到,统计原视差图中每行不同视差的数量,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. 不足

  1. 在直线合并后的结果,可能因为分组的原因,造成权重最大的不是地面映射的斜线,而是其他的线段,这将造成后面的结果全错了。
  2. 提纯轮廓的时候,如果两个面积相当的轮廓中间断裂,那么只能找到一般的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博客

https://github.com/1zlab/1ZLAB_OpenCV_Laser_Cross

基于双目立体视觉的障碍物检测方法 - 道客巴巴

基于双目立体视觉的障碍物检测算法的研究与实现 - 道客巴巴

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

  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火柴的初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值