OpenCV辅助对象(help objects)(1)_TermCriteria
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相关推荐
- OpenCV辅助对象(help objects)(5)_DataType
cv::DataType<>为OpenCV中用于提取数据类型的模板,主要是利用C++ traits技术,实现算法与数据类型 的分离,增加算法兼容性,<learning OpenCV3 ...
- OpenCV辅助对象(help objects)(3)——Ptr
OpenCV中的Ptr(智能指针)经过多次版本修改之后,在OpenCV4.0版本之后编译器需要指出C++11的编译器才能编译.Ptr类也完全进行了修改,将Ptr修改为了使用C++11中的shared_ ...
- OpenCV辅助对象(help objects)(6)_InputArray和OutputArray
opencv中的cv:DataType<>解决了算法与数据类型分类的问题,使算法能够适应多种类型的数据,以及能够方便提取出数据类型.但是OpenCV的基本数据类型有多多,Mat matx, ...
- OpenCV辅助对象(help objects)(4)_Exception
OpenCV源码中一般程序如果遇到一些异常(比如空指针等之类的)需要跑出异常一般使用Exception类.Exception是OpenCV在C++std::exception异常中进行了再次封装. E ...
- OpenCV辅助对象(help objects)(2)_Range
Range在opencv中经常被用来表示一段连续的整数数字序列,整体数据结构比较简单,有两个元素start 和 end,分别为序列的开始和结束,取值范围为一个半开半闭空间: [start, end), ...
- OpenCV的数据类型——辅助对象
在上一篇文章中,主要介绍了OpenCV的基础数据类型.接下来在本篇文章中将主要对OpenCV的辅助对象进行介绍. cv::TermCriteria类 在很多算法中都存在着循环嵌套,只有满足终止条件时才 ...
- OpenCV 实时对象跟踪(质心跟踪)
本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...
- OpenCV运行对象检测深度学习网络的实例(附完整代码)
OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...
- OpenCV收集对象及其分割蒙版的数据集的实例(附完整代码)
OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 OpenCV收集对象及其分割蒙版的数据集的实例 #include "opencv2/core. ...
最新文章
- pku 1077 Eight
- 科技巨头纷纷从刷脸转向“刷手”,指纹如何扛起生物识别大旗?
- Jenkins安装plugin
- 推荐系统的应用案例剖析
- [机器学习笔记]Note12--降维
- Promise.all 处理error
- Java 面试之数据库
- HBase之Region Compact流程分析
- 从0开始构建一个属于你自己的PHP框架
- selenium-绕过登录
- POJ 3278(Catch That Cow)
- 手机软件APP下载类网站Pbootcms模板 游戏软件应用网站源码 模板自适应手机端
- ubuntu 20 解决软件商店不可用问题
- 人机交互-10-交互设计模型
- Receptive Field Block Net 论文阅读
- printf 函数使用 可变参数函数实现原理
- CCF之小明上学——2018.12 第一题 (java满分代码)
- PMP考试的5A好考吗?
- vuex4 极速入门到上手
- <Zhuuu_ZZ>那些年我们踩过的Hadoop HA的坑--高可用集群