除了基本类型和大型容器之外,还有一系列辅助对象对于控制各种算法(如终止条件)或对容器执行各种操作(如“range”或“切片”)非常重要。还有一个非常重要的对象,智能指针对象cv::Ptr
。
cv::TermCriteria
类
许多算法需要一个停止条件。通常,停止条件要么是有限迭代次数(称为COUNT或MAX_ITER),要么是某种错误参数,基本上就是说,“如果误差都这么小了,可以退出了”(称为EPS
-epsilon
的缩写,代表一个很小的数字)。在许多情况下,最好同时拥有这两种功能,这样,即便算法永远不能“误差足够小”,它仍然会在某个时刻退出。
cv::TermCriteria
对象封装了一个或两个停止标准,以便可以方便地将它们传递给OpenCV算法函数。它们有三个成员变量-type
、maxCount
和epsilon
-可以直接设置(它们是公共的),或者更多情况下,只是由构造函数以TermCri teria( int type, int maxCount, double epsilon )
的形式设置。变量类型设置为cv::TermCriteria::COUNT
或cv::TermCriteria::EPS
。也可以逻辑或将两者连在一起(即“|
”)。cv::TermCriteria::COUNT
和cv::TermCriteria::MAX_ITER
是一样的。如果终止条件包括cv::TermCriteria::COUNT
,算法在maxCount
次迭代之后终止。如果终止标准包括cv::TermCrite ria::EPS
,那么就是在告诉算法在与算法的收敛性相关联的某个度量低于EPS
之后终止。
cv::Range
类
cv::Range
类用于指定连续的整数序列。cv::Range
对象有两个元素:start
和end
,通常使用构造函数cv::Range( int start, int end )
设置。范围包括它们的起始值,但不包括它们的终止值,因此cv::Range rng( 0, 4 )
包括值0、1、2和3,但不包括4。使用size()
可以得到元素数量。在前面的示例中,rng.size()
将等于4。还有一个成员empty()
用于测试范围是否没有元素。最后,静态方法Range::all()
返回一个特殊的变量,表示“整个序列”或“整个范围”,就像Matlab中的“:
”或Python中的“…”。OpenCV 中所有Range的方法和函数都支持这个特殊的Range:: all()
。
比如
void my_function(..., const Range& r, ....)
{
if(r == Range::all()) {
// process all the data
}
else {
// process [r.start, r.end)
}
}
cv::Ptr
模板和垃圾回收机制
C++中一个非常有用的对象类型是“智能”指针。该指针允许我们创建对某个对象的引用,然后将其传递。你可以创建更多对该对象的引用。当引用超出作用域时,智能指针的引用计数会递减。一旦所有的引用(指针的实例)都消失了,内存将被自动清理(释放)。
这就是智能指针的运作方式。首先,为要“包装”的类对象定义指针模板的实例。我们可以使用类似于cv::Ptr<cv::Matx33f> p(new cv::Matx33f);