Подтвердить что ты не робот

OpenCV: IplImage против Mat, который использовать?

Я новичок в OpenCV (около 2 месяцев). У меня есть книга Learning OpenCV от Bradski и Kaehler. Мой вопрос заключается в том, что если я хочу делать все в 2.0+, когда следует использовать Matrices (Mat) и когда следует использовать IplImage?

Bradky book утверждает, что он написан на основе OpenCV 2.0, и он в основном использует IplImage в своем примере кода, но в более поздней онлайн-документации это звучит так, как Mat теперь представляет собой полный тип данных для изображений, маски и т.д., как базовая матрица в Matlab. Это оставляет мне интересно, следует ли считать IplImage устаревшим.

Итак, должен ли я полностью избегать IplImages при написании нового кода? Или есть важные вещи, которые IplImages позволяют мне делать, что маты не делают?

Спасибо.

4b9b3361

Ответ 1

IplImage находится в OpenCV с самого начала. Он является частью интерфейса C для OpenCV. Вам нужно выделить и освободить память для структур IplImage самостоятельно. (помните команды cvReleaseImage?)

Новая структура Mat является частью структуры С++. Очевидно, что это объектно-ориентированная. Кроме того, он управляет всей памятью для вас! Он отслеживает ссылки на него. Затем количество ссылок обращается в нуль, оно автоматически освобождается от необходимости. Это одна превосходная функция!

Перейдите к Mat. Вы должны легко перевести код из IplImage thingy в тег Mat, если вы используете некоторую среду IDE с Intellisense (она сбрасывает список возможных функций, переменных и т.д. По мере ввода)

Ответ 2

Я бы очень рекомендовал использовать Mat. Я использовал его некоторое время, и это здорово. Функции-члены и выражения в матрицах делают вещи намного проще, чем дело с IplImage и, как вы сказали, это тип данных catch-all.

Перейдите к Mat!

Ответ 3

Я бы сказал, что это будет зависеть от платформы, на которую вы собираетесь запускать свое приложение. Если вы разрабатываете приложение для встроенной системы, вы, скорее всего, будете использовать C. В этом случае вам придется использовать IplImage. Цитирование из tutorial:

Основным недостатком интерфейса С++ является то, что многие встроенные системы разработки на данный момент поддерживают только C. Поэтому, если только вы ориентируетесь на встроенные платформы, нет смысла использовать старые методы (если вы не мазохист-программист, а вы спрашиваете для проблем).

Ответ 4

спасибо за помощь.

Я также обнаружил после публикации этого вопроса, что функция с Mat в качестве аргумента может принимать IplImage непосредственно вместо этого аргумента Mat, что позволяет довольно легко обновить код в кусках, если он уже разбит на удобные функции. Просто измените аргументы функции с IplImage* на Mat, затем измените функцию для работы с Mat. Другой код, вызывающий эту функцию, должен все еще работать нормально (он имеет в моем опыте).

Ответ 5

Я предлагаю Мату. Сбор мусора является автоматическим, и, таким образом, приложение является более надежным и имеет меньше утечек памяти. Кроме того, Mat - это новый способ хранения данных, поэтому, если вы новичок, просто начиная с OpenCV, Mat является более новым и требует менее тщательного кодирования для создания полного приложения.

Совместимость - это одно, что Mat будет немного хуже. IplImage был доступен дольше и, следовательно, имеет большую совместимость с большинством вещей. Я считаю, что вы можете использовать IplImage с Mat тоже, а если нет, то IplImage > Mat также довольно просто выполнить.

Поскольку Iplimage доступен в течение более длительного периода времени, вы, вероятно, найдете больший выбор образцов.

Вот мои два цента: Как новобранец (все еще обучающий трюк) в обработке зрения с помощью OpenCV, выберите один, Mat или IplImage и получите действительно хорошее. Однако изучите, по крайней мере, основы другого, чтобы вы знали, что делать, если вам нужно использовать функцию, которая не совместима с другой.

Но повторить, если вы новичок, попробуйте начать с Mat. Поскольку это более новая реализация, ее легче освоить и получить правильно!

Ответ 6

Mat намного проще и проще в использовании. Он представляет собой изображение в виде матрицы. это тоже быстрее. Я бы порекомендовал Mat над IplImage.

Ответ 7

Iplimage - это некоторая структура интерфейса C в Opencv, а Mat более подходит для С++-программы и поддерживает некоторые стили С++, такие как ref parameter и stream operator и т.д. Хотя это все объектно-ориентированное программирование, Mat включает больше методов, чем Iplimage делает, как создание и выпуск, который Ipliamge вызовет некоторый интерфейс cvXXX для завершения. Более того, Mat - новая структура из Opencv2, которая, я думаю, является символом развития для старых. Я хочу, чтобы это помогло.

Ответ 8

Я считаю, что использование cv:: Mat намного удобнее. он более общий. Мы можем видеть, что IplImage является подмножеством cv:: Mat. Тип данных по умолчанию для IplImage - это целое число без знака, а для cv:: Mat - двойное. Поэтому гораздо проще использовать Mat для любой математической операции.

Ответ 9

Я начал использовать opencv примерно в 2012 году или около того. Так что я начал с Mat, который является мощным и простым в использовании. BUT для чтения или повторного использования этого кода, который был "старым", мне пришлось рассказывать о iplimages, это прост в использовании, также. Но будущее - это Mat, я думаю. И не забывайте Mat в CLASS, это означает, что вам не нужно выпускать Mat.On с другой стороны, вы ДОЛЖНЫ освободить импликацию. Мой английский плохой, извините.

Ответ 10

При написании процедуры обнаружения Blob Я заметил, что использование

IplImage* img;
uchar* image_src = (uchar*)img->imageData;
image_src[x+y*width] = ...;

Это намного быстрее, чем при использовании

Mat image;
image.at<uchar>(x,y) = ...;

Примерно в 5 раз быстрее. Некоторые из этого могут быть связаны с тем, что я использовал вложенный цикл X, Y для Mat и один цикл для IplImage. Но если вам нужно написать какие-либо подпрограммы, которые работают непосредственно с пикселей, я бы придерживался IplImage.