柚子快報激活碼778899分享:使用OpenCV來實現(xiàn)車輛統(tǒng)計
柚子快報激活碼778899分享:使用OpenCV來實現(xiàn)車輛統(tǒng)計
百度網(wǎng)盤視頻鏈接: 鏈接:https://pan.baidu.com/s/1UC7CAFOVe25KtbgFk723EA?pwd=yrkk? 提取碼:yrkk
1.最終效果展示:
可以統(tǒng)計視頻中的車輛
2.實現(xiàn)思路
加載視頻圖像預處理(去噪、背景減除、形態(tài)學)對車輛進行統(tǒng)計顯示車輛統(tǒng)計信息(增加水?。?/p>
3.詳細步驟與技術實現(xiàn)
在這一部分,我們將深入探討如何使用OpenCV庫來實現(xiàn)車輛統(tǒng)計的具體步驟和技術細節(jié)。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量用于圖像處理和計算機視覺任務的函數(shù)。
3.1 加載視頻
首先,我們需要加載包含車輛運動的視頻文件。在OpenCV中,這可以通過cv2.VideoCapture()函數(shù)來完成。你需要指定視頻文件的路徑作為參數(shù)。
代碼示例:
import cv2
# 視頻文件路徑
video_path = 'video.mp4'
# 創(chuàng)建一個VideoCapture對象
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print("Error: Could not open video.")
exit()
3.2 圖像預處理
圖像預處理是車輛檢測的關鍵步驟,它可以幫助我們提高檢測的準確性和效率。
3.2.1 去噪
為了去除圖像中的噪聲,我們可以使用高斯模糊或中值模糊等方法。這里我們使用高斯模糊。
代碼示例:
# 讀取視頻幀
ret, frame = cap.read()
if ret:
# 應用高斯模糊
blurred_frame = cv2.GaussianBlur(frame, (5, 5), 0)
3.2.2 背景減除
背景減除是車輛檢測中常用的技術,它可以幫助我們分離出移動的對象(如車輛)。這里我們可以使用混合高斯背景/前景分割器(MOG2)或KNN背景/前景分割器。
代碼示例:
# 創(chuàng)建背景減除器
fgbg = cv2.createBackgroundSubtractorMOG2()
# 對每一幀應用背景減除
fgmask = fgbg.apply(blurred_frame)
3.2.3 形態(tài)學操作
形態(tài)學操作如腐蝕和膨脹可以幫助我們?nèi)コ〉脑肼朁c和填補前景對象中的小洞。
代碼示例:
# 腐蝕操作
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
eroded_fg = cv2.erode(fgmask, kernel, iterations=2)
# 膨脹操作
dilated_fg = cv2.dilate(eroded_fg, kernel, iterations=2)
3.3 對車輛進行統(tǒng)計
在形態(tài)學處理之后,我們通常會通過輪廓檢測來識別出車輛。使用cv2.findContours()函數(shù)可以找到圖像中的輪廓。
代碼示例:
# 找到輪廓
contours, hierarchy = cv2.findContours(dilated_fg, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 初始化車輛計數(shù)器
vehicle_count = 0
for contour in contours:
# 過濾掉小的輪廓
if cv2.contourArea(contour) > min_area_threshold:
vehicle_count += 1
# 可以在這里繪制輪廓或進行其他處理
cv2.drawContours(frame, [contour], -1, (0, 255, 0), 3)
# 更新車輛統(tǒng)計信息
print(f"Total vehicles detected: {vehicle_count}")
3.4 顯示車輛統(tǒng)計信息(增加水?。?/p>
在視頻幀上顯示車輛統(tǒng)計信息,我們可以使用cv2.putText()函數(shù)在圖像上添加文本。
代碼示例:
# 在視頻幀上添加車輛統(tǒng)計信息
cv2.putText(frame, "car number:{}".format(car_cnt), (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 顯示結果
cv2.imshow('frame', frame)
3.5 清理資源
在視頻處理完成后,記得釋放VideoCapture對象和關閉所有OpenCV窗口。
代碼示例:
# 釋放VideoCapture對象
cap.release()
cv2.destroyAllWindows()
print("車輛數(shù)量:", car_cnt)
通過以上步驟,我們可以實現(xiàn)一個基本的車輛統(tǒng)計系統(tǒng)。當然,這個系統(tǒng)可以根據(jù)具體需求進行擴展和優(yōu)化,比如使用更復雜的背景減除算法、引入深度學習模型進行車輛檢測等。
4.項目完整代碼(這里只使用了形態(tài)學進行降噪)
"""
車輛識別
1.前景和后景的分離
二值圖
2.通過二值圖查找輪廓
3.通過輪廓,獲取外接最大的矩形區(qū)域,從而查找車輛
4.根據(jù)區(qū)域上的每一個點P0(x0,y0)
5.繪制一條線的區(qū)域范圍:
如果P0點穿過線的范圍,就統(tǒng)計一輛車
"""
import cv2
cap = cv2.VideoCapture("video.mp4")
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, ksize=(5, 5))
# 前后景分離
bgSegMog = cv2.createBackgroundSubtractorMOG2()
line_y = 550
offset = 6
# 統(tǒng)計車輛數(shù)量
car_cnt = 0
while cap.isOpened():
retval, frame = cap.read()
if not retval:
print('讀取視頻失敗')
break
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# erode_frame = cv2.erode(frame_gray, kernel, iterations=10)
# 前后景分離
mask = bgSegMog.apply(frame_gray)
mask_erode = cv2.erode(mask, kernel, iterations=1)
mask_erode_dilate = cv2.dilate(mask_erode, kernel, iterations=1)
#查找輪廓
contours, hierarchy = cv2.findContours(mask_erode_dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 繪制一條線的區(qū)域范圍:
cv2.line(frame, (0, line_y), (1280, line_y), (0, 0, 255), 2)
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
if w < 90 and h < 90:
continue
if y > (line_y - offset) and y < (line_y + offset):
car_cnt+=1
pass
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(frame, "car number:{}".format(car_cnt), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow("frame", frame)
# cv2.imshow("mask", mask)
# cv2.imshow("mask_erode", mask_erode)
# cv2.imshow("mask_erode_dilate", mask_erode_dilate)
cv2.waitKey(25)
cap.release()
cv2.destroyAllWindows()
print("車輛數(shù)量:", car_cnt)
5.總結
? ? ? ? 本文使用OpenCV構建車輛統(tǒng)計系統(tǒng),涵蓋視頻加載、圖像預處理(去噪、背景減除、形態(tài)學操作)、車輛檢測與計數(shù),并在視頻幀上實時顯示車輛總數(shù)。通過輪廓檢測與面積過濾識別車輛,優(yōu)化檢測準確性。系統(tǒng)實現(xiàn)自動化處理,可進一步擴展功能如車輛跟蹤。展示了OpenCV在車輛統(tǒng)計中的強大能力,為相關領域提供了實用參考。
柚子快報激活碼778899分享:使用OpenCV來實現(xiàn)車輛統(tǒng)計
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。