OpenCV小实例——人脸识别(实现多脸识别)

 


这几天太热了,希望可以下场降温雨!

上次的人脸识别,每次只能识别一个人脸,这次的可以识别多个人脸。

代码如何:

 

#include <opencv2/opencv.hpp>  
#include <cstdio>  
#include <cstdlib>  
#include <Windows.h>  
using namespace std;
int main()
{
	// 加载Haar特征检测分类器  
	// haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径  
	const char *pstrCascadeFileName = "haarcascade_frontalface_alt.xml";
	CvHaarClassifierCascade *pHaarCascade = NULL;
	pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);

	// 载入图像  
	//cv::VideoCapture camera(0);//打开摄像头
	cv::VideoCapture camera("少女时代 - OH! - 日文版.avi");//载入视频
	//const char *pstrImageName = "style4.jpg";
	//IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
	while (1)
	{
		cv::Mat frame;
		camera >> frame;
		IplImage  *pSrcImage;
		pSrcImage = &IplImage(frame);
		IplImage  *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
		cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);

		// 人脸识别与标记  
		if (pHaarCascade != NULL)
		{
			CvScalar FaceCirclecolors[] =
			{
				(0, 255, 255),
				(0, 255, 0),
				(255, 128, 0),
				(255, 255, 0),
				(255, 0, 0),
				(255, 0, 255),
				(0, 0, 255),
				(0, 128, 255)
			};

			CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
			cvClearMemStorage(pcvMStorage);
			// 识别  
			DWORD dwTimeBegin, dwTimeEnd;
			dwTimeBegin = GetTickCount();
			CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
			dwTimeEnd = GetTickCount();

			printf("人脸个数: %d   识别用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);

			// 标记  
			for (int i = 0; i < pcvSeqFaces->total; i++)
			{
				CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, 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(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);
			}
			cvReleaseMemStorage(&pcvMStorage);
		}

		const char *pstrWindowsTitle = "人脸识别";
		cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
		cvShowImage(pstrWindowsTitle, pSrcImage);
		if (cvWaitKey(30) >= 0)  break;//延时30ms
		//cvWaitKey(0);
	}
	//cvDestroyWindow(pstrWindowsTitle);
	//cvReleaseImage(&pSrcImage);
	//cvReleaseImage(&pGrayImage);
	return 0;
}

结果截图:

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值