使用OpenCV对车道进行实时检测的实现示例代码


Posted in Python onJune 19, 2020

项目介绍

下图中的两条线即为车道:

使用OpenCV对车道进行实时检测的实现示例代码

我们的任务就是通过 OpenCV 在一段视频(或摄像头)中实时检测出车道并将其标记出来。其效果如下图所示:

使用OpenCV对车道进行实时检测的实现示例代码

这里使用的代码来源于磐怼怼大神,此文章旨在对其代码进行解释。

实现步骤

1、将视频的所有帧读取为图片;

2、创建掩码并应用到这些图片上;

3、图像阈值化;

4、用霍夫线变换检测车道;

5、将车道画到每张图片上;

6、将所有图片合并为视频。

代码实现

1、导入需要的库

import os
import re
import cv2
import numpy as np
from tqdm import notebook
import matplotlib.pyplot as plt

其中 tqdm.notebook 是用来显示进度条的。

2、将图片(视频的每一帧)加载进来

这里我们已经将视频的每一帧读取为图片了,并将它们都放进 frames 文件夹。

# 获取帧的文件名
col_frames = os.listdir('frames/') # 读取 frames 文件夹下的所有图片
col_frames.sort(key=lambda f: int(re.sub('\D', '', f))) # 按名称对图片进行排序

# 加载帧
col_images=[]
for i in notebook.tqdm(col_frames):
  img = cv2.imread('frames/'+i)
  col_images.append(img) # 将所有图片添加进 col_images 列表

3、选择一张图片进行处理

3.1 选定一张图片

# 指定一个索引
idx = 457

# plot frame
plt.figure(figsize=(10,10))
plt.imshow(col_images[idx][:,:,0], cmap= "gray")
plt.show()

使用OpenCV对车道进行实时检测的实现示例代码

3.2 创建掩码

# 创建0矩阵
stencil = np.zeros_like(col_images[idx][:,:,0])

# 指定多边形的坐标
polygon = np.array([[50,270], [220,160], [360,160], [480,270]])

# 用1填充多边形
cv2.fillConvexPoly(stencil, polygon, 1)

# 画出多边形
plt.figure(figsize=(10,10))
plt.imshow(stencil, cmap= "gray")
plt.show()

使用OpenCV对车道进行实时检测的实现示例代码

3.3 将掩码应用到图片上

# 应用该多边形作为掩码
img = cv2.bitwise_and(col_images[idx][:,:,0], col_images[idx][:,:,0], mask=stencil)

# 画出掩码后的图片
plt.figure(figsize=(10,10))
plt.imshow(img, cmap= "gray")
plt.show()

这里的按位与操作 cv2.bitwise_and() 可以参考OpenCV 之按位运算举例解析一文。

使用OpenCV对车道进行实时检测的实现示例代码

3.4 图像阈值化

# 应用图像阈值化
ret, thresh = cv2.threshold(img, 130, 145, cv2.THRESH_BINARY)

# 画出图像
plt.figure(figsize=(10,10))
plt.imshow(thresh, cmap= "gray")
plt.show()

其中 cv2.threshold 函数的用法可以参考Opencv之图像阈值一文。

使用OpenCV对车道进行实时检测的实现示例代码

3.5 霍夫线变换检测车道

lines = cv2.HoughLinesP(thresh, 1.0, np.pi/180, 30, maxLineGap=200)

# 创建原始帧的副本
dmy = col_images[idx][:,:,0].copy()

# 霍夫线
for line in lines:
  x1, y1, x2, y2 = line[0] # 提取出霍夫线的坐标
  cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3) # 将霍夫线画在帧上

# 画出帧
plt.figure(figsize=(10,10))
plt.imshow(dmy, cmap= "gray")
plt.show()

cv2.HoughLinesP() 函数介绍:

lines = HoughLinesP(image, rho, theta, threshold, minLineLength=None, maxLineGap=None)

