在数据结构中存储不同大小的图像,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<cv::Mat> jaguars
- 这是一个好主意,因为 stl 容器可以对其内容进行一些很好的处理,并且您可以轻松修改矢量的大小。
一个列表,例如std::list<cv::Mat> toFind
- 如果您打算经常修改容器的大小,这比向量更好。
前面提到的任何一个,但是带有指针,例如cv::Mat *crazyPointers[33]
- 当您要移动一些大对象时,最好只移动有关它们所在位置的信息,而不是对象。cv::Mat
在内部使用它做一些技巧数据,所以不应该这样。
【讨论】:
非常感谢大家。我已经尝试过 std::vector<:mat> ,它非常适合我目前的情况。 @morynicz 再次感谢您的友好建议。但是,我不能事先采用固定大小的数组。但是,我喜欢列表的想法(std::list<:mat> 也。我将尝试一下。 @morynicz:公平地说,通用容器的 MATLAB 等价物是 cell arrays以上是关于在数据结构中存储不同大小的图像,OpenCV的主要内容,如果未能解决你的问题,请参考以下文章