Opencv实现停车位识别的思路及代码是什么
Admin 2022-08-03 群英技术资讯 276 次浏览
(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)=pos if (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://www.jb51.net/article/254006.htm
高斯去噪:
https://www.jb51.net/article/198212.htm
局部二值化:
https://www.jb51.net/article/248000.htm
中值滤波:
https://www.jb51.net/article/198212.htm
Opencv中获取卷积核:
https://www.jb51.net/article/254013.htm
腐蚀操作:
https://www.jb51.net/article/214725.htm
#转换为灰度图 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)=pos mask=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+=1 color=(0,255,0) thickness=3 else: color=(0,0,255) thickness=2 cv2.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来解决)。
(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)=pos if (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: break cv2.destroyAllWindows() if __name__ == '__main__': print('Pycharm')
(2)main.py
import os import cv2 import pickle import cvzone with open('CarParkPos', 'rb') as fp: position = pickle.load(fp) #停车位的高宽 img_width,img_height=47,88 cap=cv2.VideoCapture('video/packing-3.mp4') def checkParkingSpace(dilate): countBlackCar=0 for pos in position: (x,y)=pos mask=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+=1 color=(0,255,0) thickness=3 else: color=(0,0,255) thickness=2 cv2.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.shape if 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)视频效果
停车位识别演示
注:视频自己做的比较差,建议读者最好自己尝试实现这个思路。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python查找多个字典公共键key案例,文章主要通过案例分享展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
程序设计的好与坏,早在我们青葱岁月时就接触过了,只是那是并不知道这竟如此重要。能够立即改善程序设计、写出“好”代码的知识有以下几点
最近工作中遇到了matplotlib保存图片坐标轴不完整的问题,所以这篇文章主要给大家介绍了关于python matplotlib画图时坐标轴重叠显示不全和图片保存时不完整问题的解决方法,需要的朋友可以参考下
今天通过园区停车信息这样一个场景分析python3 依赖倒置原则,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
这篇文章主要介绍了Python在不同场景合并多个Excel的方法,文章围绕主题总共分享了三种方法,具有一定的参考价值,需要的小伙伴可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008