如何使用 C++ 在 OpenCV 中检测静态图片中的脸部?

opencvc++server side programmingprogramming更新于 2025/5/14 8:37:17

我们从图像中检测脸部。为了检测脸部,我们使用了"detectMultiScale()"函数。

此函数的实际格式是 −

语法

detectMultiScale(source matrix, vector, searchScaleFactor, minNeighbours, flags, minfeatureSize)

通过更改函数参数,我们可以控制"detect.MultiSpace()"函数。此函数采用以下参数。

源矩阵

这是将检测脸部的矩阵。在这种情况下,它将是保存视频帧的矩阵。

向量

"detect.MultiScale()"函数将是矩形类型的向量。矩形是 OpenCV 中的向量,我们必须将其定义为向量。

searchScaleFactor

搜索比例因子决定了函数将寻找多少个不同大小的脸部。我们通常使用 1.1。如有必要,我们可以使用 1.2 来加快检测系统的速度。但是,在这种情况下,检测到脸部的频率不如使用 1.1 时那么高。

minNeighbours

此参数检测检测器的置信度。这意味着该函数显示检测器检测到脸部的信心程度。为了获得更好的可靠性,我们可以使用更高的数字,但这会减慢处理速度。为了加快处理速度但降低可靠性,我们可以使用较小的数字。我们通常使用 3 或 4 作为 minNeighbours。

flags

默认情况下,该函数将查找所有面部。如果我们使用"CASCADE_FIND_BIGGEST_OBJECT"作为标志的值,它将仅查找最大的面部。在这种情况下,系统执行速度更快。使用"CASCADE_SCALE_IMAGE",我们可以搜索多个面部。

minFeatureSize

minFeatureSize 确定面部的最小尺寸。如果我们想要检测远离相机的面部,那么我们应该使用较小的值。如果面部靠近相机,我们应该使用较大的值。我们使用 (20 x 20) 或 (30 x 30) 尺寸作为典型距离。在示例中,我们使用了detectMultiScale()函数作为

faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//

以下代码演示了如何在OpenCV中从静态图片中检测人脸。

示例

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
//此标头包含'rectangle()'函数的定义//
#include<opencv2/objdetect/objdetect.hpp>
//此头文件包含级联分类器的定义//
#include<string>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
   Mat image_with_humanface;//声明一个矩阵来加载包含人脸的图像//
   image_with_humanface = imread("friends.jpg");//加载包含人脸的图像//
   namedWindow("Face Detection");//声明一个窗口来显示结果//
   string training_classifier_location = "C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";//在字符串中定义 XML 训练分类器的位置//
   CascadeClassifier faceDetector;//声明一个名为"face detector"的 CascadeClassifier 类的对象//
   faceDetector.load(trained_classifier_location);//在对象中加载 XML 训练分类器//
   vector<Rect>faces;//声明一个名为 faces 的矩形向量//
   vector<Rect>boundary;//声明一个名为 rectangle 的矩形向量//
   faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//检测"image_with_humanfaces"矩阵中的人脸//
   for (size_t i = 0; i < faces.size(); i++){ //循环在人脸周围绘制矩形//
      Mat faceROI = image_with_humanface(faces[i]);//将人脸存储在矩阵中//
      int x = faces[i].x;//获取人脸矩形起点的初始行值//
      int y = faces[i].y;//获取人脸矩形起点的初始列值//
      int h = y + faces[i].height;//计算矩形的高度//
      int w = x + faces[i].width;//计算矩形的宽度//
      rectangle(image_with_humanface, Point(x, y), Point(w, h), Scalar(255, 0, 255), 2, 8, 0);//使用人脸周围绘制矩形//
   }
    imshow("Face Detection", image_with_humanface);//显示检测到的人脸//
   waitKey(0);//等待按键来终止程序//
   return 0;
}

输出


相关文章