首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 人臉性別識別教程(12):集成四種分類器的 MFC 完整實現

     編輯:關於C++

C++ 人臉性別識別教程(12):集成四種分類器的 MFC 完整實現

接續前文,將訓練好的 PCA、Fisher、LBP、SVM 四種性別分類器集成到 MFC 應用中,實現下拉選單切換、離線模型加載、實時識別顯示。


一、離線訓練四種分類器模型

訓練耗時約 5 分鐘,採用離線訓練、在線加載模式。生成模型文件:

  • PCA_Model.xml
  • Fisher_Model.xml
  • LBP_Model.xml
  • SVM_SEX_Model.txt(含 HOG 特徵參數)

二、MFC 界面添加 Combo Box 控件

  1. 工具箱拖入 Combo Box,ID 設為 IDC_COMBO_FUNCTION
  2. OnInitDialog 初始化選項:

((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->AddString(_T("PCA變換"));
((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->AddString(_T("Fisher變換"));
((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->AddString(_T("LBP變換"));
((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->AddString(_T("支持向量機"));
((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->SetCurSel(1);  // 默認 Fisher

屬性設置:取消 Sort、調整 Drop Down 高度 顯示所有選項。


三、全局聲明分類器對象

在 GenderRecognitionMFCDlg.cpp 頂部:


static Ptr model_PCA = createEigenFaceRecognizer();
static Ptr model_Fisher = createFisherFaceRecognizer();
static Ptr model_LBP = createLBPHFaceRecognizer();
static CvSVM svm;

四、「初始化」按鈕按需加載模型


void CGenderRecognitionMFCDlg::OnBnClickedButtonInitial() {
    // ... 人臉檢測器加載代碼 ...
    
    int index = ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->GetCurSel();
    switch (index) {
        case 0: model_PCA->load(modelPath + "PCA_Model.xml"); break;
        case 1: model_Fisher->load(modelPath + "Fisher_Model.xml"); break;
        case 2: model_LBP->load(modelPath + "LBP_Model.xml"); break;
        case 3: svm.load(modelPath + "SVM_SEX_Model.txt"); break;
    }
    MessageBox(_T("初始化完成"));  // 加載耗時 ~5秒,提示友好
}

五、性別識別核心函數


void CGenderRecognitionMFCDlg::GenderRecognition(IplImage* img) {
    Mat image(img);
    resize(image, image, Size(92, 112));  // 統一歸一化尺寸
    
    int index = ((CComboBox*)GetDlgItem(IDC_COMBO_FUNCTION))->GetCurSel();
    switch (index) {
        case 0: m_genderLabel = model_PCA->predict(image); break;
        case 1: m_genderLabel = model_Fisher->predict(image); break;
        case 2: m_genderLabel = model_LBP->predict(image); break;
        case 3: {
            Mat trainImg;
            resize(image, trainImg, Size(64, 64));
            HOGDescriptor hog(Size(64,64), Size(16,16), Size(8,8), Size(8,8), 9);
            vector descriptors;
            hog.compute(trainImg, descriptors);
            Mat svmMat(1, descriptors.size(), CV_32FC1);
            for (size_t i = 0; i < descriptors.size(); ++i)
                svmMat.at(0, i) = descriptors[i];
            m_genderLabel = svm.predict(svmMat);
            break;
        }
    }
    
    // 顯示結果
    GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(
        m_genderLabel == 1 ? _T("帥哥") : _T("美女")
    );
}

六、人臉檢測回調中調用識別

在 detect_and_draw 中,檢測到人臉後:

  1. cvSetImageROI 設置人臉區域
  2. 創建 faceImage,彩色圖 cvCvtColor 灰度化(自動複製 ROI),灰度圖 cvCopy 深拷貝 ROI(避免淺拷貝 BUG,見教程 14)
  3. 調用 GenderRecognition(faceImage)
  4. cvReleaseImage 釋放

七、關鍵經驗總結

  1. 分類器本質:PCA/Fisher/LBP 底層均為 KNN,僅特徵提取不同;SVM 為獨立分類器
  2. MFC 學習:推薦孫鑫 MFC 視頻教程,本項目僅用基礎控件操作
  3. 初始化提示:模型加載耗時,必加完成提示框
  4. resource.h:查閱控件 ID 定義
  5. 全局變量:教學用全局,實際項目應封裝於類中,避免線程安全問題

下一教程將引入攝像頭視頻流實時性別識別。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved