实战 | 基于OpenCV的停车场空余车位实时监测系统(详细步骤 + 源码)

news2024/11/26 7:33:07

导  读

    本文主要介绍如何使用Python和OpenCV实现一个停车场空余车位实时监测系统,并包含详细步骤和源码。

      

背景介绍

    介绍实现步骤之前,先来看看测试视频(小型停车场实时监控画面):

,时长00:28

    我们的目标是实时检测停车场剩余空位数量,以此来提示将要进入停车场的司机是否有空位。

      

实现步骤

    完成一个停车场实时空位检测系统的主要步骤如下:

    ① 设定每个停车位ROI;

    ② 设计停车与空位的判断方法;

    ③ 对每个ROI分别判断状态;

    ④ 实时检测输出结果。

1

设定每个停车位ROI

    停车位ROI的设定可以根据实际情况处理,一般停车位比较多且有规律的可以使用坐标间隔增加的方式自动设定。本文实例中停车位较少,且中间有部分特殊位置,所以采用手动框选设定方法。如下图所示:

    鼠标左键按下,标记新的停车位;鼠标右键按下且点击位置位于矩形内,删除对应矩形。实现代码如下:

import cv2import pickle
rectW,rectH=107,48
try:    with open('carParkPos','rb') as f:        posList=pickle.load(f)except:    posList=[]
def mouseClick(events,x,y,flags,params):    if events==cv2.EVENT_LBUTTONDOWN:        posList.append((x,y))    if events==cv2.EVENT_RBUTTONDOWN:        for i,pos in enumerate(posList):            x1,y1=pos            if x1<x<x1+rectW and y1<y<y1+rectH:                posList.pop(i)    with open('carParkPos','wb') as f:        pickle.dump(posList,f)

while True:    img=cv2.imread("img.png")    for pos in posList: cv2.rectangle(img,pos,(pos[0]+rectW,pos[1]+rectH),(0,0,255),2)
    cv2.imshow("Image",img)    cv2.setMouseCallback("Image",mouseClick)    if cv2.waitKey(1) == 27:        break

    直至标记好所有的停车位ROI,并写入文件,效果如下:

 

2

为设计停车与空位的判断方法

    选择停车状态和空位状态的图片各2张,做演示说明:

    判断停车状态与空位状态的具体步骤如下:

    ① 转为灰度图;

    ② 高斯滤波;

    ③ 自适应二值化;

    ④ 中值滤波 + 膨胀;

    ⑤ 计算非0像素数量;

    ⑥ 判断结果:非0像素数量 < 900则为空位,否则表示停车状态。

    代码与效果如下:

import cv2import numpy as np
img = cv2.imread('2.png')cv2.imshow('src', img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)blur=cv2.GaussianBlur(gray,(3,3),1)Thre=cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,25,16)blur=cv2.medianBlur(Thre,5)kernel=np.ones((3,3),np.uint8)dilate=cv2.dilate(blur,kernel,iterations=1)count=cv2.countNonZero(dilate)cv2.imshow('dilate', dilate)print(count)if count<900:    cv2.rectangle(img, (0, 0), (img.shape[1],img.shape[0]), (0, 255, 0), 5)else:    cv2.rectangle(img, (0, 0), (img.shape[1],img.shape[0]), (0, 0, 255), 5)
cv2.imshow('result', img)cv2.waitKey()cv2.destroyAllWindows()

    绿色矩形表示空位,红色矩形表示停车,数量表示非0像素数。

3

对每个ROI分别判断状态

    从坐标文件中循环读取位置信息,依次判断每个ROI的状态:​​​​​​​

with open('carParkPos','rb') as f:    posList=pickle.load(f)frame_counter = 0def check(imgPro):    spaceCount=0    for pos in posList:        x,y=pos        crop=imgPro[y:y+rectH,x:x+rectW]        count=cv2.countNonZero(crop)        if count<900:            spaceCount+=1            color=(0,255,0)            thick=5        else:            color=(0,0,255)            thick=2
        cv2.rectangle(img,pos,(x+rectW,y+rectH),color,thick)    cv2.rectangle(img,(45,30),(250,75),(180,0,180),-1)    cv2.putText(img,f'Free: {spaceCount}/{len(posList)}',(50,60),cv2.FONT_HERSHEY_SIMPLEX,0.9,(255,255,255),2)

4

实时检测输出结果

    实时检测输出结果,代码和效果如下:​​​​​​​

import cv2import numpy as npimport pickle
rectW,rectH=107,48
cap=cv2.VideoCapture('carPark.mp4')
with open('carParkPos','rb') as f:    posList=pickle.load(f)frame_counter = 0def check(imgPro):    spaceCount=0    for pos in posList:        x,y=pos        crop=imgPro[y:y+rectH,x:x+rectW]        count=cv2.countNonZero(crop)        if count<900:            spaceCount+=1            color=(0,255,0)            thick=5        else:            color=(0,0,255)            thick=2
        cv2.rectangle(img,pos,(x+rectW,y+rectH),color,thick)    cv2.rectangle(img,(45,30),(250,75),(180,0,180),-1)    cv2.putText(img,f'Free: {spaceCount}/{len(posList)}',(50,60),cv2.FONT_HERSHEY_SIMPLEX,0.9,(255,255,255),2)
while True:    _,img=cap.read()    if frame_counter == cap.get(cv2.CAP_PROP_FRAME_COUNT):        frame_counter = 0 #Or whatever as long as it is the same as next line        cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, 0)    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)    blur=cv2.GaussianBlur(gray,(3,3),1)    Thre=cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,25,16)    blur=cv2.medianBlur(Thre,5)    kernel=np.ones((3,3),np.uint8)    dilate=cv2.dilate(blur,kernel,iterations=1)    check(dilate)
    cv2.imshow("Image",img)    cv2.waitKey(10)

 

参考链接 & 源码下载

https://github.com/creativekids11/Car-Parking-Space-Counter-Detector

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAMA-CDGA/CDGP数据治理工程师证书含金量杠杠滴

DAMA-CDGA/CDGP数据治理工程师证书含金量杠杠滴 DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&a…

Linux常用操作 | 权限网络进程主机... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Linux。。。 下面是我总结的 Linux 知识的初阶版思维导图&#xff0c;后续会不断补充 文章目录Linux常用操作软件安装systemctl软链接日期时区ntpip地址主机名配置VMware固定IPps命令kill命令nmap命令netstat命令ping命令wget命令curl命令top命令df命令iosta…

Ubuntu 建立 http server

1.執行 sudo apt install apache2 2.檢查Apache sudo systemctl status apache2 看到active說明運行正常 3.調整UFW防火牆 允許Apache遠端連接 查看 sudo ufw app list 允許HTTP/HTTPs傳輸 sudo ufw allow in "Appach Full" 4.測試 在網頁上打開 http://{你的…

汇编伪指令

目录 段的定义&#xff08;重点&#xff09; 定位方式 汇编地址计数器 $ ORG 例题 段寄存器的设定&#xff08;重点&#xff09; 源程序的结束&#xff08;重点&#xff09; 过程的定义&#xff08;了解&#xff09; 掌握 过程定义伪指令 PROC&#xff0c; ENDP 段定…

QT—常用容器 QStringList,QVector,QMap,QHash,QVariant

QStringList 元素添加 可以直接添加元素&#xff0c;也可也使用append( )方法在末尾追加元素 QStringList weekList<<"星期一"<<"星期二"<<"星期三"; weekList.append("星期四"); qDebug()<<weekList; 元素…

LeetCode刷题复盘笔记—一文搞懂动态规划之123. 买卖股票的最佳时机 III问题(动态规划系列第二十二篇)

今日主要总结一下动态规划的一道题目&#xff0c;123. 买卖股票的最佳时机 III 题目&#xff1a;123. 买卖股票的最佳时机 III Leetcode题目地址 题目描述&#xff1a; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能…

小程序地图插入图标后 怎么实现点击图标弹出窗口

1问题描述本次博客的要解决的问题是&#xff1a;小程序地图插入图标后 怎么实现点击图标弹出窗口如图&#xff1a;2算法描述点击标记点获取数据想要在地图等页面上显示弹窗&#xff0c;是使用的是marke的方法&#xff0c;点击标记点获取数据先在wxml里写好布局文件<view cl…

可强占RCU

可强占RCU前言前言 RCU机制属于无锁编程的一种&#xff0c;在访问读端临界区时不需要加锁&#xff0c;故不存在上面提到的锁的问题&#xff0c;所以拥有极好的扩展性&#xff0c;且可以多个读者同时存在。那为什么不用RCU锁取代其他锁呢&#xff1f;前面说到读端不用加锁&…

光纤耦合装置的公差分析

摘要 在现代光学中&#xff0c;光纤存在于各种光学系统中&#xff0c;能够将多少光耦合到光纤中一直是人们关注的问题。耦合效率对系统的对准十分敏感&#xff0c;特别是对于芯径相对较小的单模光纤。在本例中&#xff0c;我们选择了一个设计良好的光纤耦合透镜&#xff0c;并根…

