1. 程式人生 > >opencv3/C++ HOG特徵提取

opencv3/C++ HOG特徵提取

HOG特徵

HOG(Histograms of Oriented Gradients)梯度方向直方圖
通過利用梯度資訊能反映影象目標的邊緣資訊並通過區域性梯度的大小將影象區域性的外觀和形狀特徵化.在論文Histograms of Oriented Gradients for Human Detection中被提出.

HOG特徵的提取過程為:

  1. Gamma歸一化;
  2. 計算梯度;
  3. 劃分cell
  4. 組合成block,統計block直方圖;
  5. 梯度直方圖歸一化;
  6. 收集HOG特徵。

Gamma歸一化:
對影象顏色進行Gamma歸一化處理,降低區域性陰影及背景因素的影響.
計算梯度:

通過差分計算出影象在水平方向上及垂直方向上的梯度:
f

x(x,y)=f(x,y)f(x+1,y)
fy(x,y)=f(x,y)f(x,y+1)
然後得到各個畫素點的梯度的幅值及方向:
f(x,y)=fx(x,y)2+fy(x,y)2
φtan1(fx(x,y)fy(x,y))
劃分cell
將整個視窗劃分成大小相同互不重疊的細胞單元cell(如8×8畫素),計算出每個cell的梯度大小及方向.然後將每畫素的梯度方向在0180o 區間內(無向:0-180,有向:0-360)平均分為9個bins,每個cell內的畫素用幅值來表示權值,為其所在的梯度直方圖進行加權投票.
9bins:
這裡寫圖片描述
如圖,不同數量的bins下的錯誤率:
這裡寫圖片描述

組合成block,統計block直方圖
將2×2個相鄰的cell組成大小為16×16的畫素塊即block.依次將block大小的滑動視窗從左到右從上到下滑動,求其梯度方向直方圖向量.
這裡寫圖片描述
如圖,不同大小的cell與不同大小的block作用下的效果對比:
這裡寫圖片描述
梯度直方圖歸一化
作者對比了L2-norm、L1-norm、L1-sqrt等歸一化方法,發現都比非標準資料有顯著的改善.其中L2-norm和L1-sqrt效果最好,而L1-norm檢測效果要比L2-norm和L1-sqrt低5%.
L2-norm:
VV/V22+ε2
L1-norm:
VV/(V
1
+ε)

L1-sqrt:
VV/(V1+ε)
如圖,不同的歸一化方法效果對比:
這裡寫圖片描述
這樣通過歸一化能夠進一步地對光照、陰影和邊緣進行壓縮.
收集HOG特徵
由於每個cell內的梯度方向分成了9個bins,這樣每個細胞單元的HOG特徵向量長度是9.
這裡寫圖片描述
這樣,對於大小為128×64大小的影象,採用8*8畫素的sell,2×2個cell組成的16×16畫素的block,採用8畫素的block移動步長,這樣檢測視窗block的數量有((128-16)/8+1)×((64-16)/8+1)=15×7.則HOG特徵描述符的維數為15×7×4×9.
這裡寫圖片描述

這裡寫圖片描述

HOG的缺點:
速度慢,實時性差;難以處理遮擋問題。

OpenCV應用

利用HOG進行行人檢測時有兩種用法:
1、採用HOG特徵+SVM分類器進行行人檢測;
2、利用HOG+SVM訓練自己的XML檔案。

採用第一種方法,使用HOG特徵結合SVM分類器進行行人檢測,簡單示例:

#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>
using namespace std;
using namespace cv;

int main()
{
    Mat src, dst;
    src = imread("E:/image/image/passerby.jpg",1);
    if (src.empty())
    {
        printf("can not load the image...\n");
        return -1;
    }
    dst = src.clone();
    vector<Rect> findrects, findrect;
    HOGDescriptor HOG;
    //SVM分類器
    HOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    //多尺度檢測
    HOG.detectMultiScale(src, findrects, 0, Size(4,4), Size(0,0), 1.05, 2);
    //若rects有巢狀,則取最外面的矩形存入rect
    for(int i=0; i < findrects.size(); i++)
    {
        Rect rect = findrects[i];
        int j=0;
        for(; j < findrects.size(); j++)
            if(j != i && (rect & findrects[j]) == rect)
                break;
        if( j == findrects.size())
            findrect.push_back(rect);
    }
    //框選出檢測結果
    for(int i=0; i<findrect.size(); i++)
    {
        RNG rng(i);
        Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255));
        rectangle(dst, findrect[i].tl(), findrect[i].br(), color, 2);
    }

    imshow("src",src);
    imshow("dst",dst);
    waitKey();
    return 0;
}

這裡寫圖片描述
這裡寫圖片描述

相關推薦

opencv3/C++ HOG特徵提取

HOG特徵 HOG(Histograms of Oriented Gradients)梯度方向直方圖 通過利用梯度資訊能反映影象目標的邊緣資訊並通過區域性梯度的大小將影象區域性的外觀和形狀特徵化.在論文Histograms of Oriented Gradi

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

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

HOG特徵提取程式碼(opencv處理基本資料,c語言實現基本演算法)

