前言
在 OpenCV 中,Mat 是一个非常重要的类,它代表了一个 n 维的稠密数组,其中每个元素都具有相同的数据类型。Mat 可以用来表示图像、矩阵、向量和其他数学对象,它支持多种数据类型,如整型、浮点型、布尔型等。
Mat 是 OpenCV 中的一个重要组件,几乎所有的图像处理和计算机视觉任务都涉及到它。因此,了解 Mat 的基本用法和属性是非常重要的。
本文主要和大家分享LabVIEW AI视觉工具包OpenCV Mat的基本用法和属性。
一、Mat的基本用法
1、创建Mat对象
可以使用Creat_mat.vi来创建一个空的 Mat 对象,也可以创建一个指定大小和数据类型的 Mat 对象。Creat_mat.vi数据类型选择8UC1_size,则可以创建一个灰度图Mat,选择8UC3_size,则可以创建某种颜色的彩图Mat,选择其他数据类型,则会创建一个空的Mat对象
Creat_mat.vi是一个多态VI,用于创建创建不同数据类型的Mat,即多维数组。
常用的数据类型包括:
- 8U:8 位无符号整型,取值范围为 0 到 255。
- 16U:16 位无符号整型,取值范围为 0 到 65535。
- 16S:16 位有符号整型,取值范围为 -32768 到 32767。
- 32S:32 位有符号整型,取值范围为 -2147483648 到 2147483647。
- 32F:32 位浮点型,取值范围为 -3.4028235e+38 到 3.4028235e+38。
- 64F:64 位浮点型,取值范围为 -1.7976931348623158e+308 到 1.7976931348623158e+308。
除了上述基本数据类型外,还支持复合数据类型,例如:
- 8UC1_size:8 位无符号整型,1 个通道。
- 8UC3_size:8 位无符号整型,3 个通道。
8U 表示 8 位无符号整型,C 表示通道数,1、3 分别表示通道数为 1、3。在创建 Mat 对象时,需要指定矩阵的数据类型,可根据实际所需数据类型来创建Mat。
多态VI概念:可以处理多种不同数据类型的VI被称为“多态VI”。多态VI根据输入或输出的 数据类型,再选择调用一个针对这种数据类型实现功能的VI,这些针对某种数据类型实现功能的VI称作“实例VI”。一般一个VI调用多个实例VI,简而言之:一个多态VI就是多个实例VI的封装和组合。
2、释放 Mat 对象
可以使用Release.vi释放Mat 对象占用的内存。
下面是一个示例代码,演示了如何创建和释放 Mat 对象:
- 创建一个大小为480*640,数据类型为 8UC3 ,颜色为全红的RGB 彩色图像,代码如下:
- 创建一个大小为480*640,数据类型为 8UC1 ,灰度为0的灰度图像,代码如下:
二、不同数据类型Mat对象的属性
Mat的属性可以由属性节点(property node.vi)获取,如数据类型为8U的Mat,有如下属性:
1、Mat对象基本属性
channels
:通道数。cols
:矩阵的列数。rows
:矩阵的行数。data_Pointer
:矩阵中第一个元素的指针,可以通过该指针访问整个矩阵的数据。dims
:矩阵的维度,通常是 2 或 3。elemSize
:表示矩阵中每个元素所占用的字节数。它等于elemSize1 * channels
elemSize1
:表示矩阵中每个元素的字节数(即数据类型大小),而channels
是矩阵中的通道数。
例如:
如果 Mat 对象表示一个 3x3 的灰度图像,其数据类型为 8UC1(即 8 位无符号单通道图像),则elemSize1
为 1,channels
为 1,因此elemSize
为 1。
如果cv::Mat
对象表示一个 3x3 的 RGB彩色图像,其数据类型为 8UC3(即 8 位无符号三通道图像),则elemSize1
为 8/8=1,channels
为3,因此elemSize
为 3。
elemSize
在计算cv::Mat
对象的内存大小时非常有用。矩阵的内存大小可以通过以下公式计算:size_t size_in_bytes = rows * step; // 每行的字节数乘以行数
length
:矩阵的大小,是一个一维数组,包含rows
和cols
。step
:矩阵在内存中每一行的字节数,通常是一个包含两个或三个元素的整数数组,其中step[0]
表示每行元素所占用的字节数,step[1]
和step[2]
分别表示相邻两行在内存中的地址偏移量。total
:矩阵中元素的总数,等于cols * rows
type
:矩阵的数据类型,表示矩阵中每个元素的数据类型。
2、Mat对象的数据属性
1d_data
:是一个一维数组,数组大小为cols * rows * channels
,该数组中每一个元素都代表一个像素,对于灰度图像,像素用8位无符号数,0表示黑色,255表示白色。对于彩色像素而言,每个像素需要三位这样的8位无符号数来表示,即三个通道(R,G,B),数组则依次存储一个像素的三个通道的值,然后再存储下一个像素点。8UC1_data
:是一个二维数组,数组行数为rows
,列数为cols * channels
,该数组中每一个元素都代表一个像素;8UC3_data
:是一个二维数组,数组行数为rows
,列数为cols * channels
,该数组中每一个元素都代表一个像素;image
:LabVIEW自带的图片控件。picture
:二维图片,图片控件U32_data
:表示一个32位整型数组,数组行数为rows
,列数为cols
,用于存储图像中每个像素的颜色值。每个像素都由一组颜色值来表示,这些颜色值可以是灰度值、RGB值或其他颜色空间(RGBA)的值。该数组中每一个元素都代表一个像素;像素值由16进制表示
总结
以上就是今天要给大家分享的内容,如果有问题可以在评论区里讨论,如您想要探讨更多关于LabVIEW与人工智能技术,欢迎加入我们:705637299。
**如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