// 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 &feature1, std::vector &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 faces; CenterFaceMnn::GetInstance()->Detect(img, faces); //std::vector feature; if (faces.size() > 0) { //std::vector 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 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 landmark; landmark.insert(landmark.end(), face.landmarks, face.landmarks + sizeof(face.landmarks) / sizeof(float));*/ //std::vector 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; }