⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 harrfeature.cpp

📁 一种Adboost算法的改进算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////
//
// 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 + -