OpenCV - IplImage - PullRequest
       44

OpenCV - IplImage

16 голосов
/ 04 марта 2011

Что такое IplImage в OpenCV? Можете ли вы просто объяснить, что подразумевается под этим типом? Когда мы должны его использовать?

Спасибо.

Ответы [ 4 ]

23 голосов
/ 04 марта 2011

На основании тега 'c ++', который у вас есть в вашем вопросе: Вы не должны использовать его, вы должны использовать cv :: Mat. Каждый IplImage является внутренним cv :: Mat.

IplImage используется только в C API. Это своего рода CvMat и содержит данные изображения. Его название происходит от корней OpenCV (Intel IPL).

Это больше не актуально, если вы используете C ++ API OpenCV.

22 голосов
/ 19 сентября 2011

IplImage и cv :: Mat - это разные типы заголовков для данных матрицы / изображения.Они в основном совместимы друг с другом, но IplImage используется в C API OpenCV, а cv :: Mat используется в new C ++ API.

Когда вы решите использовать C OpenCVAPI, вы будете в основном использовать IplImages.В противном случае вы в основном будете использовать cv :: Mats.

. Конечно, вы можете конвертировать IplImages и cv :: Mats друг в друга, например,

cv::Mat mat(myIplImage);

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

Глубокое копирование (не только заголовок "преобразован" / скопирован, но также и базовые данные) возможно с

cv::Mat mat(myIplImage, true)

Обратите внимание, что несколько IplImages могут также указывать на одни и те же базовые данные, как и несколько cv :: Mats.


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

Например, посмотрите на определение IplImage: http://opencv.willowgarage.com/documentation/basic_structures.html#iplimage

Самый важный участник - char *imageData;.Этот указатель ссылается на фактические данные изображения.Однако IplImage в целом также содержит метаинформацию об изображении, например количество строк и столбцов.

2 голосов
/ 17 мая 2012

Структура IplImage была унаследована от библиотеки обработки изображений Intel, в которой формат является собственным.OpenCV поддерживает только подмножество возможных форматов IplImage, как указано в списке параметров выше.

0 голосов
/ 04 января 2015

Если вы используете C ++, вы не используете IplImage, потому что это используется только в программе на C (IplImage в C API). Кроме того, если вы используете C, вам нужно опубликовать Cv перед именами переменных: "CvMat *", "CvPoint ", "IplImage " и т. Д. Лучше использовать код C ++, вы не используете Cv: "Mat *" и т. Д., Но вы не можете использовать тип IplImage, вместо IplImage вы используете тип Mat, например, в функции findchessboardcorner.

...