//
|
// Created by ps on 19-4-11.
|
//
|
|
#include <basic/util/app/AppPreference.hpp>
|
#include "VptRpcElement.h"
|
|
VptRpcElement::VptRpcElement(std::string shareMemoryName) : m_shareMemoryName(shareMemoryName),
|
m_rpcClient(appPref.getStringData("vpt.proxy"),
|
appPref.getStringData("vpt.ip"),
|
appPref.getIntData("vpt.port"), "tcp"),
|
m_sharedMemory(nullptr), m_trackingTrigger(nullptr) {
|
init();
|
|
}
|
|
VptRpcElement::~VptRpcElement() {
|
if (m_sharedMemory) {
|
delete m_sharedMemory;
|
}
|
if (m_trackingTrigger) {
|
delete m_trackingTrigger;
|
m_trackingTrigger = nullptr;
|
}
|
}
|
|
void VptRpcElement::setImage(const cv::Mat &value) {
|
|
if (value.size != m_image.size) {
|
m_image = cv::Mat(value.rows, value.cols, CV_8UC3, m_sharedMemory->data());
|
}
|
value.copyTo(m_image);
|
}
|
|
cv::Mat VptRpcElement::getImage() const {
|
return m_image;
|
}
|
|
VptDetect::ObjInfos VptRpcElement::getObjects() const {
|
return m_objs;
|
}
|
|
std::vector<ScoredRect> VptRpcElement::getLastScoreRects() const {
|
return m_trackingTrigger->getLastScoreRects();
|
}
|
|
void VptRpcElement::threadFunc() {
|
//#todo 业务
|
// ClockTimer ct("YoloRpcElement::threadFunc");
|
m_triggerScoredRects.clear();
|
m_CarScoredRects.clear();
|
m_HPScoredRects.clear();
|
m_HCPScoredRects.clear();
|
try {
|
auto server = m_rpcClient.getServer();
|
if (!server) {
|
ERR("server is null");
|
return;
|
}
|
m_objs = server->VptDetect(m_image.cols, m_image.rows, m_sharedMemory->key().toStdString());//TODO
|
}
|
catch (std::exception &e) {
|
ERR(e.what())
|
}
|
|
for (auto &obj: m_objs) {
|
// //#todo 人/人骑车/车
|
// if (obj.sdkDetectType != 0)
|
// continue;
|
|
ScoredRect scoredRect;
|
|
//#todo
|
scoredRect.rect = cv::Rect(obj.bskRect.left, obj.bskRect.top, obj.bskRect.width, obj.bskRect.height);
|
scoredRect.score = scoredRect.rect.area() > 0 ? obj.obj_score : 0;
|
scoredRect.properties["time"] = getProperty("time");
|
scoredRect.properties["imgKey"] = getProperty("imgKey");
|
if (m_trackingTrigger->triggerOnce(scoredRect)) {
|
m_trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
|
m_trackingTrigger->getLastRect().properties["type"] = m_TypeStr[obj.sdkDetectType];
|
m_trackingTrigger->getLastRect().properties["time"] = getProperty("time");
|
m_trackingTrigger->getLastRect().properties["imgKey"] = getProperty("imgKey");
|
m_triggerScoredRects.push_back(m_trackingTrigger->getLastRect());
|
|
}
|
}
|
m_trackingTrigger->triggerLine();
|
auto res_ = m_trackingTrigger->getLastScoreRects();
|
for (auto &obj: res_) {
|
if(obj.properties["type"] == "person") {
|
m_HPScoredRects.push_back(obj);
|
DBG("person:" << obj.score);
|
}else if((obj.properties["type"] == "bike") ||
|
(obj.properties["type"] == "motor")){
|
m_HCPScoredRects.push_back(obj);
|
DBG("bike or moto:" << obj.score);
|
}else{
|
m_CarScoredRects.push_back(obj);
|
DBG("car:" << obj.score);
|
}
|
}
|
|
fireConnectors();
|
}
|
|
void VptRpcElement::init() {
|
|
m_trackingTrigger = new TrackingTrigger(0.5);
|
m_sharedMemory = new QSharedMemory(QString(m_shareMemoryName.c_str()));
|
// DBG(shareMemoryName);
|
//1520 x 2688 1080 x 1920 //2560 * 1440 * 4
|
if (!m_sharedMemory->create(4608 * 2592 * 4)) {
|
m_sharedMemory->attach();
|
}
|
|
try {
|
auto server = m_rpcClient.getServer();
|
m_HpResStr = server->getStr(0); // 行人二次属性 case 0
|
m_HcpResStr = server->getStr(1); // 人骑车二次属性 case 1
|
m_TypeStr = server->getStr(2)[0]; // VPT检测种类 case 2
|
m_colorLabelStr = server->getStr(3)[0]; // 车牌颜色 case 3
|
}
|
catch (std::exception &e) {
|
ERR(e.what())
|
}
|
}
|
|
std::vector<ScoredRect> VptRpcElement::getLastHpRects() const {
|
return m_HPScoredRects;
|
}
|
|
std::vector<ScoredRect> VptRpcElement::getLastHCPRects() const {
|
return m_HCPScoredRects;
|
}
|
|
std::vector<ScoredRect> VptRpcElement::getLastCarRects() const {
|
return m_CarScoredRects;
|
}
|