#include<cv.h> #include<highgui.h> #include<math.h> #include<opencv.hpp> using namespace cv; using namespace std;

OpenCv-C++-HOG特徵檢測演算法

HOG主要是用來做行人檢測的,HOG方法是基於對稠密網格中歸一化的區域性方向梯度直方圖的計算。此方法的基本觀點是:區域性目標的外表和形狀可以被區域性梯度或邊緣方向的分佈很好的描述,即使我們不知道對應的梯度和邊緣的位置。在實際操作中,將影象分為小的元胞(cells),在每個元胞內累加計算出一維

HOG特徵提取實現方法

實現HOG特徵提取的大概過程: 1)灰度化(將影象看做一個x,y,z(灰度)的三維影象); 2)採用Gamma校正法對輸入影象進行顏色空間的標準化(歸一化);目的是調節影象的對比度,降低影象區域性的陰影和光照變化所造成的影響,同時可以抑制噪音的干擾; 3)

HOG特徵提取 matlab

網上有很多大神寫的hog的原理,這裡就不介紹了,本文主要用matlab實現求影象的hog特徵,主要參考了 http://blog.csdn.net/dulingtingzi/article/detai

caffe c++API特徵提取

作為caffe初學者,特徵提取python官方給的教程比較好用;但是關於c++API的使用,找了一些資料,說的並不是特徵完善;專案要求,得到ImageNet影象在CaffeNet網路結構中第fc7層的特徵。 環境:window7+caffe 語言:C++

HOG特徵提取matlab程式碼

HOG特徵提取,HOG特徵是影象梯度方向的直方圖,且是對window進行的處理,是區域性feature,提取的是一個window的特徵,即將區域的梯度幅值根據不同角度進行統計。引數主要有winsize(待考證,有些文件說沒有此視窗),blocksize,cell

HOG特徵提取分析

背景引言 方向梯度直方圖(Histogram of Oriented Gradient,HOG)是用於在計算機視覺和影象處理領域,目標檢測的特徵描述子。該項技術是用來計算影象區域性出現的方向梯度次數或資訊進行計數。此種方法跟邊緣方向直方圖、尺度不變特徵變換以及形狀上下文方法有很多相似。但與它們的不同點是:

opencv3/C++輪廓的提取與篩選

輪廓提取 findContours發現輪廓 findContours( InputOutputArray binImg, //輸入8bit影象,0值畫素值不變,非0的畫素看成1;(變為二值影象) OutputArrayOfArrays contours

Opencv3 提取影象Hog特徵老是報錯處理

###一般是因為圖片的尺寸問題 ###解決辦法(改變圖片尺寸) 圖片的尺寸應該是 hog 函式第一個引數 Size 的大小或是他的倍數 //HOG檢測器,用來計算HOG描述子的 HOGDescrip

【機器學習--opencv3.4.1版本基於Hog特徵描述子Svm對經典手寫數字識別】

 方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和影象處理中用來進行物體檢測的特徵描述子。HOG特徵通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。 #include <iostream> #inc

用OpenCV顯示HOG特徵圖的C++程式碼

https://blog.csdn.net/sinat_31135199/article/details/53470879 #include <opencv2/opencv.hpp> #include <cstdio> #include <cstdlib&

opencv3 SIFT特徵提取方法和RANSAC(隨機抽樣一致性方法)進行剔除無匹配點

最近整理一下利用SIFT特徵提取方法和RANSAC(隨機抽樣一致性方法)進行剔除無匹配點的內容 //讀取影象 Mat img01=imread("3.png"); Mat img02=imread("4.png"); imshow("orig

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

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

影象處理之特徵提取(一)之HOG特徵 特徵數的計算

對於64128的影象而言,每88的畫素組成一個cell,每22個cell組成一個塊,也就是說,64128的圖片,總共有36715=3780個特徵。 單個cell的9個特徵,每個block(掃描視窗)包含22個cell也就是229=36個特徵,一個64128大小的

影象處理之特徵提取(一):HOG特徵

HOG方向梯度直方圖: (1)具體在HOG中方向梯度的實現:首先用[-1,0,1]梯度運算元對原影象做卷積運算,得到x方向(水平方向,以向右為正方向)的梯度分量gradscalx,然後用[1,0,-1]T梯度運算元對原影象做卷積運算,得到y方向(豎直方向,以向上為正方向)的

影象特徵提取HOG特徵

方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是用於影象檢測的特徵描述子。它通過計算和統計區域性區域的梯度方向直方圖來構成特徵。特徵地,HOG在行人檢測方向取得巨大成功。 演算法實現過程: (1)標準化gamma空間和顏色空間

影象特徵提取三大法寶:HOG特徵,LBP特徵,Haar特徵

(一)HOG特徵 1、HOG特徵: 方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵是一種在計算機視覺和影象處理中用來進行物體檢測的特徵描述子。它通過計算和統計影象區域性區域的梯度方向直方圖來構成特徵。Hog特徵結合SVM分

使用skimage提取影象hog特徵

使用skimage提取影象hog特徵 from skimage.feature import hog from skimage import io from PIL import Image import cv2 img = cv2.cvtColor(cv2.imread('../img/t