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

技术栈:python+opencv

实现思路:

  1. canny边缘检测获取图中的边缘信息;
  2. 霍夫变换寻找图中直线;
  3. 绘制梯形感兴趣区域获得车前范围;
  4. 得到并绘制车道线;

效果展示:

代码实现:

import cv2
import numpy as npdef canny():gray = cv2.cvtColor(lane_image, cv2.COLOR_RGB2GRAY)#高斯滤波blur = cv2.GaussianBlur(gray, (5, 5), 0)#边缘检测canny_img = cv2.Canny(blur, 50, 150)return canny_imgdef region_of_interest(r_image):h = r_image.shape[0]w = r_image.shape[1]# 这个区域不稳定,需要根据图片更换poly = np.array([[(100, h), (500, h), (290, 180), (250, 180)]])mask = np.zeros_like(r_image)# 绘制掩膜图像cv2.fillPoly(mask, poly, 255)# 获得ROI区域masked_image = cv2.bitwise_and(r_image, mask)return masked_imageif __name__ == '__main__':image = cv2.imread('test.jpg')lane_image = np.copy(image)canny = canny()cropped_image = region_of_interest(canny)cv2.imshow("result", cropped_image)cv2.waitKey(0)

霍夫变换加线性拟合改良:

效果图:

代码实现:

主要增加了根据斜率作线性拟合过滤无用点后连线的操作;

import cv2
import numpy as npdef canny():gray = cv2.cvtColor(lane_image, cv2.COLOR_RGB2GRAY)blur = cv2.GaussianBlur(gray, (5, 5), 0)canny_img = cv2.Canny(blur, 50, 150)return canny_imgdef region_of_interest(r_image):h = r_image.shape[0]w = r_image.shape[1]poly = np.array([[(100, h), (500, h), (280, 180), (250, 180)]])mask = np.zeros_like(r_image)cv2.fillPoly(mask, poly, 255)masked_image = cv2.bitwise_and(r_image, mask)return masked_imagedef get_lines(img_lines):if img_lines is not None:for line in lines:for x1, y1, x2, y2 in line:# 分左右车道k = (y2 - y1) / (x2 - x1)if k < 0:lefts.append(line)else:rights.append(line)def choose_lines(after_lines, slo_th):  # 过滤斜率差别较大的点slope = [(y2 - y1) / (x2 - x1) for line in after_lines for x1, x2, y1, y2 in line]  # 获得斜率数组while len(after_lines) > 0:mean = np.mean(slope)  # 计算平均斜率diff = [abs(s - mean) for s in slope]  # 每条线斜率与平均斜率的差距idx = np.argmax(diff)  # 找到最大斜率的索引if diff[idx] > slo_th:  # 大于预设的阈值选取slope.pop(idx)after_lines.pop(idx)else:breakreturn after_linesdef clac_edgepoints(points, y_min, y_max):x = [p[0] for p in points]y = [p[1] for p in points]k = np.polyfit(y, x, 1)  # 曲线拟合的函数,找到xy的拟合关系斜率func = np.poly1d(k)  # 斜率代入可以得到一个y=kx的函数x_min = int(func(y_min))      # y_min = 325其实是近似找了一个x_max = int(func(y_max))return [(x_min, y_min), (x_max, y_max)]if __name__ == '__main__':image = cv2.imread('F:\\A_javaPro\\test.jpg')lane_image = np.copy(image)canny_img = canny()cropped_image = region_of_interest(canny_img)lefts = []rights = []lines = cv2.HoughLinesP(cropped_image, 1, np.pi / 180, 15, np.array([]), minLineLength=40, maxLineGap=20)get_lines(lines)  # 分别得到左右车道线的图片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, 180, image.shape[0])  # 要画左右车道线的端点righttop = clac_edgepoints(rightpoints, 180, image.shape[0])src = np.zeros_like(image)cv2.line(src, lefttop[0], lefttop[1], (255, 255, 0), 7)cv2.line(src, righttop[0], righttop[1], (255, 255, 0), 7)cv2.imshow('line Image', src)src_2 = cv2.addWeighted(image, 0.8, src, 1, 0)cv2.imshow('Finally Image', src_2)cv2.waitKey(0)

