标定系列——OpenCV中的CV_8UC1、CV_16UC1、CV_32FC1等对应的整数值及计算方法(二十五)

news/2024/11/15 6:16:41/

标定系列——OpenCV中的CV_8UC1、CV_16UC1、CV_32FC1等对应的整数值及计算方法(二十五)

  • 1.代码段
  • 2.计算方法举例
  • 3.直接给出其余对应结果

1.代码段

以下取自OpenCV文档

#define 	CV_BIG_INT(n)   
#define 	CV_BIG_UINT(n)   
#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.计算方法举例

根据提供的宏定义,CV_8UC1 是通过 CV_MAKETYPE 宏定义的一个数据类型标识符,它结合了数据深度 CV_8U 和通道数 1。

1)首先,需要知道 CV_8U 和 CV_CN_SHIFT 的值。
根据代码:
CV_8U 表示8位无符号整数,对应的整数值是 0。
CV_CN_SHIFT 表示通道数的位移量,其值是 3。

2)CV_MAT_DEPTH_MASK 是用来获取数据深度的掩码,它定义为 (1 << CV_CN_SHIFT) - 1。
根据 CV_CN_SHIFT 的值,CV_MAT_DEPTH_MASK 计算如下:
1 << CV_CN_SHIFT = 1 << 3 = 8
(1 << CV_CN_SHIFT) - 1 = 8 - 1 = 7
所以,CV_MAT_DEPTH_MASK 的值是 7。

3)使用 CV_MAKETYPE 宏来计算 CV_8UC1 的整数值:

CV_MAKETYPE(CV_8U, 1) = (CV_MAT_DEPTH(CV_8U) + ((1 - 1) << CV_CN_SHIFT))
由于 CV_8U 对应的整数值是 0,并且 1 - 1 等于 0,
所以:
CV_MAKETYPE(0, 0) = (0 + (0 << 3))
左移操作 0 << 3 的结果仍然是 0,因为任何数左移0位都保持不变。
所以:
CV_MAKETYPE(0, 0) = 0 + 0 = 0
因此,CV_8UC1 对应的整数值是 0。这意味着它表示一个8位单通道图像,其中单通道(灰度图像)的数据类型是无符号整数。

说明:
根据提供的代码,CV_MAKETYPE(depth, cn) 宏的定义如下:
#define CV_MAKETYPE(depth, cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
其中,CV_MAT_DEPTH(depth) 是一个提取数据类型深度的宏,而 ((cn)-1) << CV_CN_SHIFT) 计算的是通道数部分的值。

根据之前的讨论,我们知道:

CV_CN_SHIFT 是通道数在数据类型标识符中左移的位数。
CV_MAT_DEPTH(depth) 是数据类型深度的掩码,它是 CV_DEPTH_MAX - 1,而 CV_DEPTH_MAX 是 (1 << CV_CN_SHIFT)。
假设 CV_CN_SHIFT 的值为 3,那么 CV_MAT_DEPTH_MASK 将会是 1 << CV_CN_SHIFT - 1,即 7。这意味着数据类型深度占据了标识符的低3位,而通道数占据了接下来的几位。

现在,再让我们计算一些具体的例子:

CV_8UC1:8位无符号整数,单通道。

深度:CV_8U 对应的整数值(假设为 0)。
通道数:1 - 1 左移 CV_CN_SHIFT 位,即 0 左移 3 位,结果还是 0。
结果:0 + 0 = 0
CV_8UC2:8位无符号整数,双通道。

深度:CV_8U 对应的整数值(假设为 0)。
通道数:(2 - 1) << 3 = 1 << 3 = 8。
结果:0 + 8 = 8
CV_8UC3:8位无符号整数,三通道。

深度:CV_8U 对应的整数值(假设为 0)。
通道数:(3 - 1) << 3 = 2 << 3 = 16。
结果:0 + 16 = 16
以此类推,对于 CV_8UC(n),其整数值计算为:

结果:CV_8U 的值 + (n - 1) << CV_CN_SHIFT

3.直接给出其余对应结果

对于无符号16位整数类型(CV_16U):
CV_16UC1 = CV_16U + ((1-1) << CV_CN_SHIFT) = 2 + (0 << 3) = 2
CV_16UC2 = CV_16U + ((2-1) << CV_CN_SHIFT) = 2 + (1 << 3) = 2 + 8 = 10
CV_16UC3 = CV_16U + ((3-1) << CV_CN_SHIFT) = 2 + (2 << 3) = 2 + 16 = 18
CV_16UC4 = CV_16U + ((4-1) << CV_CN_SHIFT) = 2 + (3 << 3) = 2 + 24 = 26
CV_16UC(n) 是一个通用宏,对于任意 n,其计算方式为 2 + ((n-1) << 3)
对于有符号16位整数类型(CV_16S):
CV_16SC1 = CV_16S + ((1-1) << CV_CN_SHIFT) = 3 + (0 << 3) = 3
CV_16SC2 = CV_16S + ((2-1) << CV_CN_SHIFT) = 3 + (1 << 3) = 3 + 8 = 11
CV_16SC3 = CV_16S + ((3-1) << CV_CN_SHIFT) = 3 + (2 << 3) = 3 + 16 = 19
CV_16SC4 = CV_16S + ((4-1) << CV_CN_SHIFT) = 3 + (3 << 3) = 3 + 24 = 27
CV_16SC(n) 对于任意 n,其计算方式为 3 + ((n-1) << 3)
对于32位有符号整数类型(CV_32S):
CV_32SC1 = CV_32S + ((1-1) << CV_CN_SHIFT) = 4 + (0 << 3) = 4
CV_32SC2 = CV_32S + ((2-1) << CV_CN_SHIFT) = 4 + (1 << 3) = 4 + 8 = 12
CV_32SC3 = CV_32S + ((3-1) << CV_CN_SHIFT) = 4 + (2 << 3) = 4 + 16 = 20
CV_32SC4 = CV_32S + ((4-1) << CV_CN_SHIFT) = 4 + (3 << 3) = 4 + 24 = 28
CV_32SC(n) 对于任意 n,其计算方式为 4 + ((n-1) << 3)
对于32位浮点数类型(CV_32F):
CV_32FC1 = CV_32F + ((1-1) << CV_CN_SHIFT) = 5 + (0 << 3) = 5
CV_32FC2 = CV_32F + ((2-1) << CV_CN_SHIFT) = 5 + (1 << 3) = 5 + 8 = 13
CV_32FC3 = CV_32F + ((3-1) << CV_CN_SHIFT) = 5 + (2 << 3) = 5 + 16 = 21
CV_32FC4 = CV_32F + ((4-1) << CV_CN_SHIFT) = 5 + (3 << 3) = 5 + 24 = 29
CV_32FC(n) 对于任意 n,其计算方式为 5 + ((n-1) << 3)
对于64位浮点数类型(CV_64F):
CV_64FC1 = CV_64F + ((1-1) << CV_CN_SHIFT) = 6 + (0 << 3) = 6
CV_64FC2 = CV_64F + ((2-1) << CV_CN_SHIFT) = 6 + (1 << 3) = 6 + 8 = 14
CV_64FC3 = CV_64F + ((3-1) << CV_CN_SHIFT) = 6 + (2 << 3) = 6 + 16 = 22
CV_64FC4 = CV_64F + ((4-1) << CV_CN_SHIFT) = 6 + (3 << 3) = 6 + 24 = 30
CV_64FC(n) 对于任意 n,其计算方式为 6 + ((n-1) << 3)


http://www.ppmy.cn/news/1431451.html

相关文章

IP设置https访问

目录 但是IP地址的SSL证书和传统域名证书又有着一些区别&#xff1a; IP证书的原理&#xff1a; IP证书是如何工作的&#xff1a; 具体申请IP证书&#xff1a; 首先IP地址是可以实现https访问的&#xff0c;和传统的域名地址一样&#xff0c;需要用到数字证书部署&#xff0…

试试把GPT和Suno结合起来用(附免费GPT)

什么是GPT GPT&#xff08;生成预训练变换器&#xff09;是由OpenAI开发的一种先进的人工智能模型&#xff0c;它能够理解和生成人类语言。通过大量的数据训练&#xff0c;GPT模型不仅能够撰写文章、编写代码&#xff0c;还能创作诗歌和故事。而现在&#xff0c;这种技术已经扩…

vue3+Echarts+Nodejs实现动态数据可视化

最近在做毕设的后台管理系统&#xff0c;刚好需要做数据动态可视化的功能&#xff0c;就来记录一下具体的实现方式吧&#xff01; 在开始之前就不阐述用vue创建项目的具体步骤了&#xff0c;主要详细讲解一下vue3、echarts和nodejs三者之间是如何实现数据的动态显示的&#xf…

统计单词数量(文件)(*)

请编写函数&#xff0c;统计英文文章的单词数量。 函数原型 int CountWord(FILE *f); 说明&#xff1a;参数 f 为文件指针。函数值为该文件的单词数量。 裁判程序 #include <stdio.h> #include <stdlib.h> #include <ctype.h>int CountWord(FILE *f);in…

在React Router 6中使用useRouteLoaderData钩子获取自定义路由信息

在 React Router 6 中怎么像vueRouter一样&#xff0c;可以在配置路由的时候&#xff0c;定义路由的元信息(附加信息)&#xff1f;答案是可以的。稍有些复杂。核心是通过为每个路由定义了一个 loader 函数,用于返回自定义的路由信息&#xff0c;然后通过useRouteLoaderData 钩子…

【设计模式】9、facade 外观模式

文章目录 九、外观模式9.1 player9.1.1 player_test.go9.1.2 player.go 9.2 login_register9.2.1 account_test.go9.2.2 account.go 九、外观模式 https://refactoringguru.cn/design-patterns/facade 如果有一个复杂的系统, 内部有很多子系统, 可以用 facade 封装一层, 只暴…

MongoDB分片部署(windows)

OS&#xff1a;win10 MongoDB&#xff1a;4.4.24 分片架构 从图中可以看出&#xff0c;分片集群中主要由三个部分组成&#xff0c;即分片服务器&#xff08; Shard &#xff09;、路由服务器 &#xff08; Mongos &#xff09;以及配置服务器&#xff08; Config Server &am…

李沐动手学深度学习-优化和深度学习

优化和深度学习 对于深度学习问题&#xff0c;我们通常会先定义损失函数。一旦有了损失函数&#xff0c;就可以使用优化算法来尝试最小化损失。在优化中&#xff0c;损失函数通常被称为优化问题的目标函数。按照传统惯例&#xff0c;大多数优化算法都关注的是最小化。 优化的…