cv::Mat::step step1 elemSize elemSize1介绍

引言

在看slam源码中,常见到cv::Mat类中的step,step1,elemSize和elemSize1等函数和属性,不了解这些函数和属性的含义的话,难以看懂slam源码中对图像的操作,因此本文介绍这些函数和属性的含义,并给出具体的例子。

OpenCV图像的存储方式

要理解上述函数的函数,首先需要了解图像在opencv中的存储方式,图1显示了rgb图像在opencv中的存储方式。每个元素包含三个通道。

图1 opencv图像存储方式

 step,step1,elemSize,elemSize1含义

  • step[0]: 图像一行元素的字节数,图1中,step[0]就是任意一行,比如row0,所有元素的字节数
  • step:是cv::Mat类的一个属性,等同于step[0]
  • step[1]: 图像一个元素的字节数,图1中,任意一个元素,比如(row0, col0),该元素又包含三个通道,step[1]就是该任意元素所有通道的字节数
  • step1(0): 图像一行元素的通道数,图1中,每个元素有3个通道,一行有4个元素,所以step(0)=12, step1()函数等同于step1(0),因为该函数的默认参数是0
  • step1(1): 图像一个元素的通道数,图1中,每个元素有3个通道,所以step1(1)=3
  • elemSize(): 图像中一个元素的字节数,图1中,任意一个元素,比如(row0, col0),该元素又包含三个通道,elemSize()就是该任意元素所有通道的字节数
  • elemSize1():图像中一个元素中的一个通道的字节数,图1中,任意一个元素,比如(row0, col0),该元素又包含三个通道,elemSize1()就是该任意元素一个通道的字节数

示例

可能上面的文字介绍还是比较抽象,下面通过一个例子来进一步介绍

#include <opencv2/core.hpp>
#include <iostream>

int main(int argc, char **argv)
{
    cv::Mat img(3, 4, CV_16UC3, cv::Scalar_<uchar>(1, 2, 3));

    std::cout << img << std::endl;
    std::cout << "step = " << img.step << std::endl;
    std::cout << "step[0] = " << img.step[0] << std::endl;
    std::cout << "step[1] = " << img.step[1] << std::endl;
    std::cout << "step1 = " << img.step1() <<std::endl;
    std::cout << "step1(0) = " << img.step1(0) << std::endl;
    std::cout << "step1(1) = " << img.step1(1) << std::endl;
    std::cout << "elemSize() = " << img.elemSize() << std::endl;
    std::cout << "elemSize1() = " << img.elemSize1() << std::endl;
    return 0;
}

代码中定义了一个3行4列的Mat类对象img,其中img的每个元素的类型是CV_16UC3,其中CV_16UC3是OpenCV定义好的数据类型,16U代表每个元素的类型是16位的unsigned short类型,C3代表每个元素有3个通道。代码输出img的step,step1,elemSize和elemSize1。

 可以看出img的存储方式与上文介绍的保持一致,每个元素有3个通道。

step:img中一行元素的字节数,img中每个元素的类型是16位unsigned short,也就是说每个元素占2个字节,每个元素有3个通道,一行有4个元素,因此step=2\times 3\times 4 =24

step[0]:等同于step

step[1]: img中一个元素的字节数,一个元素2字节,包含3通道,step[1]=2\times 3=6

step1(): img中一行元素的通道数,每个元素3通道,一行4个元素,step1()=3\times 4=12

step1(0): 等同于step1()

step1(1):img中一个元素的通道数,每个元素3通道, step1(1)=3

elemSize(): img中一个元素的字节数,elemSize()=2\times 3=6

elemSize1(): img中一个元素的一个通道的字节数,elemSize1() = 2

猜你喜欢

转载自blog.csdn.net/qq_34493401/article/details/128384344