提供一个有用的链接:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html#cascade-classifier
这份代码可以实现对摄像头的每一帧图片进行人脸和人眼的检测。
//人脸检测 #include <opencv2/opencv.hpp> #include <Windows.h> using namespace std; int main() { //加载检测器 const char *cascadeFileName = "D:\\opencv\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml"; const char *cascadeFileName1 = "D:\\opencv\\opencv\\data\\haarcascades\\haarcascade_eye_tree_eyeglasses.xml"; CvHaarClassifierCascade *pHaarCascade = NULL; CvCapture *cap = cvCreateCameraCapture(0); if(!cap) { cerr<<"error!"<<endl; exit(-1); } IplImage *tempImage = cvQueryFrame(cap); CvSize size = cvSize( (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH), (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT) ); //const char *srcImageFileName = "testface.jpg"; const char *srcWindowsName = "原图"; //IplImage *srcImage = cvLoadImage(srcImageFileName, CV_LOAD_IMAGE_UNCHANGED); IplImage *srcImage = cvCreateImage(size, IPL_DEPTH_8U, 3); cvNamedWindow(srcWindowsName, CV_WINDOW_AUTOSIZE); while((tempImage = cvQueryFrame(cap)) != NULL) { cvCopy(tempImage, srcImage); //处理每一帧图像 if (srcImage->origin == IPL_ORIGIN_TL) { cvFlip(srcImage, srcImage); } IplImage *grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1); cvCvtColor(srcImage, grayImage, CV_BGR2GRAY); pHaarCascade = (CvHaarClassifierCascade*)cvLoad(cascadeFileName); //人脸检测 if(pHaarCascade != NULL) { //多种颜色识别多张脸 CvScalar faceCircleColors[] = { {{0,0,255}},{{0,128,255}},{{0,255,0}},{{255,0,255}} }; CvMemStorage *cvMstorage = cvCreateMemStorage(0); cvClearMemStorage(cvMstorage); //DWORD dwTimeBegin, dwTimeEnd; //dwTimeBegin = GetTickCount(); CvSeq *cvSeqFace = cvHaarDetectObjects(grayImage, pHaarCascade, cvMstorage); //dwTimeEnd = GetTickCount(); //cout<<"识别用时:"<<dwTimeEnd - dwTimeBegin<<endl; for(int i = 0; i < cvSeqFace->total; i++) { CvRect *r = (CvRect*)cvGetSeqElem(cvSeqFace, i); CvPoint center; int radius; center.x = cvRound(r->x + r->width * 0.5); center.y = cvRound(r->y + r->height * 0.5); radius = cvRound((r->width + r->height)*0.25); cvCircle( srcImage, center, radius, faceCircleColors[i%4], 2); } //cout<<"检测完毕!共有"<<cvSeqFace->total<<"个人脸。"<<endl; cvReleaseMemStorage(&cvMstorage); } pHaarCascade = (CvHaarClassifierCascade*)cvLoad(cascadeFileName1); if(pHaarCascade != NULL) { //多种颜色识别多张脸 CvScalar faceCircleColors[] = { {{0,255,255}},{{255,128,255}},{{128,255,0}} }; CvMemStorage *cvMstorage = cvCreateMemStorage(0); cvClearMemStorage(cvMstorage); //DWORD dwTimeBegin, dwTimeEnd; //dwTimeBegin = GetTickCount(); CvSeq *cvSeqFace = cvHaarDetectObjects(grayImage, pHaarCascade, cvMstorage); //dwTimeEnd = GetTickCount(); //cout<<"识别用时:"<<dwTimeEnd - dwTimeBegin<<endl; for(int i = 0; i < cvSeqFace->total; i++) { CvRect *r = (CvRect*)cvGetSeqElem(cvSeqFace, i); CvPoint center; int radius; center.x = cvRound(r->x + r->width * 0.5); center.y = cvRound(r->y + r->height * 0.5); radius = cvRound((r->width + r->height)*0.25); cvCircle( srcImage, center, radius, faceCircleColors[3], 2); } //cout<<"检测完毕!共有"<<cvSeqFace->total<<"个眼睛。"<<endl; cvReleaseMemStorage(&cvMstorage); } cvShowImage(srcWindowsName, srcImage); cvReleaseImage(&grayImage); char c = cvWaitKey(22); if(c == 27) break; } //等待 //cvWaitKey(); //销毁窗口,释放资源 cvDestroyWindow(srcWindowsName); cvReleaseImage(&srcImage); return 0; }