Mat的step,size,step1,elemSize,elemSize1这几个属性非常容易混淆。 OpenCV的官方参考手册也没有解释清楚这几个概念。

前一段时间研究了一下每个属性的含义,如果有什么错误,欢迎大家指正。

step1(i):每一维元素的通道数

step[i]:每一维元素的大小,单位字节

size[i]:每一维元素的个数

elemSize():每个元素大小,单位字节

elemSize1():每个通道大小,单位字节

这个解释可能有点抽象,结合示例程序和示意图解释这几个概念

[cpp] view plain copy

  1. void Learn_Mat_Definiton()//测试一下step[]的各个维度大小
  2. {
  3. //////////////////Demo1(3维矩阵)///////////////////////////////////////////
  4. printf("//////////////////////Demo1(3维矩阵)////////////////////////\n");
  5. //最后面的两个数:(行,列),确定了一个面
  6. //是一个依次降维的过程
  7. //8,10组成了面,5个面,组成了立方体
  8. int matSize[] = {5,8,10};//每一维元素的个数:8:行,10:列
  9. Mat mat1(3,matSize, CV_16UC3, Scalar::all(0));
  10. //求step[i]的大小:每一维元素的大小(单位字节)
  11. printf("\n///////step[i]的大小//////////\n");
  12. printf("step[0]:%d\n",mat1.step[0]);//480:面的大小(第一维)
  13. printf("step[1]:%d\n",mat1.step[1]);//60:线的大小(第二维)
  14. printf("step[2]:%d\n",mat1.step[2]);//6:点的大小(第三维)
  15. //求size[i]:每一维元素的个数
  16. printf("\n///////size[i]的大小///////\n");
  17. printf("size[0]:%d\n",mat1.size[0]);//5:面
  18. printf("size[1]:%d\n",mat1.size[1]);//8:线
  19. printf("size[2]:%d\n",mat1.size[2]);//10:点
  20. //求step1(i):每一维元素的通道数
  21. printf("\n///////step1(i)的大小///////\n");
  22. printf("step1(0):%d\n",mat1.step1(0));//240:面
  23. printf("step1(1):%d\n",mat1.step1(1));//30:线
  24. printf("step1(2):%d\n",mat1.step1(2));//3:点
  25. //求elemSize:每个元素的大小(单位字节)
  26. printf("\n///////elemSize的大小///////\n");
  27. printf("elemSize:%d\n",mat1.elemSize());//6:每个元素的大小
  28. //求elemSize1:每个通道的大小(单位字节)
  29. printf("\n///////elemSize1的大小///////\n");
  30. printf("elemSize1:%d\n",mat1.elemSize1());//2:每个通道的大小
  31. }

程序结果

这里我们定义了一个三维矩阵

int matSize[] = {5,8,10};//每一维元素的个数:8:行,10:列

Mat mat1(3,matSize, CV_16UC3, Scalar::all(0));

示意图如下图

每一维的元素表示什么意思呢?

这里我们以空间几何的角度来解释,能够更加容易理解一点。

三维矩阵,一共有三维,我们分别类比为

面:每个二维矩阵,表示第1维的元素

线:矩阵的每一行,表示第2维的元素

点:矩阵中每行的每个元素,表示第3维的元素

那么这样子就可以解释清楚每一维元素的含义了。

以step[i]为例

step[0]:面的大小,第1维的元素的大小,也就是二维矩阵的大小,一个二维矩阵有8行,所以step[0]=step[1]*8=480

step[1]:线的大小,第2维的元素的大小,也就是二维矩阵每一行的大小,由于每个元素大小为6,每行有10个元素,所以step[1]=10*6=60

step[2]:点的大小,第3维的元素的大小,这里矩阵的每个元素类型为CV_16UC3,所以step[2]=2*3=6个字节

这里注意:

1.step的大小是字节

2.注意下标与维数的对应关系:下标2对应点,1对应线,0对应面

3.矩阵有几维,step[]数组就有几个元素,如3维,则有3个元素,step[0],step[1],step[2].分别对应面,线,点
只要记住,最后一个总是表示点,然后依次向前为线,面...

4.第2,3 点 ,对于size和step1()也一样。

step1(i)和size[]与step[i]原理相同。

elemSize  表示每个元素的大小(单位字节),每个元素可能有多个通道,示例中,每个元素有三个通道,而每个通道类型为CV_16U,算3个通道的总数, 2*3=6

elemSize1 每个通道的大小(单位字节),CV_16=2字节

下面给出一个图像中的示例

