目标旋转与缩放对KCF峰值的影响分析

前言

闲来无事,想来对目标跟踪过程中的目标大小,旋转,缩放等因素对KCF的相关峰的影响进行分析,给工程实践中KCF算法的优化做一些参考。

实验条件设置

输入图像大小:128 X 128
初始目标大小:32 X 32
模板大小:64 X 64
实验采用图像的灰度特征,进行高斯相关计算。

目标尺度变化

目标尺度变化范围0.50.60.70.80.91.01.11.21.31.41.5
响应图最大值0.0668480840.111808940.232026640.57100170.832849741.00000010.88254390.648447040.356169580.275285660.20936146
响应图最小值-0.04672203-0.04553543-0.03989693-0.029312855-0.017185785-2.0157451e-05-0.012943685-0.020009845-0.028667688-0.032690994-0.033392116
预测x位置24.069.509965455902364.064.064.5396091909225364.0000003908573264.3695700442237464.0000010396065264.0000126023309361.2989340944804367.88682475606274
预测y位置64.069.509961460703364.064.064.5396091909225364.064.3704385024264.064.0000063012289861.29760745583530560.113167608012546

KCF的峰值响应图与目标尺度变换的响应关系KCF峰值响应与目标尺度变换的关系
从实验图中可以看出,目标尺度变换对峰值响应的大小以及位置的影响较大,当目标的尺度变化在30%以内(0.7~1.3)之间的时候,从KCF的峰值响应还是能比较准确预测出目标的位置。当目标的尺度变化大于30%时,KCF的响应图中会出现多个峰值,导致目标的位置预测出错。因此KCF建议的目标尺度变化的适应范围为30%。

目标旋转变换

def rotate_image(angle, img_in):
    img = np.array(img_in)
    h,w,c= img.shape
    # 内置函数获取旋转矩阵M,正值表示逆时针旋转,假设左上角是坐标原点
    M = cv2.getRotationMatrix2D((w / 2, h / 2), angle, 1)
    # 执行旋转, 任意角度旋转
    result = cv2.warpAffine(img, M, (w, h))
    return result

def kcf_rotate_test(angle_list,im_w,t_w,im_path,tracker):
    img_init = np.zeros((im_w,im_w,3),dtype=np.uint8)
    sx_i= (im_w-t_w)/2
    sx_i= int(sx_i)
    img_init[sx_i:sx_i+t_w,sx_i:sx_i+t_w,:]= np.zeros((t_w,t_w,3),dtype=np.uint8) + 255
    tracker.init([sx_i,sx_i,t_w,t_w], img_init)
    x_list = []
    y_list = []
    max_list = []
    min_list = []
    for angle in angle_list:
        img_test = rotate_image(angle,img_init)
        tracker.init([sx_i, sx_i, t_w, t_w], img_init)
        # plt.imshow(img_test)
        # plt.show()
        boundingbox, res = tracker.update(img_test)
        x_list.append(boundingbox[0] + boundingbox[2] / 2)
        y_list.append(boundingbox[1] + boundingbox[3] / 2)
        M = np.max(res)
        N = np.min(res)
        max_list.append(M)
        min_list.append(N)
        res = (res - N) / (M - N) * 255
        res = res.astype(int)
        cv2.imwrite(im_path + str(angle) + '.png', res)
    return x_list, y_list, max_list, min_list
目标角度变化范围051015202530354045
响应图最大值1.00000010.980299830.913658740.83338460.75610130.692193450.64058840.60415970.583417530.57602036
响应图最小值-2.0157451e-05-0.008251084-0.016885508-0.022890527-0.025615571-0.025575582-0.024337143-0.025989398-0.027248029-0.027552575
预测x位置64.0000003908573263.962929406021563.9249161733116863.8954121811231663.8706187310460263.8562428474751663.83882381331281463.8258791499871363.8237934586033263.86116787894965
预测y位置64.064.040644609241364.0809066444163964.1222197181651364.1658549066552164.2133270486437864.2591550392146364.3074926813867264.3582557955438164.40825158684362

KCF响应图与目标旋转角度的关系KCF的最大峰值响应与目标旋转角度的关系
从实验数据看,KCF算法对目标旋转的适应性较好。由于本实验采用的是对称的方块目标作为测试,目标的旋转范围设定为0~45°。在目标旋转变化的过程中,相关相应图中的相关峰值有较大程度的降低,但与尺度变换带来的相关峰值的降低相比,要小得多。从相关图的形状中也可以看出,相关图的形状变化较小,说明KCF算法对目标旋转的适应性较强。这个特性推测与KCF采用的循环核原理相关。

参考博客

python plt.plot的用法:
Python OpenCV getRotationMatrix2D()实例讲解

后记

本文只是一些粗浅的分析,实际上我们在使用的过程中,还遇到过一些工程问题,希望能在以后的时间里进行归纳和总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值