OpenCV - 如何以 Mat 形式编写 IplImage 数组?

Posted

技术标签:

【中文标题】OpenCV - 如何以 Mat 形式编写 IplImage 数组?【英文标题】:OpenCV - How to write IplImage array in Mat form? 【发布时间】:2015-11-24 02:06:11 【问题描述】:

我的旧项目是用 C 编写的,其中包含很多“IplImage”。

这是一个例子,

IplImage** img_array = new IplImage* [img_number];
for(int i = 0; i < img_number; i++)

    img_array[i] = cvCreateImage(cvSize(320, 240), IPl_DEPTH_8U, 3);
    cvSet(img_array[i], cvScalar(0, 0, 0));

.
.
.
.
.
for(int i = 0; i < img_number; i++)

    cvReleaseImage(&img_array[i]);

delete[] img_array;

现在我必须将我的项目重写为 C++ 形式,我应该使用 cv::Mat。

但是,我不确定将上面的代码写入 cv::Mat 的相同方式吗?

我试过这样写:

int dims[] = img_number, 320, 240;
cv::Mat img_array(3, dims, CV_8UC3);

虽然一切看起来都不错,但是说到一行:

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

    img_array[i] = random_img.clone();

显示错误:

C2676:binary operator'[':'cv::Mat'does not define this operator or a conversion to a type acceptable to the predefined operator

之后我找到了另一种可能的方式,但需要使用向量:

vector<Mat> img_array;
for(int i = 0 ; i < img_number; i++)

    img_array.push_back(random_img.clone());

我还没有实现,不知道这是否是我想要的解决方案?

欢迎任何建议。

【问题讨论】:

一定要用vector&lt;Mat&gt;!!! 【参考方案1】:

您应该将cv::Mat 类视为旧IplImage* 的替代品。您使用的构造函数应该创建一个多维 cv::Mat 实例,这可能不是您要寻找的。根据您基于 IplImage* 的代码,您可能试图从一组 IplImage 指针创建一组 Mat 图像。为此,这个 ctor 会更好地发挥作用:

Mat::Mat(const IplImage* img, bool copyData=false)

如果您将copyData 参数设置为true,则构造函数将复制IplImage* 的内容并像往常一样控制新的数据缓冲区(引用计数、正确释放等)如果您设置了它为 false,将使用原始 IplImage* 数据,您必须注意在完成 cv::Mat 实例之前不要释放它。

原始文档是here

而且,是的,通常最好将 cv::Mat 实例放入向量中。在这种情况下,Mats 使用的内存将在向量超出范围时自动释放(除非您创建了其他一些引用原始数据的cv::Mats,但这是另一回事)

编辑 看来不推荐使用上面的 Mat 构造函数。您应该改用cvarrToMat() 函数,正如this 问题的答案中所建议的那样

【讨论】:

感谢您的建议

以上是关于OpenCV - 如何以 Mat 形式编写 IplImage 数组?的主要内容,如果未能解决你的问题,请参考以下文章

opencv如何计算图像中物体的像素值

从 Mat 元素到 IplImage 的 opencv 转换 *

当我想将 IpLmage 转换为 mat、opencv 时遇到了一些错误

opencv中Mat数据怎么保存为JPG格式的图片

将 CV_16SC2 Mat 保存到文件 OpenCV

在android上的opencv中创建yuv mat