OpenCV除了基本数据结构(Basic data types)之外还有很多的辅助结构才能使opencv使用越来越完善,下面来分析第一个辅助结构TermCriteria,该结构是OpenCV3中经过整个引入的,之前旧版本为CvTermCriteria.

TermCriteria是经常被用来作为算法的终止条件何时退出,当算法达到一定的迭代次数之后才进行退出,要么达到最大迭代次数(COUNT或MAX_ITER),要么达到一定阈值迭代次数退出(EPS)。

该类常用在在程序初始化时将其退出条件定义好,然后在算法时计算时进行判断,经常被用来作为函数传参。OpenCV中有很对算法API在使用时都需要根据实际使用场景设置迭代退出条件。

TermCriteria类

TermCriteria类相对比较简单,最主要的是由三个变量,type(终止条件类型)、maxCount(最大迭代次数)、epsilon(迭代阈值或者称之为迭代精度),源代码定义如下:

总结如下:

Method Description
TermCriteria() 默认构造函数
TermCriteria(int type, int maxCount, double epsilon)

带参数构造函数

type:设置终止类型,是在最大迭代次数终止 还是在精度设置终止

maxCount:设置最大迭代次数

double epsilon:迭代阈值或精度

inline bool isValid() 是否还有效
int type 保存的终止循环条件
int maxCount 最大迭代次数
double epsilon 算法精度退出条件

type终止类型

type类型理解很重要,理解了type类型就基本上对该TermCriteria有了一个了解,type设置的类型如下

type Description
COUNT或MAX_ITER 两者意义意义,都是达到最大条件终止
EPS 达到算法精度退出

TermCriteria类可以设置的方式有

1: TermCriteria::COUNT或TermCriteria::MAX_ITER :达到最大迭代退出

2:   TermCriteria::EPS: 达到迭代阈值或精度 退出

3:TermCriteria::COUNT + TermCriteria::EPS: 两者只要达到其中一个就退出

TermCriteria用例

整个 TermCriteria类比较简单,目前对该类的使用方法资料非常少,笔者在翻阅了OpenCV源码之后,在samples\cpp\tutorial_code\video\meanshift\meanshift.cpp 一个用例,总体流程相对比较清晰,代码做下讲解

笔者把算法部分给去掉,只留下了条件判断主要流程:

