<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在這個專案中,我們將建立一個停車位計數器。我們會發現總共有多少輛車,以及有多少停車位是空的。關於本教學最好的一點是,我們將使用基本的影象處理技術來解決這個問題,沒有使用機器學習、深度學習進行訓練來識別。
python -m venv venv
cd venvScripts .activate.bat
pip install opencv-python
import cv2 import pickle img=cv2.imread('carParkImg.png') cv2.imshow("image",img)
import cv2 import pickle img=cv2.imread('carParkImg.png') cv2.rectangle(img,(50,192),(157,240),(255,0,255),2) #座標位置可以多次嘗試確定 cv2.imshow("image",img) cv2.waitKey(0)
可以看出,每個停車位的估計寬、高為:
width=107 # 157-102 height = 48 # 240 - 192
import cv2 import pickle img=cv2.imread('carParkImg.png') width,height = 107,48 posList = [] # 滑鼠點選的座標集合 def mouseClick(events,x,y,flags,params): if events == cv2.EVENT_LBUTTONDOWN: posList.append((x,y)) while True: img = cv2.imread("carParkImg.png") cv2.imshow("images",img) for pos in posList: cv2.rectangle(img,pos,(pos[0]+width,pos[1]+height),(255,0,255),2) #座標位置可以多次嘗試確定 cv2.imshow("image",img) cv2.setMouseCallback("images",mouseClick) if cv2.waitKey(10) & 0xFF== ord('q'): break
通過滑鼠點選在任何位置新增矩形框,但當矩形框位置出錯時,無法進行刪除。因此通過新增滑鼠右鍵的事件,刪除錯誤的矩形框。
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 +width and y1 < y <y1 +height: posList.pop(i)
通過pickle.dump()保持儲存滑鼠點選的位置資訊。
with open('CarParkPos','wb') as f: pickle.dump(posList,f)
通過pickle.load()載入儲存好的位置資訊,即在原有的停車位新增或刪除停車位,而不是每一幀畫面重新繪製。
with open('CarParkPos','wb') as f: posList = pickle.load(f)
完整程式碼如下:
import cv2 import pickle img=cv2.imread('carParkImg.png') width,height = 107,48 try: with open('CarParkPos','rb') as f: posList = pickle.load(f) except: posList = [] # 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 +width and y1 < y <y1 +height: posList.pop(i) with open('CarParkPos','wb') as f: pickle.dump(posList,f) while True: img = cv2.imread("carParkImg.png") for pos in posList: cv2.rectangle(img,pos,(pos[0]+width,pos[1]+height),(255,0,255),2) #座標位置可以多次嘗試確定 cv2.imshow("image",img) cv2.setMouseCallback("image",mouseClick) if cv2.waitKey(10) & 0xFF== ord('q'): break
import cv2 import pickle import cvzone import numpy as np # Video feed cap = cv2.VideoCapture('carPark.mp4') while True: success,img= cap.read() cv2.imshow("Image",img) if cv2.waitKey(10) & 0xFF== ord('q'): break
視訊時間比較短,為了讓視訊迴圈播放,新增如下程式碼:
if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT): cap.set(cv2.CAP_PROP_POS_FRAMES,0)
即:當前視訊播放到結尾時,重新播放
擷取停車位,回來對每個停車位進行影象處理,從而分析該停車位是否被佔用
def checkParkingSpace(): for pos in posList: x,y = pos imgCrop=img[y:y+height,x:x+width] cv2.imshow(str(x*y),imgCrop)
對影象二值化、高斯模糊處理
imgGray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) imgBlur =cv2.GaussianBlur(imgGray,(3,3),1)
利用自適應二值化對影象進行處理
imgThreshold=cv2.adaptiveThreshold(imgBlur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,25,16)
cv2.adaptiveThreshold 引數的選擇可以通過TrackBar拖到卷軸,直到選擇合適的數值。
可以看出停車位上有車輛時白色畫素點比較多,停車位沒有車輛時,白色畫素點很少甚至沒有,因此我們可以基於白色畫素點數量來確定該車為是否被佔用。同時可以看到當停車位為空時存在一些椒鹽噪聲,通過medianBlur來處理椒鹽噪聲
imgMedian = cv2.medianBlur(imgThreshold,5)
可以看出椒鹽噪聲少了一部分。
使用dilate(膨脹)增強白色畫素值,便於更好區分每個停車位是否被佔用
kernel=np.ones((3,3),np.uint8); imgDilate=cv2.dilate(imgMedian,kernel,iterations=1)
可以看出白色的輪廓比之前加厚了
擷取每個停車位,經過處理後的影象,統計白色畫素的數量
修改checkParkingSpace
函數,將處理好的影象傳入函數
def checkParkingSpace(imgProc): for pos in posList: x,y = pos imgCrop=imgProc[y:y+height,x:x+width] count=cv2.countNonZero(imgCrop) cvzone.putTextRect(img,str(count),(x,y+height-3,scale =1.5,thickness=2,offset=0)
對比可以看出,佔有車位的數值比較大1000-2000,空車位的200-500,數值的差距比較大。
畫出所有停車位,對比找出合適的閾值,區分停車位為空還是被佔用了。
可以看出停車位為空時,值為0-600,而停車位被佔用,值為:960-2300,因此我們設定閾值為750。所以低於750此時停車位沒有車,高於950則停車位有車。
加上文字描述
程式碼
import cv2 import pickle import cvzone import numpy as np # Video feed cap = cv2.VideoCapture('carPark.mp4') with open('CarParkPos','rb') as f: posList = pickle.load(f) width,height=107,48 def checkParkingSpace(imgProc): spaceCounter=0 for pos in posList: x,y = pos imgCrop=imgProc[y:y+height,x:x+width] count=cv2.countNonZero(imgCrop) if count < 950: color = (0,255,0) thickness = 5 spaceCounter +=1 else: color = (0,0,255) thickness = 2 cv2.rectangle(img,pos,(pos[0]+width,pos[1]+height),color,thickness=thickness) cvzone.putTextRect(img,str(count),(x,y+height-5),scale =1.5,thickness=2,offset=0,colorR=color) cvzone.putTextRect(img,f'Free{spaceCounter}/{len(posList)}',(100,50),scale =3,thickness=5,offset=20,colorR=(0,200,0)) while True: if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT): cap.set(cv2.CAP_PROP_POS_FRAMES,0) success,img= cap.read() imgGray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) imgBlur =cv2.GaussianBlur(imgGray,(3,3),1) imgThreshold=cv2.adaptiveThreshold(imgBlur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,25,16) imgMedian = cv2.medianBlur(imgThreshold,5) kernel=np.ones((3,3),np.uint8); imgDilate=cv2.dilate(imgMedian,kernel,iterations=1) checkParkingSpace(imgDilate) # for pos in posList: # cv2.rectangle(img,pos,(pos[0]+width,pos[1]+height),(255,0,255),2) cv2.imshow("Image",img) # cv2.imshow("imgBlur",imgBlur) # cv2.imshow("imgThreshold",imgThreshold) # cv2.imshow("imgMedian",imgMedian) # cv2.imshow("imgDilate",imgDilate) if cv2.waitKey(10) & 0xFF== ord('q'): break
最終效果如下:
原始碼連結:https://github.com/yuanxinshui/Opencv-project/tree/main/39%20Parking%20Space%20Counter
到此這篇關於Python中使用Opencv開發停車位計數器的文章就介紹到這了,更多相關python Opencv停車位計數器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45