最基本的数据类型是模板类cv::Vec<>
,这是一个原生容器类,我们将其称为 fixed vector 类。为什么不直接使用STL类呢?主要区别在于,fixed vector 类适用于其尺寸在编译时已知的小向量。这使得操作小变量的时候更加高效。后面我们将介绍cv::Mat
类,它是处理任意维数的大型数组的类型,但是现在,可以认为固定的向量类对于小的数据量来说是方便快捷的。
cv::Vec<>
是一个模板,但在大多数情况下不会以该形式看到或使用它。相反,cv::Vec<>
模板的常见实例化有其他的名字(typedef)。它们的名称类似于cv::Vec2i
、cv::Vec3i
和cv::Vec4d
(分别表示两个元素的整数向量、三个元素的整数向量和四个元素的双精度浮点向量)。还有其他的名字比如cv::Vec{2,3,4,6}{b,w,s,i,f,d}
(每个括号拿一个出来配对)
除了 fixed vector 类,还有 fixed matrix 类。它们与模板cv::Matx<>
相关联。就像 fixed vector 类一样,cv::Matx<>
不是用于大型数组,而是用于处理某些特定的小矩阵运算。在计算机视觉中,有很多2×2或3×3的矩阵,还有一些4×4的矩阵,它们用于各种变换。cv::Matx<>
就是为容纳这些类型的对象而设计的。与cv::Vec<>
一样,cv::Matx<>
通常通过cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d}
形式的 typedef 使用。重要的是要注意,对于 fixed matrix 类,其维数必须在编译时已知。
与 fixed vector 类密切相关的是 point 类,它是两个或三个基本类型值的容器。point 类是从它们自己的模板派生的,不是从 fixed vector 类直接派生出来的,但是它们可以相互转换。point 类和 fixed vector 类之间的主要区别在于,point 类的成员由命名的变量(mypoint.x
、mypoint.y
)访问,而不是通过 vector 索引(myvec[0]
、myvec[1]
)。与cv::Vec<>
一样,point 类通常通过 typedef 别名调用,用于实例化适当的模板。比如cv::Point2i
、cv::Point2f
和cv::Point2d
,或者cv::Point3i
、cv::Point3f
和cv::Point3d
。
cv::Scalar
类实质上是一个四维点。与 point 类一样,cv::Scalar
实际上与可以生成任意四分量矢量的模板相关联,但是关键字cv::Scalar
被特别 typedef 为具有双精度分量的四分量矢量。与 point 类不同,cv::Scalar
对象的元素使用整数索引进行访问,与cv::Vec<>
相同。这是因为cv::Scalar
类直接派生自cv::Vec<>
(具体地说,是从cv::Vec<double, 4>
派生)。
接下来是cv::Size
和cv::Rect
。与 point 类一样,这两个类都是从它们自己的模板派生的。cv::Size
主要通过数据成员的 width
和 height
来区分,而不是x
和y
,而cv::Rect
则具有这四个成员height
、width
、x
、y
。类cv::Size
实际上是cv::Size2i
的别名,在 width
和 height
是整数的情况下,cv::Size2i
本身是更通用模板的别名。对于 width
和 height
的浮点值,请使用别名cv::Size2f
。类似地,cv::Rect
是整数形式的矩形的别名。还有一个类表示非坐标轴平行的矩形。它名为cv::RotatedRect
,包含一个cv::Point2f
类型的center
、一个cv::Size2f
类型的size
和一个float
类型的angle
。