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 数据中。 其实这是我的代码:code
int 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* 的转换的主要内容,如果未能解决你的问题,请参考以下文章
将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat