IplImage против CvMat

Я знаю, что многих интересует техническая разница между IplImage и CvMat. (Да, НЕ cv::Mat(*), а CvMat.) Итак, давайте проясним различия с практической точки зрения.

Является ли CvMat версией IplImage с пересчетом ссылок? Является ли CvMat всего лишь оболочкой вокруг IplImage? Если да, то почему они также разработали CvMat?

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

В чем преимущество использования IplImage вместо более новых структур?

(*)(Я поместил здесь также тег c++, так как многие люди используют его и с c++, а также некоторые библиотеки предпочитают IplImage.)


person Barney Szabolcs    schedule 09.12.2012    source источник


Ответы (3)


IplImage поступил из библиотеки обработки изображений Intel, согласно документам: http://opencv.willowgarage.com/documentation/basic_structures.html#iplimage

Этот вопрос также касается структуры CvMat, которая может быть вам полезна: Какова структура памяти cvMat OpenCV?

Что касается того, что более выгодно: хотя здесь или там могут быть небольшие различия в скорости с CvMat или IplImage в разных контекстах — это зависит от того, что вы хотите сделать. Например. вам нужно разделить матричную структуру в памяти? Вам нужна эффективная сериализация, поиск и т. д.? Приложение имеет значение.

(Теоретически одно из преимуществ, предлагаемых IplImage, заключается в том, что из-за его родословной он обычно более совместим с существующими реализациями, как вы заметили.)

person fish2000    schedule 09.12.2012
comment
Я имел в виду совместное использование памяти, например, динамическое повторное использование выделенной памяти на месте в качестве какой-либо другой структуры, которая не была ясной из моего комментария (мои извинения)... например. аналогично тому, как вы можете просто memcpy() экземпляров CImg напрямую использовать в качестве IplImage экземпляров (см. .h#L278" rel="nofollow noreferrer">github.com/fish2000/cython-imaging/blob/master/CIL/ext/include/), если их цветовые каналы расположены в правильном порядке. В зависимости от ваших потребностей структура IplImage может помочь вам в этом случае, а может и не помочь. - person fish2000; 09.12.2012
comment
... кстати, я на самом деле понятия не имею, существует ли схема подсчета ссылок для любой структуры (хотя я сомневаюсь в этом), навскидку. - person fish2000; 09.12.2012

Я рекомендую вам прочитать параграф Примитивные типы данных OpenCV из книги Изучение OpenCV. Есть большое и хорошее объяснение разницы между этими двумя типами данных.

person ArtemStorozhuk    schedule 09.12.2012
comment
Благодарность! Я не знаю, как я мог забыть посмотреть на эту часть, +1. - person Barney Szabolcs; 09.12.2012

Отвечая на ваш вопрос:

В чем преимущество использования IplImage вместо более новых структур?

Может быть, нет. По какой-то причине он устарел разработчиками, я предполагаю, что причина, по которой вы все еще часто его находите, заключается в устаревшем коде; потому что люди все еще следуют старым образцам кода, не зная, что структура устарела, и потому что «Изучение OpenCV первое издание» устарело в отношении сигнатур функций opencv и структур данных, но за ним все еще следуют многие людей, начиная с opencv.

Для справки: Learning OpenCV 2nd edition должен выйти в марте 2013 года, но не не цитируй меня по этому поводу ;)

person Rui Marques    schedule 09.12.2012
comment
Когда я начал экспериментировать с устаревшим IplImage (вместо cv::Mat), некоторые функции были написаны там на удивление хорошо, и у меня был более жесткий контроль над памятью. Я чувствовал, что могу лучше повторно использовать выделение памяти. (По какой-то причине утечка cv::Mat на Mac, а IplImage - нет.) - person Barney Szabolcs; 09.12.2012