基础数据类型分为三类:
- 直接从C++继承的基础数据类型(比如int,float),包括简单的数组和矩阵,简单的几何概念,比如点、矩形、大小
- 辅助对象(Helper objects),更抽象,比如垃圾收集指针类、用于数据切片的范围对象(range objects)以及抽象的终止条件类等
- 大型数组类型,比如cv::Mat类,用来代表任意维度的包含任意基础元素的数组;稀疏矩阵cv::SparseMat,适用于直方图
基础类型概述
cv::Vec<>
- C语言原语类型(如int或float)的容器,也就是固定向量类
- 与STL类的不同之处是,固定向量类用于在编译时已经知道维度的小型向量,更高效
- 有很多别名(typedef),比如cv::Vec2i、cv::Vec4d(2个元素的整型向量、4个元素的双精度浮点向量),任何有着 cv::Vec{2,3,4,6}{b,w,s,i,f,d} 形式的声明,对2个到6个维度的6种数据类型的任何组合都有效
b = unsigned char
w = unsigned short
s = short
i = int
f = float
d = double
cv::Matx<>
- 固定矩阵类,用于在编译时已经知道维度的小型矩阵
- cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d}
cv::Point类
- 由自己的模板派生的,也可以从固定向量类转换得到
- 与固定向量类最大的不同是他们的成员通过名称变量访问(mypoint.x, mypoint.y)而不是通过下标(myvec[0], myvec[1])
- 通过别名调用,比如cv::Point2i
辅助对象
cv::TermCriteria类
- 很多算法需要一个终止条件来确定何时退出,要么是达到允许的有限迭代次数,要么是某种形式的误差参数(EPS, epsilon)
- cv::TermCriteria对象把一个或两个终止条件封装,以便传入算法函数里,有三个成员变量,type, maxCount, epsilon,都可以直接设置,更常见的做法是只通过他们的构造函数 TermCriteria(int type, int maxCount, double epsilon) 进行设置
- type设置为 cv::TermCriteria::COUNT 或者cv::TermCriteria::EPS,也可以把两个条件通过位运算符|并在一起
cv::Range类
- 用于确定一个连续的整数序列
- 有两个元素 start, end,常在构造函数 cv::Range(int start, int end) 中设定,包含头不含尾,如cv::Range(0,4)包含0,1,2,3
- size() 函数得到range类的元素数量
- empty() 用于测试range是否含有元素
- all() 用于获得对象可用范围
cv::Ptr模板和垃圾收集
- 智能指针 smart pointer 允许我们创建多个对象的引用,然后传递到各处,所有这些引用都会被计数,当引用超过范围,引用次数就会减少,一旦所有的引用消失,这个对象将自动清理
- 首先为你需要封装的对象定义一个指针模板的实例
cv::Ptr<Matx33f> p( new cv::Matx33f )
cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>()
- 这个模板类的构造函数拥有指向对应对象的指针,你就会得到一个智能指针p,你可以像使用标准指针一样使用他
- 创建其他系统类型的对象就不需要把一个指向新的对象的指针传递给他们,比如 Ptr< Matx33f > q,这里实际上只有一个 cv::Matx33f 实例,p和q都指向他
- addred() 和 release() 增加和减少指针内部的引用次数
- empty() 确定一个智能指针是否指向一个已经被释放掉的对象
- delete_obj() 引用次数为零时自动调用的函数
cv::Exception类和异常处理
- 继承自STL的异常类 std::exception
- 有成员 code(由数字的错误码代表), err(错误的字符串), func(错误的函数名), file(错误发生的文件) 和 line(错误出现在文件中的行数)
- 有几个内置宏用于自己生成异常,比如 CV_Error(errorcode, description)会生成并抛出一个有固定文字描述的异常
cv::DataType<>模板
template<typename _Tp> class DataType
{
typedef _Tp value_type;
typedef value_type work_type;
typedef value_type channel_type;
typedef value_type vec_type;
enum {
generic_type = 1,
depth = -1,
channels = 1,
fmt = 0,
type = CV_MAKETYPE(depth, channels)
};
};
cv::InputArray类和cv::OutputArray类
- 表示支持任何数组类型
- 前者假设为常量(只读),后者为可变量
- cv::noArray() 返回 cv::InputArray
工具函数
template<T> T* cv::allocate(
size_t sz
);
template<T> void cv::deallocate(
T* ptr,
size_t sz
);
void* cv::fastMalloc(
size_t sz
);
void cv::fastFree(
void* ptr
);
- cv::allocate() 函数与数组形式的 new 相似,分配了含n个T类型对象的C风格数组,为每个对象调用默认构造函数并返回指向数组中的第一个对象的指针
- cv::deallocate() 函数与数组形式的 delete 相似,释放含n个T类型对象的C风格数组
- cv::fastMalloc() 工作机制跟 malloc() 类似
- cv::fastFree() 释放由 cv::fastMalloc() 分配的缓存