使用dlib实现形状不变物体的动态跟踪

使用dlib实现形状不变物体的动态跟踪_第1张图片

Ok,这篇主要讲述如何使用Dlib库实现形状不变物体的动态跟踪。

首先,确保您的python库中,包含了dlib,如果没有,请参考如下blog:

https://blog.csdn.net/sinat_38530349/article/details/86742523

OK,安装好dlib,我们可以使用dlib下面

correlation_tracker 

这个封装好的类实现,物体的动态追踪。

首先定义好一个矩形区域(给定四个参数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文件

使用dlib实现形状不变物体的动态跟踪_第2张图片

  便可知道初始矩形的参数

你可能感兴趣的:(Machine,Learning)