我正在尝试计算视频的密集特征轨迹,如https://hal.inria.fr/hal-00725627/document。我正在尝试使用这样的openCV hog描述符:
winSize = (32,32)
blockSize = (32,32)
blockStride = (2,2)
cellSize = (2,2)
nbins = 9
hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)
hist = hog.compute(img)
然而,这会返回一个非常大的特征向量:(160563456,1)。
什么是窗户? (使用winsize) 什么是街区? 什么是细胞? 该文档对解释每个参数的含义并不是特别有用。
来自http://www.learnopencv.com/histogram-of-oriented-gradients/ 我看到,要计算HOG,我们为图像补丁的每个单元格创建一个直方图,然后在补丁上进行标准化。
我想要的是我的图像的每个(32,32)块的4个9bin直方图,应该从该贴片的(16,16)个细胞的直方图计算。因此,对于(480,640)图像,我期望最终的猪大小为40716。
<(>((32 * 32)/(16 * 16))* 9)*(((480-16 * 640-16)/(32 * 32)* 4))= 40716((PatchSize / cell size)* numBins)* numPatches = hogSize
我也看到人们做这样的事情:
winStride = (8,8)
padding = (8,8)
locations = ((10,20),)
hist = hog.compute(image,winStride,padding,locations)
但是,我不明白location参数的作用,因为我不希望仅在一个位置计算HOG功能,而是计算我图像的所有(32,32)个补丁。
答案 0 :(得分:1)
cell_size = (16, 16) # h x w in pixels
block_size = (2, 2) # h x w in cells
nbins = 9 # number of orientation bins
# winSize is the size of the image cropped to an multiple of the cell size
# cell_size is the size of the cells of the img patch over which to calculate the histograms
# block_size is the number of cells which fit in the patch
hog = cv2.HOGDescriptor(_winSize=(img.shape[1] // cell_size[1] * cell_size[1],
img.shape[0] // cell_size[0] * cell_size[0]),
_blockSize=(block_size[1] * cell_size[1],
block_size[0] * cell_size[0]),
_blockStride=(cell_size[1], cell_size[0]),
_cellSize=(cell_size[1], cell_size[0]),
_nbins=nbins)
self.hog = hog.compute(img)
答案 1 :(得分:0)
我们将图像分成mxn像素的单元格。比方说8x8。 因此,64x64图像将产生8x8像素的8x8单元格。
为了降低整体亮度效果,我们在特征计算中添加归一化停止。一个块包含几个单元格。我们不是对每个单元格进行标准化,而是跨块进行标准化。 32x32像素块将包含4x4 8x8像素单元。
窗口是我们计算特征描述符的图像的一部分。 假设你想在大图像中找到64x64像素的东西。然后,您将在图像上滑动64x64像素窗口并计算每个位置的特征描述符,然后使用该特征描述符找到最佳匹配位置...
这些都在文件中。只需阅读并进行实验,直到您理解为止。 如果您不能按照文档进行操作,请阅读源代码并查看逐行的内容。