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

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

参考链接

cv::Mat 中通道和维度不是一个概念

  • data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data)
  • dims:Mat所代表的矩阵的维度,如 3 * 4 的矩阵为 2 维, 3 * 4 * 5 的为3维
  • channels:通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。
  • depth:深度,即每一个像素的位数(bits),在opencv的Mat.depth()中得到的是一个 0 – 6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;
例如一个3x 4 x 5的矩阵,dims = 3, channels = 12 的含义如下:
三维矩阵,每个矩阵元素拥有的值的个数为12。

step size step1 elementSize elementSize1

这里注意:

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]原理相同。

5. step1 = step / elemSize1
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

//定义全局坐标系

int main() {
  std::cout << "=====================================================二维矩阵=="
               "============================================="
            << std::endl;
  cv::Mat test_mat(cv::Size(2, 3), CV_8UC3, cv::Scalar(1, 2, 3));
  std::cout << test_mat << std::endl;

  std::cout << "size of uchar is: " << sizeof(uchar) << std::endl;

  std::cout << "[step]: " << test_mat.step << std::endl;
  // step
  // 可以理解为Mat矩阵中每一行的“步长”,以字节为基本单位,每一行中所有元素的字节总量,是累计了一行中所
  // 有元素、所有通道、所有通道的elemSize1之后的值;

  std::cout << "[step[0]]: " << test_mat.step[0] << std::endl;
  std::cout << "[step[1]]: " << test_mat.step[1] << std::endl;

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

  std::cout << "[step1[0]]: " << test_mat.step1(0) << std::endl;
  std::cout << "[step1[1]]: " << test_mat.step1(1) << std::endl;

  // step1(i):每一维元素的通道数;
  // 也就是每一维元素的个数

  std::cout << "[elemSize]: " << test_mat.elemSize() << std::endl;
  // 每个元素的大小(单位字节)  ,每个矩阵元素拥有的值的个数为通道数

  std::cout << "[elemSize1]: " << test_mat.elemSize1() << std::endl;
  //每个通道的大小(单位字节)

  std::cout << "=====================================================三维矩阵=="
               "============================================="
            << std::endl;

  int matsize[] = {5, 8, 10};
  cv::Mat test_mat1(3, matsize, CV_16UC3, cv::Scalar(1, 2, 3));

  std::cout << "size of cv_16u is: " << sizeof(ushort) << std::endl;
  std::cout << "dim is: " << test_mat1.dims << std::endl;

  std::cout << "[step]: " << test_mat1.step << std::endl;
  // step
  // 可以理解为Mat矩阵中每一行的“步长”,以字节为基本单位,每一行中所有元素的字节总量,是累计了一行中所
  // 有元素、所有通道、所有通道的elemSize1之后的值;

  std::cout << "[step[0]]: " << test_mat1.step[0] << std::endl;
  std::cout << "[step[1]]: " << test_mat1.step[1] << std::endl;
  std::cout << "[step[2]]: " << test_mat1.step[2] << std::endl;

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

  std::cout << "[step1[0]]: " << test_mat1.step1(0) << std::endl;
  std::cout << "[step1[1]]: " << test_mat1.step1(1) << std::endl;
  std::cout << "[step1[2]]: " << test_mat1.step1(2) << std::endl;

  // step1(i):每一维元素的通道数;
  // 也就是每一维元素的个数

  std::cout << "[elemSize]: " << test_mat1.elemSize() << std::endl;
  // 每个元素的大小(单位字节)  ,每个矩阵元素拥有的值的个数为通道数  2xchannel

  std::cout << "[elemSize1]: " << test_mat1.elemSize1() << std::endl;
  //每个通道的大小(单位字节)  2
}

输出

=====================================================二维矩阵===============================================
[  1,   2,   3,   1,   2,   3;
   1,   2,   3,   1,   2,   3;
   1,   2,   3,   1,   2,   3]
size of uchar is: 1
[step]: 6
[step[0]]: 6
[step[1]]: 3
[step1[0]]: 6
[step1[1]]: 3
[elemSize]: 3
[elemSize1]: 1
=====================================================三维矩阵===============================================
size of cv_16u is: 2
dim is: 3
[step]: 0
[step[0]]: 480
[step[1]]: 60
[step[2]]: 6
[step1[0]]: 240
[step1[1]]: 30
[step1[2]]: 3
[elemSize]: 6
[elemSize1]: 2

猜你喜欢

转载自blog.csdn.net/ahelloyou/article/details/114087174