待改进:

代码实用性差,几乎不能用于实际,但是可以作为初学者的练手项目;
斑马线检测思路:获取车前感兴趣区域,判断白色像素点比例即可实现;
行人检测思路:opencv有内置行人检测函数,基于内置的训练好的数据集;

python+opencv车道线检测(简易实现)相关推荐

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

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

  2. python opencv车道线检测

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

  3. Python OpenCV车道线识别侦测

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

  4. python+opencv车道线,实线虚线的检测

    最近在做一个基于opencv的无人小车,行车过程中遇到障碍时需要变道,由于实线不能变道,所以要判断车道线.但是找了很多地方却找不到关于车道线的实线虚线检测,于是通过自己的奇思妙想,想到了解决的办法,于 ...

  5. 基于python的车道线检测

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

  6. 无人驾驶之车道线检测简易版

    无人驾驶技术近些年发展迅速.无人车若想实现自动驾驶,从视觉的角度上讲其要先学会观察道路,具体来说,就是检测车道线.包括识别车道线与车的位置关系,是实线还是虚线等.本文将简单介绍车道线检测的基本技术,包 ...

  7. opencv车道线检测

    车道线检测,需要完成以下功能: 图像裁剪:通过设定图像ROI区域,拷贝图像获得裁剪图像 反透视变换:用的是室外采集到的视频,没有对应的变换矩阵.所以建立二维坐标,通过四点映射的方法计算矩阵,进行反透视 ...

  8. 基于Opencv车道线检测

    二值化:先变化为灰度图,然后设定阈值直接变成二值化图像. 形态学滤波:对二值化图像进行腐蚀,去除噪点,然后对图像进行膨胀,弥补对车道线的腐蚀. ROI提取:提取感兴趣的ROI 边缘线检测:canny变 ...

  9. 车道线检测参考学习资料

    一.GitHub: https://github.com/amusi/awesome-lane-detection(全) https://github.com/ChengZhongShen/Advan ...

最新文章

  1. 系统芯片(SOC)架构- Aviral Mittal
  2. 机器学习 LR getA()
  3. Lync Server 2010迁移至Lync Server 2013故障排错Part1:缺少McsStandalone.msi
  4. C++ Primer 第9章 顺序容器 第一次学习笔记
  5. a卡显存测试软件_官方游戏性能堪比RTX 3080 苏姿丰:RX 6000 Big Navi是史上最强A卡...
  6. 安装和配置Hadoop
  7. mysql与mssql中datetime类型字段问题_excel数据存入sqlserver过程中,遇到Datetime的格式问题。...
  8. 3.7 测试时的 Batch Norm
  9. 【实践】通过Composer,安装yii2-advanced
  10. Trick(十四)—— 判断是否序列中所有的元素都相同
  11. 如何在乌版图系统添加拼音输入法!
  12. EF并非我们想象的那么智能
  13. 同步异步和阻塞3-同步阻塞
  14. eclipse配色方案推荐_收藏!58个设计师最佳配色工具网站
  15. JavaScript 上传文件并显示进度条(主页资源中有后端服务器).
  16. gitter 卸载_最佳Gitter渠道:学习编码
  17. ToDoList本地存储原生js版/jQuery版
  18. STM32 Bootloader开发记录 3 固件签名校验
  19. 【19周-星耀】FASTER!FASTER!FASTER!
  20. android曲面屏点击事件无响应,都说曲面屏中看不中用,主要原因有四点,第三点是关键!...

热门文章

  1. LabWindows™/CVI中的多线程技术
  2. 运用three.js写的漂浮立方
  3. 生鲜超市管理系统(JavaSSH)
  4. Bitpay背后的BCH生态体系到底有多强大?
  5. 论文笔记:Adapting Object Detectors via Selective Cross-Domain Alignment
  6. 科一模拟考总结之马路杀手2016_12_23
  7. 你有四个装药丸的罐子,每个药丸都有一定的重量,被污染的药丸是没被污染的重量+1.只称量一次,如何判断哪 个罐子的药被污染了?
  8. 股票入门基础知识39:图表分析中添加趋势线
  9. 在线播放MP3音乐HTML代码
  10. redis linux下布署