c++ - 向量保存单个值而不是多个值
问题描述
我是 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 正在保存或替换单个值,而不是附加以前的值。
如何解决这个问题?任何提示都会很明显。
解决方案
看起来很简单,你需要移动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
. 它在哪里声明?也许这就是混乱的根源。
推荐阅读
- tensorflow - ModuleNotFoundError:没有名为“absl”的模块
- java - 通过 Java 发送带有 JSON 的 HTTPS 请求
- database - 使用 go 和 InstantClient 从存储过程访问 OUT 参数(t_cursor 类型)
- c# - 如何在 Visual Studio 中调试 .NET Framework
- c++ - QPixmap 对象质量丢失
- javascript - 单独的 OWL 轮播脚本
- azure - 在 Azure 数据工厂的 Web 活动中使用 Cookie
- sql - 如何使用 Scala Slick 编写一对多查询,该查询返回类似 `(Model1, Option[Seq[Model2]])`
- tensorflow - 如何在 Tensorflow/Keras 中的 2 层之间创建循环连接?
- c++ - C++ 使用带有 curl 的谷歌电子邮件发送 zip 文件