此应用程序允许您检测图像中已检测到的人脸的关键点。您可以检测图像中找到的所有人脸的关键点,并在各种应用程序中进一步使用它们,例如换脸、人脸平均等。此功能现已在 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 函数来获取图像中所有检测到的人脸的形状,然后绘制包围人脸的矩形并标记所需的关键点。
检测结果