人脸识别实现,这里直接提供了模型文件,.xml文件,进行直接匹配就行,难度相对较小。
主要运用的函数是faceCascade.detectMultiScale(img,faces,scaleFactor=1.1,minNeighbors=10);
scaleFactor:
因为图像的像素有大有小,图像中的人脸因为远近不同也会有大有小,
所以需要通过scaleFactor参数设置一个缩小的比例,对图像进行逐步缩小来检测,
这个参数设置的越大,计算速度越快,但可能会错过了某个大小的人脸
minNeighbors:
只有其“邻居”大于等于这个值的结果才认为是正确结果。
设置scaleFactor=1.1,minNeighbors=10,出现脸部识别不全的结果图:
设置scaleFactor=1.1,minNeighbors=3,解决问题:
代码实现:
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/objdetect.hpp>
#include <iostream>
Face Detection ///
using namespace std;
using namespace cv;
void main() {
string path = "D:\\visual studio\\c++ opencv\\image information\\R.jpg";
Mat img = imread(path);
CascadeClassifier faceCascade;
faceCascade.load("Learn-OpenCV-cpp-in-4-Hours-main\\Resources\\haarcascade_frontalface_default.xml");
if (faceCascade.empty())
{
cout << "XML file not loadeed" << endl;
}
vector<Rect>faces;
faceCascade.detectMultiScale(img,faces,1.1,3);
/*1.1scaleFactor
因为图像的像素有大有小,图像中的人脸因为远近不同也会有大有小,
所以需要通过scaleFactor参数设置一个缩小的比例,对图像进行逐步缩小来检测,
这个参数设置的越大,计算速度越快,但可能会错过了某个大小的人脸
minNeighbors参数10,只有其“邻居”大于等于这个值的结果才认为是正确结果。
*/
/*1.1,10
而每次缩小1.1倍,所以导致识别出的结果较少。
下面我让scaleFactor=1.1,minNeighbors=3,
你会发现,当scaleFactor=1.03时,每个人脸被识别的次数都比上一组测试要多
,因为每次缩小的比例小,迭代的次数就多了。看一下输出结果
*/
for (int i = 0;i < faces.size(); i++)
{
rectangle(img, faces[i].tl(), faces[i].br(), Scalar(255, 0, 255), 3);
}
namedWindow("Image", WINDOW_NORMAL);
imshow("Image",img);
waitKey(0);
}