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

 更新时间:2020年06月19日 11:11:04   作者:cofisher  
这篇文章主要介绍了使用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()

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()

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 之按位运算举例解析一文。

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之图像阈值一文。

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 表示每条直线的两端坐标。

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源码学习之PyObject和PyTypeObject

    Python源码学习之PyObject和PyTypeObject

    今天给大家带来的是关于Python源码的相关知识学习,文章围绕着PyObject和PyTypeObject展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Python中exit、return、sys.exit()等使用实例和区别

    Python中exit、return、sys.exit()等使用实例和区别

    这篇文章主要介绍了Python中exit、return、sys.exit()等使用实例和区别,本文是一个实际项目中的总结,需要的朋友可以参考下
    2015-05-05
  • Python实现执行Shell命令并获取输出

    Python实现执行Shell命令并获取输出

    这篇文章主要介绍了如何借助 os.system() 从 Python 脚本执行 cmd 命令,以及如何借助 Python 中的 subprocess 模块以更简单的方式从脚本执行 cmd 命令,感兴趣的小伙伴可以了解下
    2023-10-10
  • Python编程快速上手——Excel到CSV的转换程序案例分析

    Python编程快速上手——Excel到CSV的转换程序案例分析

    这篇文章主要介绍了Python Excel到CSV的转换程序,结合具体案例形式分析了Python操作Excel到CSV转换的操作技巧与相关注意事项,需要的朋友可以参考下
    2020-02-02
  • Python源码解析之List

    Python源码解析之List

    今天带大家来复习Python底层代码LIST,文中有非常详细的介绍及代码示例,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • 跟老齐学Python之Python文档

    跟老齐学Python之Python文档

    文档,这个词语在经常在程序员的嘴里冒出来,有时候他们还经常以文档有没有或者全不全为标准来衡量一个软件项目是否高大上。那么,软件中的文档是什么呢?有什么要求呢?python文档又是什么呢?文档有什么用呢?
    2014-10-10
  • python opencv鼠标画矩形框之cv2.rectangle()函数

    python opencv鼠标画矩形框之cv2.rectangle()函数

    鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝不可,下面这篇文章主要给大家介绍了关于python opencv鼠标画矩形框cv2.rectangle()函数的相关资料,需要的朋友可以参考下
    2021-10-10
  • Python在Console下显示文本进度条的方法

    Python在Console下显示文本进度条的方法

    Python是一门与php有点像的编辑语言了,下文来给各位在利用Python实现进度条了,对Python在Console下显示文本进度条的方法相关知识感兴趣的朋友一起学习吧
    2016-02-02
  • Matplotlib快速入门指南(适合小白)

    Matplotlib快速入门指南(适合小白)

    这篇文章主要给大家介绍了关于Matplotlib快速入门指南的相关资料,Matplotlib是一个非常强大的Python画图工具,支持跨平台运行,它不仅是Python常用的2D绘图库,同时它也提供了一部分3D绘图接口,需要的朋友可以参考下
    2023-09-09
  • PYTHON如何读取和写入EXCEL里面的数据

    PYTHON如何读取和写入EXCEL里面的数据

    这篇文章主要介绍了PYTHON如何读取和写入EXCEL里面的数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论