1. 程式人生 > >學習OpenCV——HoG特徵詳解(特徵點篇)

學習OpenCV——HoG特徵詳解(特徵點篇)

HOG即histogram of oriented gradient, 是用於目標檢測的特徵描述子,該技術將影象區域性出現的方向梯度次數進行計數,該方法和邊緣方向直方圖、scale-invariant feature transform類似,不同的是hog的計算基於一致空間的密度矩陣來提高準確率。Navneet Dalal and Bill Triggs首先在05年的CVPR中提出HOG,用於靜態影象or視訊的行人檢測。

HOG特徵原理:

HOG的核心思想是所檢測的區域性物體外形能夠被光強梯度或邊緣方向的分佈所描述。通過將整幅影象分割成小的連線區域(稱為cells),每個cell生成一個方向梯度直方圖或者cell中pixel的邊緣方向,這些直方圖的組合可表示出(所檢測目標的目標)描述子。為改善準確率,區域性直方圖可以通過計算影象中一個較大區域(稱為block)的光強作為measure被對比標準化,然後用這個值(measure)歸一化這個block中的所有cells.這個歸一化過程完成了更好的照射/陰影不變性。

與其他描述子相比,HOG得到的描述子保持了幾何和光學轉化不變性(除非物體方向改變)。因此HOG描述子尤其適合人的檢測。

通俗的講:

HOG特徵提取方法就是將一個image:

1. 灰度化(將影象看做一個x,y,z(灰度)的三維影象)

2. 劃分成小cells(2*2)

3. 計算每個cell中每個pixel的gradient(即orientation)

4. 統計每個cell的梯度直方圖(不同梯度的個數),即可形成每個cell的descriptor

再小談下Hog、SIFT與PCA-SIFT的應用與區別:

Hog沒有旋轉和尺度不變性,因此計算量小;而SIFT中每個feature需要用128維的向量來描述,因此計算量相對很大。

那麼行人檢測中怎麼應用HOG呢

對於解決Scale-invariant的問題:將圖片進行不同尺度的縮放,就相當於對模板進行不同尺度scale的縮放

對於解決Rotation-invariant 的問題:建立不同方向的模版(一般取15*7的)進行匹配

總的來說,就是在不同尺度上的影象進行不同方向的模板(15*7)匹配,每個點形成一個8方向的梯度描述。

SIFT由於其龐大計算量不用與行人檢測,而PCA-SIFT的方法過濾掉很多維度的資訊,只保留20個主分量,因此只適用於行為變化不大的物體檢測。

method

Time

Scale

Rotation

Blur

Illumination

Affine

Sift

common

best

best

common

common

good

PCA-sift

good

good

good

best

good

best

Surf

best

common

common

good

best

good



hog是一個基於梯度的直方圖提取演算法,用於人體檢測十分有效。在opencv2.2+版本里面已經實現。

封裝在HOGDescriptor類裡。

hog其實就是對一副圖片的指定大小區域進行梯度統計。可以直接呼叫。opencv把它過於複雜化了,用的時候分什麼window,block,cell啥的。。。一大堆東西。

這裡有三篇很好的文章介紹一下。

這篇文章就是對window,block,cell的解釋

這篇文章是對得到的vector結果數組裡的結果個數進行的分析。

這篇文章是教你如何在vs2010下安裝opencv2.2 非常不錯的一篇文章。我原來寫sift的時候是用的vc6+opencv1.0。

不過有個地方要注意的是:這篇文章裡說的附加依賴項中只讓你加上基本的幾個。如果你要用hog,必須再加上opencv_objdetect220d.lib

看檔名字就知道是什麼。。。

好了背景資料介紹完了,給出個例子,就是我的main函式 放出來做個示範。

