opencv核心功能Mat

Mat-基本图像容器

Mat不需要手动分配内存
Mat基本上是一个具有两个数据部分的类:
矩阵头(包含矩阵的大小,用于存储的方法,存储在哪个地址的信息等等)和 指向包含像素值(取决于所选存储方法的任何维度)。矩阵头大小是恒定的,然而矩阵本身的大小可以随着图像的不同而变化,通常会大一个数量级。

OpenCV使用引用计数系统。这个想法是每个Mat对象都有自己的头,但是通过使它们的矩阵指针指向相同的地址,矩阵可以在它们的两个实例之间共享。此外,复制操作符只会将头和指针复制到大矩阵,而不是数据本身。

1
2
3
4
Mat A, C;                          // creates just the header parts
A = imread(argv[1], IMREAD_COLOR); // here we'll know the method used (allocate matrix)
Mat B(A); // Use the copy constructor
C = A; // Assignment operator

所有上述对象,最后指向相同的单个数据矩阵。然而,它们的头部是不同的,并且使用它们中的任何一个进行修改也会影响所有其他的。在实践中,不同的对象只是向相同的底层数据提供不同的访问方法。

1
2
Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
Mat E = A(Range::all(), Range(1,3)); // using row and column boundaries

现在您可以询问矩阵本身是否属于多个_Mat_对象,它们在不再需要时负责清理它。简短的答案是:使用它的最后一个对象。这是通过使用引用计数机制来处理的。每当有人复制_Mat_对象的标题时,矩阵的计数器就会增加。每当头部被清洁时,这个计数器就会减少。当计数器达到零时,矩阵也被释放。有时你也想复制矩阵本身,所以OpenCV提供了cv :: Mat :: clone()cv :: Mat :: copyTo()函数。

1
2
3
Mat F = A.clone();
Mat G;
A.copyTo(G);

现在修改F或G不会影响Mat头指向的矩阵。所有这一切你需要记住的是:

  • OpenCV功能的输出图像分配是自动的(除非另有说明)。
  • 您不需要考虑OpenCVs C ++界面的内存管理。
  • 赋值运算符和复制构造函数只复制标题。
  • 可以使用cv :: Mat :: clone()cv :: Mat :: copyTo()函数复制图像的基础矩阵。

RGB是最常见的,因为我们的眼睛使用类似的东西,OpenCV标准显示系统使用BGR颜色空间(红色和蓝色通道的开关)组成颜色。
cv :: imwrite()函数将矩阵写入图像文件。但是,为了调试目的,查看实际值更为方便。您可以使用Mat的“操作符”来执行此操作。请注意,这仅适用于二维矩阵。

虽然Mat作为一个图像容器非常好,但它也是一个通用的矩阵类。因此,可以创建和操纵多维矩阵。您可以通过多种方式创建Mat对象:
cv :: Mat :: Mat构造函数

1
2
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
cout << “M =” << endl << “” <<“M << endl << endl;

对于二维和多通道图像,我们首先定义它们的大小:行和列数。

然后,我们需要指定用于存储元素的数据类型和每个矩阵点的通道数。为此,我们根据以下约定构造了多个定义:

1
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]