配置好OpenCV环境来测试一下小程序。
- 打开摄像头进行人脸检测
#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; }
效果就不展示了。
- 对图片中人脸进行检测
//头文件 #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>& 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”特征主要用于人脸识别。