如何使用 C++ 在 OpenCV 中检测最大的人脸?
opencvc++server side programmingprogramming更新于 2025/5/14 7:52:17
我们将学习如何仅检测最大的人脸。本主题与上一个主题相同。唯一的区别是我们使用了额外的"Rect"结构和"for 循环"来检测最大的人脸。
此函数的实际格式 −
Mat faceROI = image_with_humanface(maxRect)
maxRect 具有图像上最大人脸的面积和位置信息。上面的行是在图像上最大人脸所在的相同位置裁剪存储在 maxRect 中的相同区域并存储在"faceROI"中矩阵。
以下程序从静态图片中检测最大的人脸 −
示例
#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("person.jpg");//加载包含人脸的图像// namedWindow("Face Detection");//声明一个窗口来显示结果// string trained_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 的矩形向量// faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_FIND_BIGGEST_OBJECT);//检测 'image_with_humanfaces' 矩阵中的人脸// Rect maxRect;//声明一个矩形。默认情况下,大小为零像素// for (int i = 0; i < faces.size(); i++){ //启动 for 循环以检测最大的人脸// if (faces[i].area() > maxRect.area()){ //计算脸部面积并与maxRect的面积进行比较// maxRect = faces[i];//根据最大脸部的大小将最大矩形存储在MaxRect中// } } for (size_t i = 0; i < faces.size(); i++){ //循环在脸部周围绘制矩形// Mat faceROI = image_with_humanface(maxRect);//将脸部存储在大小等于maxRect的矩阵中// int x = maxRect.x;//获取人脸矩形起点的初始行值// int y = maxRect.y;//获取人脸矩形起点的初始列值// int h = y + maxRect.height;//计算矩形的高度// int w = x + maxRect.width;//计算矩形的宽度// rectangle(image_with_humanface, Point(x, y), Point(w, h), Scalar(255, 0, 255), 3, 6, 0);//使用最大值绘制矩形// } imshow("Face Detection",image_with_humanface);//显示最大人脸face// waitKey(0);//等待按键终止程序 return 0; }