使用opencv在内存中加载一组图片

使用opencv在内存中加载一组图片,c,opencv,C,Opencv,我正在用C API OpenCV更新C中的一个旧代码,我需要在内存中加载至少300个图像,以便使用它们生成一些算法 所以,我一直在想,我可以将这些图像加载到内存中,以使操作更快,而不是从磁盘加载,并对每个图像进行单个操作 这样做的最佳方式是什么?我想,对于大多数应用程序来说,这样做所带来的性能提升是如此之小,以至于根本不值得这么费劲。确保有任何收益的唯一方法是这样做并测量时间 这种方法的问题在于,根据图像的大小,一次存储它们可能会耗尽RAM内存。如果您使用的是C代码,那么图像将自动保留在内存中,

我正在用C API OpenCV更新C中的一个旧代码,我需要在内存中加载至少300个图像,以便使用它们生成一些算法

所以,我一直在想,我可以将这些图像加载到内存中,以使操作更快,而不是从磁盘加载,并对每个图像进行单个操作


这样做的最佳方式是什么?

我想,对于大多数应用程序来说,这样做所带来的性能提升是如此之小,以至于根本不值得这么费劲。确保有任何收益的唯一方法是这样做并测量时间


这种方法的问题在于,根据图像的大小,一次存储它们可能会耗尽RAM内存。

如果您使用的是C代码,那么图像将自动保留在内存中,直到您显式释放它们。只需对希望从磁盘加载的每个映像调用
cvLoadImage
。我建议您将
IplImage*
指针存储在一个大数组中,这样您就不会忘记它们。完成后,只需调用
cvReleaseImage
,内存将全部释放


正如您所提到的,在加载过程中,您必须注意不要耗尽内存。如果您这样做,您将别无选择,只能将一个子集加载到内存中,并将其余部分保留在磁盘上。

uhh。。。从磁盘将数据预加载到内存的性能提高不值得这么麻烦吗?你能解释一下吗?我希望看到一些研究表明这种做法总是值得费心的。事实上,并非每个应用程序都是如此。edsonlp1必须先测试和衡量自己的收益,然后才能确定方法。我认为这完全取决于是否可以在图像上连续进行操作。如果操作不能连续完成(即,对一个图像执行所有操作,然后移动到下一个图像),那么将图像保留在内存中将获得巨大的收益。否则,就没有意义了,因为您仍然需要加载它们并将它们保存回磁盘。在一个线程中加载而在另一个线程中处理可能会有轻微的收益,但它们可能很小……磁盘访问很昂贵,内存访问也很昂贵,但要便宜得多。如果您知道您将重用某些数据(不仅仅是处理和忘记),那么最好将其缓存在内存中。我并不是说在内存中保存东西总是一个好主意,但我强烈不同意你的说法,即“对于大多数应用程序来说,这样做的性能增益太小,甚至不值得麻烦”,因为你不知道应用程序实际做了什么。看到我们在这里做什么了吗?投机。有许多重要信息不在问题中。我在回答中所说的是:注意,除非你尝试一下,否则没有办法知道(因为问题中没有提供信息)。谢谢土豚。我已经做了大量的IplImage*并将所有图像加载到内存中。这对我来说非常合适。