OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配项
图像中的面部标志检测

此应用程序让您可以检测图像中被检测到的人脸的标志。您可以检测图像中找到的所有人脸的标志,并将其进一步用于各种应用程序,如换脸、人脸平均等。OpenCV 中现已提供此功能。

// 运行样本所需的命令
./sampleDetectLandmarks -file=trained_model.dat -face_cascade=lbpcascadefrontalface.xml -image=/path_to_image/image.jpg

命令参数的说明 {tutorial_face_training_parameters}

‍* model_filename f: 存储要加载的已训练模型的二进制文件的路径(必需)[示例 - /data/file.dat]

  • image i:必须在其中检测面部标志的图像路径。(必需)[示例 - /data/image.jpg]
  • face_cascade c:您想用作人脸检测器的面部级联 XML 文件的路径。(必需)

理解代码

本教程将解释用于人脸标志检测的示例代码。直接跳转到代码

c++
CascadeClassifier face_cascade;
face_cascade.load(cascade_name);
Mat img = imread(image);
Ptr<Facemark> facemark = createFacemarkKazemi());
facemark->loadModel(filename);
cout<<"Loaded model"<<endl;

以上代码创建一个 CascadeClassifier 来检测人脸区域,并创建一个面部标志检测类的实例。我们需要加载一个用于面部标志检测的预训练模型以及用于人脸检测的级联文件。它还加载必须在其中检测标志的图像。

c++
vector<Rect> faces;
resize(img,img,Size(460,460),0,0,INTER_LINEAR_EXACT);
Mat gray;
std::vector<Rect> faces;
if(img.channels()>1){
cvtColor(img.getMat(),gray,COLOR_BGR2GRAY);
}
else{
gray = img.getMat().clone();
}
equalizeHist( gray, gray );
face_cascade.detectMultiScale( gray, faces, 1.1, 3,0, Size(30, 30) );

在进行一些预处理后,我们首先必须检测可能的人脸区域(它们将存储在 vector<Rect>。此外,将图像缩小到较小尺寸,因为处理速度在小图像中较快。

c++
vector< vector<Point2f> > shapes;
if (facemark->fit(img,faces,shapes))
{
for ( size_t i = 0; i < faces.size(); i++ )
{
cv::rectangle(img,faces[i],Scalar( 255, 0, 0 ));
}
for (unsigned long i=0;i<faces.size();i++){
for(unsigned long k=0;k<shapes[i].size();k++)
cv::circle(img,shapes[i][k],5,cv::Scalar(0,0,255),FILLED);
}
namedWindow("Detected_shape");
imshow("Detected_shape",img);
waitKey(0);
}

然后,它创建一个向量的向量的形状来存储对每张检测出的人脸进行存储。以上代码调用函数 fit 来获得图像中所有检测出人脸的形状,然后再绘制与人脸边界相切的矩形,并标记所需位置。

检测结果