使用 OpenCV 构建车辆计数器系统
介紹
本文,我們將使用歐幾里德距離跟蹤和輪廓的概念在 Python 中使用 OpenCV 構建車輛計數器系統。
對象追蹤
對象跟蹤是在視頻中定位移動對象的過程。在 OpenCV 中有多種技術可以執行對象跟蹤??梢葬槍?2 種情況執行對象跟蹤:
跟蹤單個對象
跟蹤多個對象
在這里,我們將執行多對象跟蹤方法,因為我們在一個時間范圍內有多輛車。
流行的追蹤算法
DEEP SORT:它是最廣泛使用和非常有效的目標跟蹤算法之一,它適用于 YOLO 目標檢測,使用卡爾曼濾波器進行跟蹤。
質心跟蹤算法:質心跟蹤算法是一種易于理解且非常有效的算法。這是一個多步驟的過程。
步驟 1:獲取檢測到的對象的邊界框坐標并使用邊界框的坐標計算質心。
步驟 2:對于每個后續幀,它使用邊界框坐標計算質心,并為這些邊界框分配一個 id,并計算每個可能的質心之間的歐幾里德距離。
步驟 3:我們的假設是給定對象可能會在后續幀中移動,并且它們質心之間的歐幾里德距離將是與其他對象相比的最小距離。
步驟 4:將相同的 ID 分配給后續幀之間的最小移動質心。
為了檢測任何運動物體,我們可以用 frame(t) 減去 frame(t+1)。
對象跟蹤的應用
因為計算機不斷增長的計算能力,對象跟蹤變得越來越先進。對象跟蹤有一些主要的用例。
交通跟蹤和避免碰撞。
人群追蹤
無人在家時進行寵物追蹤
導彈跟蹤
空氣畫筆
實現歐幾里得距離跟蹤器
本文使用的所有代碼的源文件和測試視頻都可以通過這個鏈接下載:
https://github.com/Abhishekjl/OPENCV-
上面討論的所有步驟都可以使用一些數學計算來執行
我們已經建立了一個名為EuclideanDistTracker對象跟蹤的類。
import?math class?EuclideanDistTracker:def?__init__(self):#?Storing?the?positions?of?center?of?the?objectsself.center_points?=?{}#?Count?of?ID?of?boundng?boxes#?each?time?new?object?will?be?captured?the?id?will?be?increassed?by?1self.id_count?=?0def?update(self,?objects_rect):objects_bbs_ids?=?[]#?Calculating?the?center?of?objectsfor?rect?in?objects_rect:x,?y,?w,?h?=?rectcenter_x?=?(x?+?x?+?w)?//?2center_y?=?(y?+?y?+?h)?//?2#?Find?if?object?is?already?detected?or?notsame_object_detected?=?Falsefor?id,?pt?in?self.center_points.items():dist?=?math.hypot(center_x?-?pt[0],?center_y?-?pt[1])if?dist?<?25:self.center_points[id]?=?(center_x,?center_y)print(self.center_points)objects_bbs_ids.append([x,?y,?w,?h,?id])?????same_object_detected?=?Truebreak#?Assign?the?ID?to?the?detected?objectif?same_object_detected?is?False:self.center_points[self.id_count]?=?(center_x,?center_y)??????????????????????objects_bbs_ids.append([x,?y,?w,?h,?self.id_count])???????self.id_count?+=?1#?Cleaning?the?dictionary?ids?that?are?not?used?anymorenew_center_points?=?{}for?obj_bb_id?in?objects_bbs_ids:var,var,var,var,?object_id?=?obj_bb_idcenter?=?self.center_points[object_id]new_center_points[object_id]?=?center#?Updating?the?dictionary?with?IDs?that?is?not?usedself.center_points?=?new_center_points.copy()return?objects_bbs_ids你可以創建一個名為tracker.py并粘貼跟蹤器代碼的文件,也可以使用此鏈接(https://github.com/Abhishekjl/OPENCV-)直接下載跟蹤器文件。
update→更新方法需要一個包含所有邊界框坐標的數組。
tracker 返回一個包含 [x,y,w,h, object_id] 的數組。這里 x,y,w,h 是邊界框的坐標,object_id 是與該邊界框關聯的 id。
在準備好跟蹤器文件后,我們需要實現我們的目標檢測器,稍后我們將我們的跟蹤器與目標檢測器綁定。
加載庫和視頻
從我們已經創建的 tracker.py 文件中導入我們的 EuclideanDistTracker 類。
import?cv2 import?numpy?as?np from?tracker?import?EuclideanDistTracker tracker?=?EuclideanDistTracker() cap??=?cv2.VideoCapture('highway.mp4') ret,?frame1?=?cap.read() ret,?frame2?=?cap.read()cap.read()它返回幀和布爾值,我們需要捕獲幀。
在 OpenCV 中獲取視頻幀
這個想法是獲得兩個后續幀之間的絕對差,以便檢測移動對象。
while?cap.isOpened():#?ret,?frame?=?cap.read()diff?=?cv2.absdiff(frame1,?frame2)??#?this?method?is?used?to?find?the?difference?bw?two??framesgray?=?cv2.cvtColor(diff,?cv2.COLOR_BGR2GRAY)blur?=?cv2.GaussianBlur(gray,?(5,5),?0?)#?here?i?would?add?the?region?of?interest?to?count?the?single?lane?carsheight,?width?=?blur.shapeprint(height,?width)#?thresh_value?=?cv2.getTrackbarPos('thresh',?'trackbar')_,?threshold?=?cv2.threshold(blur,?23,?255,?cv2.THRESH_BINARY)dilated?=?cv2.dilate(threshold,?(1,1),?iterations=1)contours,?_,?=?cv2.findContours(dilated,?cv2.RETR_TREE,?cv2.CHAIN_APPROX_SIMPLE)detections?=?[]#?DRAWING?RECTANGLE?BOX?(Bounding?Box)for?contour?in?contours:(x,y,w,h)?=?cv2.boundingRect(contour)if?cv2.contourArea(contour)?<300:continuedetections.append([x,y,w,h])boxes_ids?=?tracker.update(detections)for?box_id?in?boxes_ids:x,y,w,h,id?=?box_idcv2.putText(frame1,?str(id),(x,y-15),??cv2.FONT_HERSHEY_SIMPLEX,?0.8,?(0,0,255),?2)cv2.rectangle(frame1,?(x,y),(x+w,?y+h),?(0,255,0),?2)cv2.imshow('frame',frame1)frame1?=?frame2ret,?frame2?=?cap.read()key?=?cv2.waitKey(30)if?key?==?ord('q):break cv2.destroyAllWindows()cv2.absdiff 此方法用于獲取兩幀之間的絕對差。
得到幀差后將差值轉換為灰度,然后應用閾值和輪廓檢測。
找到的輪廓是所有運動物體的輪廓
為了避免所有的噪音,我們只采用那些尺寸大于 300 的輪廓。
boxes_ids 包含 (x,y,w,h,id)。
cv2.putText 用于在框架上寫入 Id。
cv2.rectange() 用于繪制邊界框。
輸出:車輛計數器系統
結論
在本文中,我們討論了對象跟蹤的概念和對象跟蹤的用例,即車輛計數器。
我們討論了對象跟蹤的一些應用,并討論了質心跟蹤算法中涉及的步驟,并將其用于車輛計數。
基于深度學習的對象跟蹤算法(如用于 YOLO 對象檢測的 DEEP SORT 算法)在我們的案例中執行得更準確。
☆ END ☆
如果看到這里,說明你喜歡這篇文章,請轉發、點贊。微信搜索「uncle_pn」,歡迎添加小編微信「 woshicver」,每日朋友圈更新一篇高質量博文。
↓掃描二維碼添加小編↓
總結
以上是生活随笔為你收集整理的使用 OpenCV 构建车辆计数器系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【mysql】如何对 时分秒 不规则的数
- 下一篇: 期权分仓系统是什么?期权分仓软件的原理又