python+opencv实现车道线检测


Posted in Python onFebruary 19, 2021

python+opencv车道线检测(简易实现),供大家参考,具体内容如下

技术栈:python+opencv

实现思路:

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

效果展示:

python+opencv实现车道线检测

代码实现:

import cv2
import numpy as np


def 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_img


def 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_image


if __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)

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

效果图:

python+opencv实现车道线检测

代码实现:

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

import cv2
import numpy as np


def 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_img


def 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_image


def 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:
 break

 return after_lines


def 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 相关文章推荐
python 爬取微信文章
Jan 30 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
用十张图详解TensorFlow数据读取机制(附代码)
Feb 06 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
TensorFlow实现卷积神经网络
May 24 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
python实现贪吃蛇小游戏
Mar 21 Python
Python pandas用法最全整理
Aug 04 Python
python实现通过flask和前端进行数据收发
Aug 22 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 Python
Python随机数函数代码实例解析
Feb 09 Python
pytorch 一行代码查看网络参数总量的实现
May 12 Python
python UIAutomator2使用超详细教程
Feb 19 #Python
Python实现曲线拟合的最小二乘法
Feb 19 #Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
Feb 19 #Python
python绘制高斯曲线
Feb 19 #Python
Python绘制数码晶体管日期
Feb 19 #Python
Python Pygame实现俄罗斯方块
Feb 19 #Python
python实现图片转字符画
Feb 19 #Python
You might like
php escape URL编码
2008/12/10 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
JS交互点击WKWebView中的图片实现预览效果
2018/01/05 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
python网络编程之文件下载实例分析
2015/05/20 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
pytorch 求网络模型参数实例
2019/12/30 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
python 实现Harris角点检测算法
2020/12/11 Python
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
商务英语广告词大全
2014/03/18 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android
mysql sql常用语句大全
2022/06/21 MySQL