📄 palmpriintrec.cpp
字号:
// PalmPriintRec.cpp: implementation of the CPalmPriintRec class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "tryshot.h"
#include "PalmPriintRec.h"
#include "hdg.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPalmPriintRec::CPalmPriintRec()
{
//首先需要加载配置文件
nH=480;
nL=640;
nrgb=3;
}
CPalmPriintRec::~CPalmPriintRec()
{
}
//-------连续处理识别nNumb张照片-------
int CPalmPriintRec::rec(BYTE *pD, int nNumb,BYTE *pback,HWND *phwnd)
{
//pD是当前连续采集的多张照片,pback是背景照片
//////////////////下面对pback进行预处理///////////////////////////////////
// pback是按照bmp的格式保存的,m_pBback已经在对话框产生时初始化好了BGR形式
//////////////////////////////////////////////////////////////////////////
int nrlt=0;
int *pR=new int[nNumb];
BYTE *ptempdata=new BYTE[nH*nL*nrgb];//处理照片的临时空间
CString str_cut_fn;
for (int nIndex=0;nIndex<nNumb;nIndex++)
{
pretreat(ptempdata,pD+nIndex*nH*nL*nrgb,pback);//逐一进行前处理
str_cut_fn.Empty();
str_cut_fn.Format("Cut_%d.bmp",nIndex);
displayDB(ptempdata,*(phwnd+nIndex),str_cut_fn);//_____将预处理的中间结果在主对话框中显示出来
*(pR+nIndex)=rec_one(pD+nIndex*nH*nL*nrgb,pback);
}
nrlt=*(pR);
delete []ptempdata;
delete []pR;
return nrlt;
}
//-------仅识别一张照片--------
int CPalmPriintRec::rec_one(BYTE *pD,BYTE *pback)
{
int nrlt=0;
//图像前处理
//特征提取
//识别
return nrlt;
}
//_________对掌纹原始图像进行预处理_____________
// 将与背景不同的部分提取出来,传入prlt中
//pback是原图,
//pD是当前的照片,
//要从pD中将手的轮廓提取出来
/*
2006-12-04
老板建议用RGB夹角来处理背景和前景
*/
//////////////////////////////////////////////////////////////////////////
// [3/14/2007]
// 下面用灰度分割方法提取出掌纹轮廓
// pD中的数据是怎样安排的
// pD中是当前照片,pback中是背景
void CPalmPriintRec::pretreat(BYTE *prlt,BYTE *pD,BYTE *pback)
{
int nhang,nlie;
/* 逐个像素
double dthreshold=1.8;
double *pcheck=new double[3];
double *pbk=new double[3];
Chdg hdg;
for (nhang=0;nhang<nH;nhang++)
{
for (nlie=0;nlie<nL;nlie++)
{
*(pcheck+0)=*(pD+(nlie+nhang*nL)*nrgb+0);//B
*(pcheck+1)=*(pD+(nlie+nhang*nL)*nrgb+1);//G
*(pcheck+2)=*(pD+(nlie+nhang*nL)*nrgb+2);//R
*(pbk+0)=*(pback+(nlie+nhang*nL)*nrgb+0);//B
*(pbk+1)=*(pback+(nlie+nhang*nL)*nrgb+1);//G
*(pbk+2)=*(pback+(nlie+nhang*nL)*nrgb+2);//R
//计算夹角
//double tprlt=hdg.cacuangle(pcheck,pbk,3);
if (dthreshold>hdg.cacuangle(pcheck,pbk,3))
{
*(prlt+(nlie+nhang*nL)*nrgb+0)=0;
*(prlt+(nlie+nhang*nL)*nrgb+1)=0;
*(prlt+(nlie+nhang*nL)*nrgb+2)=0;
}
else
{
*(prlt+(nlie+nhang*nL)*nrgb+0)=*(pD+(nlie+nhang*nL)*nrgb+0);
*(prlt+(nlie+nhang*nL)*nrgb+1)=*(pD+(nlie+nhang*nL)*nrgb+1);
*(prlt+(nlie+nhang*nL)*nrgb+2)=*(pD+(nlie+nhang*nL)*nrgb+2);
}
}
}
*/
/* 2×2像素
double dthreshold=1.8;
double *pcheck=new double[12];//3×4
double *pbk=new double[12];
Chdg hdg;
for (nhang=0;nhang<nH;nhang=nhang+2)
{
for (nlie=0;nlie<nL;nlie=nlie+2)
{
*(pcheck+0)=*(pD+(nlie+nhang*nL)*nrgb+0);//B
*(pcheck+1)=*(pD+(nlie+nhang*nL)*nrgb+1);//G
*(pcheck+2)=*(pD+(nlie+nhang*nL)*nrgb+2);//R
*(pcheck+0+3)=*(pD+(nlie+1+nhang*nL)*nrgb+0);//B
*(pcheck+1+3)=*(pD+(nlie+1+nhang*nL)*nrgb+1);//G
*(pcheck+2+3)=*(pD+(nlie+1+nhang*nL)*nrgb+2);//R
*(pcheck+0+6)=*(pD+(nlie+(nhang+1)*nL)*nrgb+0);//B
*(pcheck+1+6)=*(pD+(nlie+(nhang+1)*nL)*nrgb+1);//G
*(pcheck+2+6)=*(pD+(nlie+(nhang+1)*nL)*nrgb+2);//R
*(pcheck+0+9)=*(pD+(nlie+1+(nhang+1)*nL)*nrgb+0);//B
*(pcheck+1+9)=*(pD+(nlie+1+(nhang+1)*nL)*nrgb+1);//G
*(pcheck+2+9)=*(pD+(nlie+1+(nhang+1)*nL)*nrgb+2);//R
//////////////////////////////////////////////////////////////////////////
*(pbk+0)=*(pback+(nlie+nhang*nL)*nrgb+0);//B
*(pbk+1)=*(pback+(nlie+nhang*nL)*nrgb+1);//G
*(pbk+2)=*(pback+(nlie+nhang*nL)*nrgb+2);//R
*(pbk+0+3)=*(pback+(nlie+1+nhang*nL)*nrgb+0);//B
*(pbk+1+3)=*(pback+(nlie+1+nhang*nL)*nrgb+1);//G
*(pbk+2+3)=*(pback+(nlie+1+nhang*nL)*nrgb+2);//R
*(pbk+0+6)=*(pback+(nlie+(nhang+1)*nL)*nrgb+0);//B
*(pbk+1+6)=*(pback+(nlie+(nhang+1)*nL)*nrgb+1);//G
*(pbk+2+6)=*(pback+(nlie+(nhang+1)*nL)*nrgb+2);//R
*(pbk+0+9)=*(pback+(nlie+1+(nhang+1)*nL)*nrgb+0);//B
*(pbk+1+9)=*(pback+(nlie+1+(nhang+1)*nL)*nrgb+1);//G
*(pbk+2+9)=*(pback+(nlie+1+(nhang+1)*nL)*nrgb+2);//R
//计算夹角
double tprlt=hdg.cacuangle(pcheck,pbk,12);
if (dthreshold>hdg.cacuangle(pcheck,pbk,12))
{
*(prlt+(nlie+nhang*nL)*nrgb+0)=0;
*(prlt+(nlie+nhang*nL)*nrgb+1)=0;
*(prlt+(nlie+nhang*nL)*nrgb+2)=0;
*(prlt+(nlie+1+nhang*nL)*nrgb+0)=0;
*(prlt+(nlie+1+nhang*nL)*nrgb+1)=0;
*(prlt+(nlie+1+nhang*nL)*nrgb+2)=0;
*(prlt+(nlie+(nhang+1)*nL)*nrgb+0)=0;
*(prlt+(nlie+(nhang+1)*nL)*nrgb+1)=0;
*(prlt+(nlie+(nhang+1)*nL)*nrgb+2)=0;
*(prlt+(nlie+1+(nhang+1)*nL)*nrgb+0)=0;
*(prlt+(nlie+1+(nhang+1)*nL)*nrgb+1)=0;
*(prlt+(nlie+1+(nhang+1)*nL)*nrgb+2)=0;
}
else
{
*(prlt+(nlie+nhang*nL)*nrgb+0)=*(pD+(nlie+nhang*nL)*nrgb+0);
*(prlt+(nlie+nhang*nL)*nrgb+1)=*(pD+(nlie+nhang*nL)*nrgb+1);
*(prlt+(nlie+nhang*nL)*nrgb+2)=*(pD+(nlie+nhang*nL)*nrgb+2);
*(prlt+(nlie+1+nhang*nL)*nrgb+0)=*(pD+(nlie+1+nhang*nL)*nrgb+0);
*(prlt+(nlie+1+nhang*nL)*nrgb+1)=*(pD+(nlie+1+nhang*nL)*nrgb+1);
*(prlt+(nlie+1+nhang*nL)*nrgb+2)=*(pD+(nlie+1+nhang*nL)*nrgb+2);
*(prlt+(nlie+(nhang+1)*nL)*nrgb+0)=*(pD+(nlie+(nhang+1)*nL)*nrgb+0);
*(prlt+(nlie+(nhang+1)*nL)*nrgb+1)=*(pD+(nlie+(nhang+1)*nL)*nrgb+1);
*(prlt+(nlie+(nhang+1)*nL)*nrgb+2)=*(pD+(nlie+(nhang+1)*nL)*nrgb+2);
*(prlt+(nlie+1+(nhang+1)*nL)*nrgb+0)=*(pD+(nlie+1+(nhang+1)*nL)*nrgb+0);
*(prlt+(nlie+1+(nhang+1)*nL)*nrgb+1)=*(pD+(nlie+1+(nhang+1)*nL)*nrgb+1);
*(prlt+(nlie+1+(nhang+1)*nL)*nrgb+2)=*(pD+(nlie+1+(nhang+1)*nL)*nrgb+2);
}
}
}
*/
// 3×3像素
double dthreshold=2;//1.8;
double *pcheck=new double[27];//3×9
double *pbk=new double[27];
Chdg hdg;
for (nhang=0;nhang<nH;nhang=nhang+3)
{
for (nlie=0;nlie<(nL-1);nlie=nlie+3)
{
*(pcheck+0)=*(pD+(nlie+nhang*nL)*nrgb+0);//B
*(pcheck+1)=*(pD+(nlie+nhang*nL)*nrgb+1);//G
*(pcheck+2)=*(pD+(nlie+nhang*nL)*nrgb+2);//R
*(pcheck+0+3)=*(pD+(nlie+1+nhang*nL)*nrgb+0);//B
*(pcheck+1+3)=*(pD+(nlie+1+nhang*nL)*nrgb+1);//G
*(pcheck+2+3)=*(pD+(nlie+1+nhang*nL)*nrgb+2);//R
*(pcheck+0+6)=*(pD+(nlie+2+nhang*nL)*nrgb+0);
*(pcheck+1+6)=*(pD+(nlie+2+nhang*nL)*nrgb+1);
*(pcheck+2+6)=*(pD+(nlie+2+nhang*nL)*nrgb+2);
*(pcheck+0+9)=*(pD+(nlie+(nhang+1)*nL)*nrgb+0);//B
*(pcheck+1+9)=*(pD+(nlie+(nhang+1)*nL)*nrgb+1);//G
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -