基于opencv实现车道线检测
基于opencv的车道线检测,供大家参考,具体内容如下
原理:
算法基本思想说明:
传统的车道线检测,多数是基于霍夫直线检测,其实这个里面有个很大的误区,霍夫直线拟合容易受到各种噪声干扰,直接运用有时候效果不好,更多的时候通过霍夫直线检测进行初步的筛选,然后再有针对性的进行直线拟合,根据拟合的直线四个点坐标,绘制出车道线,这种方式可以有效避免霍夫直线拟合不良后果,是一种更加稳定的车道线检测方法,在实际项目中,可以选择两种方法并行,在计算出结果后进行叠加或者对比提取,今天分享的案例主要是绕开了霍夫直线检测,通过对二值图像进行轮廓分析与几何分析,提取到相关的车道线信息、然后进行特定区域的像素扫描,拟合生成直线方程,确定四个点绘制出车道线,对连续的视频来说,如果某一帧无法正常检测,就可以通过缓存来替代绘制,从而实现在视频车道线检测中实时可靠。
原理图:
代码:
#include#include #include usingnamespacecv; usingnamespacestd; /** **1、读取视频 **2、二值化 **3、轮廓发现 **4、轮廓分析、面积就算,角度分析 **5、直线拟合 **6、画出直线 ** */ Pointleft_line[2]; Pointright_line[2]; voidprocess(Mat&frame,Point*left_line,Point*right_line); MatfitLines(Mat&image,Point*left_line,Point*right_line); intmain(intargc,char**argv){ //读取视频 VideoCapturecapture("E:/opencv/road_line.mp4"); intheight=capture.get(CAP_PROP_FRAME_HEIGHT); intwidth=capture.get(CAP_PROP_FRAME_WIDTH); intcount=capture.get(CAP_PROP_FRAME_COUNT); intfps=capture.get(CAP_PROP_FPS); //初始化 left_line[0]=Point(0,0); left_line[1]=Point(0,0); right_line[0]=Point(0,0); right_line[1]=Point(0,0); cout< (i,j)=0; } } imshow("binary",binary); //寻找轮廓 vector >contours; findContours(binary,contours,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE); Matout_image=Mat::zeros(gray.size(),gray.type()); for(inti=0;i h){ continue; } //最小包围矩形 RotatedRectrrt=minAreaRect(contours[i]); //cout<<"最小包围矩形angle:"< 89.0 if(angle<20.0||angle>84.0){ continue; } if(contours[i].size()>5){ //用椭圆拟合 RotatedRecterrt=fitEllipse(contours[i]); //cout<<"用椭圆拟合err.angle:"< 160.0)) { if(80.0 left_pts; vector right_pts; Vec4fleft; for(inti=100;i<(cx-10);i++) { for(intj=cy;j (j,i); if(pv==255) { left_pts.push_back(Point(i,j)); } } } for(inti=cx;i<(width-20);i++) { for(intj=cy;j (j,i); if(pv==255) { right_pts.push_back(Point(i,j)); } } } if(left_pts.size()>2) { fitLine(left_pts,left,DIST_L1,0,0.01,0.01); doublek1=left[1]/left[0]; doublestep=left[3]-k1*left[2]; intx1=int((height-step)/k1); inty2=int((cx-25)*k1+step); Pointleft_spot_1=Point(x1,height); Pointleft_spot_end=Point((cx-25),y2); line(out,left_spot_1,left_spot_end,Scalar(0,0,255),8,8,0); left_line[0]=left_spot_1; left_line[1]=left_spot_end; } else { line(out,left_line[0],left_line[1],Scalar(0,0,255),8,8,0); } if(right_pts.size()>2) { Pointspot_1=right_pts[0]; Pointspot_end=right_pts[right_pts.size()-1]; intx1=spot_1.x; inty1=spot_1.y; intx2=spot_end.x; inty2=spot_end.y; line(out,spot_1,spot_end,Scalar(0,0,255),8,8,0); right_line[0]=spot_1; right_line[1]=spot_end; } else { line(out,right_line[0],right_line[1],Scalar(0,0,255),8,8,0); } returnout; }
结果图片:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。