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