【高空無人機視角下的路口車輛與行人檢測跟蹤與軌跡刻畫】
- 背景需求
- 可參考的方法
- 1、 opencv + python 實作目標跟蹤的方法:
- 主要代碼
- ① main.py
- ② items.py
- 檢測效果
- 2、 dlib庫單目標檢測方法
- 3、 深度學習方法
- 代碼
- 效果
- 推薦相關目標追蹤的博文
背景需求
背景:
專案需要在高空視角下,對視頻流中的行人與車輛進行跟蹤與軌跡記錄,理想的狀態如下所示:

完全達到上述實際達到可能有點難度,但是可以逐步嘗試實作,
可參考的方法
1、 opencv + python 實作目標跟蹤的方法:
這里是為了更加準確獲取具體目標的坐標資訊,減小檢測模型帶來的誤差因素,所以考慮單目標的跟蹤檢測,先用人工標注視頻流的第一幀,選擇要跟蹤的目標,之后進行逐幀跟蹤并刻畫軌跡,
采用opencv + python 結合的方法
- 環境依賴
- opencv-python==3.4.9.33
- contrib==0.3.0
- pytho==3.7
主要代碼
① main.py
# -*- coding: utf-8 -*-
# @Time : 2021/09/03
# @Author : Wupke
# Purpose : Single-object detection & Trajectory tracking using opencv and python
import cv2
from items import MessageItem
import time
import numpy as np
class ObjectTracker(object):
def __init__(self, dataSet):
self.cascade = cv2.CascadeClassifier(dataSet)
def track(self, frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = self.cascade.detectMultiScale(gray, 1.03, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
return frame
class Tracker(object):
'''
對于指定目標,進行后續跟蹤
'''
def __init__(self, tracker_type="BOOSTING", draw_coord=True):
'''
初始化追蹤器種類
'''
# 查看opencv版本
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
self.tracker_types = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
self.tracker_type = tracker_type
self.isWorking = False
self.draw_coord = draw_coord
# 構造追蹤器
if int(minor_ver) < 3:
self.tracker = cv2.Tracker_createBoosting(tracker_type)
else:
if tracker_type == 'BOOSTING':
self.tracker = cv2.TrackerBoosting_create()
if tracker_type == 'MIL':
self.tracker = cv2.TrackerMIL_create()
if tracker_type == 'KCF':
self.tracker = cv2.TrackerKCF_create()
if tracker_type == 'TLD':
self.tracker = cv2.TrackerTLD_create()
if tracker_type == 'MEDIANFLOW':
self.tracker = cv2.TrackerMedianFlow_create()
if tracker_type == 'GOTURN':
self.tracker = cv2.TrackerGOTURN_create()
def initWorking(self, frame, box):
'''
追蹤器作業初始化,frame:初始化追蹤畫面,box:追蹤的區域
'''
if not self.tracker:
raise Exception("追蹤器未初始化")
status = self.tracker.init(frame, box)
if not status:
raise Exception("追蹤器作業初始化失敗")
self.coord = box
self.isWorking = True
def track(self, frame):
'''
開啟追蹤,記錄記錄追蹤目標坐標
'''
message = None
if self.isWorking:
status, self.coord = self.tracker.update(frame)
if status:
message = {"coord": [((int(self.coord[0]), int(self.coord[1])),
(int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3])))]}
if self.draw_coord:
center_x = ''
center_y = ''
p1 = (int(self.coord[0]), int(self.coord[1]))
p2 = (int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3]))
cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)
message['msg'] = "is tracking"
center_x,center_y=int((p1[0]+p2[0])/2),int((p1[1]+p2[1])/2)
return MessageItem(frame, message),center_x,center_y # 匯出繪制的跟蹤框中心坐標
if __name__ == '__main__':
a = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
tracker = Tracker(tracker_type="KCF") # 跟蹤器可以切換其他的來看效果
# video = cv2.VideoCapture(0)
cap = cv2.VideoCapture("E:/Desktop/D_0239.mp4")
'''獲得視頻流幀數,保存跟蹤的視頻,保存處理后的視頻,注意保存處理后的視頻畫面幀的大小是否改變等等問題,否則會儲存視頻失敗
'''
fps,w,h, = int(cap.get(5)),int(cap.get(3)),int(cap.get(4))
print('fps: ', fps,'w: ', w,'h: ', h)
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
res_path = 'E:/Desktop/實驗室文字編輯作業/20210827無人機/demo/result000.mp4'
res = cv2.VideoWriter(res_path,fourcc,fps,(w,h),True)
i=0
car_tri=[] # 存盤系列軌跡點中心的坐標
while True:
ret, frame = cap.read()
frame = cv2.resize(frame, (1200, 800))
if i==0:
# 暫停第一幀進行手工標注
bbox = cv2.selectROI(frame, False)
tracker.initWorking(frame, bbox)
i+=1
#第二幀以后,開始保存每一幀的跟蹤框中心坐標
center=[]
if (ret):
item = tracker.track(frame)[0] # 畫面
x,y= tracker.track(frame)[1:] # 第二幀以后
center.append(x)
center.append(y)
car_tri.append(center)
# # 限制軌跡最大長度
# if len(car_tri)> 300:
# for k in range(len(car_tri) - 300):
# del car_tri[k]
# # # 繪制軌跡
if len(car_tri) > 2:
for j in range(1, len(car_tri) - 1):
pot1_x = car_tri[j][0]
pot1_y = car_tri[j][1]
pot2_x = car_tri[j + 1][0]
pot2_y = car_tri[j + 1][1]
cv2.line(frame, (pot1_x, pot1_y), (pot2_x, pot2_y), (255,0,0), 2)
# print(x,y)
frame=item.getFrame()
cv2.imshow("track", frame)
frame = cv2.resize(frame, (w, h)) # 還原視頻的原始尺寸
res.write(frame)
k = cv2.waitKey(1) & 0xff
if k == 27:
break
cap.release()
res.release()
cv2.destroyAllWindows()
② items.py
#encoding=utf-8
import json
'''
封裝類
'''
class MessageItem(object):
#用于封裝資訊的類,包含圖片和其他資訊
def __init__(self,frame,message):
self._frame = frame
self._message = message
def getFrame(self):
#圖片資訊
return self._frame
def getMessage(self):
#文字資訊,json格式
return self._message
# def getBase64Frame(self):
#回傳base64格式的圖片,將BGR影像轉化為RGB影像
# jepg = IOUtil.array_to_bytes(self._frame[...,::-1])
# return IOUtil.bytes_to_base64(jepg)
def getBase64FrameByte(self):
#回傳base64格式圖片的bytes
return bytes(self.getBase64Frame())
def getJson(self):
#獲得json資料格式
dicdata = {"frame":self.getBase64Frame().decode(),"message":self.getMessage()}
return json.dumps(dicdata)
def getBinaryFrame(self):
return IOUtil.array_to_bytes(self._frame[...,::-1])
檢測效果
- 車輛
- 行人
2、 dlib庫單目標檢測方法
還有dlib庫中的dlib.correlation_tracker()類實作目標跟蹤的方法
dlib官方檔案入口:
http://dlib.net/python/index.html#dlib.correlation_tracker
相關博文:https://blog.csdn.net/hongbin_xu/article/details/78359663
3、 深度學習方法
采用深度學習方法,先進行檢測,在結合跟蹤演算法進行軌跡刻畫,在這種視角下,需要重新訓練檢測的模型,而且行人目標較小,檢測難度大,效果不敢說(嘗試yolov+deepsort),正在整合,后續會更新,
代碼
在這里插入代碼片
效果
后續更新,,,,,,

推薦相關目標追蹤的博文
https://blog.csdn.net/qq_35488769/article/details/79103264
https://blog.csdn.net/hongbin_xu/article/details/78359663
https://blog.csdn.net/MHxiaoS/article/details/106675585
高空無人機視角下的檢測跟蹤資料集網址:
① https://www.ind-dataset.com/
② http://aiskyeye.com/download/multi-object-tracking_2021/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297669.html
標籤:其他
上一篇:哈希影像相似性識別
下一篇:OpenCV-影像明度




