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

C++ 人臉性別識別教程(四):OpenCV 人臉檢測函數詳解與實戰

     編輯:關於C++

項目架構

人臉性別識別三大模塊:人臉檢測 → 特徵提取 → 性別分類。
項目架構圖

OpenCV 人臉檢測完整流程

1. 環境配置

  • 工程類型:Win32 控制台應用
  • 包含頭文件:#include
  • 命名空間:using namespace cv; using namespace std;

2. 攝像頭初始化(C API,OpenCV 1.x 風格,2.x 兼容)

CvCapture* capture = cvCreateCameraCapture(0); // 0 為默認攝像頭
cvNamedWindow("Camera");

3. 幀捕獲與顯示循環

IplImage* frame = NULL;
while ((frame = cvQueryFrame(capture)) != NULL) {
    cvShowImage("Camera", frame);
    cvWaitKey(1); // 必須有延時,否則無法正常顯示
}

4. 人臉檢測核心步驟

分類器加載:OpenCV 自帶 Haar 級聯分類器(haarcascade_frontalface_alt_tree.xml 等)

// 全局變量
static CvMemStorage* storage = NULL;
static CvHaarClassifierCascade* cascade = NULL;
const char* cascadePath = "D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt_tree.xml";

// 初始化
storage = cvCreateMemStorage(0);
cascade = (CvHaarClassifierCascade*)cvLoad(cascadePath);

灰度化:檢測器要求灰度圖

IplImage* gray = cvCreateImage(cvSize(frame->width, frame->height), 8, 1);
cvCvtColor(frame, gray, CV_BGR2GRAY);

檢測調用

cvClearMemStorage(storage);
CvSeq* faces = cvHaarDetectObjects(
    gray, cascade, storage,
    1.1,      // scaleFactor: 圖像縮放比例
    2,        // minNeighbors: 候選矩形保留閾值
    0,        // flags
    cvSize(30, 30) // minSize: 最小人臉尺寸
);

繪製矩形框

for (int i = 0; i < (faces ? faces->total : 0); ++i) {
    CvRect* r = (CvRect*)cvGetSeqElem(faces, i);
    cvRectangle(frame,
                cvPoint(r->x, r->y),
                cvPoint(r->x + r->width, r->y + r->height),
                CV_RGB(0, 255, 0), 2);
}
cvShowImage("Camera", frame);

5. 完整可運行代碼

#include 
using namespace cv; using namespace std;

static CvMemStorage* storage = NULL;
static CvHaarClassifierCascade* cascade = NULL;
const char* cascadePath = "D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt_tree.xml";

int main() {
    CvCapture* capture = cvCreateCameraCapture(0);
    cvNamedWindow("Camera");
    storage = cvCreateMemStorage(0);
    cascade = (CvHaarClassifierCascade*)cvLoad(cascadePath);
    
    IplImage* frame = NULL;
    while ((frame = cvQueryFrame(capture)) != NULL) {
        // 灰度化
        IplImage* gray = cvCreateImage(cvSize(frame->width, frame->height), 8, 1);
        cvCvtColor(frame, gray, CV_BGR2GRAY);
        
        // 檢測
        cvClearMemStorage(storage);
        CvSeq* faces = cvHaarDetectObjects(gray, cascade, storage, 1.1, 2, 0, cvSize(30,30));
        
        // 繪製
        for (int i = 0; i < (faces ? faces->total : 0); ++i) {
            CvRect* r = (CvRect*)cvGetSeqElem(faces, i);
            cvRectangle(frame, cvPoint(r->x, r->y),
                        cvPoint(r->x+r->width, r->y+r->height), CV_RGB(0,255,0), 2);
        }
        cvShowImage("Camera", frame);
        cvWaitKey(1);
        cvReleaseImage(&gray); // 釋放灰度圖
    }
    return 0;
}

關鍵參數說明

參數含義典型值
scaleFactor每次圖像縮放比例,>11.1~1.3
minNeighbors候選框保留閾值,越大越嚴格2~5
minSize最小檢測人臉尺寸cvSize(30,30)
flagsCV_HAAR_DO_CANNY_PRUNING 等0 或默認

運行效果

人臉檢測運行效果圖

遷移到 OpenCV 3.x/4.x C++ API 提示

  • 使用 cv::CascadeClassifier 類替代 C 結構體
  • 使用 cv::Mat 替代 IplImage*
  • detectMultiScale 替代 cvHaarDetectObjects
  • 內存自動管理,無需 CvMemStorage
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved