小編寫這篇文章的一個主要目的,主要是給大家就相關的具體內容做出一些詳細解答,比如了解使用python的相關知識,主要是涉及到python Opencv的一些相關知識,比如使用python Opencv實現停車位識別,就具體的內容,下面給大家詳細解答下。
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)=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(建議看懂視頻中的思路)
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)=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)視頻效果
停車位識別演示
綜上所述,這篇文章就給大家介紹到這里了,希望可以給各位讀者帶來一定的幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128392.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:實現實時人臉識別本文記錄了在學習深度學習過程中,使用,開發環境為,實現局域網連接手機攝像頭,對目標人員進行實時人臉識別,效果并非特別好,會繼續改進這里是項目地址項目中用到的大文件地址如果各位老爺看完覺得對你有幫助的話,請給個小星星,當前時間 opencv+mtcnn+facenet+python+tensorflow 實現實時人臉識別 Abstract:本文記錄了在學習深度學習過程中,...
??歡迎訂閱《從實戰學python》專欄,用python實現爬蟲、辦公自動化、數據可視化、人工智能等各個方向的實戰案例,有趣又有用!?? 更多精品專欄簡介點這里 治愈生活的良方 就是保持對生活的熱愛 前言 哈嘍,大家好,我是一條。 每次和女朋友出去玩,拍照是必須的,天氣好還行,天氣要是不好,加上我這破手機,那拍的簡直慘不忍睹,自己都不過去。 但是沒什么能難倒程序員的,為了不挨罵,連夜寫出去霧...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02