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

📄 harrfeature.cpp

📁 一种Adboost算法的改进算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                                                FeatureStPos, 
                                                FeatureScale,
                                                pInterData);
                                        feaCount++;
                                        FeatureScale.x += 1;
                                }
                                FeatureScale.y += 1;
                        }
                        //========= 计算E类特征 ==========
                        FeatureScale.y = 2;
                        FeatureType = 4;
                        while (FeatureStPos.y + 3 * FeatureScale.y < imageSize.y)
                        {
                                FeatureScale.x = 2; 
                                while (FeatureStPos.x + FeatureScale.x < imageSize.x)
                                {
                                        pFeatures[feaCount] = GetOneFeatureValue
                                                (FeatureType, 
                                                FeatureStPos, 
                                                FeatureScale,
                                                pInterData);
                                        feaCount++;
                                        FeatureScale.x += 1;
                                }
                                FeatureScale.y += 1;
                        }
                        FeatureStPos.x += 1;
                }
                FeatureStPos.y += 1;
        }

        return;
}


/////////////////////////////////////////////////////////////////////////////////////////
//针对每一个特定的分类器计算出它的分类错误率
float HarrFeature::GetOneFeatureValue(BYTE FeatureType, POINT FeatureStPos, POINT FeatureScale,
                                      float* pFaceData)
{
        float    *pDataFromFile;//一个训练图象的积分图象数据
        int      posLeftTop0, posRightBottom0, posRightTop0, posLeftBottom0,
                posMiddleTop0, posMiddleBottom0;

        int      posLeftTop1, posRightBottom1, posRightTop1, posLeftBottom1,
                posLeftMiddle1, posRightMiddle1;

        int      posLeftTop2, posRightBottom2, posRightTop2, posLeftBottom2,
                posMiddleLTop2, posMiddleRTop2, posMiddleLBottom2, posMiddleRBottom2;

        int      posLeftTop3, posMiddleTop3, posRightTop3,
                posLeftMiddle3, posMiddleMiddle3, posRightMiddle3,
                posLeftBottom3, posMiddleBottom3, posRightBottom3;

        int      posLeftTop4, posRightTop4, posLeftTMiddle4, posRightTMiddle4,
                posLeftBMiddle4, posRightBMiddle4, posLeftBottom4, posRightBottom4;
        float    result;

        //***********************//
        //  如果计算的是A类特征  // 
        //***********************//
        if (FeatureType == 0)
        {
                posLeftTop0 = imageSize.x * (FeatureStPos.y) + (FeatureStPos.x);
                posMiddleTop0 = posLeftTop0 + FeatureScale.x;
                posRightTop0 = posMiddleTop0 + FeatureScale.x;
                posLeftBottom0 = imageSize.x * (FeatureStPos.y+FeatureScale.y) + (FeatureStPos.x);
                posMiddleBottom0 = posLeftBottom0 + FeatureScale.x;
                posRightBottom0 = posMiddleBottom0 + FeatureScale.x;

                pDataFromFile = pFaceData;

                result = pDataFromFile [posLeftBottom0] 
                + pDataFromFile [posRightBottom0] 
                - pDataFromFile [posLeftTop0] 
                - pDataFromFile [posRightTop0] 
                + 2 * (pDataFromFile [posMiddleTop0] 
                - pDataFromFile [posMiddleBottom0]);
        }
        //***********************//
        //  如果计算的是B类特征  // 
        //***********************//
        if (FeatureType == 1)
        {
                posLeftTop1 = imageSize.x * (FeatureStPos.y) + (FeatureStPos.x);
                posRightTop1 = posLeftTop1 + FeatureScale.x;
                posLeftMiddle1 = imageSize.x * (FeatureStPos.y + FeatureScale.y) + (FeatureStPos.x);
                posRightMiddle1 = posLeftMiddle1 + FeatureScale.x;
                posLeftBottom1 = imageSize.x * (FeatureStPos.y + 2*FeatureScale.y) + (FeatureStPos.x);
                posRightBottom1 = posLeftBottom1 + FeatureScale.x;

                pDataFromFile = pFaceData;
                result = pDataFromFile [posLeftTop1] 
                + pDataFromFile [posLeftBottom1] 
                - pDataFromFile [posRightTop1] 
                + 2 * (pDataFromFile [posRightMiddle1] 
                - pDataFromFile [posLeftMiddle1]) 
                        - pDataFromFile [posRightBottom1];
        }
        //***********************//
        //  如果计算的是C类特征  // 
        //***********************//
        if(FeatureType == 2)
        {
                posLeftTop2 = imageSize.x * (FeatureStPos.y) + FeatureStPos.x;
                posMiddleLTop2 = posLeftTop2 + FeatureScale.x;
                posMiddleRTop2 = posMiddleLTop2 + FeatureScale.x;
                posRightTop2 = posMiddleRTop2 + FeatureScale.x;
                posLeftBottom2 = imageSize.x * (FeatureStPos.y + FeatureScale.y) + FeatureStPos.x;
                posMiddleLBottom2 = posLeftBottom2 + FeatureScale.x;
                posMiddleRBottom2 = posMiddleLBottom2 + FeatureScale.x;
                posRightBottom2 = posMiddleRBottom2 + FeatureScale.x;

                pDataFromFile = pFaceData;

                result = (pDataFromFile [posRightTop2] + pDataFromFile [posLeftBottom2]) 
                        - (pDataFromFile [posLeftTop2] + pDataFromFile [posRightBottom2]) 
                        + 3*(pDataFromFile [posMiddleLTop2] + pDataFromFile [posMiddleRBottom2]) 
                        - 3*(pDataFromFile [posMiddleRTop2] + pDataFromFile [posMiddleLBottom2]);
        }
        //***********************//
        //  如果计算的是D类特征  // 
        //***********************//
        if (FeatureType == 3)
        {
                posLeftTop3 = imageSize.x * (FeatureStPos.y) + FeatureStPos.x;
                posMiddleTop3 = posLeftTop3 + FeatureScale.x;
                posRightTop3 = posMiddleTop3 + FeatureScale.x;
                posLeftMiddle3 = imageSize.x * (FeatureStPos.y + FeatureScale.y) + FeatureStPos.x;
                posMiddleMiddle3 = posLeftMiddle3 + FeatureScale.x;
                posRightMiddle3 = posMiddleMiddle3 + FeatureScale.x;
                posLeftBottom3 = imageSize.x * (FeatureStPos.y + 2 * FeatureScale.y) + FeatureStPos.x;
                posMiddleBottom3 = posLeftBottom3 + FeatureScale.x;
                posRightBottom3 = posMiddleBottom3 + FeatureScale.x;

                pDataFromFile = pFaceData;

                result = 2 * (pDataFromFile [posMiddleTop3] 
                + pDataFromFile [posLeftMiddle3] 
                + pDataFromFile [posRightMiddle3] 
                + pDataFromFile [posMiddleBottom3]) 
                        - (pDataFromFile [posLeftTop3] 
                        + pDataFromFile [posRightTop3] 
                        + pDataFromFile [posLeftBottom3] 
                        + pDataFromFile [posRightBottom3] 
                        + 4 * pDataFromFile [posMiddleMiddle3]);
        }
        //***********************//
        //  如果计算的是E类特征  // 
        //***********************//
        if (FeatureType == 4)
        {
                posLeftTop4 = imageSize.x * (FeatureStPos.y) + FeatureStPos.x;
                posRightTop4 = posLeftTop4 + FeatureScale.x;

                posLeftTMiddle4 = imageSize.x * (FeatureStPos.y + FeatureScale.y) + FeatureStPos.x;
                posRightTMiddle4 = posLeftTMiddle4 + FeatureScale.x;

                posLeftBMiddle4 = imageSize.x * (FeatureStPos.y + 2 * FeatureScale.y) + FeatureStPos.x;
                posRightBMiddle4 = posLeftBMiddle4 + FeatureScale.x;

                posLeftBottom4 = imageSize.x * (FeatureStPos.y + 3 * FeatureScale.y) + FeatureStPos.x;
                posRightBottom4 = posLeftBottom4 + FeatureScale.x;

                pDataFromFile = pFaceData;

                result = 3*(pDataFromFile [posLeftTMiddle4] + pDataFromFile [posRightBMiddle4])
                        - 3*(pDataFromFile [posRightTMiddle4] + pDataFromFile [posLeftBMiddle4])
                        - (pDataFromFile [posLeftTop4] + pDataFromFile [posRightBottom4])
                        + (pDataFromFile [posRightTop4] + pDataFromFile [posLeftBottom4]); 
        }
        return result;
}

