简易车道线识别方法

文章目录

  • 简易车道线识别方法
    • 1.先上效果图
      • 1.1原图:
      • 1.2结果图
    • 2.源代码
    • 3.阈值脚本
    • 4.谈谈优缺点
      • 优点:
      • 缺点:

1.先上效果图

1.1原图:

1.2结果图

2.源代码

#1.canny边缘检测  2.mask   3.霍夫变换   4.离群值过滤    5.最小二乘拟合     6.绘制直线import cv2
import numpy as np
import matplotlib.pyplot as plt'''1.canny边缘检测'''
img=cv2.imread('IMG_20210707_151326.jpg',cv2.IMREAD_GRAYSCALE)     #以灰度图形式读取图片,为canny边缘检测做准备
img0=cv2.imread("IMG_20210707_151326.jpg",cv2.IMREAD_COLOR)edge_img=cv2.Canny(img,210,300)     #设定阈值,低于阈值被忽略,高于阈值被显示,# 阈值的设定与图片的色彩有关,需要手动调整到合适的值(使车道线清晰显示出来)# plt.imshow(img)
# plt.show()
# #
# cv2.namedWindow('edge_img',0)
# cv2.resizeWindow('edge_img',500,800)
# cv2.imshow('edge_img',edge_img)
# cv2.waitKey(0)'''2.roi_mask(提取感兴趣的区域)'''
mask=np.zeros_like(edge_img)   #变换为numpy格式的图片
mask=cv2.fillPoly(mask,np.array([[[0,460],[1150,470],[780,0],[650,0]]]),color=255)   #对感兴趣区域制作掩膜
#在此做出说明,实际上,车载相机固定于一个位置,所以对于感兴趣的区域的位置也相对固定,这个视相机位置而定。
cv2.namedWindow('mask',0)
cv2.resizeWindow('mask',800,1200)
cv2.imshow('mask',mask)
cv2.waitKey(0)
masked_edge_img=cv2.bitwise_and(edge_img,mask)   #与运算
# cv2.namedWindow('masked_edge_img',0)
# cv2.resizeWindow('masked_edge_img',800,1200)
# cv2.imshow('masked_edge_img',masked_edge_img)
# cv2.waitKey(0)'''3.霍夫变换,找出直线'''
def calculate_slope(line):'''计算线段line的斜率:param Line:np.array([[x_1,y_1,x_2,y_2]]):return:'''x_1,y_1,x_2,y_2=line[0]return (y_2-y_1)/(x_2-x_1)lines=cv2.HoughLinesP(masked_edge_img,1,np.pi/180,15,minLineLength=50,maxLineGap=20)    #获取所有线段left_lines=[line for line in lines if calculate_slope(line)>0]
right_lines=[line for line in lines if calculate_slope(line)<0]'''4.离群值过滤'''def reject_abnormal_lines(lines,threshold):'''剔出斜率不一致的线段'''slopes=[calculate_slope(line) for line in lines]while len(lines)>0:mean=np.mean(slopes)diff=[abs(s-mean) for s in slopes]idx=np.argmax(diff)if diff[idx]>threshold:slopes.pop(idx)lines.pop(idx)else:breakreturn lines
print(len(left_lines),len(right_lines))reject_abnormal_lines(left_lines,threshold=0.1)
reject_abnormal_lines(right_lines,threshold=0.1)
print(len(left_lines),len(right_lines))'''5.最小二乘拟合 把识别到的多条线段拟合成一条直线'''#np.ravel: 将高维数组拉成一维数组
# np.polyfit:多项式拟合
#np.polyval: 多项式求值def least_squares_fit(lines):x_coords=np.ravel([[line[0][0],line[0][2]] for line in lines])y_coords = np.ravel([[line[0][1], line[0][3]] for line in lines])   #取出所有标点poly=np.polyfit(x_coords,y_coords,deg=1)                             #进行直线拟合,得到多项式系数point_min=(np.min(x_coords),np.polyval(poly,np.min(x_coords)))point_max = (np.max(x_coords), np.polyval(poly, np.max(x_coords)))     #根据多项式系数,计算两个直线上的点return np.array([point_min,point_max],dtype=np.int64)left_lines=least_squares_fit(left_lines)
right_lines=least_squares_fit(right_lines)'''6.直线绘制'''
cv2.line(img0,tuple(left_lines[0]),tuple(left_lines[1]),color=(0,255,255),thickness=5)
cv2.line(img0,tuple(right_lines[0]),tuple(right_lines[1]),color=(0,255,255),thickness=5)cv2.namedWindow('lane',0)
cv2.resizeWindow('lane',800,1200)
cv2.imshow('lane',img0)
cv2.waitKey(0)

各个代码块都有对应的注释,有不明白的可以留言。

3.阈值脚本

为了方便找出合适的阈值,这里有一个脚本:

import cv2cv2.namedWindow('edge_detection',0)
cv2.resizeWindow('edge_detection',500,800)
cv2.createTrackbar('minThreshold','edge_detection',50,1000,lambda x: x)
cv2.createTrackbar('maxThreshold','edge_detection',100,1000,lambda x: x)img=cv2.imread('IMG_20210707_151326.jpg',cv2.IMREAD_GRAYSCALE)
while True:minThreshold=cv2.getTrackbarPos('minThreshold','edge_detection')maxThreshold=cv2.getTrackbarPos('maxThreshold','edge_detection')edges=cv2.Canny(img,minThreshold,maxThreshold)cv2.imshow('edge_detection',edges)cv2.waitKey(10)

