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



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



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



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



спасибо.

742   10  

10 ответов:

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

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

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

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

перейти к Mat!

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

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

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

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

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

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

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

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

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

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

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

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

Я начал использовать opencv примерно в 2012 году или около того .Поэтому я начал с мата,который является мощным и простым в использовании.Но чтобы прочитать или повторно использовать этот код, который был "старым", мне пришлось kown sth о iplimages,он также прост в использовании. Но будущее-это мат,я думаю.И не забудьте коврик в классе,то есть, вам не нужно выпускать коврик.С другой стороны, вы должны освободить имплимаж. Мой английский беден,извините.

при написании процедуры обнаружения больших двоичных объектов Я заметил, что с помощью

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.

Comments

    Ничего не найдено.