OpenCV: Mat属性step,size,step1,elemSize,elemSize1

时间:2019-09-18
本文章向大家介绍OpenCV: Mat属性step,size,step1,elemSize,elemSize1,主要包括OpenCV: Mat属性step,size,step1,elemSize,elemSize1使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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*3=6 bytes
1
step[1]:对应的是线的大小,第二维的元素的大小,也就是二维矩阵每一行的大小,所以

step[1] = 10*6 = 60 bytes
1
step[0]:对应的是面的大小,每一行的大小再乘以行数

step[0] = 60*8 = 480 bytes
1
第二组size[i]的大小,

size[0] = 5
size[1] = 8
size[2] = 10
1
2
3
因为

step1[i] = step.p[i]/elemSize1();
1
就先看一下elemSize和elemSize1的具体含义

elemSize 表示每个元素的大小(单位是字节),每个元素可能有多个通道,按照代码中对应的定义,每个元素有三个通道,每个通道类型为CV_16U,所以3个通道的总数是6,和step[2]的数值相等。

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

所以规整化的step1[i]分别为:

step1[0] = step[0]/elemSize1 = 240 bytes
step1[1] = step[1]/elemSize1 = 30 bytes
step1[2] = step[2]/elemSize1 = 3 bytes


原文链接:https://blog.csdn.net/Felaim/article/details/80702787

 

原文地址:https://www.cnblogs.com/fcfc940503/p/11545444.html