112 lines
2.4 KiB
C++
112 lines
2.4 KiB
C++
// FaceAlgorithmApi.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
|
|
//
|
|
|
|
#include <iostream>
|
|
#include "Inc/CenterFaceMnn.h"
|
|
#include "Inc/MobileFaceFeatureMnn.h"
|
|
#include "Inc/LivenessIRMnn.h"
|
|
#include "Inc/FaceQuality.h"
|
|
|
|
|
|
#define IN
|
|
#define OUT
|
|
|
|
|
|
int DeepCamFaceDetect(IN const cv::Mat& frame, OUT std::vector<FaceInfo>& faceList)
|
|
{
|
|
if (frame.empty())
|
|
{
|
|
return ERR_IMG;
|
|
}
|
|
return CenterFaceMnn::GetInstance()->Detect(frame, faceList);
|
|
}
|
|
|
|
int DeepCamGetFaceFeature(IN const cv::Mat& frame, IN const float* landmarks, OUT float* feature)
|
|
{
|
|
if (frame.empty())
|
|
{
|
|
return ERR_IMG;
|
|
}
|
|
if (landmarks == nullptr)
|
|
{
|
|
return ERR_LANDMARK;
|
|
}
|
|
return MobileFaceFeatureMnn::GetInstance()->GetFaceFeature(frame, landmarks, feature);
|
|
}
|
|
|
|
int DeepCamFaceFeatureCompare(IN const float* feature1, IN const float* feature2, OUT float& fSimilarity)
|
|
{
|
|
fSimilarity = 0.f;
|
|
|
|
if (feature1 == nullptr || feature2 == nullptr)
|
|
{
|
|
return ERR_FEATURE;
|
|
}
|
|
|
|
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))));
|
|
|
|
//拉高分数
|
|
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);
|
|
fSimilarity = fabsf(temp - min_score) / (max_score - min_score);
|
|
}
|
|
|
|
return ERR_OK;
|
|
}
|
|
|
|
int DeepCamFaceLivenesIr(IN const cv::Mat& frame, IN float face_x1, IN float face_y1, IN float face_x2, IN float face_y2, IN const float* landmarks, OUT float& livenessScore)
|
|
{
|
|
livenessScore = 0.f;
|
|
if (frame.empty())
|
|
{
|
|
return ERR_IMG;
|
|
}
|
|
if (landmarks == nullptr)
|
|
{
|
|
return ERR_LANDMARK;
|
|
}
|
|
return LivenessIRMnn::GetInstance()->LivenessDetect(frame, face_x1, face_y1, face_x2, face_y2, landmarks, livenessScore, true);
|
|
}
|
|
|
|
int DeepCamGetFaceQuality(IN const cv::Mat& frame, IN float face_x1, IN float face_y1, IN float face_x2, IN float face_y2, OUT float& score)
|
|
{
|
|
if (frame.empty())
|
|
{
|
|
return ERR_IMG;
|
|
}
|
|
cv::Rect face_rect = cv::Rect(face_x1, face_y1, face_x2 - face_x1, face_y2 - face_y1);
|
|
score = FaceQuality::GetInstance()->DetectQuality(frame, face_rect);
|
|
return ERR_OK;
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
std::cout << "Hello World!\n";
|
|
}
|
|
|