系列教程第 16 篇:在攝像頭視頻流中集成人臉檢測與性別識別,並引入多幀融合投票機制大幅提升識別結果穩定性。
定時器 OnTimer 觸發:
cvQueryFrame 獲取下一幀detect_and_draw 人臉檢測 + 性別識別(內部調用 GenderRecognition)CvvImage::DrawToHDC 繪製帶檢測框的結果幀void CGenderRecognitionMFCDlg::OnTimer(UINT_PTR nIDEvent) {
m_pVideoInfo->m_pFrameImage = cvQueryFrame(m_pVideoInfo->m_pCapture);
IplImage* frame = m_pVideoInfo->m_pFrameImage;
detect_and_draw(frame); // 檢測並識別,結果畫在 frame 上
CvvImage cvt; cvt.CopyOf(frame);
cvt.DrawToHDC(m_pPicCtlHdc, &m_PicCtlRect);
CDialogEx::OnTimer(nIDEvent);
}
新增 ComboBox IDC_COMBO_NUM,選項 1,3,5,7,9,11,13,15,默認 9。讀取方式:
int iFrameNum = 0;
int idx = ((CComboBox*)GetDlgItem(IDC_COMBO_NUM))->GetCurSel();
switch (idx) { case 0: iFrameNum=1; break; case 1: iFrameNum=3; ... }
m_boolModelFlag:TRUE=圖片模式(單幀直出),FALSE=視頻模式(多幀融合)。
TRUEFALSE類成員 m_ManNum, m_WomenNum, m_FrameNum 累計:
if (m_boolModelFlag) { // 圖片模式
SetResultText(m_genderLabel == 1 ? "帥哥" : "美女");
} else { // 視頻模式
if (m_genderLabel == 1) ++m_ManNum;
else if (m_genderLabel == 2) ++m_WomenNum;
++m_FrameNum;
if (m_FrameNum == iFrameNum) {
SetResultText(m_ManNum > m_WomenNum ? "帥哥" : "美女");
m_ManNum = m_WomenNum = m_FrameNum = 0;
}
}
IplImage* → cv::Mat → resize(92,112)IDC_COMBO_FUNCTION 選擇分類器:PCA / Fisher / LBP / HOG+SVMm_genderLabel (1=男, 2=女)