Подтвердить что ты не робот

Что означает 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))
4b9b3361

Ответ 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, который по умолчанию имеет пустую матрицу.