Ok,这篇主要讲述如何使用Dlib库实现形状不变物体的动态跟踪。
首先,确保您的python库中,包含了dlib,如果没有,请参考如下blog:
https://blog.csdn.net/sinat_38530349/article/details/86742523
OK,安装好dlib,我们可以使用dlib下面
这个封装好的类实现,物体的动态追踪。
首先定义好一个矩形区域(给定四个参数Xmin,Ymin,Xmax,Ymax)
建立一个tracker的实例
tracker.start_track(img, dlib.rectangle(133, 153, 330, 734)
将他最开始固定在某个矩形区域:
# 捕捉最开始的矩形区域最为目标,适合跟踪形态几乎不变的物体
tracker.start_track(img, dlib.rectangle(133, 153, 330, 734))
我们可以准备好一段测试用的视频。
cap = cv2.VideoCapture('../../../dataset/sequences_image/bottle.mp4')
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频帧速率
接下来进行对每一帧进行更新,跟新矩形坐标的主要是用update函数
while cap.isOpened():
ret, image_np = cap.read()
if len((np.array(image_np)).shape) == 0:
break
image_np = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)
tracker.update(image_np)
plt1=(int(tracker.get_position().left()),int(tracker.get_position().top()))
plt2=(int(tracker.get_position().right()),int(tracker.get_position().bottom()))
cv2.rectangle(image_np,plt1,plt2,(0,255,0),2)
cv2.imshow("",image_np)
cv2.waitKey(int(1000/fps))
cap.release()
cv2.destroyAllWindows()
完整测试程序如下:
__author__ = "Luke Liu"
#encoding="utf-8"
# -*- coding: utf-8 -*-
# with the help of labelimg
import dlib
from imageio import imread
import glob
import cv2
import numpy as np
cap = cv2.VideoCapture('../../../dataset/sequences_image/bottle.mp4')
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频帧速率
# 创建一个tracker
tracker = dlib.correlation_tracker()
path = "../../../dataset/sequences_image/0.png"
img = imread(path)
# 捕捉最开始的矩形区域最为目标,适合跟踪形态几乎不变的物体
tracker.start_track(img, dlib.rectangle(133, 153, 330, 734))
while cap.isOpened():
ret, image_np = cap.read()
if len((np.array(image_np)).shape) == 0:
break
image_np = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY)
tracker.update(image_np)
plt1=(int(tracker.get_position().left()),int(tracker.get_position().top()))
plt2=(int(tracker.get_position().right()),int(tracker.get_position().bottom()))
cv2.rectangle(image_np,plt1,plt2,(0,255,0),2)
cv2.imshow("",image_np)
cv2.waitKey(int(1000/fps))
cap.release()
cv2.destroyAllWindows()
那么问题来了,我们如何确定第一帧时候,物体的位置矩形坐标呢?
对于一段已知的视频,我们可以使用ski-video将其转化为帧序列,对第一帧使用labelimg进行手工标注,生成XML文件,通过查看XML文件,获得矩形的位置。
至于ski-video的installation,直接用pip可能会出现各种各样的问题,建议使用conda:
安装conda-forge
conda-forge是编译的ffmpeg视频编解码库,它可直接对视频读存取
conda install ffmpeg -c conda-forge
然后pip
pip install ski-video
对一个MP4文件转化视频sequences十分简单:
__author__ = "Luke Liu"
#encoding="utf-8"
import skvideo.io
import numpy as np
import os
saved_file="C:/Users/asus/Desktop/sequences_image"
mp4_path='C:/Users/asus/Desktop/bottle.mp4'
videogen = skvideo.io.vreader(mp4_path,num_frames=30)
i = 0
for frame in videogen:
skvideo.io.vwrite(os.path.join(saved_file,"{}.png".format(i)), frame)
i = i + 1
关于labelimg 下载地址如下:
链接:https://pan.baidu.com/s/1XHNXXSe6oJWrH-d_FuUA_g
提取码:lras
解压后运行exe文件,Open 第一张图,按w进行标注,输入类别,Ctrl+S save into xml
查看xml文件
便可知道初始矩形的参数