c++ - 一个错误?一个人口众多的向量退出循环时,while 语句内的内容意外更改
问题描述
问题如下:
一方面,我用视频的所有帧填充向量。我检查帧是否真的包含视频的帧,顺序正确:是。
另一方面,当我退出 while 语句并使用 for 循环读取其内容时,它的行为就好像每一帧都等于视频的最后一帧(重复图像的向量)。
我解决了这个问题,发现了这些事实:
- 每个图像都被正确读取并存储在 frame_temp 中(从视频开始到结束检索每个帧)。
- imshow(frames[i]) 在 while 循环中显示正确的图像。
- imshow(frames[i]) 仅显示 for 循环内视频的最后一帧,无论“i”的值是什么。
我试过用vector.push_back做,但结果是一样的。
void GetFramesFromVideo(String filepath, vector<Mat>& frames)
{
Mat frame_temp;
VideoCapture cap = VideoCapture(filepath);
int videosize = cap.get(7);
frames = vector<Mat>(videosize);
bool success = cap.read(frame_temp);
frames[0]=frame_temp;
namedWindow("he");
int i = 1;
while (success)
{
success = cap.read(frame_temp);
if (success)
{
frames[i] = frame_temp;
i++;
}
imshow("he", frames[i-1]);
waitKey(10);
cout << "Read a new frame: " << success;
}
for (int i = 0; i < frames.size(); i++)
{
imshow("he", frames[i]);
waitKey(10);
}
}
- while 循环内的 imshow("he") 再现视频 - 每个帧 [i] 都是视频的实际帧。
- for 循环中的 imshow("he") 重复视频的最后一帧,一次又一次。帧向量似乎填充了最后一个“push_backed”帧的副本。
解决方案
cv::Mat
是一种具有引用语义而不是值语义的类型。换句话说,您可以将其视为指向矩阵的智能指针。
的文档operator=(const Mat&)
说:
矩阵赋值是一个 O(1) 操作。这意味着不会复制任何数据,但会共享数据,并且引用计数器(如果有)会递增。
所以你的问题很简单:你总是写到frame_temp
,这是你拥有的唯一实际数据,然后你在你的vector<Mat>
. Mat
您每次都需要创建一个新的。
推荐阅读
- eslintrc - eslintrc.js/rules 中的 eslint 不起作用
- elasticsearch - 基于父嵌套字段对文档进行排序,无需无痛脚本
- mongodb - 执行聚合以在 pymongo 中按组查找平均值时的编码问题
- javascript - 可以将 HOF 与具有自动绑定的类功能一起使用吗?
- firebase - 类型“UploadMappingFileTask”属性“googleServicesResourceRoot”没有配置值
- swift - 如何在 Swift XCTest 单元测试中捕获标准输出和标准错误?
- g++ - dyld:库未加载:/usr/local/opt/icu4c/lib/libicuuc.68.dylib 原因:找不到图像
- reactjs - 如何实现 FlatList 项目计数器
- python-3.x - 如何在 praw 上获取主页提交
- reactjs - 为什么我在导入组件时打字稿会抱怨,但在同一文件中定义组件时却不会?