1. 程式人生 > >基於vlfeat的HOG特徵提取c++程式碼實現

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

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原理。

相關推薦

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

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

基於sp++ matlab mfcc 特徵提取 c /c ++ 實現

//mel 濾波器函式 //x 輸入序列 fs取樣率 p濾波器個數 framesize 幀大小 inc 幀移 //提取mel濾波器引數用漢明窗函式 Matrix<Type> mfcc_m(double *x, int length,int fs, int p,

梅爾頻率倒譜系數(MFCC)的提取過程與C++程式碼實現

MFCC引數提取步驟 ——>預加重 ——>分幀 ——>對每一幀加窗 ——>對每一幀補零 ——>各幀訊號的FFT變換及其功率譜 ——>梅爾濾波(通過40個濾波器) ——>取對數 ——>DCT變換 ——>歸一化 1.預加重

C程式碼實現從FTP上下載檔案

從FTP上下載檔案這個功能我早就想實現了,但是苦於百度的文章大多是下載連結,一直沒捨得積分下載,這次通過查閱MSDN,將一套下載流程函式摸了一下,寫出程式碼實現從FTP下載檔案 環境 VS2015 程式碼: #include <iostream> #include <

c#程式碼實現排序演算法之歸併排序

歸併排序的平均時間複雜度為O(nlogn),最好時間複雜度為O(nlogn),最壞時間複雜度為O(nlogn),空間複雜度為O(n),是一種穩定的演算法。 1.將待排序序列r(1),r(2),…,r(n)劃分為兩個長度相等的子序列r(1),…r(n/2)和r(n/2+1),…,r

c#程式碼實現排序演算法之快速排序

快速排序的平均時間複雜度為O(nlog2n),最好時間複雜度為O(nlog2n),最壞時間複雜度為O(n²),空間複雜度為O(log2n),是一種不穩定的演算法。 1.劃分:選定一個記錄作為軸值,以軸值為基準將整個序列劃分為兩個子序列r(1)…r(i-1)和r(i+1)…r(n)

c#程式碼實現排序演算法之氣泡排序

氣泡排序的平均時間複雜度為O(n²),最好時間複雜度為O(n),最壞時間複雜度為O(n²),空間複雜度為O(1),是一種穩定的演算法。 1.將整個待排序的記錄序列劃分成有序區和無序區,初始時有序區為空,無序區包括所有待排序的記錄。 2.對無序區從前向後依次比較相鄰記錄,若反序則交

c#程式碼實現排序演算法之選擇排序

選擇排序的平均時間複雜度為O(n²),最好時間複雜度為O(n²),最壞時間複雜度為O(n²),空間複雜度為O(1),是一種不穩定的演算法。 1.將整個記錄序列劃分為有序區和無序區,初始時有序區為空,無序區含有待排序的所有記錄。 2.在無序區查詢值最小的記錄,將它與無序區的第一個記

c#程式碼實現排序演算法之插入排序

插入排序的平均時間複雜度為O(n²),最好時間複雜度為O(n),最壞時間複雜度為O(n²),空間複雜度為O(1),是一種穩定的演算法。 1.將整個待排序的記錄序列劃分成有序區和無序區,初始時有序區為待排序記錄序列的第一個記錄,無序區包括所有剩餘待排序的記錄。 2.將無序區的第一個

《大話資料結構4》—— 佇列的順序儲存結構 (迴圈佇列)—— C++程式碼實現

   佇列  ● 佇列的概念:   佇列(簡稱作隊,Queue)也是一種特殊的線性表,佇列的資料元素以及資料元素間的邏輯關係和線性表完全相同,其差別是線性表允許在任意位置插入和刪除,而佇列只允許在其一端進行插入操作在其另一端進行刪除操作。 佇

《大話資料結構5》—— 佇列的鏈式儲存結構 —— C++程式碼實現

目錄 鏈佇列 迴圈佇列和鏈式佇列的比較 鏈佇列 ●  實現佇列的最好的方式就是使用單鏈表來實現,佇列的鏈式儲存結構,其實就是線性表的單鏈表,只不過它只能尾進頭出而已——稱為鏈佇列。 ● 那為了操作方便,頭指標指向頭結點,隊尾指標指向終端節點,即最後一個結點元

[日常練習] 5. 基於掃雷遊戲的C語言實現

#include "game.h" void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for(i=0; i<rows; i++) { for(j=0

Vivado HLS實現FIR濾波器(1)——使用官方C程式碼實現FIR

使用官方C程式碼實現FIR 參考資料: 不同點說明 程式結構 C語言程式碼 模擬綜合 參考資料: 教程——基於HLS實現FIR濾波器https://blog.csdn.net/LZY27

資料結構經典例題解析C/C++程式碼實現(二)

第一題 題目 編一C程式,它能把讀入的整數依次插入到一個初始為空的二叉排序樹中,一直讀到-9999為止(-9999不插入該二叉排序樹)。輸出該二叉排序樹的前序序列、後序序列及葉結點的個數。(輸入時,兩個相鄰的整數用空格隔開)。 解析 這個程式碼可以參考二叉樹

資料結構經典例題解析C/C++程式碼實現(一)

考研需要吧,雖然挺基礎的,但是還是要練習下的,而且,還可以幫助一些其他同樣需要這些程式碼的朋友。 實現最基礎的資料結構建議是用C語言,這樣子很多細節都可以很好地把握,當然,如果用STL可以簡單地實現,那麼我也會實現一下。 第一題 題目 編一C程式,它能根據讀入的資

《大話資料結構9》—— “二叉樹的順序儲存結構”——C++程式碼實現

  順序儲存結構: 二叉樹的順序儲存結構就是用一維陣列儲存二叉樹中的結點,並且結點的儲存位置,也就是陣列的下標要能體現結點之間的關秀,比如雙親與孩子的關係,左右結點的兄弟關係。 完全二叉樹: 完全二叉樹由於其結構上的特點,通常採用順序儲存方式儲存。一棵有n個結點的完全二

【初探】“ 選擇排序 ” ——C++程式碼實現

  選擇排序(Selection sort)是一種簡單直觀的排序演算法。無論什麼資料進去都是 O(n²) 的時間複雜度。所以用到它的時候,資料規模越小越好。唯一的好處可能就是不佔用額外的記憶體空間了吧。   簡單排序處理流程 首先在未排序序列中找到最小

【初探】“直接插入排序”—— C++程式碼實現

目錄 直接插入排序簡介 演算法步驟 演算法演示 複雜度分析 穩定性 直接插入排序演算法的特點 直接插入排序簡介 ● 插入排序是一種簡單直觀的排序演算法,它也是基於比較的排序演算法。它的工作原理是通過不斷擴張有序序列的範圍,對於未排序的資料,在已排序中從

最大堆、最小堆定義及其C++程式碼實現

資料:https://blog.csdn.net/guoweimelon/article/details/50904346 但是它的最大堆刪除部分的程式碼有問題,詳見連結裡的評論區 定義 堆首先必須是一棵完全二叉樹 最大堆:完全二叉樹,父節點的值不小於子節點的值 最小堆:完全二叉樹,父節

【初探】“ 希爾排序 ”—— C++程式碼實現

目錄 希爾排序演算法介紹 希爾排序的基本思想 希爾排序的演算法效能 時間複雜度          直接插入排序和希爾排序的比較 希爾排序演算法介紹 ● 希爾排序是希爾(Donald Shell)於