python视觉识别线条_简单车道线识别

本文详细介绍了如何使用OpenCV进行车道线识别,包括灰度变换、高斯滤波、边缘检测、感兴趣区域选择、霍夫变换和车道线拟合等步骤。还提供了C++及Python代码示例,适用于离线识别单张图片和视频中的车道线。
摘要由CSDN通过智能技术生成

本文将介绍如何利用Opencv,对简单场景下的车道线进行离线识别。梳理整个识别过程的逻辑,并对过程中使用的相关知识点进行介绍。正文中使用C++实现,在文末也会附上利用python实现的代码,读者完全可以依照本文复现该项目。

1. 整体思路

简单的车道线识别可由以下几步完成:

读取视频-灰度变换-高斯滤波-边缘检测-感兴趣区域检测-霍夫变换-车道线拟合-图片混合

在下面的内容中,将按照以上步骤一步步实现,最终实现对车道线的检测。大家都知道,视频是由一帧帧的图像组成,因此对视频的车道线检测本质上是对图像的车道线进行检测。

2.实现单张图片车道线检测

1)导入包含的库文件

#include

#include

#include

#include

#include

using namespace std;

using namespace cv;

2)读取图片

//*************reading image****************** Mat image;

image = imread("/home/project1/test1.jpg");

if(image.empty()){

cout <

return -1;

}

在Opencv中,图像的数据格式是Mat,相当于一个矩阵。这个步骤虽然简单,但有两点需要注意:一是imread后面的文件地址,在linux和windows下斜线的方向可能不一样,需要注意,最好是使用全局路径,不容易出错; 二是在读入图像后,最好加一段image.empty()来判断是否正确导入了图片。原图

3)灰度变换

//***************gray image*******************

Mat image_gray;

cvtColor(image,image_gray, CV_BGR2GRAY);

使用Opencv 中的cvtColor函数可以直接将RGB的图像转换成灰度图。这个函数有三个输入参数,分别是:输入图像,输出图像,格式转化类别;灰度图

4)高斯滤波

Mat image_gau;

GaussianBlur(image_gray, image_gau, Size(5,5),0,0);

使用高斯滤波,也叫高斯模糊,能够剔除原图像中的一些噪点。比如,如果不使用高斯滤波,直接处理原图,图中一些无关紧要的特征就无法避开,影响后面的处理。相反,通过高斯模糊之后,一些不那么清晰的噪点就被删除掉了。

函数GaussianBlur的四个参数分别为:输入图像,输出图像,高斯内核,高斯内核在X方向的标准偏差,高斯内核在Y方向上的标准偏差。其中,高斯内核是由width和height两个维度构成,这两个维度可以使用不同的值,但是必须是正奇数或者为0; 高斯内核在X,Y两个方向上的标准偏差,通常设置为0(具体如何调参数暂未研究)高斯滤波

5)边缘检测

//******************canny*********************

Mat image_canny;

Canny(image_gau, image_canny,100, 200, 3);

Canny边缘检测函数共有5个输入参数,分别为:输入图像,输出图像,阈值1,阈值2, sobel算子的孔径参数。阈值:低于阈值1 的像素点会被认为不是边缘,高于阈值2的像素点会被认为是边缘,在阈值1和阈值2之间的像素点,如果与高于阈值2的像素点相邻,则认为是边缘,否则认为不是边缘。soble算子孔径参数,一般默认为3, 即表示为一个3*3的矩阵。sobel算子与高斯拉普拉斯算子都是常用的边缘算子。边缘检测

6)感兴趣区域

Mat dstImg;

Mat mask = Mat::zeros(image_canny.size(), CV_8UC1);

Point PointArray[4];

PointArray[0] = Point(0, mask.rows);

PointArray[1] = Point(400,330);

PointArray[2] = Point(570,330);

PointArray[3] = Point(mask.cols, mask.rows);

fillConvexPoly(mask,PointArray,4,Scalar(255));

bitwise_and(mask,image_canny,dstImg);

从上图可以看出,通过边缘检测得到的图片包含了很多环境信息,这些是我们不感兴趣的,需要提取我们需要都得信息。观察原图可知,车道先一般位于图片下方的一个梯形区域,手动设定4个点,组成梯形区域的四个顶点。利用fillConvexPoly函数可以画出多边形,这个函数共有4个参数:空图(大小与原图一致),顶点信息,多边形的边数,线条颜色。

将梯形掩模区域与原图进行bitwise_and 操作,可以只得到感兴趣区域内的边缘检测图,从途中可以看出只有车道线信息。bitwise_and 函数是将两张图片做“与”操作,共有3个输入参数,分别是:掩模图, 原图,输出图。需要注意的是,三张图的大小和颜色通道数量。掩模梯形区域感兴趣区域

7)霍夫变换

通过上面的操作,得到的是组成车道线的一些像素点,但这些点都是一个个独立的像素点,没有连成线。霍夫变换可以通过像素点找到图中的直线。霍夫变换有3种,标准霍夫变换,多尺度霍夫变换和累计概率霍夫变换,前两种使用HoughLines函数,最后一种使用HoughLines函数实现。累计霍夫变换的执行效率更高,所以一般更多的倾向使用累计概率霍夫变换。

霍夫变换将在迪卡尔坐标系下的线条转换到极坐标系下,迪卡尔坐标下通过一个点的所有直线的集合在极坐标系下是一条正弦曲线。正弦曲线的交点,表示这些曲线代表的点在同一条直线上。霍夫变换就通过找这些交点,确定哪些像素点是在同一条直线上。关于霍夫变换的具体讲解可以参考:经典霍夫变换(Hough Transform)​blog.csdn.net

vector lines; //包含4个int类型的结构体

int rho = 1;

double theta = CV_PI/180;

int threshold = 30;

int min_line_len = 30;

int max_line_gap = 20;

HoughLinesP(dstImg,lines,rho,theta,threshold,min_line_len,max_line_gap);

Opencv中HoughLinesP函数共有7个参数:输入原图像(单通道二进制图像,canny的结果),输出线的两个端点(x1, y1, x2, y2),rho直线搜索时的步长(单位为像素),theta直线搜索时的角度步长(单位为弧度),threshold多少个点交在一起才认为是一条直线(int),min_

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值