基于dlib的目标追踪

之前都在做目标检测,训练自己的检测器做检测,缺点就是电脑性能稍微差点的话,预测一次的时间就会稍久,我做的又正好是视频预测,所以连续播放都卡成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()

要说的都写在注释里啦,要是有不对的地方欢迎指正~

你可能感兴趣的:(计算机视觉,opencv,目标跟踪)