opencv功能Mat-基本图像容器
opencv核心功能Mat
Mat-基本图像容器
Mat不需要手动分配内存
Mat基本上是一个具有两个数据部分的类:
矩阵头(包含矩阵的大小,用于存储的方法,存储在哪个地址的信息等等)和 指向包含像素值(取决于所选存储方法的任何维度)。矩阵头大小是恒定的,然而矩阵本身的大小可以随着图像的不同而变化,通常会大一个数量级。
OpenCV使用引用计数系统。这个想法是每个Mat对象都有自己的头,但是通过使它们的矩阵指针指向相同的地址,矩阵可以在它们的两个实例之间共享。此外,复制操作符只会将头和指针复制到大矩阵,而不是数据本身。
1 | Mat A, C; // creates just the header parts |
所有上述对象,最后指向相同的单个数据矩阵。然而,它们的头部是不同的,并且使用它们中的任何一个进行修改也会影响所有其他的。在实践中,不同的对象只是向相同的底层数据提供不同的访问方法。
1 | Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle |
现在您可以询问矩阵本身是否属于多个_Mat_对象,它们在不再需要时负责清理它。简短的答案是:使用它的最后一个对象。这是通过使用引用计数机制来处理的。每当有人复制_Mat_对象的标题时,矩阵的计数器就会增加。每当头部被清洁时,这个计数器就会减少。当计数器达到零时,矩阵也被释放。有时你也想复制矩阵本身,所以OpenCV提供了cv :: Mat :: clone()和cv :: Mat :: copyTo()函数。
1 | Mat F = A.clone(); |
现在修改F或G不会影响Mat头指向的矩阵。所有这一切你需要记住的是:
- OpenCV功能的输出图像分配是自动的(除非另有说明)。
- 您不需要考虑OpenCVs C ++界面的内存管理。
- 赋值运算符和复制构造函数只复制标题。
- 可以使用cv :: Mat :: clone()和cv :: Mat :: copyTo()函数复制图像的基础矩阵。
RGB是最常见的,因为我们的眼睛使用类似的东西,OpenCV标准显示系统使用BGR颜色空间(红色和蓝色通道的开关)组成颜色。
cv :: imwrite()函数将矩阵写入图像文件。但是,为了调试目的,查看实际值更为方便。您可以使用Mat的“操作符”来执行此操作。请注意,这仅适用于二维矩阵。
虽然Mat作为一个图像容器非常好,但它也是一个通用的矩阵类。因此,可以创建和操纵多维矩阵。您可以通过多种方式创建Mat对象:
cv :: Mat :: Mat构造函数
1 | Mat M(2,2,CV_8UC3,Scalar(0,0,255)); |
对于二维和多通道图像,我们首先定义它们的大小:行和列数。
然后,我们需要指定用于存储元素的数据类型和每个矩阵点的通道数。为此,我们根据以下约定构造了多个定义:
1 | CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number] |
Ursprünglicher Autor: Bean
Ursprünglicher Link: http://yoursite.com/2019/04/28/opencv功能Mat-基本图像容器/
Copyright-Erklärung: Bitte geben Sie die Quelle des Nachdrucks an.