1.haar特徵
最早的haar特徵由papageorgiouc.等提出(《a general framework for object detection》),後來paulviola和michal jones提出利用積分影象法快速計算haar特徵的方法(《rapid object detection using a boosted cascade of ******features》)。之後,rainer lienhart 和 jochen maydt用對角特徵對haar特徵庫進行了擴充套件(《an extended set of haar-like features for rapid objectdetection》)。opencv的haar分類器就是基於擴充套件後的特徵庫(含下圖中的1、2、3,共14種)實現的。
1.1 haar特徵定義
haar特徵是基於「塊」的特徵,也被稱為矩形特徵。haar特徵(模板)分為三類:邊緣特徵、線性特徵、中心特徵和對角線特徵。特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值為白色矩形畫素和減去黑色矩形畫素和。haar特徵值反映了影象的灰度變化情況。例如:臉部的一些特徵能由矩形特徵簡單的描述,如:眼睛要比臉頰顏色要深,鼻樑兩側比鼻樑顏色要深,嘴巴比周圍顏色要深等。但矩形特徵只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結構。
對於圖中的1.a這類特徵,特徵數值計算公式為:v=sum白-sum黑,而對於2.c這類來說,計算公式如下:v=sum白-2*sum黑;之所以將黑色區域畫素和乘以2,是為了使兩種矩形區域中畫素數目一致。
1.2 haar特徵的數量
通過改變特徵模板的大小和位置,可在影象子視窗中窮舉出大量的特徵。上圖的特徵模板稱為「特徵原型」;特徵原型在影象子視窗中擴充套件(平移伸縮)得到的特徵稱為「矩形特徵」;矩形特徵的值稱為「特徵值」。
矩形特徵可位於影象任意位置,大小也可以任意改變,所以矩形特徵值是矩形模版類別、矩形位置和矩形大小這三個因素的函式。故類別、大小和位置的變化,使得很小的檢測視窗含有非常多的矩形特徵。對於乙個給定的24x24的視窗,根據不同的位置,以及不同的縮放,可以產生超過160,000個特徵,因此計算一幅影象的所有haar特徵是一件工作量很大的事。
具體的計算haar特徵個數的公式為rainer lienhart提出的:
【影象處理】計算haar特徵個數:
計算haar特徵個數:
1.3 haar特徵的快速計算-積分圖
通過一次遍歷影象得到「積分圖」(integralimage),也叫summed area table,之後任何乙個haar矩形特徵都可以通過查表的方法(look up table)和有限次簡單運算得到,大大減少了運算次數。
原影象a經過「積分」後得到相同大小的影象b,b中(x,y)處的值b(x,y)是原影象(x,y)位置左上角方向所有畫素的和,即:
舉例:
得到影象的積分圖後,特徵模板的haar特徵值就很好求了。舉例如下:
紅色矩形為特徵模板,矩形中白色區域畫素和為b(5)+b(1)-b(2)-b(6),矩形中黑色區域畫素和為b(4)+b(2)-b(3)-b(5)。二者作差即可得特徵值。
此外,對於對角線矩形特徵模板,需要構建旋轉積分影象。具體可參考:
利用積分影象法快速計算haar特徵:
積分圖構建採用增量演算法:
1)用s(i,j)表示行方向的累加和,初始化s(i,-1)=0;
2)用ii(i,j)表示乙個積分影象,初始化ii(-1,i)=0;
3)逐行掃瞄影象,遞迴計算每個畫素(i,j)行方向的累加和s(i,j)和積分影象ii(i,j)的值
s(i,j)=s(i,j-1)+f(i,j)
ii(i,j)=ii(i-1,j)+s(i,j)
4)掃瞄影象一遍,當到達影象右下角畫素時,積分影象ii就構造好了。
下面給出的**是matlab 呼叫.c檔案來計算積分圖(for迴圈較多,c語言會快很多)
(關於matlab呼叫.c和.cpp檔案,可以參考我的博文:matlab呼叫編譯.c和.cpp檔案)
#include
#include "mex.h"
// compute integral img
// s(i,j) = s(i-1,j)+i(i,j)
// ii(i,j) = ii(i,j-1)+s(i,j)
// s(i,j) = s(i+j*m);
// s(0,j) = i(0,j);ii(i,0)=s(i,0)
/* input arguments */
#define img_in prhs[0]
/* output arguments */
#define ii_out plhs[0]
/*ii為輸出積分圖,img為輸入原影象,m為行,n為列*/
static void integral(
double ii,
double *img,
int m,
int n)
{ int i;
int j;
double *s = new double[m*n];
/*列累積*/
for(j=0; j
1 軟體的定義及特點
計算機系統中的程式及其文件。程式是計算任務的處理物件和處理規則的描述 文件是為了便於了解程式所需的闡明性資料。軟體是無形的 不可見的邏輯實體 軟體是設計開發的,而不是生產製造的 軟體在使用過程中沒有磨損 老化問題 軟體是定製開發的 軟體是複雜的 軟體開發成本高 軟體易於複製 軟體質量要求較高 軟體的...
雲計算 SaaS和PaaS的含義及特點
saas 軟體即服務 paas 平台即服務 雲計算 雲安全 雲服務等名詞撲面而來。幾乎所有軟體企業都在向saas轉型,it服務商都準備轉軌雲計算,所有投軟體的vc都只考慮投saas和雲計算。當很多不同領域的廠商想搭上saas和雲計算快車的時候,saas和雲計算都出現了10種以上不同的定義,還出現了 ...
事務的特點 事務及事務的四大特徵是什麼?
事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。資料庫事務 transanction 正確執行的四個基本要素。acid,原子性 atomicity 一致性 correspon...