多维 opencv Mat访问

你看完这篇文章之后,将学会以下知识:
① 二维、三维、四维等任意维度的Mat的常用建立方法;
② 任意维度Mat中值的索引;
③ 以及一些Mat常用的操作。
下面是对各维度矩阵的介绍:
  注意:下面的操作只是我常用的操作方法,不是唯一的方法,对于那些没有思路的同学,下面的内容希望起到抛砖引玉的效果。

  我以单通道的uchar类型的图片做例子

1. 二维Mat
  二维的Mat是我们最常使用的类型,它就和我们的图片直接对应

构造函数:Mat(int rows, int cols, int type, const Scalar& s);
变量声明:cv::Mat mat2D(100, 100, CV_8UC1, cv::Scalar(0));
1
2
  上述变量声明的代码,定义了一个100x100的Mat,它有一个通道,通道中的数据类型都是uchar,每一个对应位置的值都是0。

对于这种二维矩阵的索引,有多种方法:
  第一种(效率不高)

uchar a = mat2D.at<uchar>(i,j)
1
  第二种

uchar* a = mat2D.ptr<uchar>(0);//指针指向mat2D的0行首地址
uchar a = mat2D.ptr<uchar>(1)[5];//取出(1,5)中的值
1
2
2. 三维Mat
  三维Mat一般很少用,对于它的操作:

构造函数:Mat(int ndims, const int* sizes, int type);

变量声明:
int size[3] = {100, 100, 100};
cv::Mat mat3D(3, size, CV_8UC1, cv::Scalar(0));
1
2
3
4
5
  上面变量声明的代码,声明了一个维度为3,大小为100x100x100的Mat。

对于三维Mat的索引:
  第一种方法(效率不高)

uchar a = mat3D.at<uchar>(4,5,6);//取出(4,5,6)中对应的值
1
  第二种方法

uchar* a = mat3D.ptr<uchar>(0,0);//a指向前两维限定下的行首的地址
uchar a = mat3D.ptr<uchar>(0,0)[4];//取出(0,0,4)中的值
1
2
3. 四维Mat
int size[4] = {100, 100, 100, 100};
cv::Mat mat4D(4, size, CV_8UC1, cv::Scalar(0));
1
2
对于四维Mat的索引,不能使用at函数,因为不支持超过三维的Mat

uchar* a = mat3D.ptr<uchar>(0,0,0)[4];//取出(0,0,0,4)中对应的值
1
4. 五维Mat
int size[5] = {100, 100, 100, 100, 100};
cv::Mat mat5D(5, size, CV_8UC1, cv::Scalar(0));
1
2
  大于四维的Mat,既不能使用at,也不能使用ptr访问元素。下面介绍我常用的方法:这里我们可以使用Mat类中的data成员变量,它指向Mat数据区的首地址,对于Mat类型的数据,它们是按照线性方式存值的,我们知道首地址之后,就可以通过指针偏移的方式,去索引任意元素的值。
对于 100x100x100x100x100 的五维Mat,如果索引要 [a,b,c,d,e] 中的值,则可以使用下面的方式

uchar a = *(mat5D.data + a*100*100*100*100 + b*100*100*100 + c*100*100 + d*100 + e);
1
  如果你在Mat中存储的不是CV_8UC1,而是别的类型,比如是CV_32FC1,那么就不能直接使用data,因为它默认是uchar类型的指针,需要将它强转为float类型。代码如下:

float a = *((float*)mat5D.data + a*100*100*100*100 + b*100*100*100 + c*100*100 + d*100 + e);
1
对于更高维的情况,使用上面的五维的方法推广就行,当然上述所有的方法,都不是最好的或者是唯一的,只是我个人比较常用的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV中的Mat是一个多维数组,用于存储图像或其他类型的数据。它是OpenCV中最基本的数据结构之一。 Mat类提供了许多方法来操作和访问图像数据。你可以使用Mat对象加载、保存、修改和显示图像。它还提供了一些基本的数学运算,如加法、减法和乘法,以及一些高级图像处理功能,如滤波和边缘检测。 在使用Mat类之前,你需要包含OpenCV的头文件并链接对应的库。然后,你可以使用Mat对象来创建、读取和处理图像数据。例如,你可以使用Mat对象加载一张图像: ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR); if (image.empty()) { std::cout << "Failed to load the image." << std::endl; return -1; } cv::imshow("Image", image); cv::waitKey(0); return 0; } ``` 这段代码将加载名为"image.jpg"的图像,并显示在一个窗口中。你可以使用Mat对象的其他方法来操作图像数据,如修改像素值、裁剪图像区域、调整图像大小等。 除了用于存储图像数据,Mat类还可以用于存储其他类型的多维数组。你可以使用构造函数或create()方法来创建指定类型和大小的Mat对象。例如,创建一个3x3的浮点型矩阵: ```cpp cv::Mat mat(3, 3, CV_32F); ``` 这样就创建了一个3x3的浮点型矩阵,可以用来存储和处理数值数据。 总之,OpenCVMat类是一个非常强大和灵活的数据结构,用于处理图像和其他类型的多维数据。它提供了许多方法和功能,让你能够方便地进行图像处理和计算机视觉任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值