[cpp] view plain copy

  1. void Test()
  2. {
  3. /////////////Demo2(512*512二维图像)///////////////////////////////
  4. printf("\n\n///////////////////Demo2(512*512二维图像)//////////////////////////\n");
  5. Mat mat2=imread("D:/Image/Color/Lena512.bmp",-1);//512*512的彩色Lena图
  6. //step[i]
  7. printf("\n///////step[i]的大小///////\n");
  8. printf("step[0]:%d\n",mat2.step[0]);//1536:线
  9. printf("step[1]:%d\n",mat2.step[1]);//3:点
  10. //size[i]
  11. printf("\n///////size[i]的大小///////\n");
  12. printf("size[0]:%d\n",mat2.size[0]);//512:线
  13. printf("size[1]:%d\n",mat2.size[1]);//512:点
  14. //step1(i)
  15. printf("\n///////step1(i)的大小///////\n");
  16. printf("step1(0):%d\n",mat2.step1(0));//1536:第一维的通道数
  17. printf("step1(1):%d\n",mat2.step1(1));//3:第二维的通道数
  18. //elemSize
  19. printf("\n///////elemSize的大小///////\n");
  20. printf("elemSize:%d\n",mat2.elemSize());//3:每个元素的大小
  21. //elemSize1
  22. printf("\n///////elemSize1的大小///////\n");
  23. printf("elemSize1:%d\n",mat2.elemSize1());//1:每个通道的大小,也就是单通道数据类型
  24. }

[cpp] view plain copy

结果

读者可以自行分析一下结果

OpenCV中Mat属性step,size,step1,elemSize,elemSize1的更多相关文章

  1. OpenCV中Mat的属性

    OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是 ...

  2. opencv中mat类介绍

    The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array. It ...

  3. OpenCV中Mat的基本用法:创建、复制

    OpenCV中Mat的基本用法:创建.复制 一.Mat类的创建: 1.方法一: 通过读入一张图像,直接将其转换成Mat对象. Mat image = imread("test.jpg&quo ...

  4. OpenCV中Mat的列向量归一化

    OpenCV中Mat的列向量归一化 http://blog.csdn.net/shaoxiaohu1/article/details/8287528 OpenCV中Mat的列向量归一化 标签: Ope ...

  5. Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

    Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...

  6. OpenCV中Mat操作clone() 与copyto()的区别

    OpenCV中Mat操作clone() 与copyto()的区别 // Mat is basically a class with two data parts: the matrix header ...

  7. OpenCV中Mat总结

    一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...

  8. OpenCV中Mat的使用

    一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...

  9. OpenCV中Mat的详解

    每次碰到Mat都得反复查具体的用法,网上的基础讲解不多,难得看到一篇,赶快转来收藏~ 原文地址:http://www.opencvchina.com/thread-1039-1-1.html 目标 我 ...

随机推荐

  1. JAVA泛型方法与类型限定

     泛型方法可以定义在普通类中,也可以定义在泛型类中 class ArrayAlg{ public static <T> T getMiddle(T...a){ return a[a.len ...

  2. 基础篇:3.2)规范化:3d零件建模

    本章目的:规范化零件建模,这是机械的基本功夫. 1.建模的总体原则和总体要求 1.1 建模总体原则 a)零件模型应能准确表达零件的设计信息:b)零件模型包含零件的几何要素.约束要素和工程要素:c)零件 ...

  3. 进阶篇:2.2)DFMA运用实例

    本章目的:摘录一些DFMA运用的实例,可做参考. 1.DFMA的运用实例 DFMA提供了一个从装配和制造的角度去分析已给定设计的系统方法.采用这种方法可以使得产品结构更简单.性能更可靠.装配和制造的成 ...

  4. JavaSwing概述

    GUI(Graphic User Interface)为程序提供图形界面,它最初的设计目的是构建一个通用的GUI,使其能在所有平台上运行.在Java1.0中基础类AWT(Abstract Window ...

  5. Python的html解析器

    转自https://blog.csdn.net/jqh2002_blog/article/details/24842217 其实比较不同的解析器对html的处理能力是有点麻烦的,因为它们处理的步骤并不 ...

  6. Java数组总结

    1.1    Arrays      jdk中为了便于开发,给开发者提供了Arrays(在Jdk的Util包中)类,其中包括了很多数组的常用操作.列如快速输出,排序,查找等.      1.1.1   ...

  7. 仿jQuery的toggle方法

    两次点击事件进行切换 var toggle = (function () { var a = true; return function (fn1, fn2) { a = !a; var toggle ...

  8. (转)浅谈 Linux 系统中的 SNMP Trap

    原文:https://www.ibm.com/developerworks/cn/linux/l-cn-snmp/index.html 简介 本文讲解 SNMP Trap,在介绍 Trap 概念之前, ...

  9. Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)

    1.通过select for update或select for update wait或select for update nowait给数据集加锁 具体实现参考select for update和 ...

  10. 导入数据到HBase的方式选择

    Choosing the Right Import Method If the data is already in an HBase table: To move the data from one ...