Mat -> IplImage * преобразование с копией данных
У меня есть следующая функция. Я хочу скопировать некоторые данные из 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;
}
1 ответ
Короткая версия: конвертировать во временную 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(*)
}