2

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

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

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

4

2 回答 2

3
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);
}
于 2013-04-22T09:07:16.867 回答
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在内部使用它的数据做一些技巧,所以不应该是这样。
于 2013-04-22T13:22:02.587 回答