我有以下功能。我想将Mat
的一些数据复制回来
IplImage *
键入并将其返回到主控件。
这很愚蠢,但我找不到合适的方法来做到这一点!作弊
表格没有说明有关Mat->IplImage *
转化数据的任何信息
复制(因为我需要在函数之外)。
任何想法或指针都表示赞赏。 最好 --Ali
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;
}
答案 0 :(得分:2)
简短版本:转换为临时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
s),则不需要复制数据,因为Mat
构造函数没有&#39 ; t首先复制数据。如果你重新分配,那么......
}
// this should be wrong!
for (int i = 0; i < num_images; ++i)
{
cvReleaseImage(&srcImage[i]);
这可能有问题。 images[i]
可能仍在使用相同的内存。
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(*)
}