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 в целом также содержит метаинформацию об изображении, например количество строк и столбцов.