OpenCV的数据类型 #-2
很多算法需要一个终止条件以确定何时退出。通常,终止条件的形式要么是达到允许的有限迭代次数(称为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()
指示代码优化的启用
版权声明
本文仅代表作者观点,不代表博信信息网立场。