此文章仅对人脸位置进行检测,使用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级联预训练模型