OpenCV Mat 转换为 IplImage*

6

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

IplImage *img;

已转换为 Mat

Mat mt(img);

接下来,将Mat发送到一个函数中,该函数以Mat &m为输入参数。

f(mt);

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

您有任何建议吗?

最好的祝福, Ali


转换Mat mt(img)不会复制图像数据,因此只要您不执行重新分配的操作(例如将mt分配给独立的其他Mat),就无需进行任何操作。 - Barney Szabolcs
3个回答

2
你的答案可以在这里的文档中找到: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。顺便说一句,谢谢你的回答。 - Edi
一个指向IplImage的指针被传递到了一个函数中。在函数内部,一个Mat被填充了一些数据。如果我只是使用*ipl_image = mat;,那么不会复制任何数据,只会进行头文件转换,当我从函数返回时,由于Mat内存空间已经释放,指向它的指针也就无用了。我正在寻找像ipl_img->copy(Mat)这样的东西,它可以将与图像大小相同的Mat数据复制到ipl_image数据中。 - Edi
实际上,这是我的代码: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]); // 我猜这是正确的! .... // 对images[i]进行一些操作 } for (int i = 0; i < num_images; ++i) { srcImage[i] = ?????? } }` - Edi
以下是有关编程的内容,翻译成中文:类似这样应该可以工作,但我正在寻找标准方法 for (int i = 0; i < num_images; ++i) { cvReleaseImage(&srcImage[i]); srcImage[i] = new IplImage(images[i]); } } - Edi

1

对于以下情况:

double algorithm(IplImage* imgin)
{
    //blabla
    return erg;
}

我使用以下方式调用函数:
cv::Mat image = cv::imread("image.bmp");
double erg = algorithm(&image.operator IplImage());

我进行了一些测试,看起来图像对象将管理内存。运算符IplImage()仅构造IplImage的标头。也许这会有用?


0

您可以使用以下表单:

您的代码:

plImage *img;

Mat 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的大小。

希望我能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接