一、前言
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支持的操作
| 操作 | 示例 |
|---|---|
| 默认构造函数 | cv::Vec2s v2s; cv::Vec3b v3b; |
| 复制构造函数 | cv::Vec3f u3f( v3f ); |
| 值构造函数 | cv::Vec2f v2f(x0,x1); cv::Vec6d v6d(x0,x1,x2,x3,x4,x5); |
| 成员访问 | v4f[i]; v3w(j) //两种方式都可以 |
| 向量叉乘 | v3f.cross(u3f); |
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支持的操作
| 操作 | 示例 |
|---|---|
| 默认构造函数 | cv::Matx33f m33f; cv::Mat43d m43d; |
| 复制构造函数 | cv::Matx22d m22d(n22d); |
| 值构造函数 | cv::Matx21f m(x0,x1); cv::Matx44d m(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,); |
| 含相同元素的矩阵 | m33f = cv::Matx33f::all(x); |
| 全零矩阵 | m23d = cv::Matx23d::zeros(); |
| 全1矩阵 | m16f = cv::Matx16f::ones(); |
| 创建一个单位矩阵 | m33f = cv::Matx33f::eye(); |
| 创建一个可以容纳另一个矩阵对角线的矩阵 | m31f = cv::Matx33f::diag(); |
| 创建一个均匀分布的矩阵 | m33f = cv::Matx33f::randu(min, max); |
| 创建一个正态分布的矩阵 | m33f = cv::Matx33f::nrandn(mean, variance); |
| 成员访问 | m(i, j); |
| 矩阵代数运算 | m1 = m0; m0 * m1; m0 + m1; m0 - m1; |
| 单例代数 | m * a; a * m; m / a; |
| 比较 | m1 == m2; m1 != m2; |
| 点积(单精度) | m1.dot(m2); |
| 点积(双精度) | m1,ddot(m2); |
| 改变矩阵形状 | m91f = m33f.reshape<9,1>(); |
| 变换操作符 | m44f = (Matx44f) m44d; |
| 提取(i,j)处的2*2子矩阵 | m44f.get_minor<2,2>(i,j); |
| 提取第i行 | m14f = m44f.row(i); |
| 提取第j列 | m41f = m44.col(j); |
| 提取矩阵对角线 | m41f = m44f.diag(); |
| 计算转置 | n44f = m44f.t(); |
| 逆矩阵 | n44f = m44f.inv(method); //默认method是cv::DECOMP_LU |
| 解线性系统 | m31f = m33f.solve(rhs31f, method); m32f = m33f.solve(rhs32f, method); |
| 每个元素的乘法 | m1.mul(m2); |
2.3、cv::Point类
点类,用于存储点的坐标。cv::Point一般都以别名:cv::Point{2,3}{i,f,d}的形式调用。
cv::Point支持的操作
| 操作 | 示例 |
|---|---|
| 默认构造函数 | cv::Point2i p; cv::Point3i p; |
| 复制构造函数 | cv::Point3f p2(p1); |
| 值构造函数 | cv::Point2i p(x0,x1); cv::Point3d p(x0,x1,x2); |
| 构造成固定向量类 | (cv::Vec3f) p; |
| 成员访问 | p.x; p.y; |
| 点乘 | float x = p1.dot(p2); |
| 叉乘 | p1.cross(p2); |
| 判断一个点是否在矩形r内 | p.inside(r); |
2.4、cv::Scalar类
四维点类,思维双精度向量的快速表示。虽然可以通过模板类实现各类型的点,但是不管是哪一种类型,其返回值都是双精度浮点型数据。
cv::Scalar支持的操作
| 操作 | 示例 |
|---|---|
| 默认构造函数 | cv::Scalar s; |
| 复制构造函数 | cv::Scalar s2(s1); |
| 值构造函数 | cv::Scalar s(x0); cv::Scalar s(x0,x1,x2,x3); |
| 元素相乘 | s1.mul(s2) |
| (四元数)共轭 | s.conj(); //return cv::Scalar(s0, -s1, -s2, -s2); |
| (四元数)真值测试 | s.isReal(); //return true, if s1==s2==s3==0 |
2.5、cv::Size类
大小类,包含width和height两个属性。cv::Size一般都以别名:cv::Size{2}{i,f}的形式调用,cv::Size与cv::Size2i等价。
cv::Size支持的操作
| 操作 | 示例 |
|---|---|
| 默认构造函数 | cv::Size sz; cv::Size2f sz; |
| 复制构造函数 | cv::Size sz2(sz1); |
| 值构造函数 | cv::Size2f sz(w, h); |
| 成员访问 | sz.width; sz.height; |
| (计算面积 | sz.area(); |
2.6、cv::Rect类
矩形类,包含Point类的成员x和y(矩形左上角)和Size类的成员width和height(代表了矩形的大小)。
cv::Rect支持的操作
| 操作 | 示例 |
|---|---|
| 默认构造函数 | cv::Rect r; |
| 复制构造函数 | cv::Rect r2(r1); |
| 值构造函数 | cv::Rect r(x, y, w, h); |
| 由起始点和大小构造 | cv::Rect(p, sz); |
| 由两个对角构造 | cv::Rect(p1, p2); |
| 成员访问 | r.x, r.y, r.width, r.height; |
| 计算面积 | r.area() |
| 提取左上角 | r.tl(); |
| 提取右下角 | r.br(); |
| 判断点p是否在矩形r内 | r.contains(p); |
| 矩形r1和矩形r2的交集 | cv::Rect r3 = r1 & r2; |
| 同时包含矩形r1和矩形r2的最小面积矩形 | cv::Rect r3 = r1 | r2 |
| 平移矩形rx个数量 | cv::Rect rx = r + x; |
| 扩大矩形rs大小 | cv::Rect rs = r + s; |
| 比较矩形r1与矩形r2是否相等 | bool eq = (r1 == r2); |
| 比较矩形r1和矩形r2是否不相等 | bool ne = (r1 != r2); |
2.7、cv::RotateRect类
用于表示非轴对称的矩形,内含一个cv::Point2f类型的中心点,一个cv::Size2f类型的size,还有一个float的额外角度(图形绕中心点旋转的角度)。cv::RotateRect与cv::Rect最大的不同是前者以中心为原点,后者以左上角为原点。
cv::RotateRect支持的操作
| 操作 | 示例 |
|---|---|
| 默认构造函数 | cv::RotateRect rr; |
| 复制构造函数 | cv::RotateRect rr2(rr1); |
| 从两个点构造 | cv::RotateRect rr(p1, p2); |
| 值构造函数,需要一个点(Point)、一个大小(Size)和一个角度(Angle) | cv::RotateRect rr(p, sz, theta); |
| 成员访问 | rr.center, rr.size, rr.angle; |
| 返回四个角的列表 | rr.points(pts[4]); |
2.8、复数类cv::Complex
OpenCV的复数列与STL复数类模板complex不一样,但是与之兼容,可以相互转换。它们最大的区别在于成员获取。在STL类中,虚部和实部是通过成员函数real()和imag()获取的,而在OpenCV中,直接通过成员变量re和im获取。
cv::Complex支持的操作
| 操作 | 示例 |
|---|---|
| 默认构造函数 | cv::Complexf z1; cv::Complexd z2; |
| 复制构造函数 | cv::Complexf z2(z1); |
| 值构造函数 | cv::Complexf z1(re0); cv::Complexd z2(re0, im1); |
| 成员访问 | z1.re; z1.im; |
| 复共轭 | z2 = z1.conj(); |
本文介绍了OpenCV的基础数据类型。OpenCV基于重要视觉概念抽象设计数据类型,其基础数据类型分三类。文中详细阐述了固定向量类、固定矩阵类、点类、四维点类、大小类、矩形类、非轴对称矩形类和复数类等,还提及各类的操作及特点。
27万+

被折叠的 条评论
为什么被折叠?



