#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>
|
|
|
YoloRpcElement::YoloRpcElement(std::string shareMemoryName) :
|
rpcClient(appPref.getStringData("yolo.proxy"), appPref.getStringData("yolo.ip"),
|
appPref.getIntData("yolo.port"), "tcp"),
|
sharedMemory(nullptr),
|
trackingTrigger(nullptr)
|
{
|
trackingTrigger = new TrackingTrigger(0.5);
|
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();
|
}
|
|
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;
|
trackingTrigger=nullptr;
|
}
|
}
|
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);
|
}
|
::YoloDetect::ObjInfos YoloRpcElement::getObjects() const
|
{
|
return objs;
|
}
|
|
|
std::vector<ScoredRect> YoloRpcElement::getLastScoreRects() const {
|
return trackingTrigger->getLastScoreRects();
|
}
|
|
cv::Mat YoloRpcElement::getImage() const
|
{
|
return image;
|
}
|
|
void YoloRpcElement::threadFunc()
|
{
|
// ClockTimer ct("YoloRpcElement::threadFunc");
|
triggerScoredRects.clear();
|
try {
|
auto server = rpcClient.getServer();
|
if (!server)
|
{
|
ERR("server is null");
|
return;
|
}
|
objs = server->YoloDetect(image.cols, image.rows, sharedMemory->key().toStdString());//TODO
|
}
|
catch (std::exception &e)
|
{
|
ERR(e.what())
|
}
|
// int size=objs.size();
|
// if(size>30)
|
// {
|
|
// DBG("size="<<size);
|
// return;
|
// }
|
|
for (auto &obj: objs)
|
{
|
if (obj.type != 0)
|
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;
|
scoredRect.properties["time"] = getProperty("time");
|
scoredRect.properties["imgKey"]=getProperty("imgKey");
|
if (trackingTrigger->triggerOnce(scoredRect))
|
{
|
trackingTrigger->getLastRect().properties["id"] = to_string(scoredRect.id);
|
trackingTrigger->getLastRect().properties["type"] = cocoData[obj.type];
|
trackingTrigger->getLastRect().properties["time"] = getProperty("time");
|
trackingTrigger->getLastRect().properties["imgKey"]=getProperty("imgKey");
|
// DBG("time)"<<getProperty("time"));
|
triggerScoredRects.push_back(trackingTrigger->getLastRect());
|
}
|
}
|
trackingTrigger->triggerLine();
|
// if(trackingTrigger->getLastScoreRects().size()>20)
|
// {
|
// DBG("");
|
// }
|
fireConnectors();
|
}
|