C++ OpenCV【人脸识别&人眼识别】

         此文章仅对人脸位置进行检测,使用haar级联的方法[OpenCV自带]

#include 
#include 
#include 
#include 
using namespace std;
using namespace cv;

//定义7种颜色,用于标记人脸
Scalar colors[] =
{
	//红橙黄绿青蓝紫【RGB】
	CV_RGB(255, 0, 0),
	CV_RGB(255, 97, 0),
	CV_RGB(255, 255, 0),
	CV_RGB(0, 255, 0),
	CV_RGB(0, 255, 255),
	CV_RGB(0, 0, 255),
	CV_RGB(160, 32, 240)
};

int main()
{
	//读取训练器 haar
	CascadeClassifier classifier_face;
	string haarfileFace = "D:\\Library\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";//【[opencv安装地址]\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml】
	CascadeClassifier classifier_eye;
	string haarfileEye = "D:\\Library\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml";

	if (!classifier_face.load(haarfileFace))//加载文件
	{
		cout << "coulud not load face image..." << endl;
		return -1;
	}
	if (!classifier_eye.load(haarfileEye))
	{
		cout << "coulud not load eye image..." << endl;
		return -1;
	}

	Mat srcImage, grayImage, grayImage1, dstImage;
	srcImage = imread("rg.png");//读取图片
	/*imshow("原图", srcImage);
	waitKey(0);*/
	dstImage = srcImage.clone();//复制一张图片
	cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);//生成灰度图 提高检测效率

	//检测人脸
	vector faceRect;
	classifier_face.detectMultiScale(grayImage, faceRect, 1.1, 3, 0);//调用分类器对象
	cout << "检测到人脸个数:" << faceRect.size() << endl;
	
	if (faceRect.size())
	{
		for (int i = 0; i < faceRect.size(); i++)
		{
			cv::rectangle(dstImage, faceRect[i], Scalar(0, 0, 255), 2);//标记--在脸部画矩形
			//Point center;
			//int radius;
			//center.x = cvRound((faceRect[i].x + faceRect[i].width * 0.5));
			//center.y = cvRound((faceRect[i].y + faceRect[i].height * 0.5));
			//radius = cvRound((faceRect[i].width + faceRect[i].height) * 0.25);
			//circle(dstImage, center, radius, colors[i % 7], 3);//标记--在脸部画圆(画矩形和画圆二选一)
			
			//在人脸图像中检测人眼和嘴巴
			Mat faceimg = dstImage(faceRect[i]);//获取人脸矩形图像
			/*imshow("faceimg", faceimg);
			waitKey(0);*/
			cvtColor(faceimg, grayImage1, COLOR_BGR2GRAY);
			//检测眼睛和嘴巴
			vector eyeRect;
			classifier_eye.detectMultiScale(grayImage1, eyeRect, 1.1, 3, 0);
			if (eyeRect.size())
			{
				for (int j = 0; j < eyeRect.size(); j++)
				{
					标记--在眼部画矩形
					//Rect tmpRect;
					//tmpRect.x = faceRect[i].x + eyeRect[j].x;
					//tmpRect.y = faceRect[i].y + eyeRect[j].y;
					//tmpRect.width = eyeRect[j].width;
					//tmpRect.height = eyeRect[j].height;
					//cv::rectangle(dstImage, tmpRect, Scalar(255, 0, 0));
					
					//标记--在眼部画圆(画矩形和画圆二选一)
					Point centerEye;
					int radiusEye;
					centerEye.x = cvRound((faceRect[i].x + eyeRect[j].x + eyeRect[j].width * 0.5));
					centerEye.y = cvRound((faceRect[i].y + eyeRect[j].y + eyeRect[j].height * 0.5));
					radiusEye = cvRound((eyeRect[j].width + eyeRect[j].height) * 0.25);
					circle(dstImage, centerEye, radiusEye, colors[i % 7], 2);
				}
			}
		}
	}
	imwrite("rgDetect.png", dstImage);
	//显示最终检测结果
	imshow("【人脸识别detectMultiScale】", dstImage);
	waitKey(0);

	system("pause");
	return 0;
}

        找茬:火箭少女少了一人

        Haar级联预训练模型

C++ OpenCV【人脸识别&人眼识别】_第1张图片 

 

你可能感兴趣的:(OpenCV学习,opencv,计算机视觉,图像处理,c++)