我正在尝试使用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培训师?
答案 0 :(得分:16)
为什么OpenCV用如此多的值填充特征向量?
猪特征的大小由以下等式确定(不仅仅根据图像尺寸确定):
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功能的参数(即nbins, blockSize, cellSize, winSize
),以获得所需大小的HOG功能。
但为什么hogdis.getDescriptorSize()和features.size()不一致?
他们是不同的。 getDescriptorSize()
返回分类所需的系数数。它可以按如下方式计算(参考here):
HOG descriptor length = #Blocks * #CellsPerBlock * #BinsPerCell
另一方面,features.size()
返回整个图像的所有HOG特征尺寸。
要训练,你需要传递features
。