📄 harrfeature.cpp
字号:
/////////////////////////////////////////////////////////////////////
//
// LBPFeature.cpp: implementation of the LBPFeature class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "HarrFeature.h"
#include "Image.h"
#include "direct.h"
#include "math.h"
#include "Define.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
HarrFeature::HarrFeature()
{
imageSize.x = SRCIMAGEX;
imageSize.y = SRCIMAGEY;
featureNum = TOTAL_FEATURE_NUM;
FaceImageNum = 0;
NonFaceImageNum = 0;
}
HarrFeature::~HarrFeature()
{
}
DWORD HarrFeature::GetFaceImageNum()
{
return FaceImageNum;
}
DWORD HarrFeature::GetNonfaceImageNum()
{
return NonFaceImageNum;
}
DWORD HarrFeature::GetFeatureNum(CString strFeature, bool isFace)
{
DWORD FileSizeHigh;
DWORD FileSizeLow;
HANDLE fil = CreateFile(strFeature,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
FileSizeLow = GetFileSize (fil, &FileSizeHigh);
DWORD imageNum = FileSizeLow / (sizeof(float) * featureNum);
if (isFace == true) FaceImageNum = imageNum;
else NonFaceImageNum = imageNum;
CloseHandle ((HANDLE)fil);
return imageNum;
}
void HarrFeature::SaveAllFeatures(CString strIntg, CString strFeature, bool isFaceData)
{
int i, m, n;
DWORD FileSizeHigh;
DWORD FileSizeLow;
DWORD bytesread;
float *pTempData;
float *pTempFeature;
//计算出人脸训练图象的数目
HANDLE fil = CreateFile(strIntg,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
FileSizeLow = GetFileSize (fil, &FileSizeHigh);
DWORD imageNum = FileSizeLow / (imageSize.y * imageSize.x * sizeof(float));
if (isFaceData == true) FaceImageNum = imageNum;
else NonFaceImageNum = imageNum;
//读入训练图象的积分图象数据
if (isFaceData)
printf("Reading eye integral data......\n");
else
printf("Reading noneye integral data......\n");
float *pIntgData = new float[imageNum * imageSize.x * imageSize.y];
ReadFile (fil, pIntgData, imageNum * imageSize.y * imageSize.x * sizeof(float),
&bytesread, NULL);
CloseHandle ((HANDLE)fil);
//计算出所有人脸训练图像的特征
if (isFaceData)
printf("Computing eye harr features......\n");
else
printf("Computing noneye harr features......\n");
pTempData = pIntgData;
float *pFeature = new float[imageNum * featureNum];
pTempFeature = pFeature;
for (i=0; i<imageNum; i++)
{
GetFeatures(pTempData, pTempFeature);
pTempData += imageSize.x * imageSize.y;
pTempFeature += featureNum;
}
delete []pIntgData;
//重新排列特征的顺序
FILE *f_Feature = fopen(strFeature, "wb");
if (isFaceData == true)
printf("Re-ordering eye features......\n");
else
printf("Re-ordering noneye features......\n");
float *pFinalFeature = new float[imageNum];
for (m=0; m<featureNum; m++)
{
printf("feaid = %d\r", m);
for (n=0; n<imageNum; n++)
{
pFinalFeature[n] = pFeature[n * featureNum + m];
}
//将特征写入文件
fwrite(pFinalFeature, sizeof(float), imageNum, f_Feature);
}
fclose(f_Feature);
delete []pFinalFeature;
delete []pFeature;
}
/////////////////////////////////////////////////////////////////////////////////
void HarrFeature::GetFeatures(float *pInterData, float *pFeatures)
{
int FeatureType;
POINT FeatureStPos, FeatureScale;
POINT imageSize;
imageSize.x = SRCIMAGEX;
imageSize.y = SRCIMAGEY;
long feaCount = 0;
FeatureStPos.y = 1;
while (FeatureStPos.y < imageSize.y-1)//行扫描
{
FeatureStPos.x = 1;
while (FeatureStPos.x < imageSize.x-1)//列扫描
{
//====== 计算A类特征 ======
FeatureScale.y = 2;
FeatureType = 0;
while (FeatureStPos.y + FeatureScale.y < imageSize.y)//特征y方向放大
{
FeatureScale.x = 2;
while (FeatureStPos.x + 2 * FeatureScale.x < imageSize.x)//特征x方向放大
{
pFeatures[feaCount] = GetOneFeatureValue
(FeatureType,
FeatureStPos,
FeatureScale,
pInterData);
feaCount++;
FeatureScale.x += 1;
}
FeatureScale.y += 1;
}
//========= 计算B类特征 ==========
FeatureScale.y = 2;
FeatureType = 1;
while (FeatureStPos.y + 2 * FeatureScale.y < imageSize.y)//特征y方向放大
{
FeatureScale.x = 2;
while (FeatureStPos.x + FeatureScale.x < imageSize.x)//特征x方向放大
{
pFeatures[feaCount] = GetOneFeatureValue
(FeatureType,
FeatureStPos,
FeatureScale,
pInterData);
feaCount++;
FeatureScale.x += 1;
}
FeatureScale.y += 1;
}
//========= 计算C类特征 ==========
FeatureScale.y = 2;
FeatureType = 2;
while (FeatureStPos.y + FeatureScale.y < imageSize.y)
{
FeatureScale.x = 2;
while (FeatureStPos.x + 3 * FeatureScale.x < imageSize.x)
{
pFeatures[feaCount] = GetOneFeatureValue
(FeatureType,
FeatureStPos,
FeatureScale,
pInterData);
feaCount++;
FeatureScale.x += 1;
}
FeatureScale.y += 1;
}
//========= 计算D类特征 ==========
FeatureScale.y = 2;
FeatureType = 3;
while (FeatureStPos.y + 2 * FeatureScale.y < imageSize.y)
{
FeatureScale.x = 2;
while (FeatureStPos.x + 2 * FeatureScale.x < imageSize.x)
{
pFeatures[feaCount] = GetOneFeatureValue
(FeatureType,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -