OpenCV中的像素数据类型与基本数据类型的对应关系_opencv cv_8u-程序员宅基地

技术标签: OpenCV  计算机视觉  opencv  

1 CV_8UCV_8UC3的含义

在定义Mat对象的时候,像素的数据类型经常使用CV_8UCV_8UC3来表示,例如:

	/** @overload
    @param rows Number of rows in a 2D array.
    @param cols Number of columns in a 2D array.
    @param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.
    */
    //Mat(int rows, int cols, int type);
    Mat img(3, 3, CV_8U);

它们都是宏常量,OpenCV的源码中,将像素的数据类型进行了编号,而构造函数根据传入的type值(类型编号)确定像素的具体类型,例如0就代表unsigned char,这里用0、1、2 这些太过突兀,为了使其含义更清晰,所以使用了宏,例如:

	/*
	#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_16F  7
	*/

像素的数据类型与C++中基本数据类型的对应的关系如下:
在这里插入图片描述

有些图像是多通道,那么一个像素实际上是包含了多个数,Mat类中把这多个数当成一个“像素”处理(只是这个像素比较“长”而已),并且为其声明了类型,即CV_8UC2、CV_8UC3、CV_8UC4、CV_8SC2、CV_8SC3等,它们的组成形式为:cv_<bit_depth>(S|U|F)C<number_of_channels>,即在单通道类型的基础上加上了一个C和数字,1表示1个通道,2表示2个通道,最多能表示4个通道。

多于4个通道时(例如5个通道),则使用宏函数,例如CV_8UC(5),宏函数最多只能表示512个通道

关于多个通道的宏与常数的对应关系如下表所示:(如果CV_8SC2,查表时则是查CV_8S所在行和C2所在列)
在这里插入图片描述
例如:

	printf("CV_8U: %d\n", CV_8U);
	printf("CV_8UC1: %d\n", CV_8UC1);
	printf("CV_8UC3: %d\n", CV_8UC3);

输出

CV_8U: 0
CV_8UC1: 0
CV_8UC3: 16

可以看到CV_8UC1CV_8U没差。

2 利用at访问矩阵中的元素时,必须指定数据类型

at虽然是Mat类的成员函数,但它确实模板函数,它使用时必须指定类型,而CV_8UCV_8UC3等,它们是宏,而不是类型,不能用到模板中。
若图像为单通道,模板中的类型列表应该用基本数据类型,对于多通道,则应该使用opencv源码中定义的向量类型(稍后会介绍)

	//单通道
	Mat img(3, 3, CV_8U);
	cout << (int)img.at<uchar>(0, 1) << endl;	//访问第0行第1列的元素

	//多通道
	Mat img2(3, 3, CV_8UC2);
	Vec2b v2b = img.at<Vec2b>(0, 1);
	cout << v2b << endl;			//访问第0行第1列的像素,这是一个二维向量
	cout << (int)v2b[0] << endl;	

输出

205
[205, 205]
205

这里出现了Vec2b,它其实是与CV_8UC2相匹配的向量类型,使用at访问像素时,向量的类型必须和像素类型严格匹配

opencv中的像素类型声明宏与向量类型的对应关系如下:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44457930/article/details/129865462

智能推荐

SAP PP 笔记(一) 概述-程序员宅基地

文章浏览阅读6.9k次,点赞23次,收藏112次。生产计划与控制流程概况一般来说SAP的SFC车间控制较为薄弱,很多公司都用MES来解决问题生产计划与控制流生产计划与控制组织结构与计划层次PP模块涵盖了整个生产流程,从主数据的生成到生产计划、物料生产计划、能力计划直到生产控制和成本核算可以和其他模块完整的集合到一起可以应用到所有的行业支持所有的生产方式组织结构与工厂一般来说在PP模块我们只需关心集团下面是公司,公司下面有工厂就足够了特点在产品成本计算中,每一个工厂必须有一个单 独的评估范围评估范围是物料估价的区_sap pp

RT-DETR算法优化改进:自研独家创新BSAM注意力 ,基于CBAM升级 | 注意力机制大作战_rt-dert改进-程序员宅基地

文章浏览阅读1k次。提出新颖的注意力BSAM(BiLevel SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的BiLevel Attention+Spartial Attention_rt-dert改进

freeswitch之esl开发_java esl inbound outbound-程序员宅基地

文章浏览阅读2.1k次。esl全称Event Socket Library,通过它可以与freeswitch进行交互,esl 支持多种语言java、c\c++、golang等等。_java esl inbound outbound

【C++学习】语法速成3_c++语法速成-程序员宅基地

文章浏览阅读316次,点赞2次,收藏2次。文章目录析构函数构造函数和析构函数的应用静态成员变量和静态成员函数成员对象和封闭类友元this指针常量对象、常量成员函数和常引用析构函数构造函数主要用来初始化对象,析构函数主要用来善后对象的消亡。特点:名字与类名相同(为了区别构造函数在前面加~)没有参数和返回值一个类最多只有一个析构函数对象消亡时,析构函数自动被调用,在对象消亡前做一些善后工作,比如释放分配的空间。在定义类的时候如果没有写析构函数,则编译器会自动生成缺省析构函数(并不会做什么事)。class String{ pri_c++语法速成

【Docker】Docker之镜像上传(阿里云镜像仓库)-程序员宅基地

文章浏览阅读1.1k次。docker镜像上传_阿里云镜像仓库

ROS2 学习笔记5:了解ROS2 服务Service_ros2怎么查看活跃的service-程序员宅基地

文章浏览阅读893次,点赞17次,收藏18次。在ros2里面,节点可通过服务进行通信。不像话题那样,一个节点发布消息可以被一个或多个订阅器接收的的通信方式;服务是一种请求/响应模式,客户端节点发出请求,服务端节点处理这个请求并给出响应。通常,不会连续调用一个服务;话题,甚至动作更符合这种场景。在本教程中,你使用了命令行工具去识别,详细说明和调用服务。_ros2怎么查看活跃的service

随便推点

基于STM32单片机智能LD3320语音控制风扇PWM转速启停毕业设计DIY100_stm32风扇调速-程序员宅基地

文章浏览阅读454次,点赞9次,收藏13次。基于STM32单片机语音控制风扇设计PWM转速启停LD3320语音识别模块ASR M08-B设计/DIY开发板套件100。_stm32风扇调速

Dophinscheduler-Datax插件管理_dolphinscheduler中datax自定义模板-程序员宅基地

文章浏览阅读319次。海豚调度 Datax插件安装_dolphinscheduler中datax自定义模板

kylin优化浅见_kylin v10内存回收慢-程序员宅基地

文章浏览阅读93次。欢迎指导,愿意答疑!_kylin v10内存回收慢

DingTalk「开发者说」如何开发钉钉高价值应用三部曲_钉钉是用什么开发的-程序员宅基地

文章浏览阅读1.2k次。DingTalk「开发者说」是钉钉开发者最新上线的开发者栏目,联合阿里云ACE团队,分享钉应用开发解决方案、技术更新、实战技巧,致力于成为钉钉与开发者的桥梁与纽带,让更多的钉钉开发者传播技术、提升技能、分享观点。在数字化变革的时代,“云钉一体”“钉钉全面开放”战略之后,希望钉钉技术可以持续激发开发者的创造力,为组织数字化赋能。分享人:任准,缤果科技CTO_钉钉是用什么开发的

Visual Studio UE项目无法启动调试_ue vs无法启动调试,请通过打开项目属性并-程序员宅基地

文章浏览阅读186次。点完这个又遇到问题:game files required to initialize the global shader library are missing from…错误信息:无法启动调试,请通过打开项目属性并导航到“配置属性”->“调试”来检查调试器设置。在ue官方社区找到了答案:编译器选成DebugGame Editor。如图所示,也不知道为啥会这样,还导致代码无法正常编译。_ue vs无法启动调试,请通过打开项目属性并