向量持有的是单值而不是多值。

问题描述 投票:0回答:1

我是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. 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},{"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}] 。

基本上上面的代码解析了J中的每一个对象,并创建了一个以objectMetadata指针为框的包装盒,objectMetadataPacket一个一个地保存着每一个objectMetadata指针。

当我打印objectMetadata时,它如我所料返回1。但是,当我打印 objectMetadataPacket 我认为 objectMetadataPacket 是在保留或替换单个值,而不是追加以前的值。

如何解决这个问题?任何提示都将是感激的。

c++ c pointers network-optix
1个回答
1
投票

看起来很简单,你需要移动 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. 在哪里申报?也许这就是困惑的根源。


1
投票

让我们 假设 结果是一个向量类型,但你还是只推送了最后一个对象。

result.push_back(objectMetadataPacket.releasePtr());

内的for循环。

不要忘记添加有对象MetadataPacket定义的头文件。

希望对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.