Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CV_8UC3和其他类型在OpenCV中代表什么?_C++_Opencv - Fatal编程技术网

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

C++ CV_8UC3和其他类型在OpenCV中代表什么?,c++,opencv,C++,Opencv,当我在OpenCV文档中找不到任何文字来描述各种类型代表什么时,我感到很惊讶,而谷歌搜索也没有多大帮助。我知道CV_8UC1是灰度的,但CV_8UC3代表什么?是RGB吗?还是你 另外,关于类型_c.h中的其他定义呢(它们也没有注释)。命名约定有什么模式吗?我能从它们的名字解释它们的特征吗,比如颜色等等 #define CV_8UC1 CV_MAKETYPE(CV_8U,1) #define CV_8UC2 CV_MAKETYPE(CV_8U,2) #define CV_8UC3 CV_MAKE

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

另外,关于
类型_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{U|S|F}C()

其中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类型的矩阵传递,则可以在viz模块中将该值显示为颜色,并显示RGB点云

    “它不强制执行”—但我假设像
    cv::imread
    这样的函数将用RGB值填充它们?这取决于传递给
    imread
    的标志。但是如果你通过了
    CV\u LOAD\u IMAGE\u COLOR
    ,那么输出应该始终是BGR,这是OpenCV通常使用的颜色格式。我在帖子中的意思是,仅仅因为矩阵/图像的类型是
    CV\u 8UC3
    ,并不一定意味着它是BGR。它也可能是HSV,或者根本不是颜色信息的东西。它只定义实际结构(即每像素字节数、如何访问它们、实际步幅等)。它不会强迫你用任何特定的方式来解释它们(颜色,多重灰度图像,YUV,…)。@ SasHoalm:实际上更复杂:C++将用RGB填充它们,但是Python使用NUMPY,并且将填充BGR。我假设CVY8UC4将具有alpha通道。是的,alpha通道将存储在第四通道中。我很确定
    cv::imwrite()
    会忽略它,并且需要检查它的
    cv::imwrite()
    。其他函数通常只能处理单通道图像,或者对所有通道应用相同的处理。好的,我选中了,
    cv::imread()。这里的例子:相关的-