Почему в OpenCV cv::Mat::data является указателем на тип uchar? C++
Заметил такую штуку. В OpenCV существует огромное множество типов изображений, они отличаются числом каналов и типом значений внутри. Например обычное трехканальное rgb изображение может характеризоваться uchar'ом, т.е. содержать внутри значение от 0 до 255 (Т.е. каждый канал или цвет - это число от 0 до 255), или char'ом, но тогда значения будут от -128 до 127. Отсюда вопрос, почему cv::Mat::data всегда указатель на uchar? А если я открою изображение в режиме со знаком (char)? Что будет тогда? Если же data всегда от 0 до 255 (uchar), то зачем нужны все эти типы в OpenCV?
Ответы (1 шт):
data не всегда от 0 до 255, достаточно привести в пример формат с 16-битными целыми CV_16U или 32-битными плавающими значениями CV_32F.
Использование указателя на байт удобно, т.к. байт является наименьшей адресуемой единицей.
В общем-то, наиболее общим указательным типом является бестиповый указатель void*, однако его всегда нужно приводить к конкретному типу, а вот для uchar* этого можно избежать в доброй половине случаев использования в OpenCV - как для матриц с байтовым монохромным пикселом, так и для цветных RGB, RGBA при использовании индекса с домножением на 3 или 4.