文章目录

  • 1.实现的思路
  • 2.整体代码实战
    • (1)ParkingSpacePicker.py
    • (2)main.py
    • (3)视频效果
  • 3.停车位视频下载

1.实现的思路

(1)首先使用一个处理画框的程序,将图片中的有车和无车的停车位给画出来,并且保存坐标(如果画错了,将鼠标移至要删除的框中,右击鼠标,即可删除);

#定义回调函数
def mouseClick(events,x,y,flags,params):#按下鼠标左键,将点击的坐标(x,y)保存到position列表中if (events&cv2.EVENT_LBUTTONDOWN==cv2.EVENT_LBUTTONDOWN):position.append((x,y))#按下鼠标右键时,移除选中的框if (events&cv2.EVENT_RBUTTONDOWN==cv2.EVENT_RBUTTONDOWN):for i,pos in enumerate(position):(x1,y1)=posif (x1<x<x1+img_width and y1<y<y1+img_height):position.pop(i)


(2)画好之后,关闭窗口,即可看到已经保存好坐标的文件,下次再运行程序时,不用再画框;程序会读出当前文件,将之前保存好的坐标加载出画出框。

#首先查看文件是否已经包含了CarParkPos文件
try:with open('CarParkPos','rb') as fp:position=pickle.load(fp)
except:# 存储所有停车位的坐标列表position=[]


(3)主程序的思路
将摄像头读取的图片进行处理
Opencv基础知识点:
https://blog.csdn.net/Keep_Trying_Go/article/details/125351256
高斯去噪:
https://mydreamambitious.blog.csdn.net/article/details/125203273
局部二值化:
https://mydreamambitious.blog.csdn.net/article/details/125249121
中值滤波:
https://mydreamambitious.blog.csdn.net/article/details/125204641
Opencv中获取卷积核:
https://mydreamambitious.blog.csdn.net/article/details/125265838
腐蚀操作:
https://mydreamambitious.blog.csdn.net/article/details/125265431

#转换为灰度图gray=cv2.cvtColor(src=frame,code=cv2.COLOR_BGR2GRAY)#高斯去噪gauss=cv2.GaussianBlur(src=gray,ksize=(3,3),sigmaX=0)#图像二值化处理thresh=cv2.adaptiveThreshold(src=gauss,maxValue=255,adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,thresholdType=cv2.THRESH_BINARY_INV,blockSize=21,C=16)# 中值滤波操作median=cv2.medianBlur(src=thresh,ksize=3)#腐蚀操作dilate=cv2.dilate(src=median,kernel=kernel,iterations=1)
    for pos in position:(x,y)=posmask=dilate[y:y+img_height,x:x+img_width]# cv2.imshow(str(x*y),mask)#返回灰度值不为0的像素数,可用来判断图像是否全黑。count=cv2.countNonZero(mask)#当计算的count低于800,表示是一个空位if count<800:countBlackCar+=1color=(0,255,0)thickness=3else:color=(0,0,255)thickness=2cv2.rectangle(img=frame, pt1=(pos[0], pos[1]),pt2=(pos[0] + img_width, pos[1] + img_height),color=color, thickness=thickness)cvzone.putTextRect(img=frame, text=str(count), pos=(x + 3, y + img_height - 5),scale=0.8, thickness=1, offset=0,colorR=color)

参考视频教程:https://www.bilibili.com/video/BV14Z4y1Q7au?t=3992.0(建议看懂视频中的思路)
注:代码不重要,主要是学会给出的链接中这位博主的思路。使用更加简单的方法解决问题,但是呢?这种方法我认为主要是为解决那种固定摄像头拍摄的停车位,因为我们标注的坐标是固定的(但是可以利用深度学习提取有车和无车的特征进行识别,定位的可以使用Opencv来解决)。


2.整体代码实战

(1)ParkingSpacePicker.py

import os
import cv2
import pickle#首先查看文件是否已经包含了CarParkPos文件
try:with open('CarParkPos','rb') as fp:position=pickle.load(fp)
except:# 存储所有停车位的坐标列表position=[]#停车位的高宽
img_width,img_height=47,88
#定义回调函数
def mouseClick(events,x,y,flags,params):#按下鼠标左键,将点击的坐标(x,y)保存到position列表中if (events&cv2.EVENT_LBUTTONDOWN==cv2.EVENT_LBUTTONDOWN):position.append((x,y))#按下鼠标右键时,移除选中的框if (events&cv2.EVENT_RBUTTONDOWN==cv2.EVENT_RBUTTONDOWN):for i,pos in enumerate(position):(x1,y1)=posif (x1<x<x1+img_width and y1<y<y1+img_height):position.pop(i)with open('CarParkPos','wb') as fp:pickle.dump(position,fp)while True:img=cv2.imread('images/packing.png')for pos in position:cv2.rectangle(img=img,pt1=(pos[0],pos[1]),pt2=(pos[0]+img_width,pos[1]+img_height),color=(0,255,0),thickness=2)cv2.imshow('Packing',img)#设置鼠标事件cv2.setMouseCallback('Packing',mouseClick)key=cv2.waitKey(1)if key==27:breakcv2.destroyAllWindows()if __name__ == '__main__':print('Pycharm')

(2)main.py

import os
import cv2
import pickle
import cvzonewith open('CarParkPos', 'rb') as fp:position = pickle.load(fp)#停车位的高宽
img_width,img_height=47,88cap=cv2.VideoCapture('video/packing-3.mp4')def checkParkingSpace(dilate):countBlackCar=0for pos in position:(x,y)=posmask=dilate[y:y+img_height,x:x+img_width]# cv2.imshow(str(x*y),mask)#返回灰度值不为0的像素数,可用来判断图像是否全黑。count=cv2.countNonZero(mask)#当计算的count低于800,表示是一个空位if count<800:countBlackCar+=1color=(0,255,0)thickness=3else:color=(0,0,255)thickness=2cv2.rectangle(img=frame, pt1=(pos[0], pos[1]),pt2=(pos[0] + img_width, pos[1] + img_height),color=color, thickness=thickness)cvzone.putTextRect(img=frame, text=str(count), pos=(x + 3, y + img_height - 5),scale=0.8, thickness=1, offset=0,colorR=color)return countBlackCar#获取卷积核
kernel=cv2.getStructuringElement(shape=cv2.MORPH_RECT,ksize=(3,3))while cap.isOpened():#循环播放视频文件if cap.get(cv2.CAP_PROP_POS_FRAMES)==cap.get(cv2.CAP_PROP_FRAME_COUNT):cap.set(cv2.CAP_PROP_POS_FRAMES,0)ret,frame=cap.read()# frame=cv2.resize(src=frame,dsize=(750,600))height,width,channel=frame.shapeif not ret:break#转换为灰度图gray=cv2.cvtColor(src=frame,code=cv2.COLOR_BGR2GRAY)#高斯去噪gauss=cv2.GaussianBlur(src=gray,ksize=(3,3),sigmaX=0)#图像二值化处理thresh=cv2.adaptiveThreshold(src=gauss,maxValue=255,adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,thresholdType=cv2.THRESH_BINARY_INV,blockSize=21,C=16)# 中值滤波操作median=cv2.medianBlur(src=thresh,ksize=3)#腐蚀操作dilate=cv2.dilate(src=median,kernel=kernel,iterations=1)cntCar=checkParkingSpace(dilate)cvzone.putTextRect(img=frame,text="BlackPosition: "+str(cntCar),pos=(20,height-80),scale=1.0,thickness=2)cv2.imshow('img',frame)# cv2.imshow('thresh',thresh)# cv2.imshow('median',median)# cv2.imshow('dilate',dilate)key=cv2.waitKey(30)if key==27:break
cv2.destroyAllWindows()
if __name__ == '__main__':print('Pycharm')

(3)视频效果

停车位识别演示视频

注:视频自己做的比较差,建议读者最好自己尝试实现这个思路。


3.停车位视频下载

https://699pic.com/movie/295567.html

Opencv实现停车位识别相关推荐

  1. 使用Opencv开发停车位计数器

    在这个项目中,我们将创建一个停车位计数器.我们会发现总共有多少辆车,以及有多少停车位是空的.关于本教程最好的一点是,我们将使用基本的图像处理技术来解决这个问题,没有使用机器学习.深度学习进行训练来识别 ...

  2. OpenCV车牌/数字识别

    opencv 数字识别 附完整代码 Opencv的应用之车牌识别       用的支持向量机 使用opencv进行数字识别       对学习还是有点帮助的 Tensorflow 实现 MNIST 手 ...

  3. 使用opencv作物件识别(一) —— 积分直方图加速HOG特征计算

    使用opencv作物件识别(一) -- 积分直方图加速HOG特征计算 博客分类: 图像识别.机器学习.数据挖掘 CC++C#  方向梯度直方图(Histograms of Oriented Gradi ...

  4. 2021-01-07 python opencv实现车牌识别 颜色定位

    python opencv实现车牌识别 颜色定位 主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https ...

  5. 怎样使用OpenCV进行人脸识别

    不断维护的地址:http://plzcoding.com/face-recognition-with-opencv/ 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Re ...

  6. Java使用OpenCV实现人脸识别

    通过OpenCV实现人脸识别,包括图片,视频,摄像头中人脸识别. 首先看一下效果(在网上随便找的一张图片): 下面开始说一下如何实现的: 第一步:  需要安装OpenCV 下载链接:https://o ...

  7. OpenCV场景文本识别的实例(附完整代码)

    OpenCV场景文本识别的实例 OpenCV场景文本识别的实例 OpenCV场景文本识别的实例 #include <iostream> #include <fstream>#i ...

  8. python使用opencv实现人脸识别系统

    1.首先安装过python环境,在这里就不过说    检测是否安装成功如下,在cmd中输入Python     2.安装numpy 现在开始安装numpy,打开cmd,输入pip install nu ...

  9. 基于OpenCV实现人脸识别--Python

    目录 前言 第一章 OpenCV介绍 第二章 功能描述 2.1 对已有的数据进行检测 2.2 陌生人检测并发出警告 2.3 保存陌生人的视频 2.4 输入图片进行检测 2.5 现场录用信息 第三章 功 ...

最新文章

  1. 「最新」《美国人工智能未来20年研究路线图》
  2. FATE 集群部署 step1
  3. java水晶报表pull模式_水晶报表pull模式
  4. leetcode 299. Bulls and Cows | 299. 猜数字游戏(Java)
  5. 数据大屏产品介绍PPT_有这些图表美化工具,十分钟配出炫酷的数据可视化大屏...
  6. Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究
  7. python 抓包基于pypcap
  8. 聊聊高并发下库存加减那些事儿——“异步扣减库存”
  9. 史上最冤!美国原子弹之父被骂了9年!最后他上台领奖,竟一把推开了总统.........
  10. 算法 - 二分查找(非递归实现二分查找)
  11. linux——回射服务器
  12. Bootstrap3基础 clearfix pull-left/right 辅助类样式 快速左右浮动
  13. 点阵字体显示系列补记2:关于24点阵汉字显示程序及其修改版本
  14. 【C++快速入门】面向对象篇
  15. 高考进行时,AI 监考老师已就位!
  16. python语言命名规则的是()_python语言命名规则是什么?
  17. 生命计算机在线,抖音生命计算器
  18. 一款保险系统架构设计图
  19. 主流PCB画图软件的对比区别(AD、Pads、Allegro)
  20. Zookeeper下载与安装教程(for windows)

热门文章

  1. 大江东去浪涛尽,千古风流人物故垒西边。
  2. MVC中的URL路由(一)
  3. PHP网站怎么放谷歌广告,如何在wordpress中加入google adsense广告(百度联盟)
  4. 二见钟情之组合查询(vb.net版)
  5. Idea编译出现[ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter这个问题
  6. 猫眼5万条评论告诉你《飞驰人生》值不值得看?!
  7. Ubuntu一键部署Yunzai-Bot v3
  8. C和OpenGL结合生成钻石图形的解决方案
  9. 研发流程——准入体系设计
  10. H.264里的SEI——自定义信息(SEI)