如何使用 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; }