Files
DeepCamFaceSDK2.0/TEST/tets_centerface/tets_centerface.cpp
2024-12-13 23:33:37 +08:00

175 lines
4.3 KiB
C++

// tets_centerface.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Inc/CenterFaceMnn.h"
#include "Inc/TimeCount.h"
#include "Inc/LivenessRGB.h"
#include "Inc/FaceQuality.h"
#include "Inc/MobileFaceFeatureDnn.h"
#include "Inc/MobileFaceFeatureMnn.h"
float deepcam_face_compare2(std::vector<float> &feature1, std::vector<float> &feature2)
{
USE_TIME t("deepcam_face_compare => ");
if (feature1.size() < 1 || feature1.size() != feature2.size())
{
return 0;
}
int size = feature1.size();
float tmp0 = 0, tmp1 = 0, tmp2 = 0;
for (int i = 0; i < size; i++)
{
tmp0 += feature1[i] * feature2[i];
tmp1 += feature1[i] * feature1[i];
tmp2 += feature2[i] * feature2[i];
}
return (float(tmp0 / (sqrt(tmp1)* sqrt(tmp2))));
}
float deepcam_face_compare(float* feature1, float* feature2)
{
USE_TIME t("deepcam_face_compare => ");
float tmp0 = 0, tmp1 = 0, tmp2 = 0;
for (int i = 0; i < 512; i++)
{
tmp0 += feature1[i] * feature2[i];
tmp1 += feature1[i] * feature1[i];
tmp2 += feature2[i] * feature2[i];
}
float score = (float(tmp0 / (sqrt(tmp1)* sqrt(tmp2))));
//return score;
//拉高分数
float max_score = log10f(1.01);
float min_score = log10f(0.02);
float ret, temp;
if (score <= 0) {
temp = fabs(score);
if (temp > 0.3) {
ret = 0.0001;
}
else {
ret = temp;
}
}
else {
temp = log10f(score + 0.01);
ret = fabsf(temp - min_score) / (max_score - min_score);
}
return ret;
}
void GetImgFeature(float* feature)
{
cv::Mat img;
img = cv::imread("F:/2.jpg");
cv::imshow("frame2", img);
std::vector<FaceInfo> faces;
CenterFaceMnn::GetInstance()->Detect(img, faces);
//std::vector<float> feature;
if (faces.size() > 0)
{
//std::vector<float> landmark;
//landmark.insert(landmark.end(), faces[0].landmarks, faces[0].landmarks + sizeof(faces[0].landmarks) / sizeof(float));
//MobileFaceFeatureDnn::GetInstance()->GetFaceFeature(img, faces[0].landmarks, feature);
MobileFaceFeatureMnn::GetInstance()->GetFaceFeature(img, faces[0].landmarks, feature);
}
}
int main()
{
//float ff1[512] = { 0.f };
// GetImgFeature(ff1);
cv::VideoCapture camera1(0);
//if (!camera1.isOpened())
// return 1;
while (true)
{
cv::Mat img = cv::imread("F:/1.jpg");;
//camera1 >> img;
std::vector<FaceInfo> faces;
{
//USE_TIME T("CenterFaceMnn => ");
CenterFaceMnn::GetInstance()->Detect(img, faces);
}
if (faces.size() < 1)
{
continue;
}
for (auto& face : faces)
{
float score = 0;
{
{
USE_TIME T("LivenessDetect => ");
score = LivenessRGB::GetInstance()->LivenessDetect(img, face.landmarks);
}
std::cout << "LivenessDetect score ==> " << score << std::endl;
/* std::vector<float> landmark;
landmark.insert(landmark.end(), face.landmarks, face.landmarks + sizeof(face.landmarks) / sizeof(float));*/
//std::vector<float> feature;
float feature[512] = { 0 };
float feature2[512] = { 0 };
{
USE_TIME t("GetFaceFeature => ");
MobileFaceFeatureMnn::GetInstance()->GetFaceFeature(img, face.landmarks, feature);
//MobileFaceFeatureDnn::GetInstance()->GetFaceFeature(img, face.landmarks, feature);
GetImgFeature(feature2);
}
std::cout << "cmp ================> " << deepcam_face_compare(feature, feature2) << std::endl;
for (int i = 0; i < 5; i++)
{
cv::circle(img, cv::Point(face.landmarks[i * 2], face.landmarks[i * 2 + 1]), 2, cv::Scalar(0,0,255));
}
}
//std::cout << "score ==> " << score << std::endl;
auto color = cv::Scalar(0, 0,255);
if (score > 0.7)
{
color = cv::Scalar(0, 255, 0);
}
int qua = 0;
{
//USE_TIME t("FaceQuality ");
qua = FaceQuality::GetInstance()->DetectQuality(img, cv::Rect(cv::Point(face.x1, face.y1), cv::Point(face.x2, face.y2)));
cv::Mat pose;
FaceQuality::GetInstance()->DetectPose(img, cv::Rect(cv::Point(face.x1, face.y1), cv::Point(face.x2, face.y2)), pose);
}
//std::cout << "FaceQua => " << qua << std::endl;
cv::putText(img, std::to_string(qua), cv::Point(10, 40), 0, 1, color);
cv::rectangle(img, cv::Rect(face.x1, face.y1, face.GetWidth(), face.GetHeight()), color, 1);
for (int i = 0; i < 5; i++)
{
cv::circle(img, cv::Point(face.landmarks[i*2], face.landmarks[i * 2 + 1]), 2, color);
}
cv::imshow("frame", img);
cv::waitKey(1);
break;
}
cv::imshow("img", img);
cv::waitKey(1);
}
return 0;
}