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