#include "FaceExtractServerI.h"
|
#include <basic/util/app/AppPreference.hpp>
|
#include <QtCore/QString>
|
#include <QtCore/QSharedMemory>
|
#include <basic/timer_counter/Clocktimer.h>
|
#include <THFeature_i.h>
|
|
FaceExtractServerI::FaceExtractServerI() {
|
long threadMax = appPref.getLongData("thread.max");
|
long gpuIndex = appPref.getLongData("gpu.index");
|
for (int i = 0; i < threadMax; i++) {
|
extractResourcesManager.pushResource(i);
|
}
|
if (gpuIndex < 0) {
|
CHKERR(EF_Init(threadMax), threadMax, "EF_Init returns ");
|
} else {
|
EF_Param *param = new EF_Param[threadMax];
|
for (int i = 0; i < threadMax; i++) {
|
param[i].nDeviceID = gpuIndex;
|
}
|
|
CHKERR(EF_Init_Ex(threadMax, param), threadMax, "EF_Init returns ");
|
delete[] param;
|
}
|
}
|
|
FaceExtractServerI::~FaceExtractServerI() {
|
EF_Release();
|
}
|
|
FaceDetect::Data FaceExtractServerI::faceExtract(Ice::Int width, Ice::Int height, const FaceDetect::FacePos &pos,
|
const std::string &shareMemoryName, const Ice::Current &) {
|
ClockTimer ct("FaceExtractServerI::faceExtract");
|
INFO("faceExtract");
|
QSharedMemory shareMemory(QString(shareMemoryName.c_str()));
|
FaceDetect::Data feature;
|
if (shareMemory.attach()) {
|
auto data = shareMemory.constData();
|
THFI_FacePos facesPos;
|
int channel = extractResourcesManager.getAvilableChannel(shareMemoryName);
|
memcpy(&facesPos, &pos, sizeof(facesPos) - sizeof(facesPos.pFacialData));
|
memcpy(facesPos.pFacialData, pos.pFacialData.data(), sizeof(facesPos.pFacialData));
|
feature.resize(EF_Size());
|
int ret = EF_Extract(channel, (BYTE *) data, width, height, 3, &facesPos, feature.data());
|
if (ret != 1) {
|
ERR("THFP_Execute_V2 faild, returns " << ret)
|
}
|
return feature;
|
} else {
|
ERR("shareMemory attach faild");
|
// throw std::runtime_error("shareMemory attach faild");
|
}
|
|
}
|