int cv::meanShift( InputArray _probImage, Rect& window, TermCriteria criteria )
{....../**获取最大迭代次数,和精度/double eps = (criteria.type & TermCriteria::EPS) ? std::max(criteria.epsilon, 0.) : 1.;eps = cvRound(eps*eps);int i, niters = (criteria.type & TermCriteria::MAX_ITER) ? std::max(criteria.maxCount, 1) : 100;/**以最大迭代次数为准*/for( i = 0; i < niters; i++ ){//达到精度之后退出if( dx*dx + dy*dy < eps )break;}......}int main(int argc, char **argv)
[............// 创建TermCriteria实例,终止条件设置为两者都需要达到才退出, maxCount为10,epsilon阈值设为1TermCriteria term_crit(TermCriteria::EPS | TermCriteria::COUNT, 10, 1);while(ture){...// apply meanshift to get the new locationmeanShift(dst, track_window, term_crit);....  int keyboard = waitKey(30);if (keyboard == 'q' || keyboard == 27)break;}
}

相信 看了上面之后应该对TermCriteria类怎么使用比较清楚了,下面将列举下使用用例

最大迭代次数退出用例

第一个用例设置退出type为达到最大迭代次数退出,最大迭代次数设为10:

#include <stdio.h>
#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;void main()
{TermCriteria term_crit(TermCriteria::COUNT, 10, 1);for (int i = 0; i < term_crit.maxCount; i++){cout << "number: " << i << endl;}
}

运行结果:

达到精度退出用例

达到精度退出用例:

#include <stdio.h>
#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;void main()
{TermCriteria term_crit(TermCriteria::EPS, 10, 9.8);double a = 0;while (a <= term_crit.epsilon){cout << "number: " << a << endl;a += 0.5;}
}

运行结果:

两者最先达到条件就退出

两者最先达到就退出用例:

#include <stdio.h>
#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;void main()
{TermCriteria term_crit(TermCriteria::EPS| TermCriteria::COUNT, 20, 9.8);double a = 0;for (int i = 0; i < term_crit.maxCount; i++){if (a > term_crit.epsilon){break;}a += 0.5;cout << "iter number: " << i<<",value: "<< a << endl;}
}

运行结果:

OpenCV辅助对象(help objects)(1)_TermCriteria相关推荐

  1. OpenCV辅助对象(help objects)(5)_DataType

    cv::DataType<>为OpenCV中用于提取数据类型的模板,主要是利用C++ traits技术,实现算法与数据类型 的分离,增加算法兼容性,<learning OpenCV3 ...

  2. OpenCV辅助对象(help objects)(3)——Ptr

    OpenCV中的Ptr(智能指针)经过多次版本修改之后,在OpenCV4.0版本之后编译器需要指出C++11的编译器才能编译.Ptr类也完全进行了修改,将Ptr修改为了使用C++11中的shared_ ...

  3. OpenCV辅助对象(help objects)(6)_InputArray和OutputArray

    opencv中的cv:DataType<>解决了算法与数据类型分类的问题,使算法能够适应多种类型的数据,以及能够方便提取出数据类型.但是OpenCV的基本数据类型有多多,Mat matx, ...

  4. OpenCV辅助对象(help objects)(4)_Exception

    OpenCV源码中一般程序如果遇到一些异常(比如空指针等之类的)需要跑出异常一般使用Exception类.Exception是OpenCV在C++std::exception异常中进行了再次封装. E ...

  5. OpenCV辅助对象(help objects)(2)_Range

    Range在opencv中经常被用来表示一段连续的整数数字序列,整体数据结构比较简单,有两个元素start 和 end,分别为序列的开始和结束,取值范围为一个半开半闭空间: [start, end), ...

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

    在上一篇文章中,主要介绍了OpenCV的基础数据类型.接下来在本篇文章中将主要对OpenCV的辅助对象进行介绍. cv::TermCriteria类 在很多算法中都存在着循环嵌套,只有满足终止条件时才 ...

  7. OpenCV 实时对象跟踪(质心跟踪)

    本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...

  8. OpenCV运行对象检测深度学习网络的实例(附完整代码)

    OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...

  9. OpenCV收集对象及其分割蒙版的数据集的实例(附完整代码)

    OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 #include "opencv2/core. ...

最新文章

  1. pku 1077 Eight
  2. 科技巨头纷纷从刷脸转向“刷手”,指纹如何扛起生物识别大旗?
  3. Jenkins安装plugin
  4. 推荐系统的应用案例剖析
  5. [机器学习笔记]Note12--降维
  6. Promise.all 处理error
  7. Java 面试之数据库
  8. HBase之Region Compact流程分析
  9. 从0开始构建一个属于你自己的PHP框架
  10. selenium-绕过登录
  11. POJ 3278(Catch That Cow)
  12. 手机软件APP下载类网站Pbootcms模板 游戏软件应用网站源码 模板自适应手机端
  13. ubuntu 20 解决软件商店不可用问题
  14. 人机交互-10-交互设计模型
  15. Receptive Field Block Net 论文阅读
  16. printf 函数使用 可变参数函数实现原理
  17. CCF之小明上学——2018.12 第一题 (java满分代码)
  18. PMP考试的5A好考吗?
  19. vuex4 极速入门到上手
  20. <Zhuuu_ZZ>那些年我们踩过的Hadoop HA的坑--高可用集群

热门文章

  1. Spark家族:Win10系统下搭建Scala开发环境
  2. 未来客:人人都可以构建软件或系统
  3. Socket编程实践(12) --UDP编程基础
  4. 6个精心整理的资源网站,送给正在努力的你
  5. iOS多线程:『pthread、NSThread』详尽总结
  6. poi 读取excel
  7. 如何复制图文消息封面图片?正文没显示
  8. sqlite3 出错
  9. Ubuntu 配置 Tomcat
  10. Khronos EGL and Apple EAGL