最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中使用Opencv開發(fā)停車位計(jì)數(shù)器功能

 更新時(shí)間:2022年04月04日 11:43:48   作者:@BangBang  
這篇文章主要介紹了Python中使用Opencv開發(fā)停車位計(jì)數(shù)器,本教程最好的一點(diǎn)就是我們將使用基本的圖像處理技術(shù)來(lái)解決這個(gè)問(wèn)題,沒有使用機(jī)器學(xué)習(xí)、深度學(xué)習(xí)進(jìn)行訓(xùn)練來(lái)識(shí)別,感興趣的朋友跟隨小編一起看看吧

在這個(gè)項(xiàng)目中,我們將創(chuàng)建一個(gè)停車位計(jì)數(shù)器。我們會(huì)發(fā)現(xiàn)總共有多少輛車,以及有多少停車位是空的。關(guān)于本教程最好的一點(diǎn)是,我們將使用基本的圖像處理技術(shù)來(lái)解決這個(gè)問(wèn)題,沒有使用機(jī)器學(xué)習(xí)、深度學(xué)習(xí)進(jìn)行訓(xùn)練來(lái)識(shí)別。

1. 環(huán)境安裝

1.1 安裝并激活虛擬環(huán)境

python -m venv venv
cd venv\Scripts
.\activate.bat

1.2 python包安裝

pip install opencv-python

2. 繪制停車位矩形框

2.1 導(dǎo)入停車場(chǎng)圖片

import cv2
import pickle
img=cv2.imread('carParkImg.png')
cv2.imshow("image",img)

2.2 繪制矩形框 定位停車位

import cv2
import pickle
img=cv2.imread('carParkImg.png')
cv2.rectangle(img,(50,192),(157,240),(255,0,255),2)  #坐標(biāo)位置可以多次嘗試確定
cv2.imshow("image",img)
cv2.waitKey(0)

可以看出,每個(gè)停車位的估計(jì)寬、高為:

width=107  # 157-102
height = 48 # 240 - 192

2.3 鼠標(biāo)添加、刪除停車位

import cv2
import pickle
img=cv2.imread('carParkImg.png')
width,height = 107,48
posList = []   # 鼠標(biāo)點(diǎn)擊的坐標(biāo)集合
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)  #坐標(biāo)位置可以多次嘗試確定
	cv2.imshow("image",img)
	cv2.setMouseCallback("images",mouseClick)
	if cv2.waitKey(10) & 0xFF== ord('q'):
		break

通過(guò)鼠標(biāo)點(diǎn)擊在任何位置添加矩形框,但當(dāng)矩形框位置出錯(cuò)時(shí),無(wú)法進(jìn)行刪除。因此通過(guò)添加鼠標(biāo)右鍵的事件,刪除錯(cuò)誤的矩形框。

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)

通過(guò)pickle.dump()保持保存鼠標(biāo)點(diǎn)擊的位置信息。

with open('CarParkPos','wb') as f:
	pickle.dump(posList,f)

通過(guò)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 = []   # 鼠標(biāo)點(diǎn)擊的坐標(biāo)集合
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)  #坐標(biāo)位置可以多次嘗試確定
	cv2.imshow("image",img)
	cv2.setMouseCallback("image",mouseClick)
	
	if cv2.waitKey(10) & 0xFF== ord('q'):
		break

3. 停車位視頻分析

3. 1 停車監(jiān)控視頻

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

視頻時(shí)間比較短,為了讓視頻循環(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)
  • cv2.CAP_PROP_POS_FRAMES :視頻播放當(dāng)前幀
  • cv2.CAP_PROP_FRAME_COUNT :視頻總幀數(shù)

即:當(dāng)前視頻播放到結(jié)尾時(shí),重新播放

3. 2 截取停車位

截取停車位,回來(lái)對(duì)每個(gè)停車位進(jìn)行圖像處理,從而分析該停車位是否被占用

def checkParkingSpace():
    for pos in posList:
        x,y = pos
        imgCrop=img[y:y+height,x:x+width]
        cv2.imshow(str(x*y),imgCrop)

3. 3 圖像處理

對(duì)圖像二值化、高斯模糊處理

imgGray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur =cv2.GaussianBlur(imgGray,(3,3),1)

利用自適應(yīng)二值化對(duì)圖像進(jìn)行處理

imgThreshold=cv2.adaptiveThreshold(imgBlur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,25,16)

cv2.adaptiveThreshold 參數(shù)的選擇可以通過(guò)TrackBar拖到滾動(dòng)條,直到選擇合適的數(shù)值。

可以看出停車位上有車輛時(shí)白色像素點(diǎn)比較多,停車位沒有車輛時(shí),白色像素點(diǎn)很少甚至沒有,因此我們可以基于白色像素點(diǎn)數(shù)量來(lái)確定該車為是否被占用。同時(shí)可以看到當(dāng)停車位為空時(shí)存在一些椒鹽噪聲,通過(guò)medianBlur來(lái)處理椒鹽噪聲

