python+opencv车道线,实线虚线的检测
最近在做一个基于opencv的无人小车,行车过程中遇到障碍时需要变道,由于实线不能变道,所以要判断车道线。但是找了很多地方却找不到关于车道线的实线虚线检测,于是通过自己的奇思妙想,想到了解决的办法,于是写下此博客,希望能帮到更多的人。
入门版的车道线检测
参考的资料
在此参考代码基础上完成的实线,虚线检测
代码
import cv2 as cv
import numpy as np
import utils#读取图片
src = cv.imread('test_images/test3.jpg')
#高斯降噪
src1 = cv.GaussianBlur(src,(5,5),0,0)
# cv.imshow('gaosi',src1)
#灰度处理
src2 = cv.cvtColor(src1,cv.COLOR_BGR2GRAY)
# cv.imshow('huidu',src2)
#边缘检测
lthrehlod = 50
hthrehlod =150
src3 = cv.Canny(src2,lthrehlod,hthrehlod)
# cv.imshow('bianyuan',src3)
#ROI划定区间,并将非此区间变成黑色
regin = np.array([[(0,660),(690,440),
(1200,700),(src.shape[1],660)]]) #为啥要两中括号?
mask = np.zeros_like(src3)
mask_color = 255 #src3图像的通道数是1,且是灰度图像,所以颜色值在0-255
cv.fillPoly(mask,regin,mask_color)
src4 = cv.bitwise_and(src3,mask)
# cv.imshow('bianyuan2',src4)#利用霍夫变换原理找出上图中的像素点组成的直线,然后画出来
rho = 1
theta = np.pi/180
threhold =15
minlength = 40
maxlengthgap = 20
lines = cv.HoughLinesP(src4,rho,theta,threhold,np.array([]),minlength,maxlengthgap)
#画线
linecolor =[0,255,255]
linewidth = 4
src5 = cv.cvtColor(src4,cv.COLOR_GRAY2BGR) #转化为三通道的图像# 优化处理
def choose_lines(lines, threhold): # 过滤斜率差别较大的点slope = [(y2 - y1) / (x2 - x1) for line in lines for x1, x2, y1, y2 in line]while len(lines) > 0:mean = np.mean(slope) # 平均斜率diff = [abs(s - mean) for s in slope]idx = np.argmax(diff)if diff[idx] > threhold:slope.pop(idx)lines.pop(idx)else:breakreturn lineslefts =[]
rights =[]
leftlength=[]
rightlength=[]
for line in lines:for x1,y1,x2,y2 in line:#cv.line(src5,(x1,y1),(x2,y2),linecolor,linewidth)#分左右车道k = (y2-y1)/(x2-x1)length= ((y2-y1)**2+(x2-x1)**2)**0.5#计算线段长度if k<0:lefts.append(line)leftlength.append(length)else:rights.append(line)rightlength.append(length)# print(max(leftlength))
# print(max(rightlength))if max(leftlength)>max(rightlength):text="The left-hand side is the solid line"
else:text="The right-hand side is the solid line"def clac_edgepoints(points, ymin, ymax): # 可以理解成找一条线的端点x = [p[0] for p in points]y = [p[1] for p in points]k = np.polyfit(y, x, 1)func = np.poly1d(k) # 方程是y关于x的函数,因为输入的ymin ymax。要求xmin,xmaxxmin = int(func(ymin))xmax = int(func(ymax))return [(xmin, ymin), (xmax, ymax)]good_leftlines = choose_lines(lefts, 0.1) # 处理后的点
good_rightlines = choose_lines(rights, 0.1)leftpoints = [(x1, y1) for left in good_leftlines for x1, y1, x2, y2 in left]
leftpoints = leftpoints + [(x2, y2) for left in good_leftlines for x1, y1, x2, y2 in left]
rightpoints = [(x1, y1) for right in good_rightlines for x1, y1, x2, y2 in right]
rightpoints = rightpoints + [(x2, y2) for right in good_rightlines for x1, y1, x2, y2 in right]lefttop = clac_edgepoints(leftpoints, 500, src.shape[0]) # 要画左右车道线的端点
righttop = clac_edgepoints(rightpoints, 500, src.shape[0])src6 = np.zeros_like(src5)cv.line(src6, lefttop[0], lefttop[1], linecolor, linewidth)
cv.line(src6, righttop[0], righttop[1], linecolor, linewidth)# cv.imshow('onlylane',src6)#图像叠加
src7 = cv.addWeighted(src1,0.8,src6,1,0)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(src7,text,(100,100), font, 1,(255,255,255),2)
cv.imshow('Finally Image',src7)cv.waitKey(0)
cv.destroyAllWindows()
~
代码中有几个需要注意到的地方,是车道线检测关键的所在
1、感兴趣区域的划定,会直接影响车道线检测的结果
#ROI划定区间,并将非此区间变成黑色
regin = np.array([[(0,660),(690,440),
(1200,700),(src.shape[1],660)]]) ~
大概意思就是取到的四个点形成的矩形区域,矩形区域需要框定图中的车道线,我所用到的图片大小是1280x720的,如果使用其他大小的图片可能会报错,以及车道线检测结果出现错误。需要根据自己用的实际图片更改自己的区域。
2、实线,虚线检测部分
#利用霍夫变换原理找出上图中的像素点组成的直线,然后画出来
rho = 1
theta = np.pi/180
threhold =15
minlength = 40
maxlengthgap = 20
lines = cv.HoughLinesP(src4,rho,theta,threhold,np.array([]),minlength,maxlengthgap)~lefts =[]
rights =[]
leftlength=[]
rightlength=[]
for line in lines:for x1,y1,x2,y2 in line:#cv.line(src5,(x1,y1),(x2,y2),linecolor,linewidth)#分左右车道k = (y2-y1)/(x2-x1)length= ((y2-y1)**2+(x2-x1)**2)**0.5#计算线段长度if k<0:lefts.append(line)leftlength.append(length)else:rights.append(line)rightlength.append(length)if max(leftlength)>max(rightlength):text="The left-hand side is the solid line"
else:text="The right-hand side is the solid line"~
这里就是实线,虚线检测关键所在,本人自己想到的一个解决办法,思路就是根据直线的长度,长的为实线,短的为虚线。首先通过霍夫变换找到所有的直线,再根据找到的直线算出每个直线的长度,取出左右两边最长的直线进行比较,更长的一边就是实线了。代码实现起来非常简单。
附上我使用的图片
python+opencv车道线,实线虚线的检测相关推荐
- 基于Python+OpenCV车道线检测(直道和弯道)
基于Python+OpenCV车道线检测(直道和弯道) 基于Python+OpenCV车道线检测(直道和弯道)
- python+opencv车道线检测(简易实现)
python+opencv车道线检测(简易实现) 技术栈:python+opencv 实现思路: canny边缘检测获取图中的边缘信息: 霍夫变换寻找图中直线: 绘制梯形感兴趣区域获得车前范围: 得到 ...
- Python OpenCV车道线识别侦测
Python OpenCV车道线识别侦测 如需安装运行环境或远程调试,可加QQ905733049, 或QQ2945218359由专业技术人员远程协助! 运行结果如下: 代码如下: import cv2 ...
- python opencv车道线检测
python3 opencv车道线检测 简介 特征提取 车道检测 鸟瞰图 找到车道起点 滑动窗口向上扫描 多项式拟合 鸟瞰图还原到原图 评估 总结 参考 简介 记录一下车道检测的过程.本文使用传统方法 ...
- 计算机视觉——车道线(路沿)检测
目录 系列文章目录 一.实验内容与方法 二.视频的导入.拆分.合成 1.视频时长读取 2.视频的拆分 3.视频的合成 三.图像处理/边缘检测 0.尝试 1.图像处理->边缘检测(原理) 2.Ca ...
- Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)
Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...
- Python+OpenCV:图像Harris角点检测(Harris Corner Detection)
Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...
- Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测
点击查看:Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测 文件大小:80M 操作系统:Windows10旗舰版 开发工具:Python3.8.OpenCV4.5.dlib 开发语言:.py ...
- 基于python的车道线检测
最近在开源社区下载了一份使用opencv在python环境中实现车道线检测的代码,研究了一下,终于有点儿看懂了,寻思着写下来,免得以后忘记了. 这个车道线检测项目原本是优达学城里无人驾驶课程中的第一个 ...
最新文章
- matplotlib如何绘制两点间连线_机器学习:Python常用库——Matplotlib库
- EasyUI权限系统
- python语言的理解-Python动态语言理解
- 新建文件注释_PDF汇总注释原来如此简单
- Oracle12c异常关闭后启动PDBORCL(ORA-01033)
- 使用ngModel创建组件
- mesh渲染到ui_在Unity中使用UGUI修改Mesh绘制几何图形
- c语言第一章节测试,计算机二级C语言教程章节测试:字符串
- Beta版本(有更改)
- 获取指定路径下所有PDF文件的总页数
- Bootstrap页面布局18 - BS导航路径以及分页器
- 3月4日 投影变换、仿射、Cross Ratios交比与单目测距、投影变换代码实现logo与球筐融合
- 修改服务器监听端口命令,如何更改prometheus监控系统启动的默认端口号
- 手机上最好用的五笔输入法_最欠揍的手机输入法,用不好失业又失恋
- 柳州铁一中机器人_柳州铁路第一中学的办学成果
- win10锁屏壁纸文件夹位置
- 非线性方程(组):高维方程解法
- Win32程序设计初步之线程
- 软件开发管理规范(制度)
- 如何使用hugo搭建个人博客(五):添加站内搜索(gcse)
热门文章
- C6678 srio和edma同时访问ddr冲突问题解决思路
- Direct3D 11 总结 —— 8 实现简单的绿幕抠图效果
- python 大气校正_PIE二次开发——大气校正
- SDN软件定义网络之OpenFlow协议
- Android音频录制方案,Android录音,录制其他App播放的声音
- 【OpenCV-Python】教程:3-13 Hough直线变换
- 小白兔写话_小学二年级期末写话片段练习 可爱的小白兔
- 函数解析|memset()函数的原理
- 2Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载
- matlab卡诺循环,制冷课后习题分解