//
|
// Created by ps on 18-12-18.
|
//
|
|
#ifndef TESTCODE_FACETRACKINGWRAPPER_H
|
#define TESTCODE_FACETRACKINGWRAPPER_H
|
|
#include <stdio.h>
|
#include <stdlib.h>
|
#include <string.h>
|
#include <sys/time.h>
|
#include <time.h>
|
#include <list>
|
#include <basic/debug/Debug.h>
|
|
#include <opencv2/opencv.hpp>
|
#include <FiStdDefEx.h>
|
|
#include <THFaceTracking_i.h>
|
#include <FaceDetectServer/rpc/FaceServer.h>
|
|
#include "FaceDefine.h"
|
|
|
//typedef std::list<FaceTrackingInfo> ObjectList;
|
#define MAX_DETECT_FACE 50
|
|
|
class FaceTrackingWrapper {
|
public:
|
explicit FaceTrackingWrapper();
|
|
virtual ~FaceTrackingWrapper();
|
|
void setChannelParam(int channel, const BasicFace::InitParam &);
|
|
bool initHandle();
|
|
std::vector<BasicFace::FaceDetectResult> detectFace(const BasicFace::FaceImage &image);
|
|
std::vector<BasicFace::FaceDetectResult> trackingFace(int channel, const BasicFace::FaceImage &image);
|
|
vector<BasicFace::FaceFeatureResult> extractFace(const BasicFace::FaceImage &image);
|
|
static float compareFeature(BasicFace::Feature &feature1, BasicFace::Feature &feature2);
|
|
private:
|
int nGPUDeviceID = 0;
|
|
//sdk 初始化参数
|
std::map<int, BasicFace::InitParam> m_mapParam;
|
|
//保存上次跟踪的目标
|
// std::map<int, ObjectList> m_objListCache;
|
};
|
|
static FaceTrackingWrapper g_faceTrackingWrapper;
|
static std::map<std::string, int> g_channelCache;
|
|
static ::FaceDetect::Faces faceTrackingFunc(int channel, cv::Mat &image) {
|
FaceDetect::Faces faces;
|
BasicFace::FaceImage faceImage{image.cols, image.rows, image.step, image.data};
|
|
THFT_FaceInfo facePos[MAX_DETECT_FACE];
|
int faceNum = THFT_FaceTracking(channel, image.data, facePos);
|
|
if (faceNum > 0) {
|
for (int i = 0; i < faceNum; i++) {
|
FaceDetect::FacePos face;
|
auto &pos = facePos[i];
|
memcpy(&face, &pos, sizeof(pos) - sizeof(pos.pFacialData) - sizeof(pos.nFaceID));
|
face.pFacialData.resize(sizeof(pos.pFacialData));
|
memcpy(face.pFacialData.data(), pos.pFacialData, sizeof(pos.pFacialData));
|
face.pfaceId = pos.nFaceID;
|
// DBG(face.fAngle.confidence);
|
faces.push_back(face);
|
}
|
} else {
|
DBG("Face num is 0");
|
}
|
}
|
|
#endif //TESTCODE_FACETRACKINGWRAPPER_H
|