#include "YoloRpcElement.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 <basic/db/Elasticsearch/EsDBTool.h>
|
#include <uuid/uuid.h>
|
#include <jsoncpp/json/json.h>
|
|
#include <basic/db/ES/es/ManagerEsDB.h>
|
#include <QtCore/QJsonDocument>
|
#include <QtCore/QJsonObject>
|
|
YoloRpcElement::YoloRpcElement(string shareMemoryName) :
|
rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"),
|
appPref.getIntData("yolo.port"), "tcp"), fdfsClient(nullptr), sharedMemory(nullptr),
|
m_triggerElement(0, 50), trackingTrigger(nullptr) {
|
sharedMemory = new QSharedMemory(QString(shareMemoryName.c_str()));
|
// DBG(shareMemoryName);
|
//1520 x 2688 1080 x 1920 //2560 * 1440 * 4
|
if (!sharedMemory->create(4608 * 2592 * 4)) {
|
sharedMemory->attach();
|
}
|
trackingTrigger = new TrackingTrigger(0.5);
|
try {
|
auto server = rpcClient.getServer();
|
cocoData = server->getCocoData();
|
}
|
catch (std::exception &e) {
|
ERR(e.what())
|
}
|
}
|
|
YoloRpcElement::~YoloRpcElement() {
|
if (sharedMemory) {
|
delete sharedMemory;
|
}
|
if (trackingTrigger) {
|
delete trackingTrigger;
|
}
|
}
|
|
void YoloRpcElement::threadFunc() {
|
// ClockTimer ct("YoloRpcElement::threadFunc");.
|
triggerMats.clear();
|
try {
|
auto server = rpcClient.getServer();
|
if (!server) {
|
ERR("server is null");
|
return;
|
}
|
objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
|
if (objs.size() <= 0) {
|
m_triggerElement.setState(false);
|
m_triggerElement.triggerOnce(false);
|
trackingTrigger->triggerLine();
|
return;
|
} else {
|
m_triggerElement.setState(true);
|
}
|
string t_camIdex = getProperty("dev_id") + getProperty("ch_id");
|
float t_det_sc =
|
appPref.getFloatData(t_camIdex + "yolo.det") == -1 ? 0.75 : appPref.getFloatData(t_camIdex + "yolo.det");
|
|
for (auto &obj: objs) {
|
if (obj.type != 0)
|
continue;
|
if (obj.prob < t_det_sc) {
|
continue;
|
}
|
ScoredRect scoredRect;
|
|
int x = obj.rcObj.left * image.cols;
|
int y = obj.rcObj.top * image.rows;
|
int w = (obj.rcObj.right - obj.rcObj.left) * image.cols;
|
int h = (obj.rcObj.bottom - obj.rcObj.top) * image.rows;
|
scoredRect.rect = cv::Rect(x, y, w, h);
|
|
scoredRect.score = scoredRect.rect.area() > 0 ? obj.prob : 0;
|
if (trackingTrigger->triggerOnce(scoredRect)) {
|
trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
|
trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type];
|
auto t_image = image(scoredRect.rect & cv::Rect(0, 0, image.cols, image.rows)).clone();
|
triggerMats.push_back(t_image);
|
|
std::string strImgUrl = "http://";
|
if (fdfsClient != nullptr && fdfsClient->fastFds != nullptr) {
|
fdfsClient->rwLock.rdlock();
|
std::vector<unsigned char> buffer;
|
CvUtil::cvMat2Buffer(t_image, buffer);
|
std::string strImgUrlTmp = "";
|
fdfsClient->fastFds->uploadFile(buffer, strImgUrlTmp, "jpg");
|
strImgUrl.append(fdfsClient->fastFds->getIp() + "/" + strImgUrlTmp);
|
strImgUrl.clear();
|
strImgUrl = strImgUrlTmp;
|
// strImgUrl.append("/").append(strImgUrlTmp);
|
fdfsClient->rwLock.unlock();
|
}
|
|
//使用的时候将false改为ture
|
{
|
//#todo
|
EsDBTool pManagerEsDB(appPref.getStringData("ipAdd"), appPref.getIntData("ipPort"));
|
|
string str_uuid;
|
uuid_t t_uuid;
|
char str[36];
|
uuid_generate(t_uuid);
|
uuid_unparse(t_uuid, str);
|
str_uuid = str;
|
|
// jsonyolo.insert("HardCamId","");//硬盘摄像机id ???拿不到
|
// jsonyolo.insert("ChannlId","");//通道id ??? 拿不到
|
// jsonyolo.insert("Time","");//时间 可以获取当前时间 明确时间是获取当前的还是传过来的 ??? 拿不到
|
// jsonyolo.insert("ImgUrl","");//图像img路径 ??? 拿不到
|
// jsonyolo.insert("Image","");//快照 ??? 拿不到
|
// jsonyolo.insert("DataType",obj.type);//检测的类型
|
// jsonyolo.insert("Score",obj.prob);//检测的得分
|
|
Json::Value t_json;
|
t_json["Id"] = str_uuid; //主键
|
//#todo
|
|
t_json["picName"] = "wait todo";
|
t_json["DataType"] = cocoData[obj.type];
|
t_json["Score"] = obj.prob;
|
|
t_json["personPicUrl"] = "wait todo";//人员图片 store
|
t_json["likeDate"] = AppUtil::getTimeSecString();//比较时间
|
t_json["picAddress"] = getProperty("str_addr");//抓拍地址
|
t_json["picMaxUrl"] = "wait todo";//大图路径
|
t_json["picLocalUrl"] = "wait todo";//本地路径
|
t_json["picSmUrl"] = strImgUrl;//人员抓小图
|
|
// faceRpcElement.setProperty("frame_number", frame_number);
|
t_json["picDate"] = getProperty("time");
|
t_json["content"] = "wait todo";
|
t_json["viType"] = "2";//只有4种类型 1:personface 2:personbody 3:car 4:bicycle 5:none 未知类型
|
t_json["personIsHub"] = "4";//1: 报警 2: 可疑 3: 安全 4: 未知
|
t_json["videoIp"] = getProperty("local_ip");//当前服务器IP地址
|
|
|
t_json["videoNum"] = getProperty("path");//Vide编号 外键
|
t_json["videoReqNum"] = getProperty("dev_id");//Video设备编号
|
t_json["ChannlId"] = getProperty("ch_id");//通道id
|
t_json["isDelete"] = "1";//默认1 ,0无效 1有效
|
|
t_json["indeviceid"] = appPref.getStringData("fxDevID");
|
t_json["indevicename"] = appPref.getStringData("fxDevNAME");
|
|
DBG(t_json.toStyledString());
|
bool retface = false;
|
retface = pManagerEsDB.insertData("yolodet", "info", t_json.toStyledString(), str_uuid);
|
if (retface) {
|
INFO("facedb success");
|
} else {
|
ERR("facedb fail");
|
}
|
}
|
}
|
}
|
trackingTrigger->triggerLine();
|
m_triggerElement.triggerOnce(false);
|
if (triggerMats.size() > 0)fireConnectors("YoloTrigger");
|
fireConnectors();
|
} catch (std::exception &e) {
|
ERR(e.what())
|
}
|
}
|
|
::YoloDetect::ObjInfos YoloRpcElement::getObjects() const {
|
return objs;
|
}
|
|
bool YoloRpcElement::getTrigger() const {
|
return (objs.size() > 0 ? true : false);
|
}
|
|
std::vector<cv::Mat> YoloRpcElement::getTriggerMats() {
|
return triggerMats;
|
}
|
|
std::vector<ScoredRect> YoloRpcElement::getLastScoreRects() const {
|
return trackingTrigger->getLastScoreRects();
|
}
|
|
void YoloRpcElement::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 YoloRpcElement::getTriggerState() const {
|
return m_triggerElement.getTriggerState();
|
}
|