毕设 车位识别车位检测车道线检测 - python opencv
毕设 车位识别车道线检测 - python opencv
你通常是否在停车场周围转来转去寻找停车位?如果能通过你的车辆得知最近的停车位在哪里那是不是很爽?研究表明利用深度学习技术结合OpenCV算法能够有效地解决这一问题通过实时获取停车场的画面信息即可实现
该项目可推荐用于毕业设计
毕设帮助、开题辅导、学术资源共享、问题解答服务(见文末)
检测效果
废话不多说, 先上效果图


注意车辆移动后空车位被标记上


车辆移动到其他车位
实现方式
整体思路
这个流程的第一步就是识别出每秒视频中所有可能存在的停车位位置。显然,在我们在能够确定哪些停车位未被占用之前,我们需要明确图像中哪些区域属于停车位区域。
第二步就是识别每一帧画面中的各类车辆。这样我们可以逐一分析每一辆汽车的运动轨迹。
第三部就是鉴定哪些车位目前是已占位的以及空闲的状态。这一步骤必须参考前面两步骤所得出的数据结果。
最后一步是当新车位出现时通知您。这是依据视频中前后两帧之间车辆位置的变化来判断的。
在每一个步骤中,我们都能够采用多种技术并以多种形式来实现目标。建立这个流程并不是存在一种绝对正确或错误的方法;然而,在不同方法之间存在优势与劣势的区别。
使用要使用到两个视觉识别技术 :识别空车位停车线,识别车辆
检测空车位
车位探测系统的初始阶段是识别停车位。存在一些方法能够实现这一目标。具体来说,在一个地点定位停车线是一种有效的方法。OpenCV提供了边缘检测器等工具来执行此任务。那么如果没有停车线怎么办?
我们可以使用的另一种方法也就是长时间未动车辆位于停车场的位置。换言之 有效的停车位即是那些静止未动车辆的位置。然而 这可能也会导致假阳性与真阴性的情况 这种现象可能导致假阳性结果与真阴性结果
如果自动化系统表现得不可靠的话,我们应该如何应对这种情况?我们可以采取手动方式进行操作。与基于空间的方法相比,在标注过程中需要分别对每一个停车位进行标注并进行训练不同的是我们只需标注一次停车场边界及其周边的道路区域即可为新出现的停车位配置好我们的系统。
在此处,请考虑从停车位的视频流中提取单帧并标注停车区域。Python库matplotlib为此功能提供了一个名为PolygonSelector的模块(该模块允许选择多边形区域)。
我开发了一个简洁的Python脚本用于标记输入视频中的特定多边形区域。该脚本接受视频路径作为输入,并将选定区域的坐标存储在一个pickle文件中作为输出结果。
import os
import numpy as np
import cv2
import pickle
import argparse
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.widgets import PolygonSelector
from matplotlib.collections import PatchCollection
from shapely.geometry import box
from shapely.geometry import Polygon as shapely_poly
points = []
prev_points = []
patches = []
total_points = []
breaker = False
class SelectFromCollection(object):
def __init__(self, ax):
self.canvas = ax.figure.canvas
self.poly = PolygonSelector(ax, self.onselect)
self.ind = []
def onselect(self, verts):
global points
points = verts
self.canvas.draw_idle()
def disconnect(self):
self.poly.disconnect_events()
self.canvas.draw_idle()
def break_loop(event):
global breaker
global globSelect
global savePath
if event.key == 'b':
globSelect.disconnect()
if os.path.exists(savePath):
os.remove(savePath)
print("data saved in "+ savePath + " file")
with open(savePath, 'wb') as f:
pickle.dump(total_points, f, protocol=pickle.HIGHEST_PROTOCOL)
exit()
def onkeypress(event):
global points, prev_points, total_points
if event.key == 'n':
pts = np.array(points, dtype=np.int32)
if points != prev_points and len(set(points)) == 4:
print("Points : "+str(pts))
patches.append(Polygon(pts))
total_points.append(pts)
prev_points = points
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('video_path', help="Path of video file")
parser.add_argument('--out_file', help="Name of the output file", default="regions.p")
args = parser.parse_args()
global globSelect
global savePath
savePath = args.out_file if args.out_file.endswith(".p") else args.out_file+".p"
print("\n> Select a region in the figure by enclosing them within a quadrilateral.")
print("> Press the 'f' key to go full screen.")
print("> Press the 'esc' key to discard current quadrilateral.")
print("> Try holding the 'shift' key to move all of the vertices.")
print("> Try holding the 'ctrl' key to move a single vertex.")
print("> After marking a quadrilateral press 'n' to save current quadrilateral and then press 'q' to start marking a new quadrilateral")
print("> When you are done press 'b' to Exit the program\n")
video_capture = cv2.VideoCapture(args.video_path)
cnt=0
rgb_image = None
while video_capture.isOpened():
success, frame = video_capture.read()
if not success:
break
if cnt == 5:
rgb_image = frame[:, :, ::-1]
cnt += 1
video_capture.release()
while True:
fig, ax = plt.subplots()
image = rgb_image
ax.imshow(image)
p = PatchCollection(patches, alpha=0.7)
p.set_array(10*np.ones(len(patches)))
ax.add_collection(p)
globSelect = SelectFromCollection(ax)
bbox = plt.connect('key_press_event', onkeypress)
break_event = plt.connect('key_press_event', break_loop)
plt.show()
globSelect.disconnect()

(PS: 若代码出现bug可反馈博主, 及时修改)
车辆识别
为了检测视频中的汽车对象,我们采用了Mask-RCNN算法。这是一个基于卷积神经网络构建的对象检测模型。该模型通过基于来自多个数据集(如COCO数据集)的大量图像与视频样本进行训练,并利用其强大的特征提取能力,在复杂场景下准确识别并定位不同种类的目标及其边界信息。
除了每个检测到的对象的分类结果以及其边界框位置之外,在Mask RCNN中还返回了图像中每个检测对象所对应的像素级别的掩膜信息。这种基于像素级别的掩膜技术被称为"实例分割"。在计算机视觉领域取得的进步包括自动驾驶汽车和机器人等先进应用。
M-RCNN可用于视频中的每一帧,并输出一个字典来记录边界框坐标、物体mask、预测置信度以及类别ID。目前我们通过class_ids筛选出不属于汽车、卡车或公交车的边界框位置。随后将在下一步中基于这些框计算IoU值。
因为Mask-RCNN相对复杂,在篇幅有限的情况下,请mask-RCNN的朋友们联系博主以获取相关资料。最后仅展示效果
最后
📚 作者简介:涵盖机器学习、深度学习及相关技术如卷积神经网络等。
🚀在B站上开设了项目实战课程。
🤝如果觉得文章对你有帮助,请随时评论区留言💬并点赞👍、收藏⭐️ 加关注✨。
🌱个人服务 🌱 服务详情请参考 个人主页。
