一、前言
OpenCV有很多数据类型,它们都基于一些重要视觉概念的抽象而设计,以此提供相对简单、直观的表示和处理。同时,许多算法开发者需要一些相对有效的、可以推广或扩展以满足他们特定需求的基本数据结构。OpenCV库使用基础数据类型模板构建并特化这些模板,从而使每个人都能简单地执行操作并满足自己的需求。
从组织结构的角度来看,OpenCV的基础数据类型主要分为三类:
- 直接从C++原语中继承的基础数据类型(如:int、float等);
- 辅助对象(如:垃圾收集指针类、用于数据切片的范围对象Range、抽象的终止条件类等);
- 大型数组类型(如cv::Mat);
二、基础数据类型
2.1、固定向量类cv::Vec<>
(通过下标访问)
固定向量类cv::Vec<>是一个原语容器,用于在编译时已经知道维度的小型向量。cv::Vec<>是模板,但大部分时间我们都不会倾向于使用它的这个形式,而是使用它的别名,以便用于通用的实例。别名形式:cv::Vec{2,3,4,6}{b,w,s,i,f,d}
。
固定向量类继承自固定矩阵类,而其他类的重要操作,要么是继承自固定向量类(类似cv::Scalar),要么是依赖于转换成固定向量类。
- b:unsigned char(无符号字符)
- w:unsigned short(32位整型)
- s:short(短整型)
- i:int(32位整型)
- f:float(32位浮点数)
- d:double(64位浮点数)
举例如下:
别名 | 解释 |
cv::Vec2i<> | 2个元素的整型向量 |
cv::Vec3i<> | 3个元素的整型向量 |
cv::Vec4d<> | 4个元素的双精度浮点向量 |
cv::Vec支持的操作
操作 | 示例 |
默认构造函数 | |
复制构造函数 | |
值构造函数 | |
成员访问 | |
向量叉乘 | |
2.2、固定矩阵类cv::Matx<>
与固定向量类一样,cv::Matx<>并不是用于大型数组的,而是设计用于一些特定的小型矩阵操作。在计算机视觉中,有很多2x2、3x3的矩阵,同时还有少量的4x4矩阵用于各种变换。cv::Matx<>设计用于容纳这些对象,与cv::Vec<>类似,cv::Matx<>一般都以别名:cv::Matx{1,2,3,4,5,6}{1,2,3,4,5,6}{f,d}
(cv::Matx{行数}{列数}{数据类型})的形式应用。
固定矩阵类是为编译时就已知维度的矩阵打造的,因为它的内部的所有数据都是在堆栈上分配的,所以他们的分配和清除都很快。
cv::Matx支持的操作
操作 | 示例 |
默认构造函数 | |
复制构造函数 | |
值构造函数 | |
含相同元素的矩阵 | |
全零矩阵 | |
全1矩阵 | |
创建一个单位矩阵 | |
创建一个可以容纳另一个矩阵对角线的矩阵 | |
创建一个均匀分布的矩阵 | |
创建一个正态分布的矩阵 | |
成员访问 | |
矩阵代数运算 | |
单例代数 | |
比较 | |
点积(单精度) | |
点积(双精度) | |
改变矩阵形状 | |
变换操作符 | |
提取(i,j)处的2*2子矩阵 | |
提取第i行 | |
提取第j列 | |
提取矩阵对角线 | |
计算转置 | |
逆矩阵 | |
解线性系统 | |
每个元素的乘法 | |
2.3、cv::Point
类
点类,用于存储点的坐标。cv::Point
一般都以别名:cv::Point{2,3}{i,f,d}
的形式调用。
cv::Point支持的操作
操作 | 示例 |
默认构造函数 | |
复制构造函数 | |
值构造函数 | |
构造成固定向量类 | |
成员访问 | |
点乘 | |
叉乘 | |
判断一个点是否在矩形r内 | |
2.4、cv::Scalar
类
四维点类,思维双精度向量的快速表示。虽然可以通过模板类实现各类型的点,但是不管是哪一种类型,其返回值都是双精度浮点型数据。
cv::Scalar支持的操作
操作 | 示例 |
默认构造函数 | |
复制构造函数 | |
值构造函数 | |
元素相乘 | |
(四元数)共轭 | |
(四元数)真值测试 | |
2.5、cv::Size
类
大小类,包含width和height两个属性。cv::Size
一般都以别名:cv::Size{2}{i,f}
的形式调用,cv::Size
与cv::Size2i
等价。
cv::Size支持的操作
操作 | 示例 |
默认构造函数 | |
复制构造函数 | |
值构造函数 | |
成员访问 | |
(计算面积 | |
2.6、cv::Rect
类
矩形类,包含Point类的成员x和y(矩形左上角)和Size类的成员width和height(代表了矩形的大小)。
cv::Rect支持的操作
操作 | 示例 |
默认构造函数 | |
复制构造函数 | |
值构造函数 | |
由起始点和大小构造 | |
由两个对角构造 | |
成员访问 | |
计算面积 | |
提取左上角 | |
提取右下角 | |
判断点p是否在矩形r内 | |
矩形r1和矩形r2的交集 | |
同时包含矩形r1和矩形r2的最小面积矩形 | |
平移矩形rx个数量 | |
扩大矩形rs大小 | |
比较矩形r1与矩形r2是否相等 | |
比较矩形r1和矩形r2是否不相等 | |
2.7、cv::RotateRect
类
用于表示非轴对称的矩形,内含一个cv::Point2f类型的中心点,一个cv::Size2f类型的size,还有一个float的额外角度(图形绕中心点旋转的角度)。cv::RotateRect
与cv::Rect
最大的不同是前者以中心为原点,后者以左上角为原点。
cv::RotateRect支持的操作
操作 | 示例 |
默认构造函数 | |
复制构造函数 | |
从两个点构造 | |
值构造函数,需要一个点(Point)、一个大小(Size)和一个角度(Angle) | |
成员访问 | |
返回四个角的列表 | |
2.8、复数类cv::Complex
OpenCV的复数列与STL复数类模板complex不一样,但是与之兼容,可以相互转换。它们最大的区别在于成员获取。在STL类中,虚部和实部是通过成员函数real()和imag()获取的,而在OpenCV中,直接通过成员变量re和im获取。
cv::Complex支持的操作
操作 | 示例 |
默认构造函数 | |
复制构造函数 | |
值构造函数 | |
成员访问 | |
复共轭 | |