其他分享
首页 > 其他分享> > OpenCV haarcascade_frontalface_alt2.xml人脸检测测试

OpenCV haarcascade_frontalface_alt2.xml人脸检测测试

作者:互联网

配置好OpenCV环境来测试一下小程序。

  1. 打开摄像头进行人脸检测
     
    #include<iostream>
    #include<opencv2/objdetect/objdetect.hpp>
    #include<opencv2/highgui/highgui.hpp>
    #include<opencv2/imgproc/imgproc.hpp>
    using namespace cv;
    
    //人脸检测的类
    CascadeClassifier faceCascade;
    
    int main()
    {
    
    	faceCascade.load("haarcascade_frontalface_alt2.xml");   //加载分类器,注意文件路径
    
    	VideoCapture cap;
    	cap.open(0);   //打开摄像头
    				   //cap.open("../data/test.avi");   //打开视频
    	
    	Mat img, imgGray;
    	vector<Rect> faces;
    	int c = 0;
    
    	if (!cap.isOpened())
    	{
    		return 1;
    	}
    
    	while (c!=27)//按Esc退出
    	{
    		cap >> img;
    		if (img.channels() == 3)
    		{
    			cvtColor(img, imgGray, CV_RGB2GRAY);
    		}
    		else
    		{
    			imgGray = img;
    		}
    
    		faceCascade.detectMultiScale(imgGray, faces, 1.2, 2, 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);    //框出人脸位置
    			}
    		}
    		namedWindow("Camera", 0);
    		imshow("Camera", img);
    		c = waitKey(4);//延迟4ms
    		//std::cout << c << std::endl;
    		//system("pause");
    	}
    	
    	return 0;
    }

    效果就不展示了。

  2. 对图片中人脸进行检测
    //头文件
    #include<opencv2/objdetect/objdetect.hpp>
    #include<opencv2/highgui/highgui.hpp>
    #include<opencv2/imgproc/imgproc.hpp>
    using namespace cv;
    
    
    //人脸检测的类
    CascadeClassifier faceCascade;
    
    int main()
    {
    	faceCascade.load("haarcascade_frontalface_alt2.xml");   //加载分类器,注意文件路径
    
    	Mat img = imread("D:\\Coder\\vs\\face3\\face3\\11.jpg",CV_LOAD_IMAGE_ANYCOLOR);
    	Mat imgGray;
    	std::vector<Rect> faces;
    
    	if (!img.data)
    	{
    		return 1;
    	}
    
    	if (img.channels() == 3)
    	{
    		cvtColor(img, imgGray, CV_RGB2GRAY);
    	}
    	else
    	{
    		imgGray = img;
    	}
    
    	faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 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("FacesOfPrettyGirl", img);
    
    	waitKey(0);
    	system("pause");
    	return 0;
    }

实现人脸检测主要依赖于detectMultiScale()函数,下面简单说一下函数参数的含义,先看函数原型:

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

参数的意义:

const Mat& image: 需要被检测的图像(灰度图)
vector<Rect>& objects: 保存被检测出的人脸位置坐标序列
double scaleFactor: 每次图片缩放的比例
int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸
int flags: 决定是缩放分类器来检测,还是缩放图像
Size(): 表示人脸的最大最小尺寸

 

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

 

标签:xml,haarcascade,imgGray,img,检测,frontalface,人脸,faces,include
来源: https://blog.csdn.net/u012785169/article/details/87917835