可以拖动上面的阈值,看到对应的边缘检测的结果

不清晰的图如下

清晰的图如下:

4.谈谈优缺点

优点:

代码极其简单,易于实现,对于初学者来说具有可操作性,且可以起到鼓舞初学者的作用。

缺点:

这个车道线检测的方法缺点很明显,或者说还需要改进的地方
1.无法自动对合适的阈值进行选择,即无法自动给出最合适的边缘检测;
2.对于mask的选取有待优化
3.对弯道处的车道线检测效果不佳

基于opencv的车道线识别(python)(极易实现)相关推荐

  1. 自动驾驶入门(十二):基于Opencv的车道线识别

    车道线识别有两种方法: 基于Opencv的传统视觉车道线识别方案 基于深度学习的车道线识别方案 本文将介绍基于Opencv的传统视觉车道线识别方案. 传统的车道线识别解决方案流程图如下: 代码实现如下 ...

  2. 基于视觉的车道线识别技术在智能车导航中的应用研究

    密级:公开 摘  要 摘  要 室外移动机器人的研究是机器人研究领域的重要分支,同时也是备受关注的热点领域.面向高速公路等结构化道路的室外移动机器人研究已成为现阶段民用交通运输领域移动机器人研究的主流 ...

  3. 基于OpenCV 的车道线检测方法

    车道线检测是图像处理运用到无人驾驶的一项技术,目前也过渡到了部分汽车上,高速公路的自动车道保持就是一个应用. 最近研究了两个基于opencv的车道检的代码,先放链接: A.Udacity车道线检测代码 ...

  4. 基于MATLAB的车道线识别、自动驾驶识别

    使用单目相机的视觉感知 这个例子展示了如何构建一个能够进行车道边界和车辆检测的单眼摄像机传感器仿真.该传感器将在车辆坐标系中报告这些检测结果.在本例中,您将了解自动驾驶工具箱™使用的坐标系统,以及设计 ...

  5. Python OpenCV车道线识别侦测

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

  6. python+opencv图像处理之边缘检测车道线识别

    python+opencv图像处理之边缘检测车道线识别 1.自行安装python和opencv 2.导入我们要使用的相关库 import cv2 from matplotlib import pypl ...

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

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

  8. 基于 Amazon DeepRacer Opensource 实现自定义车道线识别任务

    点击上方[凌云驭势 重塑未来] 一起共赴年度科技盛宴! 自动驾驶的视觉感知流程 在自动驾驶系统中,作为识别周边环境的"感官"角色,感知模块是整个系统安全.高效运行的基础,让汽车得以 ...

  9. Python基于OpenCV的人脸表情识别系统[源码&部署教程]

    1.项目背景 人脸表情识别是模式识别中一个非常重要却十分复杂的课题.首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾.然后对近期人脸表情识别的方法进行了分类综述.通过对各种识别方法的分析与 ...

最新文章

  1. 微信小程序修改样式弹框wx.showModal
  2. Spring Cloud【Finchley】-01服务提供者与服务消费者
  3. mysql数据库系统配置文件_跟我学虚拟机系统平台相关技术及应用——在CentOS系统中的MySql数据库系统配置文件中进行配置定义...
  4. 数据结构 算法与应用C 语言描述答案,数据结构算法与应用-C语言描述.pdf
  5. java opencv orb_opencv python ORB算法
  6. mybatis xml 参数 使用
  7. 链路聚合_配置EthTrunk链路聚合
  8. gnuplot在windows下的安装和使用
  9. 西威变频器avo下载调试资料_免费下载 |《西门子全集成自动化技术》,很全很详细...
  10. 鸟哥的linux私房菜 第五章
  11. DLKcat开发细则(自用)
  12. 术语解释(PV、UV、QPS、TPS)
  13. EOJ Contest61 2018研究生面试机考(软件工程)个人题解
  14. cpri和10g-kr的关系?
  15. redis也可以根据经纬度查询附近的元素以及计算两个经纬度的距离???
  16. excel怎么识别提取图片中的文字
  17. 内网安全学习(1)---信息收集
  18. 2022最新版Redis入门到精通(云课堂视频学习笔记)
  19. guzzle的cookie使用方法
  20. 全志A83T芯片开发资料汇总分享(datasheet,sdk,量产工具)

热门文章

  1. mysql南京廖化_MySQL上机试题
  2. 如何解决生鲜行业企业商品多,价格波动快的难题
  3. 密码学系列之:csrf跨站点请求伪造
  4. 英睿达内存条正品鉴别教程(镁光颗粒)
  5. 期货交易的二十一大战法
  6. 联想微型计算机一体机b505,联想IdeaCentreB505一体机电脑外型不错,都说它配置很? 爱问知识人...
  7. java dropdownlist_ASP动态DropDownList选择索引
  8. 小朋友学C语言(23):二进制与十进制之间的转换
  9. 早教班到底有没有必要上?
  10. 3DMAX渲染的vrimg是什么文件?又什么用?渲图后可后期调节的强大格式~