Короткая версия: преобразовать во временную 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
не копировал данные в первую очередь. Если перераспределить, то ...
}
// 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(*)
}