OpenCvSharp中CV_8UC1,CV_8UC2等参数的解释

Mat矩阵(图像容器)创建时CV_8UC1,CV_8UC2等参数介绍

Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类;

创建一个Mat对象的方法很多,我拿出其中一个重载的参数的MatType来解释一下

 

这里的type可以是任何的预定义类型,预定义类型的结构如下所示:

CV_<bit_depth>(S|U|F)C<number_of_channels>

1、bit_depth --- 比特数 --- 代表8bite,16bites,32bites,64bites --- 举个例子吧--比如说:

如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位--所以它对应的就是CV_8

2、S|U|F

  S--代表---signed int---有符号整形

U--代表--unsigned int--无符号整形

F--代表--float---------单精度浮点型

3、C<number_of_channels> ---- 代表 --- 一张图片的通道数,比如:

1--灰度图片--grayImg---是--单通道图像

2--RGB彩色图像---------是--3通道图像

3--带Alph通道的RGB图像--是--4通道图像  //貌似是透明度,有待认证


2020年12月16日补充:S|U|F——有符号整形\无符号整形\单精度浮点型

最小的数据类型可能是 char 类型,这意味着一个字节或 8 位。这可能是有符号(值-127 到 + 127)或无符号(以便可以存储从 0 到 255 之间的值)。虽然这三个组件的情况下已经给 16 万可能的颜色来表示 (如 RGB 的情况下) 我们可能通过使用浮点数 (4 字节 = 32 位) 或double(8 字节 = 64 位) 数据类型的每个组件获得甚至更精细的控制。然而,请记住增加组件的大小也会增加在内存中的整张图片的大小。

• CV_8U-8 位无符号整数 (0…..255)

• CV_8S-8 位符号整数 (-128…..127)

• CV_16U-16 位无符号整数 (0……65535)

• CV_16S-16 位符号整数 (-32768…..32767)

• CV_32S-32 位符号整数 (-2147483648……2147483647)

• CV_32F-32 位浮点数 (-FLT_MAX ………FLT_MAX,INF,NAN)

• CV_64F-64 位浮点数(-DBL_MAX ……….DBL_MAX,INF,NAN)


OpenCv中来看一下CV_8UC1,CV_64FC3等这些宏到底是什么,OpenCv的源代码显示如下(源代码在在types_c.h中):

#define CV_CN_MAX     512
#define CV_CN_SHIFT   3
#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)
 
#define CV_8U   0
#define CV_8S   1
#define CV_16U  2
#define CV_16S  3
#define CV_32S  4
#define CV_32F  5
#define CV_64F  6
#define CV_USRTYPE1 7
 
#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)
 
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
#define CV_MAKE_TYPE CV_MAKETYPE
 
#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))

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个异常的意思是输入的 Mat 对象的类型和大小与 Mask(掩膜)的类型和大小不匹配,可能会导致矩阵计算失败。通常情况下,这个异常出现的原因有以下几种: 1. Mat 对象和掩膜的类型不匹配,例如 Mat 对象是 CV_32F 类型,而掩膜是 CV_8UC1 类型; 2. Mat 对象和掩膜的大小不匹配,例如 Mat 对象的大小是 640x480,而掩膜的大小是 320x240; 3. Mat 对象或掩膜为空,即没有分配内存空间。 解决这个异常的方法通常有以下几种: 1. 检查输入的 Mat 对象和掩膜的类型和大小是否匹配,可以使用 Mat.Type 方法获取 Mat 对象的类型,使用 Mat.Size 方法获取 Mat 对象的大小; 2. 检查输入的 Mat 对象和掩膜是否为空,可以使用 Mat.Empty 属性检查 Mat 对象是否为空; 3. 使用 Debug 或 Trace 等工具,打印出异常发生的位置和相关信息,以便更好地定位问题。 下面是一个示例代码,用于检查 Mat 对象和掩膜是否匹配: ```csharp Mat src = Cv2.ImRead("image.jpg", ImreadModes.Color); Mat mask = Cv2.ImRead("mask.jpg", ImreadModes.GrayScale); if (src.Type() != mask.Type() || !src.Size().Equals(mask.Size())) { throw new OpenCVException("Mat and mask do not match."); } ``` 在上面的代码,首先使用 ImRead 方法读取一张彩色图像和一张灰度图像,然后使用 Type 和 Size 方法检查 Mat 对象和掩膜的类型和大小是否匹配,如果不匹配则抛出异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值