SiamFC:Fully-Convolutional Siamese Networks for Object Tracking中模板图片的获取方法
在这个算法中,将视频的第一帧作为制作模板图片的素材,第一帧图片有要跟踪目标的box信息,可以得到框的中心x的坐标,框的宽度w,框的高度h,也就是目标中心的坐标。
第一种情况:
然后获取框周围的context,以目标中心为原点,sqrt{[w+(w+h)/2]*[h+(w+h)/2]}边长构造一个context,这么做的目的是保证最后得到的图能完整包含框里面的目标。
得到了context之后,如果context完全在图像里面,则直接将这个区域裁剪出来,再放大到127*127的大小,得到最后的模板图片。
第二种情况:
获取的context有一部分超出了图像之外,那么就以超出部分的最大值dataw作为周边填充长度,用图片灰度平均值对其填充。然后将这个contex区域裁剪出来,注意目标中心坐标在新的图像下发生了变化。然后得到模板图片。
代码实现如下:
import numpy as np
from scipy.misc import imresize
import cv2
def pad_frame(im, frame_sz, pos_x, pos_y, patch_sz, use_avg=True):
c = patch_sz / 2
xleft_pad = np.maximum(0, - np.round(pos_x - c))
ytop_pad = np.maximum(0, - np.round(pos_y - c))
xright_pad = np.maximum(0, np.round(pos_x + c) - frame_sz[1])
ybottom_pad = np.maximum(0, np.round(pos_y + c) - frame_sz[0])
npad = np.amax(np.asarray([xleft_pad, ytop_pad, xright_pad, ybottom_pad]))
npad = np.int32(np.round(npad))
paddings = ((npad, npad), (npad,npad), (0,0))
if use_avg:
im0 = np.pad(im[:, :, 0], paddings[0:2], mode='constant',constant_values=im[:, :, 0].mean())
im1 = np.pad(im[:, :, 1], paddings[0:2], mode='constant',constant_values=im[:, :, 0].mean())
im2 = np.pad(im[:, :, 2], paddings[0:2], mode='constant',constant_values=im[:, :, 0].mean())
im_padded = np.stack([im0,im1,im2], axis=2)
else:
im_padded = np.pad(im, paddings, mode='constant')
return im_padded, npad
img=cv2.imread('2.jpg')
cv2.namedWindow("Image", cv2.WND_PROP_FULLSCREEN)
try:
init_rect = cv2.selectROI('Image', img, False, False)
x, y, w, h = init_rect
except:
exit()
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 4)
cv2.imshow('Image',img)
cv2.imwrite('1_0.jpg',img)
cv2.waitKey(0)
image = np.asarray(img)
center=np.array([x+w/2,y+h/2])
target_sz=np.array([w,h])
context = 0.5 * np.sum(target_sz)
z_sz = np.sqrt(np.prod(target_sz + context))
print(z_sz)
img1,npad=pad_frame(image,image.shape,center[0],center[1],z_sz)
cv2.rectangle(img1, (int(center[0]-z_sz/2+npad),int(center[1]-z_sz/2+npad)),(int(center[0]+z_sz/2+npad),int(center[1]+z_sz/2+npad)), (0,255,0), 4)
cv2.imshow('Image',img1)
cv2.imwrite('1_1.jpg',img1)
cv2.waitKey(0)
size=z_sz
corners = np.concatenate((np.round(center - (size - 1) / 2),np.round(center - (size - 1) / 2) + z_sz))
corners = np.round(corners).astype(int)
print(corners)
corners = (corners + npad).astype(int)
img2=cv2.rectangle(img1, (corners[0],corners[1]), (corners[2],corners[3]), (0,0,255), 4)
patch = img2[corners[1]:corners[3], corners[0]:corners[2]]
#patch = img2[797:1344, 276:823]
cv2.imshow('Image',img2)
cv2.imwrite('1_2.jpg',img2)
cv2.waitKey(0)
patch1 = cv2.resize(patch, (127, 127))
print(patch.shape)
cv2.imshow('Image',patch1)
#cv2.imshow('Image',img2)
cv2.imwrite('1_3.jpg',patch1)
cv2.waitKey(0)