边缘检测robert原理_基于OpenCV的车道线检测算法(Traditional Method)
0. Introduction
这篇文章主要是一种基于canny边缘检测的传统车道线检测算法,这种算法很轻量级,实时性较好,在进行基于深度学习的车道检测学习前,实现用Traditional Method的车道检测很有意义,其主要思想如下:代码将在文章后附上。
文章图片
总体思想 1. Canny边缘检测
1.1 Canny的检测原理
Canny边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,目前已广泛应用于各种计算机视觉系统。Canny发现,在不同视觉系统上对边缘检测的要求较为类似,因此,可以实现一种具有广泛应用意义的边缘检测技术。
- 边缘检测的一般标准包括:
② 检测到的边缘应精确定位在真实边缘的中心。
③ 图像中给定的边缘应只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边缘。边缘只要一个精确的点宽度。
- 边缘检测算法的处理流程:
- 高斯滤波,平滑图像;
-
- 计算图像中每个像素点的梯度强度和方向;
文章图片
。 G为梯度强度,
文章图片
(1)
文章图片
表示梯度方向,
文章图片
(2) 下面以Sobel算子为例,描述如何计算梯度强度和方向:
Sobel算子x和y方向分别为:
文章图片
Sobel算子x和y方向 其中Sx表示x方向的Sobel算子,用于检测y方向的边缘; Sy表示y方向的Sobel算子,用于检测x方向的边缘(边缘方向和梯度方向垂直)。在直角坐标系中,Sobel算子的方向如下图所示。
文章图片
Sobel算子方向 若图像中一个3x3的窗口为A,要计算梯度的像素点为e,则和Sobel算子进行卷积之后,像素点e在x和y方向的梯度值分别为:
文章图片
像素点e在x和y方向的梯度值 其中*为卷积符号,sum表示矩阵中所有元素相加求和。根据公式(1)、(2)便可以计算出像素点e的梯度和方向。
-
- 使用Non-Maximum Suppression(非极大值抑制)消除边缘检测带来的杂散响应;
文章图片
NMS 点A在边缘上(在垂直方向上)。梯度方向与边缘垂直。B点和C点处于梯度方向。因此,点A,与点B和C进行比较,点A是否形成局部最大值。如果是这样,它被认为是边缘,否则,它被抑制(归零)。
-
- 使用Double-Threshold(双阈值)检测确定真实和潜在的边缘;
- 通过抑制鼓励的弱边缘最终完成边缘检测.
文章图片
滞后阈值 【边缘检测robert原理_基于OpenCV的车道线检测算法(Traditional Method)】 边缘A在maxVal之上,因此被视为“真正的边缘”。虽然边C低于maxVal,但它连接到边A,所以也被认为是有效边缘,我们得到了完整的曲线。但是边B虽然高于minVal,但它并没有连接到任何“真正的边缘”,因此被丢弃。因此,我们必须相应地选择minVal和maxVal以获得正确结果,这一点非常重要。
1.2 效果
2. 做Segment 2.1 方法
Segment的主要思想是,构建一个mask,这个mask包含主要的车道区域值均为1,其余为0,将这个mask与原frame进行叠加,就可以抠出主要的车道区域。
2.2 效果
文章图片
可以看到,已经成功的抠出了车道线部分的图像。
3.做霍夫变换 3.1 Hough Transform原理
霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,常用来在图像中提取直线和圆等几何形状,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特征的集合作为霍夫变换的结果。
- 霍夫直线变换
文章图片
直线可以分别用直角坐标系和极坐标系来表示:
文章图片
那么经过某个点(x0,y0)的所有直线都可以用这个式子来表示:
文章图片
也就是说,每一个
文章图片
都表示一条经过
文章图片
的直线,则同一条直线上的点,必然会有相同的
文章图片
,如果将某个点所有的
文章图片
绘制成曲线,同一条直线上的
文章图片
曲线会相交于一点。 通俗的解释就是霍夫空间中相交的曲线越多,交点表示的线在笛卡尔坐标系中对应的点越多。结合上面的分析,在笛卡尔坐标系与霍夫空间中,同样有:
文章图片
OpenCV中,有两个API可以用来进行霍夫直线变换
①cv2.HoughLines(edges,0.8,np.pi/180,90),参数1,要检测的二值图像(一般是阈值分割或边缘检测后的图像);参数2,是距离r的精度,值越大,考虑越多的线;参数3,是角度
文章图片
的精度,值越小,考虑越多的线;参数4,累加数阈值,即
文章图片
的累加数,累加数超过一定值后就认为在同一直线上。值越小,考虑线越多; 函数返回的是一组直线的(r,θ)数据. ②cv2.HoughLinesP(edges,0.8,np.pi/180,90,minLineLength=50, maxLineGap=10),是统计概率霍夫直线变换,前面的方法又称为标准霍夫变换,它会计算图像中的每一个点,计算量比较大,另外它得到的是整一条线(r和θ),并不知道原图中直线的端点。所以提出了统计概率霍夫直线变换(Probabilistic Hough Transform),是一种改进的霍夫变换;前面参数含义相同,minLineLength:最短长度阈值,比这个长度短的线会被排除;maxLineGap:同一直线两点之间的最大距离
4. 标定车道边界
4.1 基本方法
将从hough检测到的多条线平均成一条线表示车道的左边界, 一条线表示车道的右边界。基本思想很简单,就是先将霍夫变换的线段转换为一维信息,进行多项式拟合,在将得到的截距和斜率信息进行平均,在利用数值代换转换成cv坐标系的左边界线,和右边界线;其他的代码里有详细的注释,就不过多赘述。
4.2 效果
文章图片
可以看到,车道中的标示线已经被很好的标出。
5. 可视化 最后的工作就是讲标定的车道边界在原始视频文件中输出,效果如下:
6.代码
#-*- coding: utf-8 -*-
Reference 边缘检测之Canny - TechYan - 博客园?www.cnblogs.com
文章图片
https://blog.csdn.net/zhubaohua_bupt/article/details/73826080?blog.csdn.net https://blog.csdn.net/qq_27806947/article/details/80766762?blog.csdn.net 无人驾驶实战 [首次全面公开L4级别的全自动驾驶技术,免费试听今日开放] - 七月在线?www.julyedu.com
文章图片
推荐阅读
- python|opencv-python 入门实战(传统方法Hog+svm实现目标检测)
- 从零学习openCV|【从零学习openCV】IOS7下的人脸检测
- 计算机视觉|10分钟学会使用YOLO及Opencv实现目标检测
- CLOCs(3D目标检测多模态融合之late-fusion)
- opencv|基于深度学习的口罩识别与检测PyTorch实现
- 这个牛逼的IDE插件,让你轻松检测代码安全漏洞,一键修复,核心引擎已开源
- 最全自动驾驶数据集分享系列一|目标检测数据集(2/3)
- OpenCV专题|OpenCV用于人脸检测
- yolo相关项目|基于人脸识别、姿态检测、距离估计的看电视姿态检测
- 图像处理|【OpenCv】检测黑白棋