我们都知道OpenCV是一个开源的视觉库,可以完成很多图像处理的工作,这次我要加入的功能是人脸检测。从摄像头获取的数据中,再每一帧中寻找人脸,并且框处人脸的范围。注意:这里的人脸检测并不是分辨不同的人脸,而是检测图像中是否存在人脸。
首先我们要采集摄像头的每一帧数据,这段代码在第一章中就已经完成,接下来就是人脸检测的环节。
我才用了haar级联算子进行人脸检测,这也是OpenCV中最常用的一种方法,首先我们要声明一个级联分类器
cv::CascadeClassifier faceCascade;
有了级联分类器之后,我们还需要加载级联文件,这个文件在源码包的data文件夹下,可以看到有一个haarcascades命名的文件夹
可以看到,这个文件夹里面的文件都是使用haar级联算子完成的,包括人脸检测,人眼、身体,笑脸等等,这些文件都是官方训练好的文件,可以直接使用。当然如果你需要其他的特征的检测,也可以自己进行训练。
这一次我们使用的文件是haarcascade_frontalface_alt2.xml
将文件导入分类器
faceCascadeName = "/home/project/opencv/test/7/opencv_7/haarcascades/haarcascade_frontalface_alt2.xml";
faceCascade.load(faceCascadeName.toStdString()
人脸检测部分的代码如下
cv::Mat MainWidget::faceCasePic(cv::Mat img)
{
using namespace cv;
Mat frame, frameGray;
frame = img;
//缩放系数
float scalingFactor = 0.75;
std::vector<Rect> faces;
//改变大小
cv::resize(frame, frame, Size(), scalingFactor, scalingFactor, INTER_AREA);
//转换灰度
cvtColor(frame, frameGray, CV_BGR2GRAY);
//均衡直方图
equalizeHist(frameGray, frameGray);
//检测脸部
faceCascade.detectMultiScale(frameGray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30,30));
//框出人脸
for(uint i=0; i < faces.size(); i++)
{
Rect feceRect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
rectangle(frame, feceRect, Scalar(0,0,255), 2, LINE_AA);
}
return frame;
}
传入需要检测的图像,返回框出人脸的图像,如果没有检测到人脸,则返回原图像。
完整的源码放在github上,有需要可以自行下载。 代码名称为190526.zip
https://github.com/ljy980330/opencv_face_sys
有任何问题可以在下面给我留言!大家一起学习!