opencv3/C++ HOG特征提取方式
HOG特征
HOG(Histograms of Oriented Gradients)梯度方向直方圖
通過利用梯度信息能反映圖像目標的邊緣信息并通過局部梯度的大小將圖像局部的外觀和形狀特征化.在論文Histograms of Oriented Gradients for Human Detection中被提出.
HOG特征的提取過程為:
Gamma歸一化;
計算梯度;
劃分cell
組合成block,統(tǒng)計block直方圖;
梯度直方圖歸一化;
收集HOG特征。
Gamma歸一化:
對圖像顏色進行Gamma歸一化處理,降低局部陰影及背景因素的影響.
計算梯度:
通過差分計算出圖像在水平方向上及垂直方向上的梯度:
然后得到各個像素點的梯度的幅值及方向:
劃分cell
將整個窗口劃分成大小相同互不重疊的細胞單元cell(如8×8像素),計算出每個cell的梯度大小及方向.然后將每像素的梯度方向在0−180o0−180o 區(qū)間內(無向:0-180,有向:0-360)平均分為9個bins,每個cell內的像素用幅值來表示權值,為其所在的梯度直方圖進行加權投票.
9bins:
如圖,不同數(shù)量的bins下的錯誤率:
組合成block,統(tǒng)計block直方圖
將2×2個相鄰的cell組成大小為16×16的像素塊即block.依次將block大小的滑動窗口從左到右從上到下滑動,求其梯度方向直方圖向量.
如圖,不同大小的cell與不同大小的block作用下的效果對比:
梯度直方圖歸一化
作者對比了L2-norm、L1-norm、L1-sqrt等歸一化方法,發(fā)現(xiàn)都比非標準數(shù)據(jù)有顯著的改善.其中L2-norm和L1-sqrt效果最好,而L1-norm檢測效果要比L2-norm和L1-sqrt低5%.
如圖,不同的歸一化方法效果對比:
這樣通過歸一化能夠進一步地對光照、陰影和邊緣進行壓縮.
收集HOG特征
由于每個cell內的梯度方向分成了9個bins,這樣每個細胞單元的HOG特征向量長度是9.
這樣,對于大小為128×64大小的圖像,采用8*8像素的sell,2×2個cell組成的16×16像素的block,采用8像素的block移動步長,這樣檢測窗口block的數(shù)量有((128-16)/8+1)×((64-16)/8+1)=15×7.則HOG特征描述符的維數(shù)為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特征提取方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持我們。
上一篇:gcc中extra qualification錯誤的解決
欄 目:C語言
下一篇:C++ push方法與push_back方法的使用與區(qū)別
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/95.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
 - 01-10深入理解C++中常見的關鍵字含義
 - 01-10使用C++實現(xiàn)全排列算法的方法詳解
 - 01-10c++中inline的用法分析
 - 01-10用C++實現(xiàn)DBSCAN聚類算法
 - 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
 - 01-10C++大數(shù)模板(推薦)
 - 01-10淺談C/C++中的static與extern關鍵字的使用詳解
 - 01-10深入C/C++浮點數(shù)在內存中的存儲方式詳解
 - 01-10深入理解C/C++混合編程
 


閱讀排行
本欄相關
- 04-02c語言函數(shù)調用后清空內存 c語言調用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調用函數(shù)求fibo C語言調用函數(shù)求
 
隨機閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10C#中split用法實例總結
 - 01-11ajax實現(xiàn)頁面的局部加載
 - 01-10SublimeText編譯C開發(fā)環(huán)境設置
 - 01-10delphi制作wav文件的方法
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 04-02jquery與jsp,用jquery
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 


