OPenCV高级编程——OpenCV常见的API及绘图知识详解

目录

引言

一、Mat类详解

1. Mat类的基本结构

2. Mat类的数据类型

3. Mat类的创建与初始化

4. Mat类的使用技巧

二、OpenCV核心功能模块

1. 基本的图像读取与显示

2. 图像的保存

3. 矩阵操作

4. 等待键盘输入与销毁窗口

5. 命名窗口

三、图像处理模块

1. 色彩空间转换

2. 图像写入

3. 图像变换

4. 图像滤波

四、绘图与交互

1. 绘制基本图形

  2. 文本绘制

  3. 鼠标与键盘事件

4. 示例:在图像上绘制并响应鼠标事件

五、结论


引言

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中,主要包含两部分数据:

  1. 矩阵头(matrix header):这部分的大小是固定的,包含了矩阵的大小(行数和列数)、存储方式、矩阵存储的地址等信息。
  2. 数据指针(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_8UC1CV_32FC3等)来指定Mat的数据类型。

3. Mat类的创建与初始化

Mat类可以通过多种方式创建和初始化:

  1. 使用构造函数

    • 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对象(但注意,这种方式只是复制了矩阵头,数据是共享的)(浅拷贝)
  2. 使用create函数:可以在不重新创建Mat对象的情况下改变其大小和类型。

  3. 使用其他函数:如zerosoneseye等,用于创建全零、全一或单位矩阵。

4. Mat类的使用技巧

  1. 元素访问
    • 使用at函数:M.at<type>(i, j),其中type是元素的数据类型,ij是行和列的索引。
    • 使用迭代器:通过MatIterator_迭代器遍历矩阵元素。
    • 使用指针:直接操作data指针访问矩阵数据(注意边界和步