ARM异常处理(异常源的分类、异常的响应流程)

目录 一、异常的概念 1、什么是异常&#xff1f; 2、处理异常时&#xff0c;处理器要考虑哪些问题&#xff1f; 二、ARM异常源 1、异常源的分类 2、异常模式 三、ARM异常响应 1、CPSR寄存器内容备份&#xff08;自动执行&#xff09; 2、修改CPSR的值&#xff08;自动…

广告倒排服务极致优化

作者 | XY 导读 漏斗优化是检索系统不变的话题&#xff0c;过去一年来&#xff0c;广告漏斗优化一改往日做“加法”&#xff0c;而通过简化漏斗&#xff0c;提升全系统一致性。如百度这样庞大的广告库规模、高流量规模以及复杂的业务规则&#xff0c;要做到极简的漏斗层次&…

206367-33-1,抗菌肽pBD-1

pBD-1 是一种来源于猪组织的内源性组成型表达的抗菌肽 (AMP)&#xff0c;尤其在猪黏膜上皮部位表达。pBD-1 具有抗菌作用&#xff0c;并且有助于猪黏膜和系统宿主防御。pBD-1 is an endogenous and constitutively expressed antimicrobial peptide (AMP) from porcine tissues…

rocketmq源码-consumer拉取消息(push模式)

前言 在前面consumer启动的博客中&#xff0c;有说过&#xff0c;在启动过程中&#xff0c;有两个比较重要的逻辑&#xff0c;分别是负载均衡和拉取消息的service&#xff0c;这篇博客&#xff0c;主要记录拉取消息的service&#xff0c;因为前面的demo和这篇笔记中的demo&…

电磁场知识整理------2022/12/14

电磁场知识整理1、数学基础麦克斯韦方程2、麦克斯韦方程组的近似情况2.1 恒定电场2.2 恒定电流场2.3 恒定磁场2.4 动态电磁场2.5 时谐电磁场3、电磁辐射与电磁波写在最后学习资源&#xff1a;慕课上浙大的工程电磁场与波。 工程电磁场与波 1、数学基础 正交坐标系&#xff1a;…

Android 线上卡顿监控

文章目录1. 卡顿与ANR的关系2. 卡顿原理3. 卡顿监控3.1 WatchDog3.2 Looper Printer3.2.1 监控TouchEvent卡顿3.2.2 监控IdleHandler卡顿3.2.3 监控SyncBarrier泄漏4. 小结平时看博客或者学知识&#xff0c;学到的东西比较零散&#xff0c;没有独立的知识模块概念&#xff0c;而…

leetcode 375. 猜数字大小 II-【python3详细图解】递归+记忆化搜索与动态规划

题目 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。你来猜我选了哪个数字。如果你猜到正确的数字&#xff0c;就会 赢得游戏 。如果你猜错了&#xff0c;那么我会告诉你&#xff0c;我选的数字比你的 更大或者更小 &#xff0c…

二十、JavaScript——逻辑非

! 逻辑非- &#xff01;可以对一个值进行非运算 - 它可以对一个布尔值进行取反操作 true 变成 false false 变成 true - 如果对一个非布尔值进行取反&#xff0c;它会将其先转换为布尔值&#xff0c;再进行取反操作 可以利用这个特点将其他类型转换为布尔值 <script>/*! …

Hybrid模式下,如何实现热更新?

做过开发的小伙伴应该对“热更新”不陌生吧&#xff01;热更新就是指在游戏或软件更新的时候&#xff0c;不用再重新下载安装包进行安装&#xff0c;而是在启动应用程序的时候&#xff0c;在内部进行资源或代码的更新。那么如今&#xff0c;市场为什么越来越多地选择热更新技术…

数据结构——图最全总结(期末复习必备)

目录 图 定义&#xff1a; 基本术语&#xff1a; 图的存储结构 邻接矩阵 邻接表 十字链表 邻接多重表 图的遍历 深度优先搜索(Depth First Search,DFS) 广度优先搜索(Breadth First Search,BFS) 图的应用 最小生成树 普利姆算法 克鲁斯卡尔算法 最短路径 单源最短…

优蓝冲刺港股:上半年期内亏损过亿 主打蓝领人才服务

雷递网 雷建平 12月14日优蓝国际控股股份有限公司&#xff08;简称&#xff1a;“优蓝”&#xff09;日前递交招股书&#xff0c;准备在香港上市。上半年期内亏损1.18亿优蓝是一家蓝领终身服务平台&#xff0c;旨在成为蓝领人才的首选终身服务平台。截至最后实际可行日期&#…