如何使用 C++ 在 OpenCV 中裁剪检测到的脸部?

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

我们将了解如何在 OpenCV 中裁剪检测到的脸部。要裁剪检测到的脸部,我们需要多个矩阵。最合适的方法是使用图像数组。在这个程序中使用以下两行,我们声明了两个图像矩阵 −

  • Mat cropped_faces[4];
  • Mat faceROI[4];

第一个矩阵用于存储裁剪后的图像,第二个矩阵用于定义感兴趣的区域。在检测过程中,首先,程序定位人脸并将其存储在向量中。在我们的程序中,向量的名称是"faces"向量可以包含多个元素。

使用以下两行,我们识别向量并确定它们在图像中的位置,最后在"faceROI[i]"矩阵中裁剪面部区域。

  • faceROI[]=image_with_humanface(faces[i]);
  • cropped_faces[i]=faceROI[i];

第一行在名为"image_with_humanface"的图像上找到包含面部的向量,然后裁剪并将其存储到名为"faceROI[i]"的矩阵中。在第二行中,裁剪后的图像被传递到另一个矩阵数组。该矩阵数组已用于显示裁剪后的图像。

以下程序裁剪检测到的面部并将其显示在单独的窗口中。

示例

#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;//声明一个矩阵,用于加载包含人脸的图像//
   Mat cropped_faces[3];//声明一个由 4 个元素组成的矩阵数组,用于显示裁剪后的脸部//
   Mat faceROI[3];//声明一个由 4 个元素组成的矩阵数组,用于保存裁剪后的脸部//
   image_with_humanface = imread("friends3.jpg");//加载包含人脸的图像//
   namedWindow("Face1");//声明一个窗口来显示第一个裁剪后的脸部//
   namedWindow("Face2");//声明一个窗口来显示第二个裁剪后的脸部//
   namedWindow("Face3");//声明一个窗口来显示第三个裁剪后的脸部//  
   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++){ //循环在人脸周围绘制矩形//
      faceROI[i] = image_with_humanface(faces[i]);
      cropped_faces[i] = faceROI[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("Face1", cropped_faces[0]);//显示第一个裁剪后的脸部//
   imshow("Face2", cropped_faces[1]);//显示第二个裁剪后的脸部//
   imshow("Face3", cropped_faces[2]);//显示第三个裁剪后的脸部//
   waitKey(0);//To wait for a keystroke to terminate the program
   return 0;
}

输出


相关文章