IplImage
里面有什么OpenCV
?你能解释一下它作为一种类型的含义吗?我们应该什么时候使用它?
谢谢。
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.
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也包含有关图像的元信息,例如行数和列数。
IplImage 结构继承自英特尔图像处理库,其中格式是原生的。OpenCV 仅支持可能的 IplImage 格式的子集,如上面的参数列表中所述。
如果您使用 C++,则不要使用 IplImage,因为这仅在 C 程序中使用(IplImage 在 C API 中)。此外,如果您使用 C,则需要在变量名称之前发布 Cv:“CvMat *”“CvPoint" "IplImage" 等。最好使用 C++ 代码,不要使用 Cv: "Mat * " 等,但不能使用 IplImage 类型,而不是 IplImage 你使用 Mat 类型,例如在 findchessboardcorner 函数中。