使用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根据距离和时长计算配速示例
Feb 16 Python
Python3 能振兴 Python的原因分析
Nov 28 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
Python中用于检查英文字母大写的isupper()方法
May 19 Python
Python 通过打码平台实现验证码的实现
May 13 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
用vue.js组件模拟v-model指令实例方法
Jul 05 Python
python多进程并行代码实例
Sep 30 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
python对接ihuyi实现短信验证码发送
May 10 Python
解决keras模型保存h5文件提示无此目录问题
Jul 01 Python
windows系统Tensorflow2.x简单安装记录(图文)
Jan 18 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
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
json跟xml的对比分析
2008/06/10 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
值得收藏的vuejs安装教程
2017/11/21 Javascript
Angular实现点击按钮后在上方显示输入内容的方法
2017/12/27 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
Vue+Webpack完美整合富文本编辑器TinyMce的方法
2018/11/30 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
经典c++面试题四
2015/05/14 面试题
先进个人获奖感言
2014/01/24 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
爱护花草树木的标语
2014/06/11 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
2014年人事科工作总结
2014/11/19 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
Python基本的内置数据类型及使用方法
2022/04/13 Python