// // Created by ps on 19-4-11. // #include #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 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 VptRpcElement::getLastHpRects() const { return m_HPScoredRects; } std::vector VptRpcElement::getLastHCPRects() const { return m_HCPScoredRects; } std::vector VptRpcElement::getLastCarRects() const { return m_CarScoredRects; }