Hog特征提取 openCV

目标检测的图像特征提取之(一)HOG特征
这篇文章讲的比较透彻,可以参考。需要注意的是,这篇文章最后的例子计算结果是错误的,正确结果是2340。

OpenCV HOGDescriptor 参数图解
这篇文章通过图解的方式详细解释了一下window、block、cell的关系。

HOG特征-理解篇
这是大神@Rachel-Zhang 写的。

opencv源码解析之(6):hog源码分析
openCV的hog源码解析。

openCV的实现代码:

    Mat imageMat;
    imageMat = imread("/Users/***/Desktop/640_480.png", 1);//图像大小640 * 480
    if (!imageMat.data) {
        printf("No image data.\n");
        return -1;
    }
    
    HOGDescriptor *hog = new HOGDescriptor(cvSize(64, 48), cvSize(32, 32), cvSize(8, 8), cvSize(16, 16), 9);
    vector descriptors;
    hog->compute(imageMat, descriptors, Size(2, 2), Size(0, 0));
    cout << "descriptors.size = " << descriptors.size() << endl;//输出hog特征描绘子的维度

输出是

descriptors.size = 54000

解释一下函数参数:
---HOGDescriptor函数
cvSize(64, 48):滑动窗口大小
cvSize(32, 32):block大小
cvSize(8, 8):block的移动步长
cvSize(16, 16):cell大小
9:bins个数
前四个参数的单位都是像素。

---compute函数
imageMat:图像
descriptors:hog描绘子(是一个向量,计算结果就储存在descriptors中)
Size(64, 48):窗口的移动步长
Size(0, 0):图像的padding补偿,因为有些图像的大小可不不那么合适,不能整除窗口大小,所以,可以在周围添加一圈补偿像素。

运行输出结果是 54000,咋来的呢?
是这样,先计算一个窗口的特征长度。一个cell是9个维度,一个block有4个cell,那么一个block就有4*9=36个维度。滑动窗口大小是64*48,block大小是32*32,block的步长是8*8,那么在窗口内,block横向扫描 (64 - 32) / 8 + 1 = 5次,纵向扫描 (48 - 32) / 8 + 1 = 3次,那么总共扫描 3 * 5 = 15次,15 * 36 = 540,即一个窗口的特征维度大小是540.
然后,窗口在图像上滑动,图像大小 640*480,窗口大小 64*48,滑动步长是 64*48,那么横向扫描 (640 - 64) / 64 + 1 = 10 次,纵向扫描 (480 - 48) / 48 + 1 = 10 次,那么总共扫描窗口 100次。
当然,这里的窗口滑动步长设置的是不合理的,为了方便计算我写的是 (64, 48)。
所以,540*100 = 54000,结果就是这么来的。

你可能感兴趣的:(Hog特征提取 openCV)