// // Created by ps on 18-12-18. // #ifndef TESTCODE_FACETRACKINGWRAPPER_H #define TESTCODE_FACETRACKINGWRAPPER_H #include #include #include #include #include #include #include #include #include #include #include #include "FaceDefine.h" //typedef std::list ObjectList; #define MAX_DETECT_FACE 50 class FaceTrackingWrapper { public: explicit FaceTrackingWrapper(); virtual ~FaceTrackingWrapper(); void setChannelParam(int channel, const BasicFace::InitParam &); bool initHandle(); std::vector detectFace(const BasicFace::FaceImage &image); std::vector trackingFace(int channel, const BasicFace::FaceImage &image); vector extractFace(const BasicFace::FaceImage &image); static float compareFeature(BasicFace::Feature &feature1, BasicFace::Feature &feature2); private: int nGPUDeviceID = 0; //sdk 初始化参数 std::map m_mapParam; //保存上次跟踪的目标 // std::map m_objListCache; }; static FaceTrackingWrapper g_faceTrackingWrapper; static std::map 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