在数据结构中存储不同大小的图像,OpenCV

Posted

技术标签:

【中文标题】在数据结构中存储不同大小的图像,OpenCV【英文标题】:Storing images of different sizes in a data structure, OpenCV 【发布时间】:2013-04-22 07:34:50 【问题描述】:

我想知道是否有任何方法可以使用 OpenCV (C++) 在单个数据结构中保存(或存储)不同大小的图像。例如,在 MATLAB 中,我可以使用“cell”来实现。

具体来说,我正在生成我的结果,这些结果是不同大小的图像,如果我可以将它们存储在一个单一的数据结构中,那对我来说会很高兴。这样,我可以在以后使用它。 请注意,这必须使用 C++ 和 OpenCV 完成。

我想尝试一下:std::vector。非常感谢。

【问题讨论】:

试试std::vector +1 OpenCV 中的很多函数使用std::vector<cv::Mat> 【参考方案1】:
Yeah you can try this

    std::vector<cv::Mat> ImageDataBase;

for(int i=0;i<length_of_imageDataBase;i++)

  cv::Mat img = cv::imread("Address of the images");
  ImageDataBase.pushback(img);

【讨论】:

【参考方案2】:

我认为问题在于您对 c++ 中对象的一般思考方式。 Matlab 要求对象在一个向量/数组/矩阵中具有相同的大小/但是应该调用它,因为它经过优化以对矩阵进行操作,并且这些操作非常依赖于矩阵的维度。

在 C++ 中,主要实体是一个对象。与matlab向量最相似的是数组,比如cv::Mat potatoes[30]。然而,即使这样也只需要填充同一类的对象,而不管cv::Mat 内容的大小。

所以,总结一下,你有几个选择:

一个数组,比如cv::Mat crazySocks[42] - 这里需要小心,因为你需要知道会有多少袜子,如果超出数组范围,你可能会出现分段错误 Vinoj John Hosan 建议的矢量,例如std::vector&lt;cv::Mat&gt; jaguars - 这是一个好主意,因为 stl 容器可以对其内容进行一些很好的处理,并且您可以轻松修改矢量的大小。 一个列表,例如std::list&lt;cv::Mat&gt; toFind - 如果您打算经常修改容器的大小,这比向量更好。 前面提到的任何一个,但是带有指针,例如cv::Mat *crazyPointers[33] - 当您要移动一些大对象时,最好只移动有关它们所在位置的信息,而不是对象。cv::Mat 在内部使用它做一些技巧数据,所以不应该这样。

【讨论】:

非常感谢大家。我已经尝试过 std::vector<:mat> ,它非常适合我目前的情况。 @morynicz 再次感谢您的友好建议。但是,我不能事先采用固定大小的数组。但是,我喜欢列表的想法(std::list<:mat> 也。我将尝试一下。 @morynicz:公平地说,通用容器的 MATLAB 等价物是 cell arrays

以上是关于在数据结构中存储不同大小的图像,OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV

在opencv中,图像是以啥数据类型存储的

2019-10-01 opencv图像数据结构之Mat

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

使用 OpenCV 识别模式

使用opencv复制/混合不同大小的图像