时间:2021-05-22
项目介绍
下图中的两条线即为车道:
我们的任务就是通过 OpenCV 在一段视频(或摄像头)中实时检测出车道并将其标记出来。其效果如下图所示:
这里使用的代码来源于磐怼怼大神,此文章旨在对其代码进行解释。
实现步骤
1、将视频的所有帧读取为图片;
2、创建掩码并应用到这些图片上;
3、图像阈值化;
4、用霍夫线变换检测车道;
5、将车道画到每张图片上;
6、将所有图片合并为视频。
代码实现
1、导入需要的库
import osimport reimport cv2import numpy as npfrom tqdm import notebookimport 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 frameplt.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)
输入:
输出:
lines:一个三维矩阵,其形状符合 (m, 1, n),其中 m 表示直线个数,n 表示每条直线的两端坐标。
4、对每张图片进行上一步骤的处理后写入视频
4.1 定义视频格式
# 输出视频路径pathOut = 'roads_v2.mp4'# 视频每秒的帧数fps = 30.0# 视频中每一帧的尺寸height, width = img.shapesize = (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 osimport reimport cv2import numpy as npfrom tqdm import notebookimport matplotlib.pyplot as pltcol_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.0height, width = img.shapesize = (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 车道实时检测内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
python+opencv车道线检测(简易实现),供大家参考,具体内容如下技术栈:python+opencv实现思路:1、canny边缘检测获取图中的边缘信息;
本文主要介绍了用OpenCV进行年龄和性别检测的实现示例,分享给大家,具体如下:在本文中,我将带您完成用Python进行机器学习的年龄和性别检测的任务。年龄和性
今天的目标是用OpenCV实现对运动目标的检测,这里选用三帧帧差法。代码如下:#include#include#include#include#included
本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下前言1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现。2
OpenCV的人脸检测功能在一般场合还是不错的。而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码。写代码之前应该先安装