1.固定向量类cv::Vec<>
最直接的基本数据类型是模板类cv::Vec<>,这是一个用于原语的容器类,我们将其称为固定向量类。为什么不直接使用STL类呢?关键的区别在于,固定向量类是为在编译时已知维数的小向量设计的。这就允许使用特别高效的代码来处理小的常见操作。在实践中,“small”的意思是,如果您有多个元素,那么您可能使用了错误的类。(事实上,从2.2版本开始,这个数字在任何情况下都不能超过9。)在之后,我们将研究cv::Mat类,它是处理任意维数的大数组的正确方法,但是现在,可以认为固定向量类对于小家伙来说是方便快捷的。
虽然cv::Vec<>是一个模板,但我们也不会经常看到或使用这种形式。因为我们会经常使用其别名(typedefs)。总结来说,在使用别名时一共有4*6种方式。可以在中任何一种组合。以下是三种组合方式举例:
使用别名 | 解释 |
---|---|
cv::Vec2i | 双元素整数向量 |
cv::Vec3i | 三元素整数向量 |
cv::Vec4d | 四元素双精度浮点向量 |
2.固定矩阵类cv::Matx<>
除了固定向量类cv::Vec,还有固定矩阵类,它们与模板cv::Matx<>相关联。就如同固定向量类一样,固定矩阵类也不打算用于大数组,而是设计用于处理特定的小矩阵操作。在计算机视觉中,有很多2×2或3×3矩阵,和几个4×4,用于各种转换,Matx<>被设计用来容纳这类对象。又如固定向量类的别名,固定矩阵类也用别名。主要也是从以下552个组合中任意选择。需要注意的是,对于固定矩阵类(如固定向量类,但与下一章cv::Mat不同),必须在编译时知道固定矩阵类的维数。当然,正是这种特性使得在使用固定矩阵类的操作变得高效,并消除了许多动态内存分配操作。
3.cv::Point二维/三维点类
与固定向量类密切相关的是point类,它们是两个或三个点值的基本类型容器。Point点类是从它们自己的模板派生出来的,所以它们不是直接从固定向量类派生出来的,但是Point点类可以和固定向量类相互转换。Point点类和固定向量类之间的主要区别是,Point点类的成员由命名变量(mypoint)访问,比如mypoint.x,mypoint.y。而不是通过向量索引(myvec[0], myvec[1],等等)。与cv::Vec<>一样,Point点类通常通过别名调用,以实例化适当的模板。主要有:
cv::Point2i, cv::Point2f, cv::Point2d, cv::Point3i, cv::Point3f, cv::Point3d.
4.cv::Scalar四维点类
和Point点类一样,cv::Scalar点类是四个点值的模板类。但是和Point点类不一样的是,cv::Scalar是一个具有双精度的四分量向量。还有一点和Point点类不一样是,可以使用整数索引访问Scalar对象元素,这和cv::Vec<>相同。这是因为cv::Scalar直接派生自cv::Vec<>的实例化(具体地说,派生自cv::Vec<double,4>)。
5.其余基础类
还有cv::Size和cv::Rect。与Point点类一样,这两个类都来自它们自己的模板。cv::Size是包含了宽度和高度,没有x,y。cv::Rect则包含了这四个数。Size类实际上是cv::Size2i的别名。对于宽度和高度是浮点值的情况,使用别名cv::Size2f。类似地,cv::Rect是矩形整数形式的别名。还有一个类表示一个没有轴向对齐的矩形,叫做cv::RotatedRect,包含了类型为cv::Point2f的中心点,类型为cv::Size2f的尺寸,意见一个额外的浮点数angle。
网友评论