int _tmain(int argc, char** argv)
{
 Mat trainImg; //需要分析的圖片
 trainImg=imread("1.jpg",1);   //讀取圖片
 HOGDescriptor *hog=new HOGDescriptor(cvSize(3,3),cvSize(3,3),cvSize(5,10),cvSize(3,3),9);  //具體意思見參考文章1,2
 vector<float>descriptors;//結果陣列
 hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //呼叫計算函式開始計算
 printf("%d\n",descriptors.size()); //打屏一下結果陣列的大小,看看是否符合文獻2的預估, 發現完全一樣,那篇文章很給力

 sift("1.jpg");  //這是我改寫的sift...
 for (int i=0;i<kp.size();i++) {  //這個迴圈就是我用來提前特徵點附近3*3區域的梯度資訊統計
  printf("keypoint %d at %f %f\n",i,kp[i].first,kp[i].second);
  if (kp[i].first==picw) kp[i].first--;
  if (kp[i].first==0) kp[i].first=1;
  if (kp[i].second==pich) kp[i].second--;
  if (kp[i].second==0) kp[i].second=1;
  int pos=(kp[i].second-1)*(picw-2)+kp[i].first-1;
  for (int j=0;j<9;j++) {
   res[j]+=descriptors[pos*9+j];
  }
 }
 puts("result:");
 for (int i=0;i<9;i++) printf("%lf ",res[i]); //結果以文字輸出。。。
 puts("");
IplImage * respic;  //結果以直方圖輸出,裡面有個res.jpg是我畫的直方圖背景圖,沒有這個圖跑不了程式,把從這以下程式碼註釋掉吧
 if ((respic = cvLoadImage("res.jpg", 1)) == 0) return -1; 
 double maxx=0;
 for (int i=0;i<9;i++) if (maxx<res[i]) maxx=res[i];
 for (int i=0;i<9;i++) cvRectangle(respic, cvPoint(150+51*i,(maxx-res[i])/maxx*(352-77)+77),
                cvPoint(201+51*i,351), CV_RGB(0, 0, 0),
                1, 8, 0);
 CvFont font;
 cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0 );
 itoa((int)maxx,outs,10);
 cvPutText(respic,outs,cvPoint(53,83),&font,CV_RGB(0, 0, 0));
 cvNamedWindow("image1",1);
 cvShowImage("image1", respic);
 cvWaitKey(0);  
 cvDestroyWindow("image1");

}

相關推薦

學習OpenCV——HoG特徵特徵

HOG即histogram of oriented gradient, 是用於目標檢測的特徵描述子,該技術將影象區域性出現的方向梯度次數進行計數,該方法和邊緣方向直方圖、scale-invariant feature transform類似,不同的是hog的計算基於一致空

docker如何最快速的方式建立映象並在建立時安裝配置好jdk()第五共五

Dockerfile製作映象步驟 在根目錄下建立dockerfile資料夾 mkdir dockfile 在資料夾下建立Dockerfile檔案 touch Dockerfile 編輯Dockerfile檔案 vim Dockerfile 檔案內容如下: #版本資訊 FROM centos

史上最簡單MySQL教程進階之儲存引擎介紹及預設引擎設定

什麼是儲存引擎? 與其他資料庫例如Oracle 和SQL Server等資料庫中只有一種儲存引擎不同的是,MySQL有一個被稱為“Pluggable Storage Engine Architecture”(可替換儲存引擎架構)的特性,也就意味著My

OAuth2.0授權模式

