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读写Json涉及到中文的处理方法
Sep 12 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
Python之文字转图片方法
May 10 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
python单例设计模式实现解析
Jan 07 Python
Python底层封装实现方法详解
Jan 22 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
Python headers请求头如何实现快速添加
Nov 03 Python
Python实现生活常识解答机器人
Jun 28 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 25 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
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
js的逻辑运算符 ||
2010/05/31 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
node.js监听文件变化的实现方法
2019/04/17 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
JavaScript实现移动端拖动元素
2020/11/24 Javascript
利用Python演示数型数据结构的教程
2015/04/03 Python
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
Python数组并集交集补集代码实例
2020/02/18 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
python利用线程实现多任务
2020/09/18 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
北京某公司的.net笔试题
2014/03/20 面试题
最新远光软件笔试题面试题内容
2013/11/08 面试题
应届毕业生求职信范例分享
2013/12/17 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书