www.pudn.com > expressionsb.rar > ExpStrategy.cpp
// ExpStrategy.cpp: implementation of the CExpStrategy class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "test1.h" #include "ExpStrategy.h" #include#include using namespace std; #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CExpStrategy::CExpStrategy() { m_GaborsImage=NULL; m_GaborsReal=NULL; m_GaborsImage5=NULL; m_GaborsReal5=NULL; EGraph=NULL; m_pDIB=NULL; //m_coefNum=450;//5×5×18 m_coefNum=1800;//10×10×18 grids_x=0; grids_y=0; } CExpStrategy::~CExpStrategy() { if(m_GaborsImage!=NULL) delete[] m_GaborsImage; if(m_GaborsReal!=NULL) delete[] m_GaborsReal; if(EGraph!=NULL) delete[] EGraph; if(m_pDIB!=NULL) delete m_pDIB; } FLOAT* CExpStrategy::GaborTF(CDIB *pDIB,int _left, int _top, int _right, int _bottom, BOOL _createDIB) { //注意:该函数仅能实现对整个DIB图像进行Gabor变换 //而不是如接口声明那样可以对图像的特定区域进行Gabor变换 if(pDIB==NULL) return NULL; int i,j; // FLOAT gabor_image; // FLOAT gabor_real; //弹性图的每个向量网格为5×5,即使用5×5的网格分割CDIB图 //HDIB _hDIB; LPSTR _lpbi; LPSTR _image;//图像数据的起始地址 int _widthBytes; // int grids_x;//弹性图的x方向上网格数 // int grids_y;//弹性图的y方向上网格数 // grids_x=(_right-_left)/5;// // grids_y=(_bottom-_top)/5; grids_x=pDIB->GetDIBSize().cx/5;// grids_y=pDIB->GetDIBSize().cy/5; _widthBytes=WIDTHBYTES(8*pDIB->GetDIBSize().cx); if((grids_x<=0)||(grids_y<=0)) return NULL; if(EGraph!=NULL) delete [] EGraph; EGraph=new FLOAT[grids_x*grids_y]; _lpbi=(LPSTR)::GlobalLock((HGLOBAL)pDIB->GetHDIB()); _image=pDIB->FindDIBBits(_lpbi); //Transforming…… for(i=0;i GetHDIB()); return EGraph; } BOOL CExpStrategy::Initialize() { int i,m,n; FLOAT m_n; FLOAT k_x0; FLOAT k_x1; FLOAT k_x2; FLOAT sikma_sq; FLOAT kv[18][2];//小波的频率向量(2维),6×3(6个方向,3个带宽,[6][3]) FLOAT kv_abs[18]; FLOAT sita_sin[6]; FLOAT sita_cos[6]; FLOAT kv_coef[3]={1.5708f,1.1107f,0.7854f}; FLOAT sub_kv_abs_0; FLOAT sub_kv_abs_1; FLOAT sub_kv_abs_2; sikma_sq=PI*PI; for(i=0;i<6;i++) { sita_sin[i]=sin((i+1)*PI/6.0); sita_cos[i]=cos((i+1)*PI/6.0); } for(i=0;i<6;i++) { //cos,即Kj的第一个分量 kv[i*3][0]=kv_coef[0]*sita_cos[i]; kv[i*3+1][0]=kv_coef[1]*sita_cos[i]; kv[i*3+2][0]=kv_coef[2]*sita_cos[i]; //sin,即Kj的第二个分量 kv[i*3][1]=kv_coef[0]*sita_sin[i]; kv[i*3+1][1]=kv_coef[1]*sita_sin[i]; kv[i*3+2][1]=kv_coef[2]*sita_sin[i]; } for(i=0;i<6;i++) {//计算Kj的模 kv_abs[i*3]=sqrt(kv[i*3][0]*kv[i*3][0]+kv[i*3][1]*kv[i*3][1]); kv_abs[i*3+1]=sqrt(kv[i*3+1][0]*kv[i*3+1][0]+kv[i*3+1][1]*kv[i*3+1][1]); kv_abs[i*3+2]=sqrt(kv[i*3+2][0]*kv[i*3+2][0]+kv[i*3+2][1]*kv[i*3+2][1]); } ///////////10*10: if(m_GaborsReal!=NULL) delete[] m_GaborsReal; if(m_GaborsImage!=NULL) delete[] m_GaborsImage; m_GaborsReal=new FLOAT[m_coefNum]; m_GaborsImage=new FLOAT[m_coefNum]; //////////////5*5: if(m_GaborsReal5!=NULL) delete[] m_GaborsReal5; if(m_GaborsImage5!=NULL) delete[] m_GaborsImage5; m_GaborsReal5=new FLOAT[450]; m_GaborsImage5=new FLOAT[450]; //////////////// for(i=0;i<6;i++)///0到6代表有6个不同方向的小波(sita=1/6*pi,…,pi) { ////0到3代表每个方向小波由3个频率组成(v=0,1,2) sub_kv_abs_0=kv_abs[i*3+0]*kv_abs[i*3+0]; sub_kv_abs_1=kv_abs[i*3+1]*kv_abs[i*3+1]; sub_kv_abs_2=kv_abs[i*3+2]*kv_abs[i*3+2]; ///10×10,代替下面的注释的部分 ///参考Gabor函数的定义 for(m=0;m<10;m++) for(n=0;n<10;n++) { m_n=(m+1)*(m+1)+(n+1)*(n+1); //V_Kj*V_x k_x0=kv[i*3+0][0]*(m+1)+kv[i*3+0][1]*(n+1); k_x1=kv[i*3+1][0]*(m+1)+kv[i*3+1][1]*(n+1); k_x2=kv[i*3+2][0]*(m+1)+kv[i*3+2][1]*(n+1); //real: m_GaborsReal[100*(i*3+0)+(m*10+n)] =kv_abs[i*3+0]/(sikma_sq)*exp((-0.5)*sub_kv_abs_0*m_n/sikma_sq) *(cos(k_x0)-exp((-0.5)*sikma_sq)); m_GaborsReal[100*(i*3+1)+(m*10+n)] =kv_abs[i*3+1]/(sikma_sq)*exp((-0.5)*sub_kv_abs_1*m_n/sikma_sq) *(cos(k_x1)-exp((-0.5)*sikma_sq)); m_GaborsReal[100*(i*3+2)+(m*10+n)] =kv_abs[i*3+2]/(sikma_sq)*exp((-0.5)*sub_kv_abs_2*m_n/sikma_sq) *(cos(k_x2)-exp((-0.5)*sikma_sq)); //Image: m_GaborsImage[100*(i*3+0)+(m*10+n)] =kv_abs[i*3+0]/(sikma_sq)*exp((-0.5)*sub_kv_abs_0*m_n/sikma_sq) *sin(k_x0); m_GaborsImage[100*(i*3+1)+(m*10+n)] =kv_abs[i*3+1]/(sikma_sq)*exp((-0.5)*sub_kv_abs_1*m_n/sikma_sq) *sin(k_x1); m_GaborsImage[100*(i*3+2)+(m*10+n)] =kv_abs[i*3+2]/(sikma_sq)*exp((-0.5)*sub_kv_abs_2*m_n/sikma_sq) *sin(k_x2); } //////////////5*5的Gabor变换 for(m=0;m<5;m++) for(n=0;n<5;n++) { m_n=(m+1)*(m+1)+(n+1)*(n+1); k_x0=kv[i*3+0][0]*(m+1)+kv[i*3+0][1]*(n+1); k_x1=kv[i*3+1][0]*(m+1)+kv[i*3+1][1]*(n+1); k_x2=kv[i*3+2][0]*(m+1)+kv[i*3+2][1]*(n+1); //real: m_GaborsReal5[25*(i*3+0)+(m*5+n)] =kv_abs[i*3+0]/(sikma_sq)*exp((-0.5)*sub_kv_abs_0*m_n/sikma_sq) *(cos(k_x0)-exp((-0.5)*sikma_sq)); m_GaborsReal5[25*(i*3+1)+(m*5+n)] =kv_abs[i*3+1]/(sikma_sq)*exp((-0.5)*sub_kv_abs_1*m_n/sikma_sq) *(cos(k_x1)-exp((-0.5)*sikma_sq)); m_GaborsReal5[25*(i*3+2)+(m*5+n)] =kv_abs[i*3+2]/(sikma_sq)*exp((-0.5)*sub_kv_abs_2*m_n/sikma_sq) *(cos(k_x2)-exp((-0.5)*sikma_sq)); //Image: m_GaborsImage5[25*(i*3+0)+(m*5+n)] =kv_abs[i*3+0]/(sikma_sq)*exp((-0.5)*sub_kv_abs_0*m_n/sikma_sq) *sin(k_x0); m_GaborsImage5[25*(i*3+1)+(m*5+n)] =kv_abs[i*3+1]/(sikma_sq)*exp((-0.5)*sub_kv_abs_1*m_n/sikma_sq) *sin(k_x1); m_GaborsImage5[25*(i*3+2)+(m*5+n)] =kv_abs[i*3+2]/(sikma_sq)*exp((-0.5)*sub_kv_abs_2*m_n/sikma_sq) *sin(k_x2); } } return TRUE; } FLOAT CExpStrategy::sub_GaborTF(LPSTR image) { if((m_GaborsReal==NULL)||(m_GaborsImage==NULL)) return 0.0; int i,j,m,n; FLOAT _image=0.0; FLOAT _real=0.0; for(i=0;i<6;i++) for(j=0;j<3;j++) for(m=0;m<5;m++) for(n=0;n<5;n++) { _real+=((int)image[5*m+n])*m_GaborsReal5[25*(i*3+j)+5*m+n]; _image+=((int)image[5*m+n])*m_GaborsImage5[25*(i*3+j)+5*m+n]; } return sqrt(_image*_image+_real*_real); } void CExpStrategy::Draw(CDC *pDC) { if (EGraph==NULL) return; CString str; int i,j; for(i=0;i TextOut(j*30,i*20,str); } } FLOAT CExpStrategy::CalEuDis(FLOAT *_tmp, CSize _tmpSize, int _location) {//_location:1-lefteye, 2-righteye, 3-mouth FLOAT distance=650000.0f; FLOAT tmpdis=0.0f; if(EGraph==NULL) return 0.0f; int _initX,_initY; int i,j; switch (_location) { case 1://lefteye _initY=grids_y-_tmpSize.cy-5; if(_initY<0) _initY=0; _initX=0; break; case 2://righteye _initY=grids_y-_tmpSize.cy-5; if(_initY<0) _initY=0; _initX=grids_x-_tmpSize.cx-5; if(_initX<0) _initX=0; break; case 3://mouth _initY=0; _initX=grids_x/2-_tmpSize.cx/2-3; if(_initX<0) _initX=0; break; default: break; } for(i=0;i<5;i++) for(j=0;j<5;j++) { tmpdis=sub_calEuDis(_initX+j,_initY+i,_tmp,_tmpSize); //tmpdis=sub_calEuDis(EGraph+grids_x*(_initY+i)+j,_tmp,_tmpSize); if(distance>tmpdis) distance=tmpdis; } return distance; } FLOAT CExpStrategy::sub_calEuDis(int x,int y,FLOAT *_tmp, CSize _tmpSize) { FLOAT _result=0.0f; int m,n,s,t; s=grids_x*grids_y; for(m=0;m<_tmpSize.cy;m++) for(n=0;n<_tmpSize.cx;n++) { if((t=(y+m)*grids_x+x+n)