首先我们的人脸检测实验中需要两个训练好的文件放在我们主程序目录下,如图所示:
这是两个文件的链接
链接:https://pan.baidu.com/s/141rwGLrnPUV7S1WSPfV4kQ
提取码:paqd
在人脸检测中我们只需检测到人脸和眼睛部位
// A code block
var foo = 'bar';
图片中的人脸检测
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <windows.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat image, image_gray; //定义两个Mat变量,用于存储每一帧的图像
image = imread("8.png");
imshow("原图", image);
cvtColor(image, image_gray, CV_BGR2GRAY);//转为灰度图
equalizeHist(image_gray, image_gray);//直方图均衡化,增加对比度方便处理
CascadeClassifier eye_Classifier; //载入分类器
CascadeClassifier face_cascade; //载入分类器
if (!eye_Classifier.load("haarcascade_eye.xml")) //需要将xml文档放在自己指定的路径下
{
cout << "Load haarcascade_eye.xml failed!" << endl;
return 0;
}
if (!face_cascade.load("haarcascade_frontalface_alt.xml"))
{
cout << "Load haarcascade_frontalface_alt failed!" << endl;
return 0;
}
//vector 是个类模板 需要提供明确的模板实参 vector则是个确定的类 模板的实例化
vector<Rect> eyeRect;
vector<Rect> faceRect;
//检测关于眼睛部位位置
eye_Classifier.detectMultiScale(image_gray, eyeRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t eyeIdx = 0; eyeIdx < eyeRect.size(); eyeIdx++)
{
rectangle(image, eyeRect[eyeIdx], Scalar(0, 0, 255)); //用矩形画出检测到的位置
}
//检测关于脸部位置
face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faceRect.size(); i++)
{
rectangle(image, faceRect[i], Scalar(0, 0, 255)); //用矩形画出检测到的位置
}
imshow("人脸识别图", image); //显示当前帧
waitKey(0);
}
// A code block
var foo = 'bar';
摄像头中视频中的人脸检测:
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <windows.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat image, image_gray; //定义两个Mat变量,用于存储每一帧的图像
VideoCapture capture(0); //从摄像头读入视频
while (1) //循环每一帧
{
capture >> image; //读取当前帧
cvtColor(image, image_gray, CV_BGR2GRAY);//转为灰度图
equalizeHist(image_gray, image_gray);//直方图均衡化,增加对比度方便处理
CascadeClassifier eye_Classifier; //载入分类器
CascadeClassifier face_cascade; //载入分类器
if (!eye_Classifier.load("haarcascade_eye.xml")) //需要将xml文档放在自己指定的路径下
{
cout << "Load haarcascade_eye.xml failed!" << endl;
return 0;
}
if (!face_cascade.load("haarcascade_frontalface_alt.xml"))
{
cout << "Load haarcascade_frontalface_alt failed!" << endl;
return 0;
}
//vector 是个类模板 需要提供明确的模板实参 vector则是个确定的类 模板的实例化
vector<Rect> eyeRect;
vector<Rect> faceRect;
//检测关于眼睛部位位置
eye_Classifier.detectMultiScale(image_gray, eyeRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t eyeIdx = 0; eyeIdx < eyeRect.size(); eyeIdx++)
{
rectangle(image, eyeRect[eyeIdx], Scalar(0, 0, 255)); //用矩形画出检测到的位置
}
//检测关于脸部位置
face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faceRect.size(); i++)
{
rectangle(image, faceRect[i], Scalar(0, 0, 255)); //用矩形画出检测到的位置
}
imshow("人脸识别图", image); //显示当前帧
waitKey(10); //延时10ms,即每秒播放100帧图像
}
}