一. 基本数据类型
1.一些基本类型缩写:
b | w | s | i | f | d |
---|---|---|---|---|---|
unsigned char | unsigned short | short | int | float | double |
2. Point类
Point类属于模板类, 简单且开销小. Point类通过别名调用, 并使用 . 访问成员变量, 例如:
cv::Point2i | cv::Point2f | cv::Point2d | cv::Point3i | cv::Point3f | cv::Point3d |
---|
操作函数如下:
操作 | 示例 |
---|---|
默认构造函数 | cv::Point2i p; cv::Point3i p; |
复制构造函数 | cv::Point3f p2(p1); |
值构造函数 | cv::Point2i p(x0,x2); cv::Point3d p(x0, x1, x2); |
构造成固定向量类 | (cv::Vec3f) p; |
成员函数 | p.x, p.y, //三维中:P.Z |
点乘 | float x = p1.dot(p2); |
双精度点乘 | double x = p1.dot(p2) |
叉乘 | p1.cross(p2) //三维中使用 |
判断一个点p是否在矩形r内 | p.inside® //三维中使用 |
可以转化到固定向量类.
3. 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, 0s2); |
(四元数)真值测试 | s.isReal(); //return true, if s1 == s2 == s3 == 0 |
4. size类
与Point类类似, 只要区别在于Point的数据成员是x和y(点), 而size类对应的数据成员是width和height.
size类拥有的三个别名分别为:
cv::Size | cv::Size2i | cv::Size2f |
---|
支持的操作为:
操作 | 示例 |
---|---|
默认构造函数 | cv::Size sz cv::Size2i sz cv::Size2f sz; |
复制构造函数 | cv::SIze sz2(sz1) |
值构造函数 | cv::Size2f sz(w, h) |
成员访问 | sz.width; sz.height |
计算面积 | sz.area() |
不支持转换到固定向量类.
5. cv::Rect类
矩形类包含Point类的成员x和y(矩形左上角)和size类的成员width和height(代表的矩形的大小和位置).
但矩阵并非继承自Point类或者size类, 所以不具有其相关操作.
支持的操作:
操作 | 示例 |
---|---|
默认构造函数 | cv::Rect r |
复制构造函数 | cv::Rect r2(r1) |
值构造函数 | cv::Rect(x, y, width, height) |
由起始点和大小构造 | cv::Rect(p, sz) |
由两个对角构造 | cv::Rect(p1, p2) |
成员访问 | r.x; r.y; r.width; r.height |
计算面积 | r.area() |
提取左上角 | r.tl() |
提取右下角 | r.br() |
判断点p是否在矩形内 | r.contains§ |
覆写操作符:
操作 | 示例 |
---|---|
矩形r1和矩形r2的交集 | cv::Rect r3 = r1 & r2; r1 &= r2; |
同时包含矩形r1和矩形r2的最小面积矩形 | cv::Rect r3 = r1 | r2; r1 |= r2; |
矩形r平移x个数量 | cv::Rect rx = r + x; r += x |
矩形r扩大s大小 | cv::Rect rs = r + s; r += s; |
比较矩形r1与矩形r2是否相等 | bool eq = (r1 == r2) |
比较矩形r1与矩形r2是否不想等 | bool ne = (r1 != r2) |
6. cv::RotatedRect类
包含一个中心点cv::Point2f, 一个大小cv::Size2f和一个角度float的容器.
其中float表示图形围绕中心点旋转的角度.
cv::RotatedRect和cv::Rect有一个非常重要的不同点是cv::RotatedRect是以中心为原点, 而cv::Rect则以左上角为原点. 支持的操作:
操作 | 示例 |
---|---|
默认构造函数 | cv::RotatedRect rr() |
复制构造函数 | cv::RotatedRect rr2(rr1) |
从两个点构造 | cv::RotatedRect(p1, p2) |
值构造函数, 需要一个中心点point, 一个大小size和一个角度float | cv::Rotated rr(point, size, float) |
成员访问 | rr.center, rr.size, rr.float |
返回四个角的列表 | rr.points(ptr[4]) |
7. 固定矩阵类
固定矩阵类需要在创建时知道矩阵的纬度(大小). 其分配和清楚都很快. 在小型矩阵(2x2, 3x3, 等等)矩阵上做过特别的优化.
一般来说, 在编译的时候知道矩阵的大小的时候使用固定矩阵类(比如相机矩阵), 而如果对象是一个图像或大型点列表这样的大数组的时候, 通常使用cv::Mat.
cv::Matx支持的操作:
操作 | 示例 |
---|---|
默认构造函数 | cv::Matx33f m33f; cv::Matx43d m43d; |
复制构造函数 | cv::Matx22d m22d(n22d) |
值构造函数 | cv::Matx21f m(x0, x1); cv::Matx44d m(x0, x1, …, x14, x15); |
含相同元素的矩阵 | m33f = cv::Matx33f::all( x ) |
全零矩阵 | m23d = cv::Matx23d::zeros(); |
全一矩阵 | m16f = cv::Matx16f::ones(); |
创建一个单位矩阵 | m33f = cv::Matx33f::eye(); |
成员访问 | m( i, j ), m( i ) |
8. 固定向量类
固定向量类从固定矩阵类派生出来, 可以说固定向量类是列为1的cv::Matx<>.
cv::Vec支持的操作:
操作 | 示例 |
---|---|
默认构造函数 | Vec2s v2s; Vec6f v6f; |
复制构造函数 | Vec3f u3f( v3f ); |
值构造函数 | Vec2f v2f(x0, x1); Vec6d v6d(x0, x1, x2, x3, x4, x5); |
成员访问 | v4f[ i ]; v3w( j ); //operator()和operator[]都可以 |
向量叉乘 | v3f.cross( u3f ) |