之前都在做目标检测,训练自己的检测器做检测,缺点就是电脑性能稍微差点的话,预测一次的时间就会稍久,我做的又正好是视频预测,所以连续播放都卡成PPT了,无奈之下选择抽帧检测,于是那闪烁效果堪比蹦迪现场的灯光,最后拍板定案的方法就是目标追踪了。开始研究目标追踪d额时候着实让我走了不少的弯路,吃了不少苦头。我尝试过两种方法,第一次选择opencv,做出来差强人意(当然也可能是我菜),而第二种就是我下面要写的,选择dlib库的目标追踪了。话不多说,直接上代码了。
import cv2
import dlib
video_path= r'E:\MBY\2103_ship-detection\pic\s2.mp4'
cap = cv2.VideoCapture(video_path)
count = 0
timeF = 24 #设定帧率
TRACKER= [] #设置放置追踪器的总列表
while(1):
ret, frame = cap.read()
if not ret:
break
if (count % timeF == 0) : #抽帧检测,可以自己设定帧率
f,result = predict_video(detector,frame,0.9) #这里可以更换自己的检测器
boxes = result['boxes'].tolist() #检测信息,我的检测信息是一个字典里套数组,故将其转成列表形式,若有多个检测物体,则是列表嵌套列表形式,列表里的信息包含标签,得分与预测框的坐标
if boxes != []: #当检测到目标物体时
trackers = [] #设置一个分追踪器列表
for i in boxes:
tracker = dlib.correlation_tracker() #设定追踪器
rect = dlib.rectangle(int(i[2]),int(i[3]),int(i[4]),int(i[5])) #获取检测信息,主要是获取检测信息中预测框的坐标
tracker.start_track(frame,rect) #将检测信息传入追踪器
trackers.append(tracker) #将追踪器添加到分追踪器列表中
TRACKER = trackers #将分追踪器列表的值赋予总追踪器列表
else:
# 对每一个追踪器进行更新
for tracker in TRACKER:
tracker.update(frame)
pos = tracker.get_position() #得到追踪器的位置信息
cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())),(0, 0, 0), 2) #画图
count += 1
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF #按下q键退出
if key == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
要说的都写在注释里啦,要是有不对的地方欢迎指正~