CV_8UC3和其他类型在OpenCV中代表什么?

What does CV_8UC3 and the other types stand for in OpenCV?

本文关键字:什么 OpenCV 8UC3 其他 类型 CV      更新时间:2023-10-16

当我在OpenCV文档中找不到任何描述各种类型代表什么的内容时,我感到很惊讶,谷歌搜索也没有多大帮助。我知道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))

如文档中所述

列表中的任何基元类型都可以由 表单CV_<bit-depth>{U|S|F}C(<number_of_channels>)

其中 U 是无符号整数类型,S 是有符号整数类型,F 是浮点类型。

所以CV_8UC3是一个具有 3 个通道的 8 位无符号整数矩阵/图像。虽然最常见的是这意味着RGB(或实际上是BGR)图像,但它并不强制要求它。它只是意味着有三个通道,如何使用它们取决于您和您的应用程序。

命名模式描述了数据在PC内存中的实际布局方式,与图像类型没有直接关系。实际上,数据布局和图像类型是分离的。

您可能已经找到了CV_XX模式(即数据布局)的含义。

对于成像数据类型,如果您要求 OpenCV 将图像加载为彩色图像,它会将其加载为 BGR 图像并将其数据布置为CV_8UC3。需要注意的几点:

  • 的,默认通道顺序是 BGR 而不是 RGB。这是一个遗留的顺序,因为在 OpenCV 1.xx 开发时,来自网络摄像头的数字视频源似乎遵循此顺序;
  • 可以使用模块中的类型转换函数 imgproc ,即 cv::cvtColor() 。但是,所有数据布局和图像类型都不兼容,请检查文档;
  • 通常忽略 Alpha 通道。通过忽略,我的意思是cv::imwrite()将写入一个没有 alpha 的 3 通道图像。大多数处理功能要么特定于单通道图像,要么对所有通道应用相同的处理;
  • 当函数接受 (alpha-) 掩码时,它通常是默认为空矩阵的 CV_8UC1 类型的可选参数。

8UC3 可帮助您访问 RGB 数据。它不仅限于图像。您也可以使用它来访问点云中的RGB数据。如果将 RGB 值作为 8UC3 类型的矩阵传递,则可以在可视化项模块中将此值显示为颜色并显示 RGB 点云。