美文网首页数据科学家
Hog特征提取 openCV

Hog特征提取 openCV

作者: 贰拾贰画生 | 来源:发表于2016-03-26 20:19 被阅读7719次

    目标检测的图像特征提取之(一)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<float> 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

        本文链接:https://www.haomeiwen.com/subject/gibdlttx.html