OpenCV 4.12.0 版本
目录
[1. Vec<> 短数向量](#1. Vec<> 短数向量)
[2. 二维点类Point_](#2. 二维点类Point_)
[3. 三维点类Point3_](#3. 三维点类Point3_)
[4. 四元素向量Scalar_](#4. 四元素向量Scalar_)
[5. 图像或矩形大小类Size_](#5. 图像或矩形大小类Size_)
[6. 二维矩形类Rect_](#6. 二维矩形类Rect_)
[7. 指定矩阵跨度类Range](#7. 指定矩阵跨度类Range)
[8. 旋转矩形RotatedRect](#8. 旋转矩形RotatedRect)
[9. 定矩形 Matx(fixed)](#9. 定矩形 Matx(fixed))
1. Vec<> 短数向量
用于短数值向量的模板类,是 Matx 的一个子类。其定义为
template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>
该模板类表示短数值向量(包含 1、2、3、4......个元素),你可以对其执行基本算术运算,使用 [] 运算符访问单个元素等。这些向量分配在栈上,这与 std::valarray、std::vector、cv::Mat 等不同,后者的元素在堆上动态分配。针对频繁使用的短向量,比如 10 个元素之内的短向量。
其定义了一些常用别名,最后一个字母表示数据类型:
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<ushort, 4> Vec4w;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<int, 6> Vec6i;
typedef Vec<int, 8> Vec8i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
2. 二维点类Point_
这是一个用于表示二维点的模板类,其坐标由 x 和 y 指定 。该类的实例可以与 C 结构体 CvPoint 和 CvPoint2D32f 互换。此外,它还提供了一个类型转换运算符,用于将点坐标转换为指定的类型。浮点坐标到整数坐标的转换通过舍入完成。通常,转换过程会对每个坐标进行舍入。
其定义了一些别名,最后一个字母指数据类型:
typedef Point_<int> Point2i;
typedef Point_<int64> Point2l;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point2i Point;
3. 三维点类Point3_
此类用于表示由 x、y 和 z 坐标指定的 3维点的模板类。该类的实例可与 C 结构体 CvPoint2D32f 互换。与 Point_ 类似,3维点的坐标可以转换为其他类型。此外,还支持向量运算和比较操作。
其定义了一些别名,最后一个字母指数据类型:
typedef Point3_<int> Point3i;
typedef Point3_<float> Point3f;
typedef Point3_<double> Point3d;
4. 四元素向量Scalar_
一个派生于 Vec 的四元素向量模板类。 由于 Scalar_ 和 Scalar 都派生自 Vec<_Tp, 4>,因此它们可以像普通的四元素向量一样使用。此外,它们还可以与 CvScalar 相互转换。Scalar 类型在 OpenCV 中广泛用于传递像素值。
注意,不要被 Scalar这个名称迷惑,名称跟"标量"没有关系。
其定义的别名为:
typedef Scalar_<double> Scalar;
5. 图像或矩形大小类Size_
用于指定图像或矩形大小的模板类。该类包含两个成员:width 和 height。该结构体可以与旧的 OpenCV 结构体 CvSize 和 CvSize2D32f 相互转换。它提供了与 Point_ 相同的算术和比较运算。
其定义了几个别名,其中最后一个字母表示数据类型:
typedef Size_<int> Size2i;
typedef Size_<int64> Size2l;
typedef Size_<float> Size2f;
typedef Size_<double> Size2d;
typedef Size2i Size;
6. 二维矩形类Rect_
用下述参数描述此结构:
(1) 左上角的坐标。这是 OpenCV 中 Rect_::x 和 Rect_::y 的默认解释。不过,在你的算法中,你可以从左下角开始计算 x 和 y 的值。
(2) 矩形的宽度和高度。
OpenCV **通常假定矩形的上边界和左边界包含在其内,而右边界和下边界则不包含在其内。**例如,若
x ≤ pt.x < x + width , y ≤ pt.y < y + height
则 Rect_::contains 方法返回 true。
在 OpenCV 中,几乎所有遍历图像 ROI (其中 ROI 由 Rect_<int> 指定,ROI-region of interest)的循环都是这样实现的:
for(int y = roi.y; y < roi.y + roi.height; y++)
for(int x = roi.x; x < roi.x + roi.width; x++)
{
// ...
}
7. 指定矩阵跨度类Range
用于指定序列的连续子序列(分片)。该类用于指定矩阵 (Mat) 中的行或列跨度,以及用于许多其他用途。Range(a,b) 基本上与 Matlab 中的 a:b 或 Python 中的 a..b 相同。与 Python 类似,start 是范围的左边界(含),end 是范围的右边界(不含)。这样的半开区间通常表示为 [start,end)。
静态函数 Range::all() 返回一个特殊变量,表示"整个序列"或"整个范围",就像 Matlab 中的 : 或 Python 中的 ... 一样。OpenCV 中所有接受 Range 参数的方法和函数都支持这个特殊的 Range::all() 值。当然,如果您需要进行自定义处理,则可能需要显式地检查和处理它。
8. 旋转矩形RotatedRect
该类表示平面上旋转的(即非正立的)矩形。每一个矩形都由中心点 (质心(mass center))、每一条边的长度 (由 Size2f 结构体表示)以及旋转角(以度为单位)指定。
以下示例演示了如何使用 RotatedRect:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
Mat test_image(600, 400, CV_8UC3, Scalar(0));
RotatedRect rRect = RotatedRect(Point2f(100, 100), Size2f(100, 50), 30);
Point2f vertices[4];
rRect.points(vertices);
for (int i = 0; i < 4; i++)
line(test_image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2);
Rect brect = rRect.boundingRect();
rectangle(test_image, brect, Scalar(255, 0, 0), 2);
imshow("rectangles", test_image);
waitKey(0);

9. 定矩形 Matx(fixed)
用于在编译时已知类型和大小的小矩阵 的模板类。如果需要更灵活的类型,请使用 Mat。矩阵 M 的元素可以使用 M(i,j) 表示法访问。大多数常用的矩阵运算(另请参阅 MatrixExpressions)都可用。要对 Matx 执行未实现的运算,你可以轻松地将矩阵转换为 Mat,反之亦然。其使用栈上的一个数组
在实现上,其实现了从1到15个参数的多个构造函数,例如:
Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3,
_Tp v4, _Tp v5, _Tp v6, _Tp v7,
_Tp v8, _Tp v9, _Tp v10, _Tp v11,
_Tp v12, _Tp v13, _Tp v14, _Tp v15); //!< 1x16, 4x4 or 16x1 matrix
实现:
template<typename _Tp, int m, int n> inline
Matx<_Tp,m,n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9, _Tp v10, _Tp v11, _Tp v12, _Tp v13, _Tp v14, _Tp v15)
{
CV_StaticAssert(channels >= 16, "Matx should have at least 16 elements.");
val[0] = v0; val[1] = v1; val[2] = v2; val[3] = v3;
val[4] = v4; val[5] = v5; val[6] = v6; val[7] = v7;
val[8] = v8; val[9] = v9; val[10] = v10; val[11] = v11;
val[12] = v12; val[13] = v13; val[14] = v14; val[15] = v15;
for(int i = 16; i < channels; i++) val[i] = _Tp(0);
}
其一些别名定义为:
typedef Matx<float, 1, 2> Matx12f;
typedef Matx<double, 1, 2> Matx12d;
typedef Matx<float, 1, 3> Matx13f;
typedef Matx<double, 1, 3> Matx13d;
typedef Matx<float, 1, 4> Matx14f;
typedef Matx<double, 1, 4> Matx14d;
typedef Matx<float, 1, 6> Matx16f;
typedef Matx<double, 1, 6> Matx16d;
typedef Matx<float, 2, 1> Matx21f;
typedef Matx<double, 2, 1> Matx21d;
typedef Matx<float, 3, 1> Matx31f;
typedef Matx<double, 3, 1> Matx31d;
typedef Matx<float, 4, 1> Matx41f;
typedef Matx<double, 4, 1> Matx41d;
typedef Matx<float, 6, 1> Matx61f;
typedef Matx<double, 6, 1> Matx61d;
typedef Matx<float, 2, 2> Matx22f;
typedef Matx<double, 2, 2> Matx22d;
typedef Matx<float, 2, 3> Matx23f;
typedef Matx<double, 2, 3> Matx23d;
typedef Matx<float, 3, 2> Matx32f;
typedef Matx<double, 3, 2> Matx32d;
typedef Matx<float, 3, 3> Matx33f;
typedef Matx<double, 3, 3> Matx33d;
typedef Matx<float, 3, 4> Matx34f;
typedef Matx<double, 3, 4> Matx34d;
typedef Matx<float, 4, 3> Matx43f;
typedef Matx<double, 4, 3> Matx43d;
typedef Matx<float, 4, 4> Matx44f;
typedef Matx<double, 4, 4> Matx44d;
typedef Matx<float, 6, 6> Matx66f;
typedef Matx<double, 6, 6> Matx66d;
例如:
Matx33f m(1, 2, 3,
4, 5, 6,
7, 8, 9);
cout << sum(Mat(m * m.t())) << endl;