【问题标题】:What does CV_8UC3 and the other types stand for in OpenCV?CV_8UC3 和其他类型在 OpenCV 中代表什么?
【发布时间】:2015-01-26 20:02:12
【问题描述】:

当我在 OpenCV 文档中找不到任何描述 - 用文字 - 各种类型代表什么的东西时,我感到很惊讶,而且谷歌搜索也没有多大帮助。我知道 CV_8UC1 是灰度的,但是 CV_8UC3 代表什么?是RGB吗?还是 YUV?

另外,types_c.h 的其他定义呢(它们也缺少 cmets)。命名约定有什么模式吗?我可以从他们的名字解释他们的特征,比如颜色等吗?

#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))

【问题讨论】:

标签: c++ opencv


【解决方案1】:

the documentation中所述

列表中的任何原始类型都可以由标识符定义 表格CV_<bit-depth>{U|S|F}C(<number_of_channels>)

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

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

【讨论】:

  • “它没有强制要求” - 但我假设像 cv::imread 这样的函数会用 RGB 值填充它们?
  • 这取决于传递给imread 的标志。但是如果你通过CV_LOAD_IMAGE_COLOR,那么输出应该总是BGR,这是OpenCV通常使用的颜色格式。
  • 我在帖子中的意思是,仅仅因为矩阵/图像具有CV_8UC3 类型并不一定意味着它是 BGR。它也可能是 HSV,或者根本不是颜色信息的东西。
  • @HannesOvrén 没错。它只是定义了实际的结构(即每个像素的字节数、如何访问它们、实际的步幅等)。它不会强迫你以任何特定的方式来解释它们(颜色、多个灰度图像、yuv,...)。
  • @sashoalm:实际上更复杂:C++ 会用 RGB 填充它们,但 Python 使用 numpy,并且会用 BGR 填充。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我假设 CV_8UC4 会有 alpha 通道?
  • 是的,alpha 通道将存储在第 4 个通道中。我很确定cv::imwrite()忽略它,但需要检查cv::imwrite()。其他功能通常要么仅适用于单通道图像,要么将相同的处理平等地应用于所有通道。
  • 好的,我检查了,cv::imread() 可以加载 alpha 通道(选项:as_is)或删除它(选项:load_colour)。此处示例:docs.opencv.org/doc/tutorials/introduction/display_image/…
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2021-02-01
    • 2017-08-27
    • 2020-01-18
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多