人臉影象的區域性方向模式基本思想是影象每個相素點都有乙個區域性3×3 鄰域畫素灰度值,該相素處於鄰域中心。將該區域性與3×3 鄰域的灰度值與8 個kirsch 模板卷積得到相應方向的邊緣梯度值 (i=0,1,…,7),將邊緣梯度值的絕對值 進行排序,求出第k大的值 並將大於等於 的 對應的第i位二進位制數設定為1,剩餘8-i位置為0,得到乙個八位的二進位制編碼,然後根據不同位置進行加權求和,所得的十進位制數即為該畫素點的 ldp 特徵值。八個方向的 kirsch 模板(m0~m7)如圖 1 所示,ldp 特徵提取流程如圖 2 所示。
原始碼如下:
main.cpp
#include"ldp.h"
#include
usingnamespace
cv;
usingnamespace
std;
intldp.cppmain(int
argc,char
*argv)
#include"ldp.h"
#include
#include
#include
#include
#include
usingnamespace
cv;
usingnamespace
std;
typedefstruct
pair;
/*按照降序排列*/
booloperator
pair
&x,const
pair
&y)
ldp::ldp()
voidldp::ldpedirect(mat
&ein,mat
&eout)//kirsch卷積模板
voidldp::l***attern(mat
&srcimg,mat
&ldpimg,int
r)
;
for(inti=0;i<8;i++)
sort(vec.begin(),vec.end());
//cout<<
"排序的結果為:"
<<
endl;
//將最大的前三個值對應位置置1
for(vector::iterator
it=vec.begin();it
ldpimg.ptr(y-l/2)[x-l/2]=codebit[7]*pow(2.0,7.0)+codebit[6]*pow(2.0,6.0)+codebit[5]*pow(2.0,5.0)+codebit[4]*pow(2.0,4.0)
+codebit[3]*pow(2.0,3.0)+codebit[2]*pow(2.0,2.0)+codebit[1]*pow(2.0,1.0)+codebit[0]*pow(2.0,0.0);
}
}
}執行結果:
(1)卷積後取絕對值
(1)卷積後不取絕對值
Opencv 的座標方向
由於太久沒有碰opencv了,對opencv的東西有點混淆。現在重新捋一下opencv的座標方向問題。opencv座標方向和matlab 相同,x軸沿水平方向,y軸沿豎直方向。但因為matlab中資料按列儲存,而opencv中資料按行儲存,所以在操作的時候有些區別。opencv函式變數中涉及位置資訊...
基於OpenCV的任意方向投影
目前在opencv中,有reduce函式可以進行水平或者垂直方向的投影。c voidreduce inputarraymtx,outputarrayvec,intdim,intreduceop,intdtype 1 parameters reduction operation that could ...
OpenCV中phase函式計算方向場
一 函式原型 該函式 引數angleindegrees預設為false,即弧度,當置為true時,則輸出為角度。phase函式根據函式 來計算角度,計算精度大約為0.3弧度,當x,y相等時,angle為0。數學上函式atan2為 該函式的值域為 可以通過對負數結果加 的方法,將函式的結果對映到 範圍...