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实现模拟时钟代码推荐
Nov 08 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
Python机器学习之决策树算法
Dec 22 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 Python
Python内置函数reversed()用法分析
Mar 20 Python
简单实现python数独游戏
Mar 30 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
python银行系统实现源码
Oct 25 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
利用Python实现自动扫雷小脚本
Dec 17 Python
Python爬虫定时计划任务的几种常见方法(推荐)
Jan 15 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+DBM的同学录程序(2)
2006/10/09 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
php实现的操作excel类详解
2016/01/15 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
jQuery 获取兄弟元素的几种不错方法
2014/05/23 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
jQuery实现进度条效果代码
2015/12/17 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
Python socket 套接字实现通信详解
2019/08/27 Python
Python笔记之工厂模式
2019/11/20 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
python爬虫工具例举说明
2020/11/30 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
解释下面关于J2EE的名词
2013/11/15 面试题
保安的辞职报告怎么写
2014/01/20 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书