目标追踪之opencv中追踪器的应用(python)
opencv的强大之处想必做过图像处理的人都应该了解,吹一波。今天写了一下python调用opencv追踪器在OTB数据集上的目标追踪。首先,需要注意的是仅安装opencv-python是不够的,还需要其加强包opencv-contrib-python,此时需要注意的是这两个包的版本要相同。
下边是我为OTB50+opencv写的目标追踪的调用程序,大家可以参考一下,其中需要指定采用数据集名称name,图片存放路径path1,追踪标准的路径path2。共支持'BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW',‘MOOSE’这几种追踪器,修改时更改tracker_type=tracker_types[1]中的序号即可。 'GOTURN'这个跟踪器需要另外的文件支持,下载地址https://github.com/spmallick/goturn-files,将其解压后放在工程目录下即可。
import os
import cv2
import numpy as np
def num_read_directory(directory_name):
filename1=os.listdir(directory_name)
return len(filename1)
def read_directory(directory_name,num):
filename1=os.listdir(directory_name)
img = cv2.imread(directory_name + "/" + filename1[num],cv2.IMREAD_COLOR)
return img
if __name__ == '__main__':
name="Biker"
path1="H:/tracking/OTB50/"+name+"/img/"
path2="H:/tracking/OTB50/"+name+"/groundtruth_rect.txt"
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN','MOSSE']
tracker_type=tracker_types[1]
num_image=num_read_directory(path1)
print(num_image)
img=read_directory(path1,0)
print(img.shape)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("H:/tracking/OTB50/"+name+"/"+tracker_type+"_out.avi",fourcc, 24, (img.shape[1],img.shape[0]))
f = open(path2)
frames=np.zeros([num_image,4])
j=0
for i in f:
frames[j,:]=i.split(',')
j+=1
print(i)
f.close()
if int(minor_ver) < 3:
tracker1 = cv2.Tracker_create(tracker_type)
else:
if tracker_type == 'BOOSTING':
tracker1 = cv2.TrackerBoosting_create()
if tracker_type == 'MIL':
tracker1 = cv2.TrackerMIL_create()
if tracker_type == 'KCF':
tracker1 = cv2.TrackerKCF_create()
if tracker_type == 'TLD':
tracker1 = cv2.TrackerTLD_create()
if tracker_type == 'MEDIANFLOW':
tracker1 = cv2.TrackerMedianFlow_create()
if tracker_type == 'GOTURN':
tracker1 = cv2.TrackerGOTURN_create()
if tracker_type == 'MOSSE':
tracker1 = cv2.TrackerGOTURN_create()
img = read_directory(path1,0)
img_first=img.copy()
cv2.rectangle(img_first,(int(frames[0,0]),int(frames[0,1])),(int(frames[0,0]+frames[0,2]),int(frames[0,1]+frames[0,3])),(0,0,255),1)
#bbox = cv2.selectROI(img_first, False)
bbox=tuple(frames[0,:])
tracker1.init(img_first,bbox)
cv2.namedWindow('image',cv2.WINDOW_AUTOSIZE)
cv2.imshow('image', img_first)
for i in range(num_image-1):
image=read_directory(path1,i+1)
status,box1_predict = tracker1.update(image)
cv2.rectangle(image, (int(box1_predict[0]), int(box1_predict[1])),
(int(box1_predict[0]+box1_predict[2]), int(box1_predict[1]+box1_predict[3])), (0, 255, 255), 3)
cv2.rectangle(image,(int(frames[i+1,0]),int(frames[i+1,1])),(int(frames[i+1,0]+frames[i+1,2]),
int(frames[i+1,1]+frames[i+1,3])),(0,0,255),3)
cv2.putText(image, tracker_type, (150, 20), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 255, 255), 2)
cv2.putText(image, "standard", (5, 20), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 2)
cv2.imshow('image', image)
out.write(image)
c = cv2.waitKey(10) & 0xff
if c == 27: break
cv2.destroyAllWindows()
下边列出几个追踪效果吧:
在Biker中KCF丢失追踪目标最早,MIL在这四种当中跟踪效果最好。当然这仅仅是对于Biker这个数据来说的。