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)

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值