OpenCV的数据类型
OpenCV设计了有许多数据类型,这使得重要的计算机视觉概念的表述和处理相对容易和直观
三个主要分类,the basic data types, 是由原子类型组合而成的基本数据类型;helper objects,这些类是较为抽象的类,比如垃圾回收指针类等;large array types,这些对象的基本目的,是包含数组或其他原子类型组合或常用的基本的数据类型,典型的例子,比如cv::Mat类;
除此之外,OpenCV还充分利用标准模板库,STL,还特别依赖向量类vector;
基本数据类型
最简单的基本数据类型,是固定向量类,cv::Vec<>,是模板类,原子容器类,适用于小型向量(不超过9个元素),其维度在编译之前是明确的;固定矩阵类,cv::Matx<>,是模板类,适用于小型矩阵的运算,类似与固定向量类而与cv::Mat类不同;与固定向量类密切相关的的是,cv::Point类,并不是直接继承于固定向量类,它继承自自身的模板,但是可以与固定向量类相互转换;cv::Scalar,继承于固定向量类的实例,是一个四维的点,生成四维向量而与固定向量类相关联;cv::Size类和cv::Rect类,与cv::Point类一样,也是派生于它们自己的模板;具体细节请查阅,.../opencv2/core/core.hpp
The point classes,点类
OpenCV基本数据类型中,最简单的类,基于模板结构实现,一个二维点的模板,一个三维点的模板;点类可以强制转换成其他的类;点类的别名cv::Point2i或cv::Point3f,其后面的数字代表构造点的原子数据类型的个数;
点类的基本操作
//1.默认构造 cv::Point2i p; cv::Point3f p; //2.copy构造 cv::Point3f p2(p1); //3.有参构造 cv::Point2i p(x0,x1); cv::Point3d p(x0,x1,x2); //4.强制类型转换 (cv::Vec3f) p; //5.访问数据成员 p.x; p.y; //3维点类: p.z; //6.点积 float x = p1.dot(p2); //7.双精度点积 double x = p1.ddot(p2); //8.向量积 p1.cross(p2); //3维点类only //9.查询点p是否在矩形r之内 p.inside(r);
The cv::Scalar class,标量类
Scalar类,本质上是4维Point类,实际上与模板类相关联,访问其别名会返回一个模板对象,对象内的所有成员都是双精度的浮点Point成员;Scalar类直接继承于实例化的cv::Vec<>模板类,具有向量类的操作及其属性;
Scalar类的基本操作
//默认构造 cv::Scalar s; //copy构造 cv::Scalar s2(s1); //有参构造 cv::Scalar s(x0); cv::Scalar s(x0,x1,x2,x3); //按元素相乘 s1.mul(s2); //四元结合 s.conj();//返回cv::Scalar(s0,-s1,-s2,-s3); //四元判断 s.isReal();//如果s1==s2==s3==0 返回true
The size classes,size类
Size类,实际上与其相对性的Point类相似,并且可以相互转换;其主要的不同点是Point类的数据成员以x,y命名,Size类的数据成员以width,height命名;
Size类的3个别名cv::Size,cv::Size2i, 和cv::Size2f,前2个别名是等价的;
Size类的基本操作
//有参构造 cv::Size2f sz(w,h); //访问成员 sz.width; sz.height; //计算面积 sz.area();
The cv::Rect class,矩形类
Rect类,包含Point类的成员x,y 及 Size类的成员width和height,但并不是继承于Point,Size类;它实际上是矩形模板类的具有整形成员变量的实例的别名;
Rect类的基本操作
//默认构造 cv::Rect r; //copy构造 cv::Rect r2(r1); //有参构造 cv::Rect(x,y,w,h); //起点及大小构造 cv::Rect(p,sz); //访问数据成员 r.x; r.y; r.width; r.height; //计算面积 r.area(); //提取左上角 r.tl(); //upper-left //提取右下角 r.br(); //bottom-right //判断点p是否在矩形r内 r.contains(p);
运算符重载
//矩形r1和r2的交集 cv::Rect r3 = r1 & r2; r1 &= r2; //包含矩形r1和r2的最小矩形区域 cv::Rect r3 = r1 | r2; r2 |= r2; //矩阵平移 cv::Rect rx = r + x; r += x; //放大矩阵size s cv::Rect rs = r + s; r += s; //比较二个矩阵是否完全相等 bool eq = (r1 == r2); //比较二个矩阵是否不相等 bool ne = (r1 != r2);
The cv::RotatedRect class
cv::RotatedRect类,是为数不多的非模板的C++ OpenCV 底层接口类,它是一个容器,包含一个cv::Point2f中心,一个cv::Size3f宽高,一个围绕中心旋转的单精度浮点角度;cv::RotatedRect类与cv::Rect类最大的区别是,cv::RotatedRect类,位于相对于中心的区域,cv::Rect类,位于相对于其左上角的区域;
cv::RotatedRect类的基本操作
//默认构造 cv::RotatedRect rr(); //copy构造 cv::RotatedRect rr2(rr1); //从2个角构造 cv::RotatedRect(p1,p2); //有参构造 cv::RotatedRect rr(p,sz,theta); //访问成员 rr.center; rr.size; rr.angle; //返回角列表 rr.points(pts[4]);
The fixed matrix classes
The fixed matrix 类,固定矩阵类,实际上是一个模板类,因其规模在编译之前是确定了的,所以是固定的,其数据内存分配是在栈区,分配和回收内存很快;为小型矩阵特别优化的实现,在其之上的操作也很快;OpenCV C++接口中,该类是其他基础类型的核心;固定向量类继承于该类,其他类继承于固定向量类;若是大数据阵列,比如图像,请使用 cv::Mat 类;
fixed matrix类的基本操作
//默认构造 cv::Matx33f m33f; cv::Matx43d m43d; //copy构造 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); //zeros矩阵 m23d = cv::Matx23d::zeros(); //ones矩阵 m16f = cv::Matx16f::ones(); //创建一个单元矩阵 m33f = cv::Matx33f::eye();
注意,很多固定矩阵类的函数相对于类是静态的,比如你想构建一个3×3的完全相同的矩阵,可以使用类函数,cv::Mat33f::eye()
Helper Objects
The cv::TermCriteria class
很多算法需要一个终止条件以确定何时退出,终止条件的形式,COUNT或MAX_ITER,EPS(epsilon),TYPE是,COUNT, EPS 或 COUNT + EPS
TermCriteria( int type, int maxCount, double epsilon ); //构造函数
enum Type { COUNT =1, MAX_ITER =COUNT, EPS =2 }
The cv::Range class
用于确定一个连续的整数序列,对象有两个元素start和end,在构造函数中设定,范围包含初始值start,但不包含终止值end,cv::Range rng( 0,4);包含值0,1,2,3,rng.size();等于4
cv::Range( int start, int end );
The cv::Ptr 模板和垃圾回收
智能指针,是c++中一个非常有用的类型,这个指针允许我们创建一个对象的引用,然后把它传递到各处;你可以创建更多的该对象的引用,然后所有这些引用都会被计数,当引用超出范围,智能指针的引用计数就会减少,一旦所有的引用消失,这个对象将自动清理释放。
这个模板类的构造函数就拥有指向对应对象的指针,可以类似cv::Ptr<Matx33f> p( new cv::Matx33f );或 cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>();调用;
The cv::Exception class 和异常处理
它继承自STL的异常类std::exception,这个异常类除了在cv::命名空间内,以使其有别于其他从std::exception中继承而来的对象以外没有任何特别的;
The cv::DataType<>模板
当OpenCV库函数需要传递特定数据类型的概念时,它们会创建一个cv::DataType<>类型的对象;
The cv::InputArray 类和 cv::OutputArray 类
许多OpenCV的函数都把数组作为变量并把数组作为返回值,但在OpenCV中有各种各样的数组,为了防止接口变得复杂,OpenCV定义了
The cv::InputArray和cv::OutputArray类,它们的主要区别在于前者假设为常量,后者是可变量;当不需要对应的输出时,可以传递cv::noArray();
Utility Functions
工具函数包含数学操作、测试、错误生成、内存与线程处理、优化及其他的工具
The Template Structures
OpenCV建立在类似STL、boost及其他类似库的模板元编程风格上,通用的固定长度模板:
cv::Point_<Type T> //包含二个T类型对象的点 cv::Rect_<Type T> //位置、宽度和高度,均为类型T cv::Vec<Type T, int H> //一个T类型H个对象的集合 cv::Matx<Type T, int H, int W> //一个T类型H*W个对象的集合 cv::Scalar_<Type T> //一个包含四个T类型的对象的集合(与cv::Vec<T, 4>完全相同)