如何创建矩阵向量来存储大量图像?

Posted

技术标签:

【中文标题】如何创建矩阵向量来存储大量图像?【英文标题】:How to create vector of matrices to store large number of images? 【发布时间】:2017-01-16 21:10:20 【问题描述】:

我想创建矩阵向量来存储尽可能多的图像。

我知道,有可能是这样写的:

vector<Mat> images1;

在从相机获取图像期间,我将以 100fps 的速度保存图像,分辨率为 1600*800,如下所示:

images1.push_back(InputImage.clone());

InputImage 是 Mat 并且由相机给出。由于在采集过程中创建视频会导致视频中的帧丢失或采集速度降低。

在停止图像采集之后,在停止程序之前,我会将图像写入视频,如下所示:

VideoWriter writer;
writer = Videowriter("video.avi",-1,100,frameSize(1600,800),false);
for (vector<Mat>::iterator iter = images1.begin(); ier != images1.end(); iter++)
writer.write(*iter);

是否正确,因为我不确定images1 是否可以存储大约 1500 张图像而不会溢出。

【问题讨论】:

做数学。在每像素 24 位时,您看到的空间略小于 6 GB。 如果您知道要存储的图像总数,请考虑预先使用reserve,这样您就不会尝试在 100fps 循环内重新分配。 为什么你基本上必须使用Vector?其他 STL 容器呢? 【参考方案1】:

您不必担心“溢出”,无论这在您的上下文中意味着什么。

更大的问题是内存。单个帧需要(每种颜色 8 位,3 种颜色)3 * 1600 * 800 == 3.84Mb。在 100fps 时,一秒的素材需要 0.384Gb 的内存。 8GB的内存只能容纳大约20秒的镜头。您需要将近 24GB 的内存才能保持一分钟。绝大多数视频编码软件在任何给定时间仅在内存中保留几帧视频数据,并将其余的转储到硬盘驱动器(或丢弃它,取决于软件服务的目的)。

您可能应该做的(这是 FRAPS 等程序所做的)是在收到帧后立即将它们转储到硬盘驱动器。然后,当录制完成时,您可以收工(如果您需要原始视频片段),或者您可以开始读取文件并将其编码为更压缩的格式。

【讨论】:

但我的图像是灰度图像,因此它需要 3.84/3 = 1.28 Mb,因此在 100 fps 1 秒时它是 0.128Gb 的内存。如果我想录制 20 秒,即 2.56 Gb。对于我来说,20 fps 的录制就足够了。 @reddy2810 看,如果你生活在一个你确定自己拥有所需的所有内存的世界中,那么你的方法可能没问题。我给出的建议是针对更现实的场景量身定制的,您知道您需要该程序来扩展到更大的视频源。 好的。我使用 GigE PRO 相机,但我找不到用于以 100 fps 的分辨率录制视频的软件,此外,我发布了这篇文章,寻找可以通过使用 vector 或其他东西编码来帮助我实现它的人【参考方案2】:

在内存中预先分配您的图像矢量,以便您只需要复制帧而无需实时分配。

如果您有内存问题,请尝试将帧转储到文件中,操作系统有望能够处理 I/O。如果不尝试内存映射文件。

【讨论】:

对于预分配,我尝试了保留向量,但它不适用于 Mat,因为它在 int 中工作。它给了我语法错误。 预分配意味着调整向量的大小(不是保留)或 push_backing 克隆到其中。

以上是关于如何创建矩阵向量来存储大量图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用opencv从矩阵向量构造图像

你如何创建一个函数来输入两个向量来产生一个矩阵

OpenCV基础---图像存储器(Mat类)

创建多个矩阵时出现分段错误(核心转储)

如何将块压缩行转换为密集矩阵?

如何获取矩阵二范数 opencv