此应用程序允许您检测图像中检测到的人脸的Landmark。您可以检测图像中找到的所有人脸的Landmark,并在各种应用程序(如换脸、人脸平均等)中进一步使用它们。此功能现在在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 : (必需) 要在其中检测人脸Landmark的图像的路径。[示例 - /data/image.jpg]
- face_cascade c : (必需) 您想要用作人脸检测器的人脸级联 XML 文件的路径。
代码理解
本教程将解释人脸Landmark检测的示例代码。直接跳到代码
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 来检测人脸区域,以及一个人脸Landmark检测类的实例。我们需要加载人脸Landmark检测的预训练模型,以及人脸检测的级联文件。它还加载了要在其中检测Landmark的图像。
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 函数来获取图像中所有检测到的人脸的形状,然后绘制边界人脸的矩形并标记所需的Landmark。
检测结果