一、辅助对象
1.1、cv::TermCriteria类
很多算法需要一个终止条件以确定何时退出。通常,终止条件的形式要么是达到允许的有限迭代次数(称为COUNT或MAX_ITER),要么是某种形式的误差参数(如果接近于如此程度,就可以退出,称为EPS,即epsilon的简称)。
cv::TermCriteria对象把一个或两个终止条件封装,以方便传进OpenCV算法函数里。它们有三个成员变量(type,maxCount和epsilon),都可以直接设置(公有),更常见的做法是通过它们的构造函数TermCriteria(int type, int maxCount, double epsilon)进行设置。变量type设置为cv::TermCriteria::COUNT或者cv::TermCriteria::EPS。也可以把两个条件并(使用位运算符 | )在一起。cv::TermCriteria::COUNT是cv::TermCriteria::MAX_ITER的同义词。
- 如果终止条件包含
cv::TermCriteria::COUNT,就是告诉算法在maxCount次迭代之后终止; - 如果终止条件包含
cv::TermCriteria::EPS,就是告诉算法在与算法收敛相关的某些度量降到epsilon以下后终止;
1.2、cv::Range类
cv::Range类用于确定一个连续的整数序列。cv::Range对象有两个元素start和end,与cv::TermCriteria类似,它们经常在构造函数cv::Range(int start, int end)中设定,范围包含初始值start,但不包含end,因此cv::Range rng(0, 4)包含值0、1、2、3,但是不包含4
| 函数 | 说明 |
|---|---|
| cv::Range::size() | 返回一个range对象的元素数量 |
| cv::Range::empty() | 返回一个range对象是否含有元素 |
| cv::Range::all() | 获得对象可用范围 |
1.3、cv::Ptr模板和垃圾收集
智能指针是C++中一个非常有用的类型。这个指针允许我们创建一个对象的引用,然后把它传递到各处。你可以创建更多的对该对象的引用,然后所有这些引用都会被计数。当引用超出范围,智能指针的引用计数就会减少。一旦所有的引用(指针的实例)消失,这个对象将自动清理(释放)。
指针模板实例:cv::Ptr<Matx33f> p(new cv::Matx33f)或者cv::Ptr<Mat33f> p = makePtr<cv::Matx33f>()
| 函数 | 说明 |
|---|---|
| cv::Ptr::addref() | 增加指针内部的引用计数 |
| cv::Ptr::release() | 减少指针内部的引用计数 |
| cv::Ptr::empty() | 确定一个智能指针是否指向一个已经被释放掉的对象 |
cv::Ptr<>中最后一个要了解的成员是delete_obj(),这是一个引用计数为零时自动调用的函数。默认情况下,这个函数定义了但不做任何事情。
1.4、cv::Exception类和异常处理
OpenCV使用异常来处理错误,OpenCV继承自STL的异常类std::exception定义了它自己的异常类型cv::Exception(区别在于在命名空间cv内)。
| 类成员 | 含义 |
|---|---|
| code | 一个数字的错误码 |
| err | 产生异常的错误的字符串 |
| func | 错误发生的函数名 |
| file | 错误发生的文件 |
| line | 错误发生在文件中的行数 |
err、func、line全部都是STL字符串
有几个内置宏用于自己生产异常:
- CV_Error(errorcode, description):生产并抛出一个有固定文字描述的异常;
- CV_Error(errorcode, printf_fmt_str, [printf-args]):以同样的方式工作,但允许你使用类似printf格式字符串和参数代替固定的描述;
- CV_Assert(condition)和CV_DbgAssert(condition)都会测试程序中所设定的条件(contidion),如果条件不符合则抛出异常。
1.5、cv::DataType<>模板
当OpenCV库函数需要传递特定数据类型的概念时,它们会创建一个cv::DataType<>类型的对象。cv::DataType<>本身是一个模板,传递的实际对象是这个模板的特化。
1.6、cv::InputArray类和cv::OutputArray类
许多OpenCV的函数都把数组作为变量并把数组作为返回值,但在OpenCV中有各种各样的数组。例如:OpenCV支持的一些小的数组类型(cv::Scalar、cv::Vec、cv::Matx)、STL的std::vector<>、大型数组类型cv::Mat和cv::SparseMat。
为了防止接口变得复杂,OpenCV定义了cv::InputArray和cv::OutputArray类型,它们表示支持上面的任何一个,这意味着库中使用cv::InputArray和cv::OutputArray作为形参的函数,可以使用任何数组类作为实参,例如cv::Scalar、cv::Vec和cv::Mat等等。同时,甚至还存在cv::InputOutputArray,指定用于就地计算的数据。
cv::InputArray和cv::OutputArray之间的主要区别在于前者假设为常量(只读),而后者是可变量。当不需要对应的输出时,可以传递cv::noArray()。
二、工具函数
除了提供的专门的原始数据类型外,OpenCV库还提供一些专用功能,可用于更有效地处理计算机视觉应用中普遍出现的数学和其他问题。在库的环境中,它们被称为工具函数。工具函数包含数学操作、测试、错误生成、内存与线程处理,优化及其他的工具。
工具函数和系统函数
| 函数名称 | 描述 |
|---|---|
| cvCeil() | 向上取整 |
| cvFloor() | 向下取整 |
| cvRound() | 四舍五入 |
| cv::alignPtr() | 对齐指针到给定字节数 |
| cv::alignSize() | 将缓冲区大小与给定的字节数对齐 |
| cv::allocate() | 分配一个C风格的数字对象 |
| cv::cubeRoot() | 计算一个数的立方根 |
| cv::CV_Assert() | 如果给定条件不为真,则抛出异常 |
| cv::Error() | 构造cv::Exception(从固定的字符串)并抛出异常的一个宏 |
| cv::Error_() | 构造cv::Exception(从格式化的字符串)并抛出异常的一个宏 |
| cv::deallocate() | 释放一个C风格的数组对象 |
| cv::error() | 指示错误并抛出异常 |
| cv::fastAtan2() | 向量的二维角度的计算 |
| cv::fastFree() | 释放一个内存缓存区 |
| cv::fastMalloc() | 分配一个对齐的内存缓存区 |
| cv::format() | 以sprintf类似格式创建一个STL字符串 |
| cv::getCPUTickCount() | 从内部CPU计时器获得tick计数 |
| cv::getNumThreads() | 获得当前OpenCV使用的线程数 |
| cv::getOptimalDFTSize() | 计算要传递给cv::DFT()数组的最适宜大小 |
| cv::getThreadNum() | 获得当前线程的索引 |
| cv::getTickCount() | 获得系统的tick计数 |
| cv::getTickFrequency() | 获得每秒的tick数 |
| cvIsInf() | 判断一个浮点数是否无穷 |
| cvIsNaN() | 判断一个浮点数是否不是一个数 |
| cv::setNumThreads() | 设定OpenCV使用的线程数 |
| cv::setUseOptimized() | 开启或关闭优化代码(SSE2等) |
| cv::useOptimized() | 指示代码优化的启用 |
OpenCV辅助对象与工具函数介绍
本文主要介绍了OpenCV的辅助对象和工具函数。辅助对象包括封装终止条件的类、确定整数序列的类等,还涉及模板、垃圾收集和异常处理等内容。工具函数则可用于处理计算机视觉应用中的数学和其他问题,涵盖数学操作、测试等多个方面。
754





