最近在做一个基于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车道线,实线虚线的检测相关推荐

  1. 基于Python+OpenCV车道线检测(直道和弯道)

    基于Python+OpenCV车道线检测(直道和弯道) 基于Python+OpenCV车道线检测(直道和弯道)

  2. python+opencv车道线检测(简易实现)

    python+opencv车道线检测(简易实现) 技术栈:python+opencv 实现思路: canny边缘检测获取图中的边缘信息: 霍夫变换寻找图中直线: 绘制梯形感兴趣区域获得车前范围: 得到 ...

  3. Python OpenCV车道线识别侦测

    Python OpenCV车道线识别侦测 如需安装运行环境或远程调试,可加QQ905733049, 或QQ2945218359由专业技术人员远程协助! 运行结果如下: 代码如下: import cv2 ...

  4. python opencv车道线检测

    python3 opencv车道线检测 简介 特征提取 车道检测 鸟瞰图 找到车道起点 滑动窗口向上扫描 多项式拟合 鸟瞰图还原到原图 评估 总结 参考 简介 记录一下车道检测的过程.本文使用传统方法 ...

  5. 计算机视觉——车道线(路沿)检测

    目录 系列文章目录 一.实验内容与方法 二.视频的导入.拆分.合成 1.视频时长读取 2.视频的拆分 3.视频的合成 三.图像处理/边缘检测 0.尝试 1.图像处理->边缘检测(原理) 2.Ca ...

  6. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

  7. Python+OpenCV:图像Harris角点检测(Harris Corner Detection)

    Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...

  8. Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测

    点击查看:Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测 文件大小:80M 操作系统:Windows10旗舰版 开发工具:Python3.8.OpenCV4.5.dlib 开发语言:.py ...

  9. 基于python的车道线检测

    最近在开源社区下载了一份使用opencv在python环境中实现车道线检测的代码,研究了一下,终于有点儿看懂了,寻思着写下来,免得以后忘记了. 这个车道线检测项目原本是优达学城里无人驾驶课程中的第一个 ...

最新文章

  1. matplotlib如何绘制两点间连线_机器学习:Python常用库——Matplotlib库
  2. EasyUI权限系统
  3. python语言的理解-Python动态语言理解
  4. 新建文件注释_PDF汇总注释原来如此简单
  5. Oracle12c异常关闭后启动PDBORCL(ORA-01033)
  6. 使用ngModel创建组件
  7. mesh渲染到ui_在Unity中使用UGUI修改Mesh绘制几何图形
  8. c语言第一章节测试,计算机二级C语言教程章节测试:字符串
  9. Beta版本(有更改)
  10. 获取指定路径下所有PDF文件的总页数
  11. Bootstrap页面布局18 - BS导航路径以及分页器
  12. 3月4日 投影变换、仿射、Cross Ratios交比与单目测距、投影变换代码实现logo与球筐融合
  13. 修改服务器监听端口命令,如何更改prometheus监控系统启动的默认端口号
  14. 手机上最好用的五笔输入法_最欠揍的手机输入法,用不好失业又失恋
  15. 柳州铁一中机器人_柳州铁路第一中学的办学成果
  16. win10锁屏壁纸文件夹位置
  17. 非线性方程(组):高维方程解法
  18. Win32程序设计初步之线程
  19. 软件开发管理规范(制度)
  20. 如何使用hugo搭建个人博客(五):添加站内搜索(gcse)

热门文章

  1. C6678 srio和edma同时访问ddr冲突问题解决思路
  2. Direct3D 11 总结 —— 8 实现简单的绿幕抠图效果
  3. python 大气校正_PIE二次开发——大气校正
  4. SDN软件定义网络之OpenFlow协议
  5. Android音频录制方案,Android录音,录制其他App播放的声音
  6. 【OpenCV-Python】教程:3-13 Hough直线变换
  7. 小白兔写话_小学二年级期末写话片段练习 可爱的小白兔
  8. 函数解析|memset()函数的原理
  9. 2Unity3D教程宝典之插件篇:Unity3D插件详细评测及教学下载
  10. matlab卡诺循环,制冷课后习题分解