OpenCV: IplImage против Mat, что использовать?
Я довольно новичок в OpenCV(около 2 месяцев). У меня есть книга Learning OpenCV от Bradski and Kaehler. Мой вопрос в том, если я хочу сделать все в 2.0+ манере, когда я должен использовать матрицы (Mat) и когда я должен использовать IplImage?
в книге Брэдки говорится заранее (предисловие), что он написан на основе OpenCV 2.0, и он в основном использует IplImage в своем примере кода, но более поздняя онлайн-документация заставляет его звучать так, как будто Mat теперь является универсальным типом данных для изображений, масок, и т. д., Вроде как базовая матрица в Matlab. Это заставляет меня задаться вопросом, следует ли считать iplimage устаревшим.
Итак, я должен полностью избегать IplImages при написании нового кода? Или есть важные вещи, которые IplImages позволяют мне делать, что маты не делают?
спасибо.
10 ответов:
IplImageбыл в OpenCV с самого начала. Это часть интерфейса C для OpenCV. Вам нужно выделить и освободить память дляIplImageструктуры себе. (помнитеcvReleaseImageкоманды?)новая
Matструктура является частью структуры C++. Так что очевидно, что это объектно-ориентированный. Кроме того, он управляет всей памятью для вас! Он отслеживает ссылки на него. Затем количество ссылок идет к нулю, он освобождает автоматически. Это один превосходный особенность!перейти к
Mat. Это должно быть легко перевести код изIplImageштуковина наMatthingy если вы используете какую-то 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