OpenCV对视频中的人脸和人眼检测(图片也可以)
提供一个有用的链接: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;}