精华内容
下载资源
问答
  • 不停车检测系统
    2022-03-01 00:49:05

    各位小伙伴大家好,今天将会带领大家一起学习如何搭建一个违章停车检测系统。需要重点说明的是,今天使用的逻辑和判定条件比较难,尤其是他的编程实现。不过小伙伴不要怕,我们提供了项目的开源代码,具体链接如下:

    https://github.com/hasantha-nirmal/Traffic_Violation_Detection_Yolov4_Deep-Sort

    接下来我们将详细介绍如何实现这个系统

    首先,我们需要简要了解一下这个项目中的停车违章检测是什么意思。为了介绍方便,我们将穿插使用学术术语和生活用语。想象一下,我们有一个感兴趣的区域也可以称为某个地方,车辆不应该停放在那里。但是,如果车辆只是停在那里一会儿,我们也不能将其是为为违章,例如马路边允许临时停车的区域。如果我们正在谈论的这个区域离道路太近,那么经过的车辆可能会与这个感兴趣的区域相交,并且会立即被视为违章。所以首先,我们必须消除这种情况。也就是首先解决临时停车不会判定为违章的情况。最简单的解决方案是为每辆单独的车辆引入计时器。由此,我们可以确保车辆已经在该限制区域内停留了多长时间。

    采用感兴趣区域作为停车位,我们只需使用一个摄像头即可,同时这个摄像头不仅可以同时监控和检测特定车辆占用该停车位的时间,还可以计算出每辆车必须支付的费用停车场。当然了,这需要额外的开发,这里小白做过多的介绍

    我们前面说过,我们需要建立一个计时器。这个任务的难点是需要考虑许多车辆肯定会同时出现,这使得任务变得比较复杂。不过也没有关系,我们只需要为不同的车辆设置不同的计时器即可。

    接下来我们将详细介绍如何通过代码实现上述的功能。

    # Parking space coordinates; #line 113
    parking_co = []
    
    
    #blanked = np.zeros((658,1024), dtype=np.uint8)
    blanked = np.zeros((2048, 1024), dtype=np.uint8)
    #pts = np.array(([156, 704], [2, 893], [476, 932], [270, 708]))
    pts = np.array(([513, 716], [321, 943], [884, 979], [630, 701]))
    #blanked = np.zeros((720,1280), dtype=np.uint8)
    #pts = np.array(([38, 433], [95, 322], [1246, 570], [1065, 709]))
    cv2.fillPoly(blanked, np.int32([pts]), 255)

    上面的代码给出了我们如何选择停车位作为我们的感兴趣区域。我们首先定义了一个名为park_co的空白数组,之后创建了一个于图像分辨率具有相同高度或者相同宽度的一个权威零的数组。之后选择感兴趣区域的顶点坐标。在pts变量中存放我们选择的感兴趣区域的顶点坐标。之后我们使用OpenCV中的fillPoly函数将感兴趣区域填充上,以便于我们判断车辆是否与感兴趣区域相交。

    感兴趣区域的选择如下图所示

    c63a9402db144a29e2a63380ec67fdb0.png

    现在,我们有了感兴趣的区域或禁止车辆停放的地方的像素的所有坐标点。然后我们选取车辆的边界框坐标(如何识别车辆呢,可以参考小白之前的文章)。但是,这又带来了一个问题。如果相机离这个感兴趣区域太近,当有车辆接近该区域时,它的边界框会占据非常多的坐标点,当同时有车辆时,必须对视频的每一帧重复这个过程,导致帧率急剧下降。所以,我对这个案例提出了一个假设:如果一个车辆/边界框与这个 ROI 相交,它肯定也与边界框的底线相交。所以就像在车道线违例中一样,而不是取车辆的所有边界框坐标

    bbox_bottom_line_co = list(zip(*line(*(int(bbox[0])+50,int(bbox[3])), *(int(bbox[2])-50,int(bbox[3])))))

    上面是提取底线坐标的代码。我们通过从线条的每一侧移除 50 个像素坐标来减少线条长度,以便更好地表示车辆。因此,该线始终停留在车辆区域内,并且不占用其周围的任何空闲空间。

    if len(intersection(parking_co, bbox_bottom_line_co)) > 0:
    frame_matrix.append((str(frame_num) + class_name + str(t),
    (
    str(int(bbox[0])).zfill(4), str(int(bbox[1])).zfill(4), str(int(bbox[2])).zfill(4),
    str(int(bbox[3])).zfill(4))))

    想象一辆车第一次与该地区相交。当它发生在特定帧内的那一刻,我们立即附加该事件的帧号frame_num车辆类型(class_name),车辆跟踪 ID(str(t))和该车辆在该帧的边界框坐标

    chk_index = str(frame_matrix).find(str(frame_num — 1) + class_name + str(t))

    然后立即检查前一帧是否为同一车辆发生了相同类型的相交点。如果这个相交点是第一次发生,则不满足这个条件,程序进入下一帧,没有任何进一步的交互。但是想象一下,如果这是车辆与感兴趣区域相交后的第二帧,那么会为这个chk_index变量赋一个值。

    if bool(chk_index + 1) == True:
    previous_bbox_co_str = str(frame_matrix)[
    (chk_index — 1) + len(str(frame_num — 1)) + len(class_name + str(t)) + 5:(chk_index — 1) + len(str(frame_num — 1)) + len(class_name + str(t)) + 5 + 30]

    我们首先对( chk_index+1 )的布尔值给出一个正值。设置为1的原因是,对于特定车辆,它的日志详细信息可能从数组的最开头开始,因此将其在数组中的放置值设置为 0。如果发生这种情况,bool(0)会使条件为 false即使它为真。如果没有这样的日志条目,则 chk_index仅返回 -1,当设为 +1 时,它会给出所需的 False 输出。

    此外,当该条件为真时,将会有关于边界框的前一帧日志详细信息获取到另一个名为previous_bbox_co_str的变量中。

    现在我们知道了车辆在当前帧和前一帧的边界框坐标。由于我们一直都知道车辆一直在 ROI 中,因此我们需要确定车辆是静止(不动)还是移动的。这里我们声明了一个名为immobile的新函数,用于实现这个功能。

    # Check the immobility of vehicle #line 99
    def immobile(bbox, previous_bbox_str):
    previous_bbox0 = int(previous_bbox_str[1:5])
    previous_bbox1 = int(previous_bbox_str[9:13])
    previous_bbox2 = int(previous_bbox_str[17:21])
    previous_bbox3 = int(previous_bbox_str[25:29])
    
    
    total = abs(bbox[0] — previous_bbox0) + abs(bbox[1] — previous_bbox1) + abs(bbox[2] — previous_bbox2) + abs(
    bbox[3] — previous_bbox3)
    if total <= 4:
    return True
    else:
    return False

    这里我们使用了previous_bbox_co_str作为函数的属性,以及当前的边界框坐标。我们分别计算xmin、ymin、xmax 和 ymax 值的差值,如果绝对差值小于 4,输出 True,表示车辆是不动的,否则输出 False。

    需要注意,即使车辆或任何物体完全停止,YOLO 也会给出波动的边界框坐标。为避免这个现象并使此过程稳健,我们在此处将判定变量设置为比较高的值。该值越高,程序对边界框的随机波动就越鲁棒。

    因此,如果作为车辆的函数输出是不动的(静止的),那么我们需要立即检查 cache_matrix 中是否有任何先前记录的条目,如果没有,我们需要加上当前时间(t_start)和车辆类型(class_name)并跟踪标识(str(t))

    if str((class_name + str(t))) not in str(cache_matrix): #line 310 t_start
    = datetime.now()
    cache_matrix.append((str(t_start), class_name + str(t)))
    print(cache_matrix)

    之后,我们检查车辆是否在cache_matrix中。同时还要检查同一辆车是否也在viol_matrix中。(因为我已经将违规车辆记录,这些车辆已经静止并超过了时间限制)。如果不是,我们应立即检索该特定车辆的t_start值并使用当前时间检查不同的时间。

    index = (str(cache_matrix).find(str((class_name + str(t))))) #line 318
    t_start_cm = str(cache_matrix)[index — 28:index — 11]
    t_spending = (datetime.now() — datetime.strptime(t_start_cm,
    ‘%y-%m-%d %H:%M:%S’)).total_seconds()

    如果时间差 (t_spending) 超过时间限制,那么我们将详细信息记录到电子表格中,其中包括车辆第一次进入时间 (t_start_cm)、车辆类型 (class_name) 和车辆跟踪 ID (str(t)) . 在这种情况下,出于演示目的,我们将计时器设置为 10 秒。示例如下

    78e0153872b65e12ff74dbe0e1ee3055.png

    sheet.write(row_num, 0, str(t_start_cm), style) #line 328
    # sheet.write(row_num, 1, str(round(t_spending, 2)), style)
    sheet.write(row_num, 1, str(class_name ) + str(t), style)
    row_num += 1
    workbook.save('outputs/xlsx/parking/details.xls')

    然后我们必须将这辆特定车辆作为日志条目放入viol_matrix数组中,因为该车辆现在已经违规了。这避免了进一步的重复和错误的日志条目。然后,我们可以拍摄该违规车辆的图像并将其保存为车辆类型,并将跟踪 ID 作为其名称。

    viol_matrix.append((str((class_name + str(t))))) #line 334
    # print(t_start_cm, t_spending, datetime.now())
    cropped = image.crop((int(bbox[0]), int (bbox[1]), int(bbox[2]), int(bbox[3])))
    cropped.save(
    'outputs/caps_of_detections/parking/' + str(
    class_name) + str(t) + str(' .jpg'))

    以上基本上是我们设计的违章停车检测系统的想法。为避免frame_matrix的内存过载,每超过107 个条目使用以下函数刷新该数组。

    #Avoid buffer overflow #line 353
    if len(frame_matrix)>10⁷:
    frame_matrix=[]

    以上就是本文的全部内容啦,感兴趣的小伙伴们可以操练其来了!

    
     
    
     
    
     
    
     
    
     
    往期精彩回顾
    
    
    
    
    适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
    AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

    1bdc803ae9a2c38b7767c1c482ff3c9b.png

    更多相关内容
  • 公路超限不停车检测系统促进公路管理信息化的探讨.docx
  • 不停车超限检测系统.pdf
  • Python版停车检测系统

    2022-05-05 21:57:04
    可以实现视频内车位是否有车已经空闲车位数量,可以实时检测车位情况。
  • 违章停车检测系统.rar,uxxntitled.asv,cifar10NetRCNN.mat,5.png,1653486236(1).jpg,Untitled3.m,Copy_of_Untitled.m,1.png,uxxntitled.m,uxxntitled.fig,违章停车检测系统.docx,2.png,Copy_of_Untitled3.m,3....
  • 为了构建基于无线传感器网络的大规模、低成本、低功耗的城市路边停车检测系统,本文提出了一种停车检测传感器节点硬件及软件设计方案。该系统硬件部分利用磁阻传感器实现车辆磁信号检测,软件部分主要实现基于磁信号...
  • 本设计利用SPCE061A实现了停车场进出车辆的自动检测,闸杆机的自动起落及车位信息的实时显示,配合IC卡信息处理及图像处理系统即可实现智能停车场的自动化管理。地感线圈的应用使得对车辆的检测准确无误,保证了系统...
  • 不停车超限检测系统PPT课件.pptx
  • 不停车超限检测系统学习教案.pptx
  •  当ETC系统检测到车辆进入ETC车道时,安装在龙门架上的RSU与安装在汽车挡风玻璃上的OBU进行信息交换,车道计算机根据OBU中的信息识别车辆,并根据车主的使用情况扣除通行费用。交易成功后,车道栏杆自动升起,放行...
  • 不停车超限检测系统PPT学习教案.pptx
  • 汽车持有量逐年递增,但同时也导致了交通状况的日益恶化,为解决不断加剧的交通拥堵问题,提高交通质量与通行能力,在目前的市场上许多的智能运输交通系统应运而生,其中就包括无线停车场的空位检测系统等。...
  • 吉安市公路不停车超限检测系统建设工程.doc
  • 不停车快速超限检测系统在小店超限检测点的应用.docx
  •  当ETC系统检测到车辆进入ETC车道时,安装在龙门架上的RSU与安装在汽车挡风玻璃上的OBU进行信息交换,车道计算机根据OBU中的信息识别车辆,并根据车主的使用情况扣除通行费用。交易成功后,车道栏杆自动升起,放行...
  • 基于Zigbee的停车场空位检测系统
  • 本文设计了一种智能停车场的车位信息检测及管理系统系统通过在停车场车位上安装地磁感应装置,实时采集车位的状态信息,然后借助GPRS无线网络传输至信息管理平台,信息管理平台进行后续数据的处理及信息显示,最后...
  • matlab分时代码使用深度学习的基于图像的实时停车检测和自动停车位偏离:教程 这是我们即将上书的章节的MATLAB教程(将很快更新详细信息)。 我们提供了一个预先编译好的MATLAB文件(.mlx文件),其中包含所有结果...
  • 使用OpenCV搭建违章停车检测系统

    千次阅读 2022-02-24 01:23:47
    点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达各位小伙伴大家好,今天将会带领大家一起学习如何搭建一个违章停车检测系统。需要重点说明的是,今天使用的逻辑和判定条件比较...

    点击上方“小白学视觉”,选择加"星标"或“置顶

    重磅干货,第一时间送达3bf1c05bb3d05cae7518b7fbf26c32f0.png

    各位小伙伴大家好,今天将会带领大家一起学习如何搭建一个违章停车检测系统。需要重点说明的是,今天使用的逻辑和判定条件比较难,尤其是他的编程实现。不过小伙伴不要怕,我们提供了项目的开源代码,具体链接如下:

    https://github.com/hasantha-nirmal/Traffic_Violation_Detection_Yolov4_Deep-Sort

    接下来我们将详细介绍如何实现这个系统

    首先,我们需要简要了解一下这个项目中的停车违章检测是什么意思。为了介绍方便,我们将穿插使用学术术语和生活用语。想象一下,我们有一个感兴趣的区域也可以称为某个地方,车辆不应该停放在那里。但是,如果车辆只是停在那里一会儿,我们也不能将其是为为违章,例如马路边允许临时停车的区域。如果我们正在谈论的这个区域离道路太近,那么经过的车辆可能会与这个感兴趣的区域相交,并且会立即被视为违章。所以首先,我们必须消除这种情况。也就是首先解决临时停车不会判定为违章的情况。最简单的解决方案是为每辆单独的车辆引入计时器。由此,我们可以确保车辆已经在该限制区域内停留了多长时间。

    采用感兴趣区域作为停车位,我们只需使用一个摄像头即可,同时这个摄像头不仅可以同时监控和检测特定车辆占用该停车位的时间,还可以计算出每辆车必须支付的费用停车场。当然了,这需要额外的开发,这里小白做过多的介绍

    我们前面说过,我们需要建立一个计时器。这个任务的难点是需要考虑许多车辆肯定会同时出现,这使得任务变得比较复杂。不过也没有关系,我们只需要为不同的车辆设置不同的计时器即可。

    接下来我们将详细介绍如何通过代码实现上述的功能。

    # Parking space coordinates; #line 113
    parking_co = []
    
    
    #blanked = np.zeros((658,1024), dtype=np.uint8)
    blanked = np.zeros((2048, 1024), dtype=np.uint8)
    #pts = np.array(([156, 704], [2, 893], [476, 932], [270, 708]))
    pts = np.array(([513, 716], [321, 943], [884, 979], [630, 701]))
    #blanked = np.zeros((720,1280), dtype=np.uint8)
    #pts = np.array(([38, 433], [95, 322], [1246, 570], [1065, 709]))
    cv2.fillPoly(blanked, np.int32([pts]), 255)

    上面的代码给出了我们如何选择停车位作为我们的感兴趣区域。我们首先定义了一个名为park_co的空白数组,之后创建了一个于图像分辨率具有相同高度或者相同宽度的一个权威零的数组。之后选择感兴趣区域的顶点坐标。在pts变量中存放我们选择的感兴趣区域的顶点坐标。之后我们使用OpenCV中的fillPoly函数将感兴趣区域填充上,以便于我们判断车辆是否与感兴趣区域相交。

    感兴趣区域的选择如下图所示

    8bf6b87a63f2a5ff053d7029fdd7a4c8.png

    现在,我们有了感兴趣的区域或禁止车辆停放的地方的像素的所有坐标点。然后我们选取车辆的边界框坐标(如何识别车辆呢,可以参考小白之前的文章)。但是,这又带来了一个问题。如果相机离这个感兴趣区域太近,当有车辆接近该区域时,它的边界框会占据非常多的坐标点,当同时有车辆时,必须对视频的每一帧重复这个过程,导致帧率急剧下降。所以,我对这个案例提出了一个假设:如果一个车辆/边界框与这个 ROI 相交,它肯定也与边界框的底线相交。所以就像在车道线违例中一样,而不是取车辆的所有边界框坐标

    bbox_bottom_line_co = list(zip(*line(*(int(bbox[0])+50,int(bbox[3])), *(int(bbox[2])-50,int(bbox[3])))))

    上面是提取底线坐标的代码。我们通过从线条的每一侧移除 50 个像素坐标来减少线条长度,以便更好地表示车辆。因此,该线始终停留在车辆区域内,并且不占用其周围的任何空闲空间。

    if len(intersection(parking_co, bbox_bottom_line_co)) > 0:
    frame_matrix.append((str(frame_num) + class_name + str(t),
    (
    str(int(bbox[0])).zfill(4), str(int(bbox[1])).zfill(4), str(int(bbox[2])).zfill(4),
    str(int(bbox[3])).zfill(4))))

    想象一辆车第一次与该地区相交。当它发生在特定帧内的那一刻,我们立即附加该事件的帧号frame_num车辆类型(class_name),车辆跟踪 ID(str(t))和该车辆在该帧的边界框坐标

    chk_index = str(frame_matrix).find(str(frame_num — 1) + class_name + str(t))

    然后立即检查前一帧是否为同一车辆发生了相同类型的相交点。如果这个相交点是第一次发生,则不满足这个条件,程序进入下一帧,没有任何进一步的交互。但是想象一下,如果这是车辆与感兴趣区域相交后的第二帧,那么会为这个chk_index变量赋一个值。

    if bool(chk_index + 1) == True:
    previous_bbox_co_str = str(frame_matrix)[
    (chk_index — 1) + len(str(frame_num — 1)) + len(class_name + str(t)) + 5:(chk_index — 1) + len(str(frame_num — 1)) + len(class_name + str(t)) + 5 + 30]

    我们首先对( chk_index+1 )的布尔值给出一个正值。设置为1的原因是,对于特定车辆,它的日志详细信息可能从数组的最开头开始,因此将其在数组中的放置值设置为 0。如果发生这种情况,bool(0)会使条件为 false即使它为真。如果没有这样的日志条目,则 chk_index仅返回 -1,当设为 +1 时,它会给出所需的 False 输出。

    此外,当该条件为真时,将会有关于边界框的前一帧日志详细信息获取到另一个名为previous_bbox_co_str的变量中。

    现在我们知道了车辆在当前帧和前一帧的边界框坐标。由于我们一直都知道车辆一直在 ROI 中,因此我们需要确定车辆是静止(不动)还是移动的。这里我们声明了一个名为immobile的新函数,用于实现这个功能。

    # Check the immobility of vehicle #line 99
    def immobile(bbox, previous_bbox_str):
    previous_bbox0 = int(previous_bbox_str[1:5])
    previous_bbox1 = int(previous_bbox_str[9:13])
    previous_bbox2 = int(previous_bbox_str[17:21])
    previous_bbox3 = int(previous_bbox_str[25:29])
    
    
    total = abs(bbox[0] — previous_bbox0) + abs(bbox[1] — previous_bbox1) + abs(bbox[2] — previous_bbox2) + abs(
    bbox[3] — previous_bbox3)
    if total <= 4:
    return True
    else:
    return False

    这里我们使用了previous_bbox_co_str作为函数的属性,以及当前的边界框坐标。我们分别计算xmin、ymin、xmax 和 ymax 值的差值,如果绝对差值小于 4,输出 True,表示车辆是不动的,否则输出 False。

    需要注意,即使车辆或任何物体完全停止,YOLO 也会给出波动的边界框坐标。为避免这个现象并使此过程稳健,我们在此处将判定变量设置为比较高的值。该值越高,程序对边界框的随机波动就越鲁棒。

    因此,如果作为车辆的函数输出是不动的(静止的),那么我们需要立即检查 cache_matrix 中是否有任何先前记录的条目,如果没有,我们需要加上当前时间(t_start)和车辆类型(class_name)并跟踪标识(str(t))

    if str((class_name + str(t))) not in str(cache_matrix): #line 310 t_start
    = datetime.now()
    cache_matrix.append((str(t_start), class_name + str(t)))
    print(cache_matrix)

    之后,我们检查车辆是否在cache_matrix中。同时还要检查同一辆车是否也在viol_matrix中。(因为我已经将违规车辆记录,这些车辆已经静止并超过了时间限制)。如果不是,我们应立即检索该特定车辆的t_start值并使用当前时间检查不同的时间。

    index = (str(cache_matrix).find(str((class_name + str(t))))) #line 318
    t_start_cm = str(cache_matrix)[index — 28:index — 11]
    t_spending = (datetime.now() — datetime.strptime(t_start_cm,
    ‘%y-%m-%d %H:%M:%S’)).total_seconds()

    如果时间差 (t_spending) 超过时间限制,那么我们将详细信息记录到电子表格中,其中包括车辆第一次进入时间 (t_start_cm)、车辆类型 (class_name) 和车辆跟踪 ID (str(t)) . 在这种情况下,出于演示目的,我们将计时器设置为 10 秒。示例如下

    2993208087f62d3aa1356bb7d69036e6.png

    sheet.write(row_num, 0, str(t_start_cm), style) #line 328
    # sheet.write(row_num, 1, str(round(t_spending, 2)), style)
    sheet.write(row_num, 1, str(class_name ) + str(t), style)
    row_num += 1
    workbook.save('outputs/xlsx/parking/details.xls')

    然后我们必须将这辆特定车辆作为日志条目放入viol_matrix数组中,因为该车辆现在已经违规了。这避免了进一步的重复和错误的日志条目。然后,我们可以拍摄该违规车辆的图像并将其保存为车辆类型,并将跟踪 ID 作为其名称。

    viol_matrix.append((str((class_name + str(t))))) #line 334
    # print(t_start_cm, t_spending, datetime.now())
    cropped = image.crop((int(bbox[0]), int (bbox[1]), int(bbox[2]), int(bbox[3])))
    cropped.save(
    'outputs/caps_of_detections/parking/' + str(
    class_name) + str(t) + str(' .jpg'))

    以上基本上是我们设计的违章停车检测系统的想法。为避免frame_matrix的内存过载,每超过107 个条目使用以下函数刷新该数组。

    #Avoid buffer overflow #line 353
    if len(frame_matrix)>10⁷:
    frame_matrix=[]

    以上就是本文的全部内容啦,感兴趣的小伙伴们可以操练其来了!

    下载1:OpenCV-Contrib扩展模块中文版教程

    在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

    下载2:Python视觉实战项目52讲

    在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

    下载3:OpenCV实战项目20讲

    在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

    交流群

    欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

    b0de7cd838c05841f2e74dedecc473f1.png

    b413ee7235caf613f0cf59051292b0d3.png

    展开全文
  • 行业资料-电子功用-基于车辆动态检测技术的电子不停车收费车道系统
  • 行业资料-交通装置-一种基于停车检测停车指引系统.zip
  • 系统通过红外对管检测是否有车辆进入停车场,通过LCD12864实时显示停车位车辆数,显示费用等
  • 行业资料-电子功用-基于车辆动态检测技术的电子不停车收费车道系统及方法
  • 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是基于机器视觉的停车位识别检测学长这里给一个题目综合评分(每项满分5分)难度系数:4分工作量:4分创新点:3分。...

    1 简介

    🔥 Hi,大家好,这里是丹成学长的毕设系列文章!

    🔥 对毕设有任何疑问都可以问学长哦!

    这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是

    🚩 基于机器视觉的停车位识别检测

    🥇学长这里给一个题目综合评分(每项满分5分)

    • 难度系数:4分
    • 工作量:4分
    • 创新点:3分

    🧿 选题指导, 项目分享:

    https://blog.csdn.net/Mr_DC_IT/article/details/126460477

    2 检测效果

    废话不多说, 先上效果图
    在这里插入图片描述
    在这里插入图片描述
    注意车辆移动后空车位被标记上
    在这里插入图片描述
    在这里插入图片描述

    车辆移动到其他车位

    在这里插入图片描述

    3 实现方式

    3.1 整体思路

    这个流程的第一步就是检测一帧视频中所有可能的停车位。显然,在我们能够检测哪个是没有被占用的停车位之前,我们需要知道图像中的哪些部分是停车位。

    第二步就是检测每帧视频中的所有车辆。这样我们可以逐帧跟踪每辆车的运动。

    第三步就是确定哪些车位目前是被占用的,哪些没有。这需要结合前两步的结果。

    最后一步就是出现新车位时通知我。这需要基于视频中两帧之间车辆位置的变化。

    这里的每一步,我们都可以使用多种技术用很多种方式实现。构建这个流程并没有唯一正确或者错误的方式,但不同的方法会有优劣之分。

    3.2 使用要使用到两个视觉识别技术 :识别空车位停车线,识别车辆

    3.2.1 检测空车位

    车位探测系统的第一步是识别停车位。有一些技巧可以做到这一点。例如,通过在一个地点定位停车线来识别停车位。这可以使用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可反馈博主, 及时修改)

    3.2.2 车辆识别

    要检测视频中的汽车,我使用Mask-RCNN。它是一个卷积神经网络,对来自几个数据集(包括COCO数据集)的数百万个图像和视频进行了训练,以检测各种对象及其边界。 Mask-RCNN建立在Faster-RCNN对象检测模型的基础上。

    除了每个检测到的对象的类标签和边界框坐标外,Mask RCNN还将返回图像中每个检测到的对象的像pixel-wise mask。这种pixel-wise masking称为“ 实例分割”。我们在计算机视觉领域所看到的一些最新进展,包括自动驾驶汽车、机器人等,都是由实例分割技术推动的。

    M-RCNN将用于视频的每一帧,它将返回一个字典,其中包含边界框坐标、检测对象的masks、每个预测的置信度和检测对象的class_id。现在使用class_ids过滤掉汽车,卡车和公共汽车的边界框。然后,我们将在下一步中使用这些框来计算IoU。

    由于Mask-RCNN比较复杂,这里篇幅有限,需要mask-RCNN的同学联系博主获取, 下面仅展示效果:

    在这里插入图片描述

    🧿 选题指导, 项目分享:

    https://blog.csdn.net/Mr_DC_IT/article/details/126460477

    展开全文
  • 随着经济的增长,越来越多的人加入了购车行列。汽车数量的剧增和停车场地的相对短缺,使得停车场的管理收费问题凸现。特别是大型超市的临时停车场管理收费更加... 本设计主要研究基于单片机控制的自动停车收费管理系统
  • 基于Zigbee的停车场空位检测系统
  • 其中检测仪的行进形式采用手推方式。该系统在行进时能够同时检测铁轨的宽度、水平、里程、三角坑等参数。系统的硬件框架采用基于ARM的嵌入式框架,系统软件的设计采用嵌入式操作系统μC/OS-Ⅱ。该系统不但能显著提高...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,381
精华内容 4,952
热门标签
关键字:

不停车检测系统