OpenCV Mat 到 IplImage* 的转换

Posted

技术标签:

【中文标题】OpenCV Mat 到 IplImage* 的转换【英文标题】:OpenCV Mat to IplImage* conversion 【发布时间】:2011-05-24 16:59:16 【问题描述】:

我有一个指向图像的指针:

IplImage *img;

已转换为Mat

Mat mt(img);

然后,Mat 被发送到一个函数,该函数获取对 Mat 的引用作为输入 void f(Mat &m);

f(mt);

现在我想将Mat 数据复制回原始图像。

你有什么建议吗?

最好的 阿里

【问题讨论】:

转换Mat mt(img) 不会对图像数据进行任何复制,因此您无需执行任何操作,只要您不执行重新分配的操作(例如,将 mt 分配给一个独立的其他垫子)。 【参考方案1】:

您的答案可以在此处的文档中找到:http://opencv.willowgarage.com/documentation/cpp/c++_cheatsheet.html

编辑:

第一个代码区域的前半部分确实谈到了您已经拥有的复制构造函数。

第一个代码区域的后半部分回答了您的问题。为清楚起见,转载如下。

//Convert to IplImage or CvMat, no data copying
IplImage ipl_img = img;
CvMat cvmat = img; // convert cv::Mat -> CvMat

【讨论】:

备忘单只是谈到了复制构造函数,而不是我要找的。我有一个已经填充的图像和一个 Mat 应该复制到图像的数据部分。顺便说一句,感谢您的回答。 指向 IplImage 的指针已传递给函数。在函数内部,一个 Mat 已被一些数据填充。如果我只使用 *ipl_image = mat;不会复制任何数据,只会进行标头转换,当我从函数返回时,由于 Mat 内存空间已释放,指向它的指针也无用。我正在寻找类似 ipl_img->copy(Mat) 的东西,它将具有相同图像大小的 Mat 数据复制到 ipl_image 数据中。 其实这是我的代码:codeint test(IplImage **srcImage, int num_images) vector<Mat> images(num_images); for (int i = 0; i < num_images; ++i) images[i] = Mat(srcImage[i]); // I guess this is correct! .... // some manipulation on images[i] for (int i = 0; i < num_images; ++i) srcImage[i] = ?????? 这样的东西应该可以工作,但我正在寻找一种标准的方式for (int i = 0; i < num_images; ++i) cvReleaseImage(&srcImage[i]); srcImage[i] = new IplImage(images[i]); 【参考方案2】:

对于以下情况:

double algorithm(IplImage* imgin)

    //blabla
    return erg;

我使用如下方式调用函数:

cv::Mat image = cv::imread("image.bmp");
double erg = algorithm(&image.operator IplImage());

我做了一些测试,图像对象将如何管理内存。运算符IplImage() 只会构造IplImage 的标头。也许这可能有用?

【讨论】:

【参考方案3】:

你可以使用这个表格:

您的代码:

plImage *img;

垫 mt(img);

f(mt);

现在将 Mat 数据复制回原始图像。

img->imageData = (char *) mt.data;

你也可以复制数据而不是指针:

memcpy(mt.data, img->imageData, (mt.rows*mt.cols));

(mt.rows*mt.cols) 是将 mt 的所有数据复制到 img 时应使用的大小。

希望我能帮上忙

【讨论】:

以上是关于OpenCV Mat 到 IplImage* 的转换的主要内容,如果未能解决你的问题,请参考以下文章

opencv:将iplimage转换为mat后出错

opencv编程中cvMat到Mat如何进行数据转换?

OpenCV 用 Mat 替换 IplImage

OpenCV:Mat,IplImage,CvMat类型转换

opencv mat转IplImage*

将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat