faceLandmarks.cpp
1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "faceLandmarks.h"
#include <stdio.h>
vector<vector<float>> FaceLandmarks::detect_landmarks(string image_path){
cv::Mat image=cv::imread(image_path);
float w_r=image.cols/input_size[0];
float h_r=image.rows/input_size[1];
cv::Mat blob = cv::dnn::blobFromImage(image,1.0,Size(input_size[0],input_size[1])); // 由图片加载数据 这里还可以进行缩放、归一化等预处理
net.setInput(blob); // 设置模型输入
std::vector<cv::Mat> netOutputImg;
net.forward(netOutputImg,net.getUnconnectedOutLayersNames()); // 推理出结果
cv::Mat predict_landmarks = netOutputImg[0].reshape(1,106);
vector<vector<float>> result_landmarks;
for(int i=0;i<predict_landmarks.rows;++i){
// cout<<predict_landmarks.at<float>(i,0)<<" "<<predict_landmarks.at<float>(i,1)<<endl;
vector<float> tmp_landm={predict_landmarks.at<float>(i,0)*w_r,predict_landmarks.at<float>(i,1)*h_r};
result_landmarks.push_back(tmp_landm);
}
return result_landmarks;
}
vector<vector<float>> FaceLandmarks::detect_image_landmarks(cv::Mat image){
float w_r=image.cols/input_size[0];
float h_r=image.rows/input_size[1];
cv::Mat blob = cv::dnn::blobFromImage(image,1.0,Size(input_size[0],input_size[1])); // 由图片加载数据 这里还可以进行缩放、归一化等预处理
net.setInput(blob); // 设置模型输入
std::vector<cv::Mat> netOutputImg;
net.forward(netOutputImg,net.getUnconnectedOutLayersNames()); // 推理出结果
cv::Mat predict_landmarks = netOutputImg[0].reshape(1,106);
vector<vector<float>> result_landmarks;
for(int i=0;i<predict_landmarks.rows;++i){
// cout<<predict_landmarks.at<float>(i,0)<<" "<<predict_landmarks.at<float>(i,1)<<endl;
vector<float> tmp_landm={predict_landmarks.at<float>(i,0)*w_r,predict_landmarks.at<float>(i,1)*h_r};
result_landmarks.push_back(tmp_landm);
}
return result_landmarks;
}