////////////////////////////////////////////////////////////////////////
void HarrFeature::ReOrderFeatures(CString strSrcPath, CString strDstPath)
{
        DWORD   FileSizeHigh;  
        DWORD   FileSizeLow;
        DWORD   bytesread;
        printf("Re-ordering features......\n");
        HANDLE fil = CreateFile(strSrcPath,
                GENERIC_READ|GENERIC_WRITE,
                FILE_SHARE_WRITE,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);
        FileSizeLow = GetFileSize (fil, &FileSizeHigh);
        DWORD imageNum = FileSizeLow / (sizeof(float) * featureNum);

        float *pSrcData = new float[imageNum * featureNum];
        ReadFile(fil, pSrcData, imageNum * featureNum * sizeof(float),
                &bytesread, NULL);

        CloseHandle((HANDLE)fil);

        //重新排列特征的顺序
        FILE *f_Feature = fopen(strDstPath, "wb");

        float *pFinalFeature = new float[imageNum];
        for (int m=0; m<featureNum; m++)
        {
                printf("feaid = %d\r", m);
                for (int n=0; n<imageNum; n++)
                {
                        pFinalFeature[n] = pSrcData[n * featureNum + m];
                }
                //将特征写入文件
                fwrite(pFinalFeature, sizeof(float), imageNum, f_Feature);
        }
        fclose(f_Feature);

        delete []pSrcData;
        delete []pFinalFeature;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -