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;
}


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值