基於vlfeat的HOG特徵提取c++程式碼實現

MMMMASTER發表於2015-10-30

HOG特徵又叫方向特徵直方圖特徵,是計算機視覺中作為目標檢測十分常用且奏效的特徵。其最著名的應用就是HOG+SVM這種思路解決了行人檢測的任務,這項工作發表在了CVPR2005上,從此之後,HOG+SVM這種模式被複制在了很多其他工作中。

有趣的是,在網路上我們可以輕而易舉的搜尋到無數篇關於HOG特徵的理論介紹,卻很少可以找到C++版本的程式碼。這無疑對計算機視覺研究剛剛入門的同學造成了很大困擾,紙上談兵不如將程式碼跑出來直接檢視實驗效果。這裡我與大家分享一下基於VLFeat的HOG特徵提取程式碼,希望對大家的學習有所幫助。當然,我的程式碼只是實現了對一張圖片的處理流程,及簡單的引數設定,同學們還要根據自己的實際情況在這段程式碼的基礎上稍作修改。話不多說,直接上程式碼。

#include <iostream>
#include <opencv.hpp>
#include <vl/hog.h>

using namespace std;

int main()
{
    cv::Mat image,img;
    image = cv::imread("image path");
    cv::cvtColor(image,img,CV_RGB2GRAY);
    //convert img to a float array
    float *vlimg = new float[img.cols*img.rows];
    int tmp = 0;
    for(int i=0;i<img.cols;i++)
        for(int j=0;j<img.rows;j++)
        {
            vlimg[tmp++] = img.at<uchar>(j,i)/255.0;
        }

    //set vl parameters
    vl_size numOrientations = 9;  //specifies the number of orientations
    vl_size numChannels = 1;      //number of image channel
    vl_size height = img.rows;
    vl_size width = img.cols;
    vl_size cellSize = 8;         //size of a hog cell
    vl_size hogWidth, hogHeight, hogD;
    float *hogArray;             //hog features array
    //extract hog 
    VlHog *hog = vl_hog_new(VlHogVariantDalalTriggs, numOrientations, VL_FALSE) ;
    vl_hog_put_image(hog, vlimg, height, width, numChannels, cellSize) ;
    hogWidth = vl_hog_get_width(hog) ;
    hogHeight = vl_hog_get_height(hog) ;
    hogD = vl_hog_get_dimension(hog) ;
    hogArray = (float*)vl_malloc(hogWidth*hogHeight*hogD*sizeof(float)) ;
    vl_hog_extract(hog, hogArray) ;
    vl_hog_delete(hog) ;
    //parameters of image and its hog
    cout<<"height = "<<img.rows<<"         width = "<<img.cols<<endl;
    cout<<"hogWidth = "<<hogWidth<<endl<<"hogHeight = "<<hogHeight<<endl<<"hogD = "<<hogD;
    cv::imshow("img",img);
    delete[] vlimg;
    cv::waitKey(0);
}

這段程式碼用到了opencv及vlfeat兩個庫。這兩個庫的配置大家可以自行百度,網上的方法很多。這裡就不再贅述。
程式碼最後的輸出部分只是依據理論分析的一個結果驗證,結合程式輸出可以幫助同學們更好的理解hog原理。

相關文章