此文章仅对人脸位置进行检测,使用haar级联的方法[OpenCV自带]
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
#include <cstdio>
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()
{//读取训练器 haarCascadeClassifier 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<Rect> 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<Rect> 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级联预训练模型
















