18

IplImage里面有什么OpenCV?你能解释一下它作为一种类型的含义吗?我们应该什么时候使用它?

谢谢。

4

4 回答 4

25

Based on the 'c++' tag you have in your question: You should not use it, you should use cv::Mat. Every IplImage is a cv::Mat internally.

IplImage is only used in the C API. It is a kind of CvMat and holds image data. Its name originates from OpenCV's roots (Intel IPL).

It is not relevant anymore if you use the C++ API of OpenCV.

于 2011-03-04T10:37:01.070 回答
23

IplImage 和 cv::Mat 是矩阵/图像数据的不同标头类型。它们基本上相互兼容,但 IplImage 用于 OpenCV 的 C API,而 cv::Mat 用于的C++ API。

当您决定使用 OpenCV 的 C API 时,您将主要使用 IplImages。否则,您将主要使用 cv::Mats。

当然,您可以将 IplImages 和 cv::Mats 相互转换,例如

cv::Mat mat(myIplImage);

在这种情况下,它们共享相同的基础数据,即无论您使用什么标题访问数据,通过任一标题所做的修改都是可见的。

深拷贝(不仅标头被“转换”/复制,而且底层数据也是可能的)

cv::Mat mat(myIplImage, true)

请注意,多个 IplImage 也可以指向相同的基础数据,多个 cv::Mats 也可以。


在使用 OpenCV 和类似库时,重要的是要注意 cv::Mats 和 IplImages 只是实际数据的“标题”。你可以说 cv::Mats 和 IplImages 基本上是指针加上重要的元信息,如行数、列数、通道数和用于矩阵/图像的单个单元格/像素的数据类型。而且,就像真实的指针一样,它们可以引用/指向相同的真实数据。

比如看IplImage的定义:http: //opencv.willowgarage.com/documentation/basic_structures.html#iplimage

最重要的成员是char *imageData;。该指针引用实际的图像数据。但是,整个 IplImage包含有关图像的元信息,例如行数和列数。

于 2011-09-18T22:52:21.580 回答
2

IplImage 结构继承自英特尔图像处理库,其中格式是原生的。OpenCV 仅支持可能的 IplImage 格式的子集,如上面的参数列表中所述。

于 2012-05-16T20:06:16.707 回答
1

如果您使用 C++,则不要使用 IplImage,因为这仅在 C 程序中使用(IplImage 在 C API 中)。此外,如果您使用 C,则需要在变量名称之前发布 Cv:“CvMat *”“CvPoint" "IplImage" 等。最好使用 C++ 代码,不要使用 Cv: "Mat * " 等,但不能使用 IplImage 类型,而不是 IplImage 你使用 Mat 类型,例如在 findchessboardcorner 函数中。

于 2015-01-04T12:50:21.773 回答