#include "YoloRpcElement.h" #include #include #include #include #include #include #include #include #include #include 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 DBG("objs size is " << objs.size()); 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 = 0.75; // 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); } } 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 YoloRpcElement::getTriggerMats() { return triggerMats; } std::vector 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(); }