KCF目标跟踪学习1——提取HOG特征

1.HOG算法

KCF算法在进行目标跟踪时,使用了图像的HOG特征替代了传统跟踪器所用的灰度特征。

作为一种图像的特征描述子,HOG特征将一张大小为w*h*c的图像转化为一个长度为n*1的特征向量。

更细致的讲解可参考以下文章:

https://blog.youkuaiyun.com/qq_59109986/article/details/127892628

https://www.cnblogs.com/alexme/p/11361563.html

2.利用OpenCV创建一个HOG描述符

a.参数解释

在ptyhon中,HOG描述符的参数是使用cv2中的HOGDescriptor()函数设置的,关于此函数的具体参数设置,可以参考以下文章:

https://www.cnblogs.com/alexme/p/11361563.html

https://blog.youkuaiyun.com/chen1234520nnn/article/details/85100384

https://blog.youkuaiyun.com/qq_36852276/article/details/94293375

在参数中,win_size, block_size, block_stride, cell_size, nbins可以根据实际情况自己设置,其他的一般情况下默认即可。

对于上述参数自己的理解:

HOG算法提取特征时,在设置好检测窗口(在目标追踪中即为ROI或者ROI按一定比例放大后的区域)后,会计算检测窗口每个像素的梯度大小和方向。

Cell即将检测窗口分成像素相连的单元格,cell_size即为一个单元格的大小(以像素为单位),cell越小,获取的细节信息越多。在每一个单元格中会创建一个柱形图,n_bins即为柱形图柱子的数量,通常都设置为9。

块Block由相邻单元格Cell拼接而成,如cell_size=(3*3),而block又由2*2个cell组成,则block_size=(6*6);block_stride即为block每次移动的距离(包括横向和纵向),类似于卷积中卷积核每次移动的步长。

win_size即为检测窗口的大小。注意它必须是cell大小的整数倍。

b.代码实现

import numpy as np
import cv2

# 读取图片、选取ROI、并以ROI为中心扩大2.5倍
padding = 2.5

image_path = "D:\\桌面\\学习\\目标追踪\\OTB100\\OTB100\\Basketball\\img\\0001.jpg"
image = cv2.imdecode(np.fromfile(image_path, dtype=np.uint8), flags=cv2.IMREAD_COLOR)
bbox = cv2.selectROI("select object",image)
cv2.destroyAllWindows()

x,y,w,h = bbox
cx = x + w//2
cy = y + h//2

w_padding = int(w*padding)//2*2
h_padding = int(h*padding)//2*2

x_padding = cx - w_padding//2
y_padding = cy - h_padding//2

sub_img = image[y_padding:y_padding + h_padding,x_padding:x_padding + w_padding,:]

先读取了一张图片,其中cv2.imdecode()功能和cv2.imread()是类似的,但是由于cv2.imread()图片路径中不能有中文,因此用的cv2.imdecode()。

读取图片后,手动框线ROI,再将ROI扩大2.5倍(KCF算法会将ROI扩大),并截取出sub_img。

# extract HOG feature
blockSize = (8, 8)  #block大小,定义每个块中有多少个单元格,单元格越小,所获得的细节越细
blockStride = (4, 4)  #block步长
cellSize = (4, 4)  #每个单元格的大小
winSize = (sub_img.shape[1]//4*4,sub_img.shape[0]//4*4)  # detection window(Must be an integer multiple of cell size)
nBins = 9  #将像素点梯度分为九个区间(直方图横坐标)

hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nBins)

winStride = winSize
w_padding, h_padding = winSize
w_block, h_block = blockStride
w_n = w_padding // w_block - 1  #block移动的次数
h_n = h_padding // h_block - 1
# 计算给定图像的HOG特征描述子,一个n*1的特征向量(n = w_n * h_n * 36)
hist = hog.compute(img=sub_img, winStride=winStride, padding=(0, 0))
hog_feature = hist.reshape(w_n, h_n, 36).transpose(2, 1, 0)

winSize中的运算意在将sub_img的w和h转化为cell的整数倍(因为cell为4*4的)。

运用cv2.HOGDescriptor()创建HOG描述符后,利用其中的compute函数即可计算HOG特征描述子。

最后,还可将提取出的HOG特征进行可视化。

代码是参考这篇文章的:https://blog.youkuaiyun.com/qq_59109986/article/details/127892628

# visualize the HOG
c, h, w = hog_feature.shape
feature = hog_feature.reshape(2, 2, 9, h, w).sum(axis=(0, 1))
grid = 16
hgrid = grid // 2
img = np.zeros((h * grid, w * grid))

for i in range(h):
    for j in range(w):
        for k in range(9):
            x = int(10 * feature[k, i, j] * np.cos(np.pi / 9 * k))
            y = int(10 * feature[k, i, j] * np.sin(np.pi / 9 * k))
            cv2.rectangle(img=img, pt1=(j * grid, i * grid), pt2=((j + 1) * grid, (i + 1) * grid),
                          color=(255, 255, 255))
            x1 = j * grid + hgrid - x
            y1 = i * grid + hgrid - y
            x2 = j * grid + hgrid + x
            y2 = i * grid + hgrid + y
            cv2.line(img=img, pt1=(x1, y1), pt2=(x2, y2), color=(255, 255, 255), thickness=1)
cv2.imshow("img", img)
cv2.waitKey(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值