这份代码可以实现对摄像头的每一帧图片进行人脸和人眼的检测。
//人脸检测
#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;
}