我有以下函数。我想将一些数据从Mat
复制回键入IplImage *
并将其返回到主控件。这很傻,但我找不到合适的方法!骗子工作表没有说明Mat->IplImage *
与数据的转换副本(因为我需要它在功能之外)。
任何想法或指示都将不胜感激。最好的--阿里
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 should be correct!
....
// some manipulations on images[i]
}
// this should be wrong!
for (int i = 0; i < num_images; ++i)
{
cvReleaseImage(&srcImage[i]);
srcImage[i] = new IplImage(images[i]);
images[i].clear();
}
return 0;
}
短版本:转换为临时IplImage
,然后使用cvCopy
。
然而,您的代码有几个问题:
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 should be correct!
到目前为止,是的。
....
// some manipulations on images[i]
如果操作到位(不要重新分配Mat
),就不需要将数据复制回来,因为Mat
构造函数一开始就没有复制数据。如果你重新分配,那么。。。
}
// this should be wrong!
for (int i = 0; i < num_images; ++i)
{
cvReleaseImage(&srcImage[i]);
这可能会有问题。CCD_ 8可能仍在使用相同的存储器。
srcImage[i] = new IplImage(images[i]);
new IplImage
不会对你有任何好处。它没有有意义的构造函数,请使用cvCreateImage
。
images[i].clear();
这是不必要的,因为矢量无论如何都超出了范围。
}
return 0;
}
最后一个循环应该是这样的:
for (int i = 0; i < num_images; ++i) {
IplImage* old = srcImage[i]; // store pointer for later deallocation in case of shared data
IplImage src = images[i];
srcImage[i] = cvCreateImage(...); // fill appropriate parameters here. If you didn't change size/type/etc, you might not need to create/deallocate(*)
cvCopy(&src, srcImage[i]);
cvReleaseImage(&old); // now it is safe to deallocate(*)
}