OpenCV的数据类型——辅助对象

在上一篇文章中,主要介绍了OpenCV的基础数据类型。接下来在本篇文章中将主要对OpenCV的辅助对象进行介绍。

cv::TermCriteria类

在很多算法中都存在着循环嵌套,只有满足终止条件时才会退出。通常情况下,终止条件的形式要么是达到允许的有限迭代次数(COUNT或MAX_ITER),要么是某种形式的误差参数(如果接近如此程度,就退出循环,称为EPS,即epsilon的简称)。cv::TermCriteria类有三个成员变量(type, maxCount, epsilon),都可以直接设置,因为它们是公有的。通常只通过其构造函数TermCriteria( int type, int maxCount, int epsilon )进行设置。其中,type的值可为cv::TermCriteria::COUNT、cv::TermCriteria::MAX_ITER或cv::TermCriteria::EPS,也可把两个条件并在一起(使用位运算符|)。

cv::Range类

cv::Range类用于确定一个连续的整数序列,含有两个成员变量start和end,范围包含start,但不包含end。成员函数有size()(得到Range类中的元素数)和empty()(判断Range类中是否含有元素)。cv::Range::all()用于任何需要获得对象可用范围的时候。

cv::Ptr模板和垃圾收集

智能指针(smart pointer)允许我们创建一个对象的引用,然后把它传递到各处并创建更多对该对象的引用,而这些引用都会被计数。当引用超出范围,智能指针的引用计数就会减少,当所有的引用消失时,该对象将自动清理(释放)。

可以通过以下两种方式定义一个指针模板的示例:

① cv::Ptr<cv::Matx33f> p( new cv::Matx33f );

② cv::Ptr<cv::Matx33f> p = makePtr<cv::Matx33f>();

一旦得到p,就可以创建其他相同类型的对象,而不需要把一个指向新的对象的指针传递给它们。例如:可以创建一个cv::Ptr<cv::Matx33f> q, 当p的值传递给q时,p和q同时指向一个实例。它们都知道自己是两个指针中的一个,当p被释放时,q就能知道它是原始矩阵仅存的引用的引用。如果这个时候q也要被释放,它的析构函数将被隐式调用,由于q发现它是遗留下来的最后一个引用,它会释放它的原始矩阵。cv::Ptr<>是现成安全的。

Ptr类的附加函数
函数 描述
addref 增加指针内部的引用次数
release 减少指针内部的引用次数
empty

① 确定一个智能指针是否指向一个已经被释放掉的对象(一个对象调用一次或多次release()的时候);

② 确定智能指针对象内部对象指针是否处于其他原因而为NULL(赋值时使用了一个刚好首先返回NULL的函数)

delete_obj 引用计数为0时自动调用的函数,默认情况下,定义了但不做任何事,实际可根据自己的需求重载该函数。

cv::Exception类和异常处理

OpenCV使用异常来处理错误,定义了自己的异常类型cv::Exception,它继承自STL的异常类std::exception。

扫描二维码关注公众号,回复: 2866363 查看本文章

有几个内置宏用于自己生成异常,但是在较新的OpenCV版本中,这些功能只能在调试(debug)版本中使用。

Exception内置宏
描述
CV_Error(errorcode, description) 生成并抛出一个有固定文字描述的异常
CV_Error_(errorcode, printf_fmt_str, [printf-args]) 以同样的方式工作,但允许使用类似printf格式字符串和参数代替固定的描述
CV_Assert(condition) 会在测试程序中所设定的条件(condition),如果不符合条件,则抛出异常。
CV_DbgAssert(condition)

cv::InputArray类和cv::OutputArray类

cv::InputArray类和cv::OutputArray类之间主要的区别在于前者是常量(只读),后者是可变量。除此之外还有cv::InputOutputArray(就地计算的数据)和cv::noArray()(表示输入的是并没有被使用的输入量或无输出)。

 

本文主要介绍了OpenCV中的上述辅助对象,还有其他辅助对象,比如cv::DataType<>模板,但未做深入研究,所以在此不进行介绍。

猜你喜欢

转载自blog.csdn.net/godadream/article/details/81698861