faceLandmarks.cpp 1.92 KB
#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;
}