вектор содержит одно значение вместо нескольких значений - PullRequest
0 голосов
/ 23 апреля 2020

Я новичок в c ++, этот вопрос может быть глупым для вас.

Я использую Network Optix Служба управления видео. Используя их приложение, я создаю плагин.

Я использую приведенный ниже фрагмент кода для создания пакета объекта метаданных.

std::vector<IMetadataPacket*> DeviceAgent::cookSomeObjects()
{

    std::vector<IMetadataPacket*> result;

    auto objectMetadataPacket = makePtr<ObjectMetadataPacket>();
    objectMetadataPacket->setTimestampUs(m_lastVideoFrameTimestampUs);
    objectMetadataPacket->setDurationUs(0);

    auto j = json::parse(readBuffer);

    for (auto& context : j) {

       float a = context["x1"];
       float b = context["y1"];
       float c = context["height"];
       float d = context["width"];
       std::string label = context["label"];

       auto objectMetadata = makePtr<ObjectMetadata>();

       objectMetadata->setBoundingBox(Rect(a, b, c, d));

       objectMetadataPacket->addItem(objectMetadata.get());
      } 
    result.push_back(objectMetadataPacket.releasePtr());
    return result;
}

readBuffer - это ответ на вызов API. это выглядит следующим образом.

[{"height": 0.10374343395233154, "label": "car", "width": 0.13737773895263672, "x1": 0.4747169017791748, "y1": 0.27557021379470825}, { "высота": 0,1520291566848755, "метка": "автомобиль", "ширина": 0,23306196182966232, "x1": 0,0436464324593544, "y1": 0,4737709164619446}, { "высота": 0,05128565430641174, "метка": "автомобиль",» ширина ": +0,08260226249694824," x1 ": 0,5227476954460144," y1 ": 0,1012464314699173}, {" высота ": 0,2633265256881714," метка ":" автомобиль», "ширина": 0,2628181278705597 "x1": 0,26807519793510437, "y1": 0,6712638735771179 }, { "высота": 0,1066703349351883, "метка": "автомобиль", "ширина": 0,1351754069328308 "x1": 0,3640907108783722, "y1": +0,19261829555034637}, { "высота": 0,13967299461364746, "метка": "велосипед" , "ширина": 0,09549647569656372, "x1": +0,22761660814285278, "y1": 0,5885671973228455}, { "высота": +0,06679290533065796, "метка": "автомобиль", "ширина": 0,07677030563354492, "x1": 0,7689603567123413, "y1" : 0,15423545241355896}, { "высота": 0,08153106272220612, "метка": "автомобиль", "ширина": 0,09254050254821777, "x1": 0,6379277110099792, "y1": 0. 19936798512935638}, {"height": 0.13518506288528442, "label": "car", "width": 0.11784732341766357, "x1": 0.6905719637870789, "y1": 0.34653833508491516}]

* 1015 анализирует каждый объект в J и создает упаковку в указателе objectMetadata. objectMetadataPacket содержит каждый указатель objectMetadata один за другим.

Когда я печатаю objectMetadata, он возвращает 1, как я ожидал. Но, когда я печатаю objectMetadataPacket, он также возвращает 1 вместо n числа объектов в J. Я думаю, что objectMetadataPacket удерживает или заменяет одно значение вместо добавления к предыдущим значениям.

Как это исправить? Любой намек будет заметен.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Позволяет предположить, результат - векторный тип. тем не менее вы толкаете только последний объект к нему. переместите эту строку

result.push_back(objectMetadataPacket.releasePtr());

внутрь для l oop.

Не забудьте добавить заголовочный файл с определением objectMetadataPacket.

Надеюсь, это поможет вам.

1 голос
/ 23 апреля 2020

Кажется довольно простым, вам нужно переместить push_back так, чтобы оно было внутри вашего l oop, а не после вашего l oop.

Как-то так

std::vector<IMetadataPacket*> DeviceAgent::cookSomeObjects()
{

    auto j = json::parse(readBuffer);

    for (auto& context : j) {

       float a = context["x1"];
       float b = context["y1"];
       float c = context["height"];
       float d = context["width"];
       std::string label = context["label"];

       auto objectMetadata = makePtr<ObjectMetadata>();

       objectMetadata->setBoundingBox(Rect(a, b, c, d));

       auto objectMetadataPacket = makePtr<ObjectMetadataPacket>();
       objectMetadataPacket->setTimestampUs(m_lastVideoFrameTimestampUs);
       objectMetadataPacket->setDurationUs(0);
       objectMetadataPacket->addItem(objectMetadata.get());
       result.push_back(objectMetadataPacket.releasePtr());
      } 
    return result;
}

Очевидно, что если вы только вернете один элемент в вектор, то его размер будет равен единице.

Снова глядя на ваш код, я не вижу объявления для result. Где это заявлено? Может быть, это источник путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...