目錄
項目介紹
整體流程
調(diào)試環(huán)境
項目流程
1.預處理
2.汽車識別——去背景算法(KNN/MOG2)
3.統(tǒng)計車流量數(shù)目
結(jié)尾
源代碼
測試視頻資料
流程圖
項目介紹
本次項目主要采用了傳統(tǒng)視覺的方法,對車道車流實現(xiàn)檢測,能較為準確的識別出來車道上的車輛數(shù)目。由于傳統(tǒng)視覺算法本身的局限性,因此也會有識別不準的地方。
整體流程
話不多說,先講思路,直接上流程圖
這里把所有預先設定的參數(shù)和變量統(tǒng)一稱為了“宏”,然后對識別到的每一幀圖像進行處理,最后得到理想的效果圖。
效果圖如下:
調(diào)試環(huán)境
- Jupyter Notebook(Anaconda)
- Python? ? 3.9.12
- OpenCv? 4.5.5
項目流程
1.預處理
#灰度
cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#高斯去噪
blur=cv2.GaussianBlur(frame,(5,5),5)
mask=removebg.apply(blur)
#腐蝕
erode=cv2.erode(mask,kernel,iterations=2))#iteration=n 迭代n次
#膨脹
dilate=cv2.dilate(erode,kernel,iterations=2
#cv2.imshow("x",dilate)
dst=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
2.汽車識別——去背景算法(KNN/MOG2)
? ? ? ? 先介紹KNN算法(因為本次采用的算法為KNN)
????????KNN最鄰近分類算法的實現(xiàn)原理:為了判斷未知樣本的類別,以所有已知類別的樣本作為參照,計算未知樣本與所有已知樣本的距離,從中選取與未知樣本距離最近的K個已知樣本,根據(jù)少數(shù)服從多數(shù)的投票法則(majority-voting),將未知樣本與K個最鄰近樣本中所屬類別占比較多的歸為一類。
??在Opencv中,KNN算法已經(jīng)被封裝好了,所以我們直接調(diào)用就可以。
#KNN算法去背景
removebg=cv2.createBackgroundSubtractorKNN()
????????MOG2是一個以混合高斯模型為基礎的前景/背景分割算法。使用 K(K=3 或 5)個高斯分布混合對背景像素進行建模。使用這些顏色(在整個視頻中)存在時間的長短作為混合的權重。背景的顏色一般持續(xù)的時間最長,而且更加靜止。這個函數(shù)有些可選參數(shù),比如要進行建模場景的時間長度,高斯混合成分的數(shù)量,閾值等。將他們?nèi)吭O置為默認值。然后在整個視頻中我們是需要使用backgroundsubtractor.apply() 就可以得到前景的掩模了。移動的物體會被標記為白色,背景會被標記為黑色的。使用方法同上,在此不過多贅述。
3.統(tǒng)計車流量數(shù)目
本次統(tǒng)計采用的方法為:找到矩形框的中心點經(jīng),當該點經(jīng)過提前所設定好的直線時,車輛數(shù)+1
計算中心點的函數(shù):
def center(x,y,w,h):
x1=int(w/2)
y1=int(h/2)
cx=x+x1
cy=y+y1
統(tǒng)計車流量的代碼部分:
cpoint=center(x,y,w,h)
cars.append(cpoint)#將中心點儲存到cars數(shù)組中
for (x,y) in cars:
if(y>lineHeight-7 and y<lineHeight+7):
Car_nums +=1
cars.remove((x,y))
print(Car_nums)
最后在經(jīng)過一些簡單的處理,該項目就實現(xiàn)了。文章來源:http://www.zghlxwxcb.cn/news/detail-447792.html
結(jié)尾
附源代碼:
import cv2
import numpy as np
lineHeight=550
#穿過直線的車的數(shù)量
Car_nums=0
#儲存中心坐標的數(shù)組
cars=[]
#KNN算法去背景
removebg=cv2.createBackgroundSubtractorKNN()
def center(x,y,w,h):
x1=int(w/2)
y1=int(h/2)
cx=x+x1
cy=y+y1
return cx,cy
video=cv2.VideoCapture('D://video.mp4')
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
while True:
ret,frame=video.read()
if(ret!=0):
#灰度
cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#高斯去噪
blur=cv2.GaussianBlur(frame,(5,5),5)
mask=removebg.apply(blur)
#腐蝕
erode=cv2.erode(mask,kernel,iterations=2)#iteration=n 迭代n次
#膨脹
dilate=cv2.dilate(erode,kernel,iterations=2)
#cv2.imshow("x",dilate)
dst=cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel)
#cv2.imshow("x1",dst)
#畫出檢測線
cv2.line(frame,(10,lineHeight),(1400,lineHeight),(255,0,0),2)
counts,h=cv2.findContours(dst,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#遍歷所有輪廓
for(i,c) in enumerate(counts):
(x,y,w,h)=cv2.boundingRect(c)
if((w<=90) and (h<=90)):
continue
if(y<66):
continue
#將有效的車繪制出來
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
cpoint=center(x,y,w,h)
cars.append(cpoint)#將中心點儲存到cars數(shù)組中
for (x,y) in cars:
if(y>lineHeight-7 and y<lineHeight+7):
Car_nums +=1
cars.remove((x,y))
print(Car_nums)
cv2.putText(frame,"Cars nums:"+str(Car_nums),(500,60),cv2.FONT_HERSHEY_DUPLEX,1,(255,0,0))
cv2.imshow("video",frame)
key=cv2.waitKey(1)
if(key==27):
break
video.release()
cv2.destroyAllWindows()
附上測試視頻資料:
鏈接:https://pan.baidu.com/s/1u_hjCtL3FR6FzeEVQar7wg?pwd=2Y1p?
提取碼:2Y1p文章來源地址http://www.zghlxwxcb.cn/news/detail-447792.html
較為形象的流程圖:
到了這里,關于基于Opencv+python的車流量檢測項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!