此应用程序允许您检测视频中已检测到的人脸的关键点。该应用程序首先检测当前视频帧中的人脸,然后找到它们的面部关键点。您只需传入视频作为输入。
// 运行示例的命令
./sampleDetectLandmarks -file=trained_model.dat -face_cascade=lbpcascadefrontalface.xml -video=/path_to_video/video.avi
命令参数描述
* model_filename f : (必填) 存储要加载的训练模型的二进制文件的路径 [示例 - /data/file.dat]
- video v : (必填) 需要检测人脸关键点的视频路径。[示例 - /data/video.avi]
- face_cascade c : (必填) 您要使用的人脸级联 xml 文件的路径,用作人脸检测器。
代码理解
本教程将解释人脸关键点检测的示例代码。直接跳转到代码
c++
CascadeClassifier face_cascade;
bool myDetector( InputArray image, OutputArray ROIs );
bool myDetector( InputArray image, OutputArray ROIs ){
Mat gray;
std::vector<Rect> faces;
if(image.channels()>1){
cvtColor(image.getMat(),gray,COLOR_BGR2GRAY);
}
else{
gray = image.getMat().clone();
}
equalizeHist( gray, gray );
face_cascade.detectMultiScale( gray, faces, 1.1, 3,0, Size(30, 30) );
Mat(faces).copyTo(ROIs);
return true;
}
facemark API 提供了让用户使用他们自己的人脸检测器进行人脸关键点检测的功能。以上代码创建了一个示例人脸检测器。上述函数将传递给 facemark API 中的函数指针。
c++
VideoCapture cap(video);
if(!cap.isOpened()){
cerr<<"无法加载视频。请提供正确的路径"<<endl;
return -1;
}
以上代码创建一个视频捕获对象,然后加载视频。如果视频未正确加载,则会提示用户,否则代码继续执行。
c++
Mat img = imread(image);
face_cascade.load(cascade_name);
FacemarkKazemi::Params params;
params.configfile = configfile_name;
Ptr<Facemark> facemark = FacemarkKazemi::create(params);
facemark->setFaceDetector(myDetector);
以上代码创建人脸关键点检测类的指针。上面创建的人脸检测器必须作为函数指针传递给创建用于检测人脸的 facemark 指针。
c++
vector<Rect> faces;
vector< vector<Point2f> > shapes;
Mat img;
以上代码创建一个向量来存储检测到的人脸,以及一个向量来存储当前帧中检测到的每个人脸的形状。
c++
while(1){
faces.clear();
shapes.clear();
cap>>img;
resize(img,img,Size(600,600),0,0,INTER_LINEAR_EXACT);
facemark->getFaces(img,faces);
if(faces.size()==0){
cout<<"此帧中未找到人脸"<<endl;
}
else{
for( size_t i = 0; i < faces.size(); i++ )
{
cv::rectangle(img,faces[i],Scalar( 255, 0, 0 ));
}
if(facemark->fit(img,faces,shapes))
{
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],3,cv::Scalar(0,0,255),FILLED);
}
}
}
namedWindow("Detected_shape");
imshow("Detected_shape",img);
if(waitKey(1) >= 0) break;
}
以上代码然后读取每一帧并检测人脸以及与检测到的每个形状相对应的人脸关键点。然后它显示当前帧。
运行以上代码后,您将获得类似这样的结果
示例视频