首页 > 解决方案 > 向量保存单个值而不是多个值

问题描述

我是 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},{"height":0.1525529156688"7" "width":0.23306196182966232,"x1":0.0436464324593544,"y1":0.4737709164619446},{"height":0.05128565430641174,"label":"car","width":0.08260226249694824,"x1":0.5227476954460144,"y1": 0.1012464314699173},{"height":0.2633265256881714,"label":"car","width":0.2628181278705597,"x1":0.26807519793510437,"y1":0.6712638735771179},{"height":0.1066703349351883,"label":"car ","宽度":0.1351754069328308,"x1":0。3640907108783722,"y1":0.19261829555034637},{"height":0.13967299461364746,"label":"bike","width":0.09549647569656372,"x1":0.22761660814285278,"y1":0.5885671973228455},{"height":0.06679290533065796, “标签”:“汽车”,“宽度”:0.07677030563354492,“x1”:0.7689603567123413,“y1”:0.15423545241355896},{“高度”:0.08153106272220612,“标签”:“汽车”,“宽度”:0.092540x177740502 “:0.6379277110099792,“ Y1”:0.19936798512935638},{“高度”:0.13518506288528442,“ label”标签:“ car”,“ width”:0.11784747323417171766666666666666666617.11,000.11,000,000,000,00017,00010,00010,00010,00010,0001710,00010,0001710,00010101010101010101010101010101010、10、11、、​​、、、、、、、、、、、、、、、、又13967299461364746,"label":"bike","width":0.09549647569656372,"x1":0.22761660814285278,"y1":0.5885671973228455},{"height":0.06679290533065796,"label":"car","width":0.07677030563354492, "x1":0.7689603567123413,"y1":0.15423545241355896},{"height":0.08153106272220612,"label":"car","width":0.09254050254821777,"x1":0.6379277110099792,"y1":0.19936798512935638},{"height ":0.13518506288528442,"label":"car","width":0.11784732341766357,"x1":0.6905719637870789,"y1":0.34653833508491516}]13967299461364746,"label":"bike","width":0.09549647569656372,"x1":0.22761660814285278,"y1":0.5885671973228455},{"height":0.06679290533065796,"label":"car","width":0.07677030563354492, "x1":0.7689603567123413,"y1":0.15423545241355896},{"height":0.08153106272220612,"label":"car","width":0.09254050254821777,"x1":0.6379277110099792,"y1":0.19936798512935638},{"height ":0.13518506288528442,"label":"car","width":0.11784732341766357,"x1":0.6905719637870789,"y1":0.34653833508491516}]{“高度”:0.06679290533065796,“标签”:“汽车”,“宽度”:0.07677030563354492,“x1”:0.7689603567123413,“y1”:0.15423545241355896},{“高度”:0.0812310627汽车,“标签:”“2206” width":0.09254050254821777,"x1":0.6379277110099792,"y1":0.19936798512935638},{"height":0.13518506288528442,"label":"car","width":0.11784732341766357,"x1":0.6905719637870789,"y1":0.34653833508491516 }]{“高度”:0.06679290533065796,“标签”:“汽车”,“宽度”:0.07677030563354492,“x1”:0.7689603567123413,“y1”:0.15423545241355896},{“高度”:0.0812310627汽车,“标签:”“2206” width":0.09254050254821777,"x1":0.6379277110099792,"y1":0.19936798512935638},{"height":0.13518506288528442,"label":"car","width":0.11784732341766357,"x1":0.6905719637870789,"y1":0.34653833508491516 }]6379277110099792,"y1":0.19936798512935638},{"height":0.13518506288528442,"label":"car","width":0.11784732341766357,"x1":0.6905719637870789,"38080}."35080":6379277110099792,"y1":0.19936798512935638},{"height":0.13518506288528442,"label":"car","width":0.11784732341766357,"x1":0.6905719637870789,"38080}."35080":

基本上,上面的代码解析 J 中的每个对象并在 objectMetadata 指针中创建边界框。objectMetadataPacket 一个一个地持有每个 objectMetadata 指针。

当我打印 objectMetadata 时,它按照我的预期返回 1。但是,当我打印objectMetadataPacket 它时,它还返回 1 而不是 J 中的 n 个对象。我认为 objectMetadataPacket 正在保存或替换单个值,而不是附加以前的值。

如何解决这个问题?任何提示都会很明显。

标签: c++pointers

解决方案


看起来很简单,你需要移动push_back它以便它在你的循环内,而不是在你的循环之后。

像这样的东西

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. 它在哪里声明?也许这就是混乱的根源。


推荐阅读