2014-03-13 199 views
8

我试图使用OpenCV的HOG描述符,但从中计算出的特征向量似乎太长了。下面是一个说明该问题的片段:为什么opencv的HOG描述符返回如此多的值

#include <stdio.h> 
#include <opencv2/opencv.hpp> 
#include <stdlib.h> 
#include <vector> 

int main() 
{ 
    cv::Mat image = cv::imread("1.jpg"); 
    std::vector<float> features; 
    cv::HOGDescriptor hogdis; 
    hogdis.compute(image, features); 
    printf("HOG feature's length is %zu %zu\n", hogdis.getDescriptorSize(), features.size()); 
    return 0; 
} 

输出是

HOG feature's length is 3780 1606500 

后者的价值似乎很荒谬。图像1.jpg的尺寸为256x256x3,其像素少于特征向量。为什么OpenCV用这么多值填充特征向量?如何获得3780长矢量以供给我的SVM教练?

回答

13

为什么OpenCV用这么多值填充特征向量?

的HOG特征的大小由下式确定(不仅仅在图像尺寸确定):

size_hog_features = (size_t)nbins * (blockSize.width/cellSize.width) 
         * (blockSize.height/cellSize.height) * ((winSize.width 
         - blockSize.width)/blockStride.width + 1) 
         * ((winSize.height - blockSize.height) 
         /blockStride.height + 1); 

所以这是很正常的,你有这么长的HOG特征向量。

如何获取3780长矢量以供给我的SVM教练?

HOG特征的计算过程中,为了得到你想要的大小HOG功能之前

您可以设置参数(即nbins, blockSize, cellSize, winSize)。

但为什么hogdis.getDescriptorSize()和features.size()不一致?

它们是不同的。 getDescriptorSize()返回分类所需的系数数量。它可以计算如下(参见here):

HOG descriptor length = #Blocks * #CellsPerBlock * #BinsPerCell 

在另一方面,features.size()返回所有的整个图像的HOG特征尺寸。

要训练,您需要通过features

+0

但为什么'hogdis.getDescriptorSize()'和'features.size()'不一致? –

+0

@ C.R。查看更新后的答案。 – herohuyongtao

+0

您提供的公式完全独立于图像大小。但是,当我尝试尺寸为690x622的图像时,特征矢量具有18514440个元素,与上面的1606500不同。另外,特征向量比像素总数要多,更不用说超过40倍。 –