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

#include using namespace cv; using namespace std;CvCapture* capture = cvCreateCameraCapture(0); // 0 為默認攝像頭
cvNamedWindow("Camera");
IplImage* frame = NULL;
while ((frame = cvQueryFrame(capture)) != NULL) {
cvShowImage("Camera", frame);
cvWaitKey(1); // 必須有延時,否則無法正常顯示
}
分類器加載: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);
#includeusing 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 | 每次圖像縮放比例,>1 | 1.1~1.3 |
| minNeighbors | 候選框保留閾值,越大越嚴格 | 2~5 |
| minSize | 最小檢測人臉尺寸 | cvSize(30,30) |
| flags | CV_HAAR_DO_CANNY_PRUNING 等 | 0 或默認 |

cv::CascadeClassifier 類替代 C 結構體cv::Mat 替代 IplImage*detectMultiScale 替代 cvHaarDetectObjectsCvMemStorage