Opencv 人脸检测

detectMultiScale

opencv2中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)。

void detectMultiScale(
const Mat& image,
CV_OUT vector<Rect>& objects,
double scaleFactor = 1.1,
int minNeighbors = 3, 
int flags = 0,
Size minSize = Size(),
Size maxSize = Size()
);

  • image:表示的是要检测的输入图像
  • scaleFactor:为每一个图像尺度中的尺度参数,默认值为1.1。scaleFactor参数可以决定两个不同大小的窗口扫描之间有多大的跳跃,这个参数设置的大,则意味着计算会变快,但如果窗口错过了某个大小的人脸,则可能丢失物体。
  • minNeighbors:参数为每一个级联矩形应该保留的邻近个数,默认为3。minNeighbors控制着误检测,默认值为3表明至少有3次重叠检测,我们才认为人脸确实存。
  • flags:对于新的分类器没有用(但目前的haar分类器都是旧版的,CV_HAAR_DO_CANNY_PRUNING,这个值告诉分类器跳过平滑(无边缘区域)。利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域;CV_HAAR_SCALE_IMAGE,这个值告诉分类器不要缩放分类器。而是缩放图像(处理好内存和缓存的使用问题,这可以提高性能。)就是按比例正常检测;CV_HAAR_FIND_BIGGEST_OBJECTS,告诉分类器只返回最大的目标(这样返回的物体个数只可能是0或1)只检测最大的物,CV_HAAR_DO_ROUGH_SEARCH,他只可与CV_HAAR_FIND_BIGGEST_OBJECTS一起使用,这个标志告诉分类器在任何窗口,只要第一个候选者被发现则结束寻找(当然需要足够的相邻的区域来说明真正找到了。),只做初略检测.
  • minSize:为目标的最小尺寸
  • maxSize:为目标的最大尺寸

分类器

使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里,“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:即各文件夹里的文件。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。

实例

#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>        // 核心组件
#include<opencv2/objdetect/objdetect.hpp> 
#include<opencv2/highgui/highgui.hpp>  // GUI
#include<opencv2/imgproc/imgproc.hpp>  // 图像处理
using namespace cv;
using namespace std;
CascadeClassifier faceCascade;
//训练文件路径

//Note:路径需要用双右下划线,即"\\"
//string xmlPath = "D:\\xzw\\git\\OPENCV_SDK\\OPENCV_SDK\\opencv3.4.1\\data\\haarcascades\\haarcascade_frontalface_alt2.xml";
string xmlPath = "D:\\xzw\\git\\OPENCV_SDK\\OPENCV_SDK\\opencv3.4.1\\data\\haarcascades_cuda\\haarcascade_frontalface_alt2.xml";
int main()
{
	faceCascade.load(xmlPath);
	if (!faceCascade.load(xmlPath))   //加载训练文件  
	{
		cout << "不能加载指定的xml文件" << endl;
		return -1;
	}
	VideoCapture capture;
	capture.open(0);//打开摄像头 注意这个地方的参数
	if (!capture.isOpened()) {
		cout << "open camera failed." << endl;
		return -1;
	}
	Mat img, imgGray;
	vector<Rect>faces;
	//cout << 111 << endl;
	while (1) {
		capture >> img;//读取图像至img
		if (img.empty()) {
			continue;
		}
		if (img.channels() == 3) {
			cvtColor(img, imgGray, CV_RGB2GRAY);
		}
		else {
			imgGray = img;
		}
		faceCascade.detectMultiScale(imgGray, faces, 1.5, 3, 0, Size(0, 0));//检测人脸
		if (faces.size() > 0)
		{
			for (int i = 0; i < faces.size(); i++)
			{
				rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 255, 0), 1, 8);
			}
		}
		imshow("CamerFace", img); // 显示
		if (waitKey(1) > 0)		// delay ms 等待按键退出
		{
			break;
		}
	}
	return 0;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×