基于opencv自带的人脸检测模型,实现简单的人脸检测功能,可作为机器学习初学者练手使用。简单易学,具体的方法及代码如下。
1、运行结果
输入原图
输出结果
2、工程需要加载的opencv库如下:
3、用到的人脸检测器
4、具体实现代码
#include <opencv.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
#define MULTI_TARGET //控制切换检测目标数
int main()
{
CascadeClassifier faceDetector;
string faceCascadeFilename = "haarcascade_frontalface_default.xml";
faceDetector.load(faceCascadeFilename); //加载人脸检测器
if (faceDetector.empty())
{
cout<<"load faceDetector failed!"<<endl;
return -1;
}
Mat srcImg = imread("..\\srcImg.jpg");
if(srcImg.empty())
{
cout<<"read image failed!"<<endl;
return -1;
}
imshow("srcImg", srcImg);
Mat grayImg;
cvtColor(srcImg, grayImg, CV_RGB2GRAY); //转成灰度图
vector<Rect> detectionResults;
float searchScaleFactor = 1.1f;
int minNeighbors = 3;
Size minFeatureSize(25, 25);
#ifdef MULTI_TARGET
int flags = CASCADE_SCALE_IMAGE; //检测多个目标
#else
int flags = CASCADE_FIND_BIGGEST_OBJECT|CASCADE_DO_ROUGH_SEARCH; //只检测最大目标
#endif
faceDetector.detectMultiScale(grayImg, detectionResults, searchScaleFactor, minNeighbors, flags, minFeatureSize); //进行人脸检测
Mat dstImg = srcImg.clone();
Mat detectionRect;
for (int i = 0; i < detectionResults.size(); i++)
{
if (detectionResults[i].height > 0 && detectionResults[i].width > 0)
{
detectionRect = grayImg(detectionResults[i]);
rectangle(dstImg, detectionResults[i], CV_RGB(0, 255, 0), 2, 8, 0); //画检测框
}
}
imshow("dstImg", dstImg);
waitKey(0);
return 0;
}