python?Opencv實現(xiàn)停車位識別思路詳解
1.實現(xiàn)的思路
(1)首先使用一個處理畫框的程序,將圖片中的有車和無車的停車位給畫出來,并且保存坐標(biāo)(如果畫錯了,將鼠標(biāo)移至要刪除的框中,右擊鼠標(biāo),即可刪除);
#定義回調(diào)函數(shù)
def mouseClick(events,x,y,flags,params):
#按下鼠標(biāo)左鍵,將點擊的坐標(biāo)(x,y)保存到position列表中
if (events&cv2.EVENT_LBUTTONDOWN==cv2.EVENT_LBUTTONDOWN):
position.append((x,y))
#按下鼠標(biāo)右鍵時,移除選中的框
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)畫好之后,關(guān)閉窗口,即可看到已經(jīng)保存好坐標(biāo)的文件,下次再運行程序時,不用再畫框;程序會讀出當(dāng)前文件,將之前保存好的坐標(biāo)加載出畫出框。
#首先查看文件是否已經(jīng)包含了CarParkPos文件
try:
with open('CarParkPos','rb') as fp:
position=pickle.load(fp)
except:
# 存儲所有停車位的坐標(biāo)列表
position=[]
(3)主程序的思路
將攝像頭讀取的圖片進(jìn)行處理
Opencv基礎(chǔ)知識點:
http://www.dhdzp.com/article/254006.htm
高斯去噪:
http://www.dhdzp.com/article/198212.htm
局部二值化:
http://www.dhdzp.com/article/248000.htm
中值濾波:
http://www.dhdzp.com/article/198212.htm
Opencv中獲取卷積核:
http://www.dhdzp.com/article/254013.htm
腐蝕操作:
http://www.dhdzp.com/article/214725.htm
#轉(zhuǎn)換為灰度圖
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的像素數(shù),可用來判斷圖像是否全黑。
count=cv2.countNonZero(mask)
#當(dāng)計算的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(建議看懂視頻中的思路)
注:代碼不重要,主要是學(xué)會給出的鏈接中這位博主的思路。使用更加簡單的方法解決問題,但是呢?這種方法我認(rèn)為主要是為解決那種固定攝像頭拍攝的停車位,因為我們標(biāo)注的坐標(biāo)是固定的(但是可以利用深度學(xué)習(xí)提取有車和無車的特征進(jìn)行識別,定位的可以使用Opencv來解決)。
2.整體代碼實戰(zhàn)

(1)ParkingSpacePicker.py
import os
import cv2
import pickle
#首先查看文件是否已經(jīng)包含了CarParkPos文件
try:
with open('CarParkPos','rb') as fp:
position=pickle.load(fp)
except:
# 存儲所有停車位的坐標(biāo)列表
position=[]
#停車位的高寬
img_width,img_height=47,88
#定義回調(diào)函數(shù)
def mouseClick(events,x,y,flags,params):
#按下鼠標(biāo)左鍵,將點擊的坐標(biāo)(x,y)保存到position列表中
if (events&cv2.EVENT_LBUTTONDOWN==cv2.EVENT_LBUTTONDOWN):
position.append((x,y))
#按下鼠標(biāo)右鍵時,移除選中的框
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)
#設(shè)置鼠標(biāo)事件
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的像素數(shù),可用來判斷圖像是否全黑。
count=cv2.countNonZero(mask)
#當(dāng)計算的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():
#循環(huán)播放視頻文件
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
#轉(zhuǎn)換為灰度圖
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)視頻效果
停車位識別演示

注:視頻自己做的比較差,建議讀者最好自己嘗試實現(xiàn)這個思路。
到此這篇關(guān)于Opencv實現(xiàn)停車位識別的文章就介紹到這了,更多相關(guān)Opencv實現(xiàn)停車位識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas實現(xiàn)對一列/多列進(jìn)行數(shù)據(jù)區(qū)間篩選
這篇文章主要介紹了pandas實現(xiàn)對一列/多列進(jìn)行數(shù)據(jù)區(qū)間篩選方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
深入探討PythonLogging模塊的高級用法與性能優(yōu)化
在Python應(yīng)用程序中,日志處理是一項至關(guān)重要的任務(wù),本文將探索Logging模塊的高級用法,包括日志級別、格式化、處理程序等方面的功能,需要的可以參考下2024-04-04
Django Form and ModelForm的區(qū)別與使用
這篇文章主要介紹了Django Form and ModelForm的區(qū)別與使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Python數(shù)學(xué)符號計算庫SymPy使用方法詳解
SymPy?是一個?Python?的數(shù)學(xué)符號計算庫,提供了強大的工具來進(jìn)行符號數(shù)學(xué)運算、代數(shù)操作、求解方程、微積分、矩陣運算等,它廣泛應(yīng)用于數(shù)學(xué)教學(xué)、物理學(xué)、工程學(xué)、統(tǒng)計學(xué)和概率論等領(lǐng)域,本文將結(jié)合具體案例,詳細(xì)介紹?SymPy?的使用方法,需要的朋友可以參考下2024-08-08
python 3.74 運行import numpy as np 報錯lib\site-packages\numpy\_

