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 позволяют мне делать, что маты не делают?
Спасибо.
Ответы
Ответ 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.