imgMedian = cv2.medianBlur(imgThreshold,5)

可以看出椒鹽噪聲少了一部分。
使用dilate(膨脹)增強(qiáng)白色像素值,便于更好區(qū)分每個(gè)停車位是否被占用

 kernel=np.ones((3,3),np.uint8);
 imgDilate=cv2.dilate(imgMedian,kernel,iterations=1)

可以看出白色的輪廓比之前加厚了

3. 4 判斷停車位是否被占用

截取每個(gè)停車位,經(jīng)過(guò)處理后的圖像,統(tǒng)計(jì)白色像素的數(shù)量
修改checkParkingSpace函數(shù),將處理好的圖像傳入函數(shù)

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)	

對(duì)比可以看出,占有車位的數(shù)值比較大1000-2000,空車位的200-500,數(shù)值的差距比較大。

畫出所有停車位,對(duì)比找出合適的閾值,區(qū)分停車位為空還是被占用了。

可以看出停車位為空時(shí),值為0-600,而停車位被占用,值為:960-2300,因此我們?cè)O(shè)定閾值為750。所以低于750此時(shí)停車位沒有車,高于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

到此這篇關(guān)于Python中使用Opencv開發(fā)停車位計(jì)數(shù)器的文章就介紹到這了,更多相關(guān)python Opencv停車位計(jì)數(shù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pyqt5 tablewidget 利用線程動(dòng)態(tài)刷新數(shù)據(jù)的方法

    pyqt5 tablewidget 利用線程動(dòng)態(tài)刷新數(shù)據(jù)的方法

    今天小編就為大家分享一篇pyqt5 tablewidget 利用線程動(dòng)態(tài)刷新數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Django Admin后臺(tái)添加數(shù)據(jù)庫(kù)視圖過(guò)程解析

    Django Admin后臺(tái)添加數(shù)據(jù)庫(kù)視圖過(guò)程解析

    這篇文章主要介紹了Django Admin后臺(tái)添加數(shù)據(jù)庫(kù)視圖過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Python 限制線程的最大數(shù)量的方法(Semaphore)

    Python 限制線程的最大數(shù)量的方法(Semaphore)

    今天小編就為大家分享一篇Python 限制線程的最大數(shù)量的方法(Semaphore),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Python數(shù)據(jù)分析23種Pandas核心操作方法總結(jié)

    Python數(shù)據(jù)分析23種Pandas核心操作方法總結(jié)

    在本文中,作者從基本數(shù)據(jù)集讀寫、數(shù)據(jù)處理和?DataFrame?操作三個(gè)角度展示了?23?個(gè)?Pandas?核心方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python龍貝格法求積分實(shí)例

    Python龍貝格法求積分實(shí)例

    今天小編就為大家分享一篇Python龍貝格法求積分實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python 異步之如何保護(hù)任務(wù)免于取消詳解

    Python 異步之如何保護(hù)任務(wù)免于取消詳解

    這篇文章主要為大家介紹了Python 異步之如何保護(hù)任務(wù)免于取消示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • wtfPython—Python中一組有趣微妙的代碼【收藏】

    wtfPython—Python中一組有趣微妙的代碼【收藏】

    Wtfpython講解了大量的Python編譯器的內(nèi)容。這篇文章主要介紹了wtfPython-Python中一些奇妙的代碼,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-08-08
  • pygame實(shí)現(xiàn)貪吃蛇游戲(上)

    pygame實(shí)現(xiàn)貪吃蛇游戲(上)

    這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 如何利用python執(zhí)行txt文件中的代碼

    如何利用python執(zhí)行txt文件中的代碼

    這篇文章主要介紹了如何利用python執(zhí)行txt文件中的代碼,python這么強(qiáng)大的語(yǔ)言當(dāng)然可以做大,只需使用內(nèi)置的exex()函數(shù),進(jìn)入主題前我們先來(lái)看看什么是exec()函數(shù),需要的小伙伴可以參考一下
    2022-03-03
  • python使用句柄控制windows窗口的兩種方法

    python使用句柄控制windows窗口的兩種方法

    本文主要介紹了python使用句柄控制windows窗口的兩種方法,實(shí)現(xiàn)窗口的最小化,還原,最大化,關(guān)閉操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01

最新評(píng)論

新津县| 建湖县| 和平区| 潼南县| 伊宁县| 荔波县| 哈巴河县| 新邵县| 洪雅县| 平乐县| 平度市| 兴国县| 安丘市| 象山县| 宝鸡市| 邻水| 合肥市| 澄城县| 普宁市| 温州市| 鄯善县| 栾川县| 淳化县| 龙井市| 牟定县| 滁州市| 大埔区| 抚远县| 株洲市| 平安县| 涡阳县| 景洪市| 永靖县| 胶州市| 沅江市| 蓝山县| 香格里拉县| 广元市| 雅江县| 环江| 太仆寺旗|