我是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 是在保留或替换单个值,而不是追加以前的值。
如何解决这个问题?任何提示都将是感激的。
看起来很简单,你需要移动 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
. 在哪里申报?也许这就是困惑的根源。
让我们 假设 结果是一个向量类型,但你还是只推送了最后一个对象。
result.push_back(objectMetadataPacket.releasePtr());
内的for循环。
不要忘记添加有对象MetadataPacket定义的头文件。
希望对你有所帮助。