OpenCV的数据类型 #-2

OpenCV辅助对象与工具函数介绍
本文主要介绍了OpenCV的辅助对象和工具函数。辅助对象包括封装终止条件的类、确定整数序列的类等,还涉及模板、垃圾收集和异常处理等内容。工具函数则可用于处理计算机视觉应用中的数学和其他问题,涵盖数学操作、测试等多个方面。

一、辅助对象

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::COUNTcv::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::Matcv::SparseMat

为了防止接口变得复杂,OpenCV定义了cv::InputArraycv::OutputArray类型,它们表示支持上面的任何一个,这意味着库中使用cv::InputArraycv::OutputArray作为形参的函数,可以使用任何数组类作为实参,例如cv::Scalar、cv::Vec和cv::Mat等等。同时,甚至还存在cv::InputOutputArray,指定用于就地计算的数据。

cv::InputArraycv::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()指示代码优化的启用
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值