我有以下功能。我想从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]);
这可能是有问题的。
images[i]
可能仍在使用相同的内存。 srcImage[i] = new IplImage(images[i]);
new IplImage
对您没有任何好处。它没有有意义的构造函数,请使用cvCreateImage
。 images[i].clear();
由于 vector 始终超出范围,因此这不是必需的。
}
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(*)
}
关于opencv - Mat-> IplImage *转换为数据副本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6145661/