Что означает CV_8UC3 и другие типы в OpenCV?
Я был удивлен, когда я не мог найти ничего в документации OpenCV, описывающей - со словами - то, что разные типы, и Googling тоже не помог. Я знаю, что CV_8UC1 имеет серый цвет, но что означает CV_8UC3? Это RGB? Или YUV?
Также, как насчет других определений от types_c.h
(у них также нет комментариев). Есть ли образец того, что такое соглашение об именах? Могу ли я интерпретировать из своих имен, каковы их функции, такие как цвета и т.д.?
#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
Ответы
Ответ 1
Как указано в документации
Любой примитивный тип из списка может быть определен идентификатором в форма CV_<bit-depth>{U|S|F}C(<number_of_channels>)
где U - целочисленный тип без знака, S - целочисленный тип со знаком, а F - тип float.
поэтому CV_8UC3
представляет собой 8-разрядную целую матрицу/изображение без знака с тремя каналами.
Хотя чаще всего это означает изображение RGB (или фактически BGR), оно не предусматривает его.
Это просто означает, что есть три канала, и как вы их используете, зависит от вас и вашего приложения.
Ответ 2
Схема именования показывает, как данные фактически выложены в памяти ПК и не имеет прямого отношения к типу изображения.
Фактически, формат данных и тип изображения разделены.
Вероятно, вы обнаружили значение для шаблона CV_XX (т.е. расположение данных).
Для типа изображений с изображениями, если вы попросите OpenCV загрузить изображение в качестве цветного изображения, он загрузит его как изображение BGR и выведет его данные как CV_8UC3.
Несколько вещей, о которых нужно знать:
- да, порядок каналов по умолчанию BGR, а не RGB. Это устаревший заказ, потому что цифровые видеоролики из веб-камер, похоже, следовали этому порядку, когда разрабатывался OpenCV 1.xx;
- вы можете использовать функции преобразования типов из модуля
imgproc
, а именно cv::cvtColor()
. Однако все макеты данных и типы изображений несовместимы, проверьте doc;
- альфа-канал обычно игнорируется. Путем игнорирования я имею в виду, что
cv::imwrite()
будет писать трехканальное изображение без альфы, например. Большинство функций обработки будут либо специфичными для одноканальных изображений, либо одинаковой обработкой для всех каналов;
- когда функция принимает (альфа-) маску, обычно это необязательный параметр типа
CV_8UC1
, который по умолчанию имеет пустую матрицу.