OAuth2.0有五種授權模式。 (1)授權碼模式(Authorization Code) (2)授權碼簡化模式(Implicit) (3)Pwd模式(Resource Owner Password Credentials) (4)Client模式(Cl

Android ORM 框架:GreenDao 使用進階

前言 一、複雜表結構 a, 使用 @ToOne 建立一對一 ( 1 : 1) 關係 @Entity public class Order { @Id private Long id; private lo

React Native未來導航者:react-navigation 使用進階

剛建立的React Native 微信公眾號,歡迎微信掃描關注訂閱號,每天定期會分享react native 技術文章,移動技術乾貨,精彩文章技術推送。同時可以掃描我的微信加入react-native技術交流微信群。歡迎各位大牛,React Native技術愛好者加入交流!

Jvm堆記憶體的劃分結構和優化,垃圾回收詳細解答

1.S0與S1的區間明顯較小,有效新生代空間為Eden+S0/S1,因此有效空間就大,增加了記憶體使用率 2.有利於物件代的計算,當一個物件在S0/S1中達到設定的XX:MaxTenuringThreshold值後,會將其分到老年代中,設想一下,如果沒有S0/S1,直接分成兩個區,該如何計算物件經過了多少次G

hadoop之mapreduce進階

上篇文章hadoop之mapreduce詳解(基礎篇)我們瞭解了mapreduce的執行過程和shuffle過程,本篇文章主要從mapreduce的元件和輸入輸出方面進行闡述。 一、mapreduce作業控制模組以及其他功能 mapreduce包括作業控制模組,程式設計模型,資料處理引擎。這裡我們重點闡述

hadoop之yarn基礎架構

本文主要從yarn的基礎架構和yarn的作業執行流程進行闡述 一、yarn的概述        Apache Yarn(Yet Another Resource Negotiator的縮寫)是hadoop叢集資源管理器系統,Yarn從hadoop 2引入,最初是為了

深度學習 --- 模擬退火演算法Simulated Annealing, SA

上一節我們深入探討了,Hopfield神經網路的性質,介紹了吸引子和其他的一些性質,而且引出了偽吸引子,因為偽吸引子的存在導致Hopfield神經網路正確率下降,因此本節致力於解決偽吸引子的存在。在講解方法之前我們需要再次理解一些什麼是偽吸引子,他到底是如何產生的? 簡單來說說就是網路動態轉

深度學習 --- Hopfield神經網路吸引子的性質、網路的權值的設計、網路的資訊儲存容量

上一節我們詳細的講解了Hopfield神經網路的工作過程,引出了吸引子的概念,簡單來說,吸引子就是Hopfield神經網路穩定時其中一個狀態,不懂的請看 Hopfield神經網路詳解,下面我們就開始看看吸引子有什麼性質: 1.吸引子的性質       &nb

深度學習 --- 隨機神經網路玻爾茲曼機學習演算法、執行演算法

BM網路的學習演算法 (1)  學習過程       通過有導師學習,BM網路可以對訓練集中各模式的概率分佈進行模擬,從而實現聯想記憶.學習的目的是通過調整網路權值使訓練集中的模式在網路狀態中以相同的概率再現.學習過程可分為兩個階段;第一階段

C++學習:list容器

list容器詳解       首先說說STL         STL就是Standard Template Library,標準模板庫。這可能是一個歷史上最令人興奮的工具的最無聊

三維深度學習之pointnet系列

三維深度學習之pointnet系列詳解(一) 置頂 2018年05月09日 23:25:06 痛並快樂著呦西 閱讀數:4429 標籤: pointnet 三維深度學習 更多 個人分類: 3D Deep Learning

Docker基礎學習-Dockerfile命令超全版本

製作Dockerfile為Docker入門學習的第一步(當然,除了環境搭建)。 本文收集、整理了官網關於製作Dockerfile的全部命令(除SHELL沒整理,這個就不弄了),可幫助大家快速進入Dockfile製作的學習。 以下為正文,下面進入學習姿勢吧!

[DataAnalysis]機器學習演算法——決策樹屬性劃分+剪枝+缺失值/連續值處理

決策樹簡述 決策樹是一種用於對例項進行分類的樹形結構。決策樹由節點(node)和有向邊(directed edge)組成。節點分成根節點、內節點(表示一個特徵或者屬性的測試條件)和葉子節點(表示一個分類)。 決策樹的生成是一個遞迴過程。在決策樹演算法中,有三種情形會導致遞

Liblinear機器學習庫教程基於Python API

前言 Liblinear機器學習庫主要實現SVM演算法,在處理大規模資料時速度快,但也有缺點,就是太吃記憶體,部落格 https://blog.csdn.net/roguesir/article/details/79793569 中介紹了在Mac Python

Windows下VTK6.0.0安裝CMake使用說明

操作 工具 generate 其中 con htm 目錄下的文件 ima 新建 操作系統:Windows7,用到工具:Visual studio、CMake。 1.準備工作 VTK下載: 下載最新VTK穩定版(6.0.0,截至2013年7月)http://www.vtk

HTTP協議真的很經典

cnp 運用 web應用 media 服務器端 所有 長度 request bad 轉載:http://e7kan.com/?p=264& 引言 HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。它於1990年提出,經過幾

PCA 主成分分析 寫給初學者 結合matlab轉載

整數 變量 行為 保持 sum osc 入參 函數 data 一、簡介 PCA(Principal Components Analysis)即主成分分析,是圖像處理中經常用到的降維方法,大家知道,我們在處理有關數字圖像處理方面的問題時,比如經常用的圖像的查詢