#include "FaceRpcElement.h"
|
#include <basic/util/app/AppPreference.hpp>
|
#include <QtCore/QSharedMemory>
|
#include <QtCore/QString>
|
#include <basic/timer_counter/Clocktimer.h>
|
#include <basic/util/opencv/CvUtil.h>
|
#include <QJsonDocument>
|
#include <QJsonObject>
|
#define GETSCORE(IDENT) appPref.getFloatData(IDENT) == -1 ? 95 : appPref.getFloatData(IDENT);
|
|
//************************************
|
// Method: string_replace
|
// FullName: string_replace
|
// Access: public
|
// Returns: void
|
// Qualifier: 把字符串的strsrc替换成strdst
|
// Parameter: std::string & strBig
|
// Parameter: const std::string & strsrc
|
// Parameter: const std::string & strdst
|
//************************************
|
static void string_replace(std::string &strBig, const std::string &strsrc, const std::string &strdst) {
|
std::string::size_type pos = 0;
|
std::string::size_type srclen = strsrc.size();
|
std::string::size_type dstlen = strdst.size();
|
|
while ((pos = strBig.find(strsrc, pos)) != std::string::npos) {
|
strBig.replace(pos, srclen, strdst);
|
pos += dstlen;
|
}
|
}
|
|
//todo appPref.getStringData("face.detect.proxy")
|
FaceRpcElement::FaceRpcElement(string shareMemoryName,const SdkRule& rule) :
|
//#todo
|
rpcClient(appPref.getStringData("faceDete.proxy"), appPref.getStringData("faceDete.ip"),
|
appPref.getIntData("faceDete.port"), "tcp"),
|
m_triggerElement(0, 0),
|
// rpcClient("faceServer","",10002,"tcp"),
|
sharedMemory(nullptr),
|
trackingTrigger(nullptr),
|
m_sdkRule(rule)
|
{
|
sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
|
if (!sharedMemory->create(4608 * 2592 * 4)) {
|
sharedMemory->attach();
|
DBG("size is " << sharedMemory->size());
|
}
|
|
// string t_camIdex = getProperty("dev_id");
|
//#todo
|
string t_camIdex;
|
if (shareMemoryName.find("/")) {
|
string_replace(shareMemoryName, "//", "/");
|
auto dev_pos = shareMemoryName.find("/cut/") + 5;
|
auto ch_pos = shareMemoryName.find("/", dev_pos) + 1;
|
auto str_device_id = shareMemoryName.substr(dev_pos, ch_pos - dev_pos - 1);
|
auto str_ch_id = shareMemoryName.substr(ch_pos, shareMemoryName.find("/", ch_pos) - ch_pos);
|
t_camIdex.append(str_device_id).append(str_ch_id);
|
} else {
|
t_camIdex = shareMemoryName.substr(0, shareMemoryName.rfind("faceRpc"));
|
}
|
|
float t_score = m_sdkRule.nQuality;
|
|
DBG(" TESTCODE getValue" << t_camIdex << " " << t_score << " " << t_score / 100);
|
|
t_score = t_score / 100;
|
|
trackingTrigger = new TrackingTrigger(t_score);
|
setMask(m_sdkRule.strAreas.toStdString());
|
}
|
|
FaceRpcElement::~FaceRpcElement() {
|
if (sharedMemory) {
|
delete sharedMemory;
|
}
|
if (trackingTrigger) {
|
delete trackingTrigger;
|
}
|
}
|
|
void FaceRpcElement::threadFunc() {
|
// ClockTimer ct("FaceRpcElement::threadFunc");
|
// {
|
//
|
// string string1(AppUtil::getTimeString() + "-ff2" + getProperty("time") + ".jpg");
|
// cv::imwrite(string1, image);
|
// }
|
if(!isInWeek(m_sdkRule.weekRuleVec))
|
return;
|
triggerMats.clear();
|
triggerFaces.clear();
|
triggerScoredRects.clear();
|
try {
|
auto server = rpcClient.getServer();
|
if (!server) ERR("server is null");
|
faces = server->faceDetect(image.cols, image.rows, sharedMemory->key().toStdString());
|
// DBG("faces.size " << faces.size());
|
|
for (auto face: faces) {
|
::FaceDetect::RECT &rect = face.rcFace;
|
ScoredRect scoredRect;
|
int x = face.rcFace.left;
|
int y = face.rcFace.top;
|
int w = face.rcFace.right - face.rcFace.left;
|
int h = face.rcFace.bottom - face.rcFace.top;
|
QRect re(x,y,w,h);
|
QPoint center = re.center();
|
if(!mPolygon.containsPoint(center,Qt::OddEvenFill))
|
{
|
return;
|
}
|
scoredRect.rect = {x, y, w, h};
|
scoredRect.score = (float) face.fAngle.confidence;
|
|
if (trackingTrigger->triggerOnce(scoredRect)) {
|
auto property = server->faceProperty(image.cols, image.rows, face, sharedMemory->key().toStdString());
|
trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
|
trackingTrigger->getLastRect().properties["age"] = to_string(property.age);
|
trackingTrigger->getLastRect().properties["gender"] = to_string(property.gender);
|
trackingTrigger->getLastRect().properties["beauty"] = to_string(property.beauty_level);
|
trackingTrigger->getLastRect().properties["smile"] = to_string(property.smile_level);
|
trackingTrigger->getLastRect().properties["race"] = to_string(property.race);
|
trackingTrigger->getLastRect().properties["time"] = getProperty("time");
|
trackingTrigger->getLastRect().properties["detectscore"] = scoredRect.score;
|
|
triggerFaces.push_back(face);
|
triggerMats.push_back(image(
|
CvUtil::zoomRectEqual(scoredRect.rect, 1.5, 1.5) & cv::Rect(0, 0, image.cols, image.rows)).clone());
|
triggerScoredRects.push_back(trackingTrigger->getLastRect());
|
} else {
|
// DBG("trackingTrigger->triggerOnce(scoredRect) is false ");
|
}
|
}
|
trackingTrigger->triggerLine();
|
// DBG("faces.size " << faces.size());
|
if (getLastScoreRects().size() > 0) {
|
m_triggerElement.setState(true);
|
} else {
|
m_triggerElement.setState(false);
|
}
|
|
m_triggerElement.triggerOnce(false);
|
if (triggerMats.size() > 0)fireConnectors("FaceTrigger");
|
fireConnectors();
|
} catch (std::exception &e) {
|
ERR(e.what())
|
}
|
}
|
|
cv::Mat FaceRpcElement::getImage() const {
|
return image;
|
}
|
|
::FaceDetect::Faces FaceRpcElement::getTriggerFaces() const {
|
return triggerFaces;
|
}
|
|
::FaceDetect::Faces FaceRpcElement::getFaces() const {
|
return faces;
|
}
|
|
std::vector<cv::Mat> FaceRpcElement::getTriggerMats() {
|
return triggerMats;
|
}
|
|
std::vector<ScoredRect> FaceRpcElement::getTriggerScoreRects() const {
|
return triggerScoredRects;
|
}
|
|
std::vector<ScoredRect> FaceRpcElement::getLastScoreRects() const {
|
return trackingTrigger->getLastScoreRects();
|
}
|
|
void FaceRpcElement::setImage(const cv::Mat &value) {
|
if (value.size != image.size) {
|
image = cv::Mat(value.rows, value.cols, CV_8UC3, sharedMemory->data());
|
}
|
value.copyTo(image);
|
}
|
|
bool FaceRpcElement::getTriggerState() const {
|
return m_triggerElement.getTriggerState();
|
}
|
void FaceRpcElement::setMask(std::string mask)
|
{
|
QJsonArray arrayAreas = getJsonArrayFromQString(QString::fromStdString(mask));
|
if(arrayAreas.isEmpty())
|
{
|
return;//do not detect
|
}
|
for(int i = 0;i < arrayAreas.size();++i)
|
{
|
QJsonValue jsonValue = arrayAreas[i];
|
QJsonObject obj = jsonValue.toObject();
|
int x = obj.value("x").toDouble()*4;
|
int y = obj.value("y").toDouble()*4;
|
mPolygon<<(QPoint(x,y));
|
|
}
|
}
|
QJsonArray FaceRpcElement::getJsonArrayFromQString(const QString& strJson)
|
{
|
QJsonDocument jsonDocument = QJsonDocument::fromJson(strJson.toLocal8Bit());
|
if( jsonDocument.isNull() ){
|
DBG("please check the string"<< strJson.toStdString());
|
return QJsonArray();
|
}
|
QJsonArray jsonArray = jsonDocument.array();
|
return jsonArray;
|
}
|
bool FaceRpcElement::isInWeek(const std::vector<LActRuleWeekRecord>& ruleWeek)
|
{
|
|
int nWeek = QDate::currentDate().dayOfWeek();
|
for(int i = 0;i < ruleWeek.size();++i)
|
{
|
if(ruleWeek[i].m_nType == nWeek)
|
{
|
QString strCurrent = QDateTime::currentDateTime().toString("hh:mm");
|
if(strCurrent >= ruleWeek[i].m_strBegin && strCurrent <= ruleWeek[i].m_strEnd)
|
{
|
return true;
|
}
|
}
|
}
|
return false;
|
}
|