输入:

  • image: 必须是二值图像;
  • rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0
  • theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
  • threshod: 累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。
  • minLineLength:线段以像素为单位的最小长度。
  • maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔,超过了设定值,则把两条线段当成一条线段。

输出:

lines:一个三维矩阵,其形状符合 (m, 1, n),其中 m 表示直线个数,n 表示每条直线的两端坐标。

使用OpenCV对车道进行实时检测的实现示例代码

4、对每张图片进行上一步骤的处理后写入视频

4.1 定义视频格式

# 输出视频路径
pathOut = 'roads_v2.mp4'

# 视频每秒的帧数
fps = 30.0

# 视频中每一帧的尺寸
height, width = img.shape
size = (width,height)

# 写入视频
out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)

4.2 处理所有图片并写入视频文件

for img in notebook.tqdm(col_images):

  # 应用帧掩码
  masked = cv2.bitwise_and(img[:,:,0], img[:,:,0], mask=stencil)

  # 应用图像阈值化
  ret, thresh = cv2.threshold(masked, 130, 145, cv2.THRESH_BINARY)

  # 应用霍夫线变换
  lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)
  dmy = img.copy()

  #画出检测到的线
  try:
    for line in lines:
      x1, y1, x2, y2 = line[0]
      cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)

    out.write(dmy)

  except TypeError: 
    out.write(img)

out.release()

完整代码

import os
import re
import cv2
import numpy as np
from tqdm import notebook
import matplotlib.pyplot as plt

col_frames = os.listdir('frames/')
col_frames.sort(key=lambda f: int(re.sub('\D', '', f)))

col_images=[]
for i in notebook.tqdm(col_frames):
  img = cv2.imread('frames/'+i)
  col_images.append(img)

stencil = np.zeros_like(col_images[0][:,:,0])
polygon = np.array([[50,270], [220,160], [360,160], [480,270]])
cv2.fillConvexPoly(stencil, polygon, 1)

pathOut = 'roads_v2.mp4'

fps = 30.0

height, width = img.shape
size = (width,height)

out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)

for img in notebook.tqdm(col_images):

  masked = cv2.bitwise_and(img[:,:,0], img[:,:,0], mask=stencil)

  ret, thresh = cv2.threshold(masked, 130, 145, cv2.THRESH_BINARY)

  lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)
  dmy = img.copy()

  try:
    for line in lines:
      x1, y1, x2, y2 = line[0]
      cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)

    out.write(dmy)

  except TypeError: 
    out.write(img)

out.release()

到此这篇关于使用OpenCV对车道进行实时检测的实现示例代码的文章就介绍到这了,更多相关OpenCV 车道实时检测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
更改Python命令行交互提示符的方法
Jan 14 Python
python类继承与子类实例初始化用法分析
Apr 17 Python
举例讲解Python的Tornado框架实现数据可视化的教程
May 02 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
Python中支持向量机SVM的使用方法详解
Dec 26 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
django使用多个数据库的方法实例
Mar 04 Python
python非标准时间的转换
Jul 25 Python
Python中的datetime包与time包包和模块详情
Feb 28 Python
python中 .npy文件的读写操作实例
Apr 14 Python
为什么python比较流行
Jun 19 #Python
查看keras的默认backend实现方式
Jun 19 #Python
Python图像阈值化处理及算法比对实例解析
Jun 19 #Python
OpenCV 之按位运算举例解析
Jun 19 #Python
Python实现ElGamal加密算法的示例代码
Jun 19 #Python
python 字符串的驻留机制及优缺点
Jun 19 #Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 #Python
You might like
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
利用JS实现数字增长
2016/07/28 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
python登陆asp网站页面的实现代码
2015/01/14 Python
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python之str操作方法(详解)
2017/06/19 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
Python向excel中写入数据的方法
2019/05/05 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
django 控制页面跳转的例子
2019/08/06 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
协议书怎么写
2014/04/21 职场文书
党员民主评议总结
2014/10/20 职场文书
教师节老师寄语
2015/05/28 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL