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

96 lines
2.1 KiB
C++

// sdk_test_face_compare.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Inc/DeepCamFaceApi.h"
#include "Inc/TimeCount.h"
#include <filesystem>
#include <regex>
namespace fs = std::filesystem;
bool GetFaceFeature(cv::Mat& img, float* feature)
{
std::vector<FaceInfo> face_infos;
{
USE_TIME t("FaceDetect ==> ");
DeepCamFaceDetect(img, face_infos);
}
if (face_infos.size() > 0)
{
USE_TIME t("Get Feature ==> ");
DeepCamGetFaceFeature(img, face_infos[0].landmarks, feature);
for (int i = 0; i < 5; i++)
{
cv::circle(img, cv::Point(face_infos[0].landmarks[i * 2], face_infos[0].landmarks[i * 2 + 1]), 1, cv::Scalar(0, 0, 255), 2);
}
cv::rectangle(img, cv::Rect(face_infos[0].x1, face_infos[0].y1, face_infos[0].GetWidth(),
face_infos[0].GetHeight()), cv::Scalar(0, 255, 0), 2);
cv::imshow("Face Compare", img);
cv::waitKey(1);
return true;
}
else
{//未检测到人脸
return false;
}
}
bool FindAllFilesInPath(std::string strPath, std::vector<std::string> & fileList, std::vector<std::string> & suffixFilters)
{
fs::path str(strPath);
if (!exists(str)) //必须先检测目录是否存在才能使用文件入口.
return false;
std::regex stuff(".*\\.(exe|zip)");//包含字母z的所有jpg或png图片
for (auto&fe : fs::directory_iterator(str))
{
auto fp = fe.path();
//std::wcout << fp.filename().wstring() << std::endl;
auto temp = fp.filename();
if (std::regex_match(temp.string(), stuff))
{
std::cout << temp << std::endl;
}
//replace_extension替换扩展名
//stem去掉扩展名
}
return 0;
}
int main()
{
std::string path = R"(D:\Tools\)";
std::vector<std::string> files;
std::vector<std::string> stuff;
FindAllFilesInPath(path, files, stuff);
float feature1[512] = { 0 };
GetFaceFeature(cv::imread("./1.jpg"), feature1);
cv::VideoCapture camera1(1);
if (!camera1.isOpened())
return 1;
while (true)
{
cv::Mat img;
camera1 >> img;
if (!img.empty())
{
float feature2[512] = { 0 };
float score = 0.f;
if (GetFaceFeature(img, feature2))
{
DeepCamFaceFeatureCompare(feature1, feature2, score);
}
std::cout << "cmp ==> " << score << std::endl;
}
}
return 0;
}