dlib 目标跟踪

本文使用Python API中的dlib.correlation_tracker类。

官方文档入口:http://dlib.net/python/index.html#dlib.correlation_tracker

使用dlib.correlation_tracker实现目标跟踪基本分以下四步:

dlib.correlation_tracker()创建一个跟踪类;

start_track()中设置图片中的要跟踪物体的框;

update()实时跟踪下一帧;

get_position()得到跟踪到的目标的位置。

代码实现:

# -*- coding: utf-8 -*-
import cv2
import dlib

tracker = dlib.correlation_tracker()   # 导入correlation_tracker()类
cap = cv2.VideoCapture(0)    #opencv打开摄像头,参数为设备索引号,笔记本电脑,0表示使用其内置摄像头

selection = None   # 实时跟踪鼠标的跟踪区域
track_window = None   # 要检测的物体所在区域
drag_start = None   # 标记,是否开始拖动鼠标

#鼠标点击事件回调函数
def onmouse(event, x, y, flags, param):   
    global selection, track_window, drag_start      #定义全局变量
    if event == cv2.EVENT_LBUTTONDOWN:       #鼠标左键按下
        drag_start = (x, y)       #鼠标起始位置
        track_window = None
    if drag_start:       #是否开始拖动鼠标,记录鼠标位置
        xmin = min(x, drag_start[0])
        ymin = min(y, drag_start[1])
        xmax = max(x, drag_start[0])
        ymax = max(y, drag_start[1])
        selection = (xmin, ymin, xmax, ymax)
    if event == cv2.EVENT_LBUTTONUP:        #鼠标左键松开
        drag_start = None
        track_window = selection
        selection = None

def main():
    #创建图像与窗口,并将窗口与回调函数绑定
    cv2.namedWindow('image',1)
    cv2.setMouseCallback('image',onmouse)
    
    k=0
    while(1):
        ret, frame = cap.read()     #从摄像头读入1帧,ret表明成功与否
        if not ret:
            print("Game over!")
            break
        print("Processing Frame {}".format(k))
        img_raw = frame      #初始帧
        image = img_raw.copy()      #不改变初始帧,拷贝新的帧   

        # 初始化第一帧
        if k == 0:
            # 用鼠标拖拽一个框来指定区域  
            while True:
                img_first = image.copy()     #不改变原来的帧,拷贝一个新的
                if track_window:      #跟踪目标的窗口画出后,实时标出跟踪目标
                    cv2.rectangle(img_first,(track_window[0],track_window[1]),(track_window[2],track_window[3]),(0,0,255),1)
                elif selection:      #跟踪目标的窗口随鼠标拖动实时显示
                    cv2.rectangle(img_first,(selection[0],selection[1]),(selection[2],selection[3]),(0,0,255),1)
                cv2.imshow('image',img_first)
                if cv2.waitKey(5) == 27:    # 等待时间为5ms,用户按下按下ESC(ASCII码为27),退出循环
                    break
            tracker.start_track(image, dlib.rectangle(track_window[0], track_window[1], track_window[2], track_window[3]))
        else:
            # 不是第一帧了
            tracker.update(image)     #更新,实时跟踪
            # time.sleep(3)

        box_predict = tracker.get_position()      #得到目标的位置
        cv2.rectangle(image,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),1)
        cv2.imshow('image',image)
        
        c = cv2.waitKey(5) 
        if c == 27: break      # 如果按下ESC,则退出
        k+=1
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

运行结果:

初始时,窗口中只会显示第一帧图像;

使用鼠标拖拽一个框,红框选中目标;

按ESC键,设置框内为识别目标;

实时识别跟踪目标,橙框标出;

按ESC键退出。

动图上传不上去,就不上传啦啦~~

猜你喜欢

转载自blog.csdn.net/weixin_40277254/article/details/82188461