使用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 相关文章推荐
35个Python编程小技巧
Apr 01 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
Python面向对象类的继承实例详解
Jun 27 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
python cumsum函数的具体使用
Jul 29 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
php数组去重复数据示例
2014/02/25 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
javascript制作2048游戏
2015/03/30 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
python读写文件write和flush的实现方式
2020/02/21 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
python 实现"神经衰弱"翻牌游戏
2020/11/09 Python
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
专科毕业生自我鉴定
2013/12/01 职场文书
中层干部竞争上岗演讲稿
2014/01/13 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle