资讯详情

【opencv】OpenCV: Mat属性step,size,step1,elemSize,elemSize1一次搞清

📅 2026/10/23 7:00:52 | 华诺云谱 👁 阅读
【opencv】OpenCV: Mat属性step,size,step1,elemSize,elemSize1一次搞清
OpenCV经常用到的几个Mat的属性但是每次用到都要查一下今天直接弄清楚些。首先要明白几个计算机基础的基本概念Bit意为“位”或“比特”是计算机运算的基础属于二进制的范筹Byte意为“字节”是计算机文件大小的基本计算单位这两者应用的场合不同。通常用bit来作数据传输的单位因为物理层数据链路层的传输对于用户是透明的而这种通信传输是基于二进制的传输。在应用层通常是用byte来作单位表示文件的大小在用户看来就是可见的数据大小。比如一个字符就是1byte,如果是汉字则是2byte。下面是2个具体应用实例Mbpsmega bits per second(兆位/秒)是速率单位MBmega bytes(兆比、兆字节)是量单位1MB/S兆字节/秒8MBPS兆位/秒。我们所说的硬盘容量是40GB、80GB、100GB这里的B指是的Byte也就是“字节”。(与容量相关应用层1 bit 1 二进制数据 1 byte 8 bit 1 字母 1 byte 8 bit 1 汉字 2 byte 16 bit 1Byte8Bit1字节 1字2字节 1 KB 1024 bytes 2^10 bytes 1 MB 1024 KB 2^20 bytes 1 GB 1024 MB 2^30 bytesUSB2.0标准接口传输速率是480兆位/秒,即480MBps。这里的B指是的Bit也就是“位”。与传输相关底层注另外Byte通常简写为B(大写而bit通常简写为b小写。可以这么记忆用大写的就是数据值比较大的位而小字的就是数据值比较小的字节1B8b。字节和字长的区别由于常用的英文字符用8位二进制就可以表示所以通常就将8位称为一个字节。字长的长度是不固定的对于不同的CPU、字长的长度也不一样。8位的CPU一次只能处理一个字节而32位的CPU一次就能处理4个字节同理字长为64位的CPU一次可以处理8个字节。理解字长、字节、位的概念以后对下列的问题应该会更加清晰一些step1(i):每一维元素的通道数step[i]:每一维元素的大小单位字节size[i]:每一维元素的个数elemSize()每个元素大小单位字节elemSize1()每个通道大小单位字节按照代码实例来看一下#include iostream #include opencv/highgui.h using namespace cv; void Learn_Mat_Definiton()//测试一下step[]的各个维度大小 { //////////////////Demo1(3维矩阵)/////////////////////////////////////////// printf(//////////////////////Demo1(3维矩阵)////////////////////////\n); //最后面的两个数(行列),确定了一个面 //是一个依次降维的过程 //8,10组成了面5个面组成了立方体 int matSize[] {5,8,10};//每一维元素的个数8行10列 Mat mat1(3,matSize, CV_16UC3, Scalar::all(0)); //求step[i]的大小:每一维元素的大小(单位字节) printf(\n///////step[i]的大小//////////\n); printf(step[0]:%d\n,mat1.step[0]);//480面的大小(第一维) printf(step[1]:%d\n,mat1.step[1]);//60线的大小(第二维) printf(step[2]:%d\n,mat1.step[2]);//6点的大小(第三维) //求size[i]每一维元素的个数 printf(\n///////size[i]的大小///////\n); printf(size[0]:%d\n,mat1.size[0]);//5面 printf(size[1]:%d\n,mat1.size[1]);//8线 printf(size[2]:%d\n,mat1.size[2]);//10点 //求step1(i)每一维元素的通道数 printf(\n///////step1(i)的大小///////\n); printf(step1(0):%d\n,mat1.step1(0));//240:面 printf(step1(1):%d\n,mat1.step1(1));//30:线 printf(step1(2):%d\n,mat1.step1(2));//3:点 //求elemSize每个元素的大小(单位字节) printf(\n///////elemSize的大小///////\n); printf(elemSize:%d\n,mat1.elemSize());//6每个元素的大小 //求elemSize1每个通道的大小(单位字节) printf(\n///////elemSize1的大小///////\n); printf(elemSize1:%d\n,mat1.elemSize1());//2每个通道的大小 } int main() { std::cout Hello, OpenCV! std::endl; Learn_Mat_Definiton(); return 0; }编译出的结果如下我们先看第一组step[i],其实如果倒着看理解会更加深刻一些首先定义的每个元素是CV_16UC3,16bits,3通道所以对应每个元素的大小是step[2] 16/8*36 bytesstep[1]:对应的是线的大小第二维的元素的大小也就是二维矩阵每一行的大小所以step[1] 10*6 60 bytesstep[0]:对应的是面的大小每一行的大小再乘以行数step[0] 60*8 480 bytes第二组size[i]的大小size[0] 5 size[1] 8 size[2] 10因为step1[i] step.p[i]/elemSize1();就先看一下elemSize和elemSize1的具体含义elemSize 表示每个元素的大小单位是字节每个元素可能有多个通道按照代码中对应的定义每个元素有三个通道每个通道类型为CV_16U,所以3个通道的总数是6和step[2]的数值相等。elemSize1 每个通道的大小(单位字节)CV_162字节所以规整化的step1[i]分别为step1[0] step[0]/elemSize1 240 bytes step1[1] step[1]/elemSize1 30 bytes step1[2] step[2]/elemSize1 3 bytes一次性弄弄清楚每次都查一下得不偿失O(∩_∩)O哈哈~参考地址[1]https://blog.csdn.net/panjunnn/article/details/5611241[2]https://blog.csdn.net/qianqing13579/article/details/45318279[3]https://blog.csdn.net/Sunshine_in_Moon/article/details/45268971
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