目录
引言
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像处理、视频分析、对象检测等功能。本文将详细介绍OpenCV中常见的API以及绘图相关的知识,帮助开发者更好地理解和使用OpenCV。
一、Mat类详解
Mat类是OpenCV中C++版本的矩阵类,它替代了原来C版本的矩阵结构体CvMat和图像结构体IplImage。Mat类具有许多优势,特别是与STL(Standard Template Library)的兼容性很好,提供了许多类似于STL的操作,并且是一种高效的数据类型,对内存进行动态管理,无需用户手动管理内存。
1. Mat类的基本结构
Mat类定义于OpenCV的core.hpp中,主要包含两部分数据:
- 矩阵头(matrix header):这部分的大小是固定的,包含了矩阵的大小(行数和列数)、存储方式、矩阵存储的地址等信息。
- 数据指针(data pointer):一个指向矩阵包含像素值的指针,用于访问矩阵的实际数据。
Mat类的定义大致如下(简化版):
class CV_EXPORTS Mat {
public:
int flags; // 包含矩阵的多个标志位,如深度、通道数等
int dims; // 数组的维度,>= 2
int rows, cols; // 矩阵的行数和列数
uchar* data; // 指向数据的指针
int* refcount; // 指向引用计数器的指针
// 其他成员...
};
2. Mat类的数据类型
Mat类支持多种数据类型,这些数据类型决定了矩阵中元素的存储方式。常见的数据类型包括:
- CV_8U:8位无符号整数(0~255)
- CV_8S:8位有符号整数(-128~127)
- CV_16U:16位无符号整数(0~65535)
- CV_16S:16位有符号整数(-32768~32767)
- CV_32S:32位有符号整数
- CV_32F:32位浮点数
- CV_64F:64位浮点数
在OpenCV中,可以通过特定的模板类(如Mat_<uchar>
、Mat_<int>
等)或类型标识符(如CV_8UC1
、CV_32FC3
等)来指定Mat的数据类型。
3. Mat类的创建与初始化
Mat类可以通过多种方式创建和初始化:
-
使用构造函数:
Mat::Mat()
:默认构造函数,创建一个空的Mat对象。Mat::Mat(int rows, int cols, int type)
:指定行数、列数和类型创建Mat对象。Mat::Mat(Size size, int type)
:使用Size
结构体指定尺寸和类型创建Mat对象。Mat::Mat(const Mat& m)
:拷贝构造函数,创建一个与已有Mat对象相同的Mat对象(但注意,这种方式只是复制了矩阵头,数据是共享的)(浅拷贝)。
-
使用
create
函数:可以在不重新创建Mat对象的情况下改变其大小和类型。 -
使用其他函数:如
zeros
、ones
、eye
等,用于创建全零、全一或单位矩阵。
4. Mat类的使用技巧
- 元素访问:
- 使用
at
函数:M.at<type>(i, j)
,其中type
是元素的数据类型,i
和j
是行和列的索引。 - 使用迭代器:通过
MatIterator_
迭代器遍历矩阵元素。 - 使用指针:直接操作
data
指针访问矩阵数据(注意边界和步
- 使用