机器视觉算法(第8期)----OpenCV中事半功倍的工具函数
上期我们一起学习了OpenCV中很重要的几个辅助对象, 机器视觉算法(第7期)----OpenCV中很重要的辅助对象 今天我们主要学习一下OpenCV中几个让人事半功倍的工具函数。
除了前面我们学习的原始数据类型之外,OpenCV库还提供了一些专用功能,可用于更有效地处理计算机视觉应用中普遍出现的数学和其他问题。在库的环境中,被称为工具函数。工具函数包含数学操作,测试,错误生成,内存与线程处理,优化及其他的工具。下表中列举了这些函数并概括了他们的功能。
下面我们来逐一分析下每个函数的用法及作用: cv::alignPtr()
template<T> T* cv::alignPtr( // Return aligned pointer of type T*
T* ptr, // pointer, unaligned
int n = sizeof(T) // align to block size, a power of 2
);
给定任意类型的指针,该函数根据如下公式计算一个相同类型的对齐指针:
(T*)(((size_t)ptr + n+1) & -n)
cv::alignSize()
size_t cv::alignSize( // minimum size >='sz' divisible by 'n'
size_t sz, // size of buffer
int n = sizeof(T) // align to block size, a power of 2
);
给定一个数量n(一般是从sizeof()返回的值)和一个来自缓存sz的大小,alignSize()计算此缓冲区应该的大小,以便包含大小为n个整数的对象。这便是最小的大于或等于sz除以n的数。计算使用了下面的公式:
(sz + n-1) & -n
cv::allocate()
template<T> T* cv::allocate( // Return pointer to allocated buffer
size_t sz // buffer size, multiples of sizeof(T)
);
cv::allocate()函数与数组形式的new相似,都分配了含n个T类型对象的C风格数组,为每个对象调用默认构造函数并返回指向数组中第一个对象的指针。
cv::deallocate()
template<T> void cv::deallocate(
T* ptr, // Pointer to buffer to free
size_t sz // size of buffer, multiples of sizeof(T)
);
cv::deallocate()函数与数组形式的delete相似,都释放了含n个T类型对象的C风格数组,为每个对象调用析构函数。cv::deallocate()用于释放由cv::allocate()分配的对象。传递给cv::deallocate()的元素n必须与一开始cv::allocate()分配的对象数量相同。
cv::fastAtan2()
float cv::fastAtan2( // Return value is 32-bit float
float y, // y input value (32-bit float)
float x // x input value (32-bit float)
);
这个函数计算了x,y对应的反正切所对应的角度,并以0.0~360.0之间的角度表示。
cvCeil()
int cvCeil( // Return the smallest int >= x
float x // input value (32-bit float)
);
给定一个浮点型数据x,cvCeil()计算不小于x的最小整数,并返回。如果超出32位整型的表示范围,则返回未定义(undefined)。
cvFloor()
int cvFloor( // Return the largest int <= x
float x // input value (32-bit float)
};
给定一个浮点型数据x,cvFloor()计算不大于x的最大整数,并返回。如果超出32位整型的表示范围,则返回未定义(undefined)。
cv::cubeRoot()
float cv::cubeRoot( // Return value is 32-bit float
float x // input value (32-bit float)
);
该函数返回变量x的立方根。x可正可负。
cv::CV_Assert() and CV_DbgAssert()
// example
CV_Assert( x!=0 )
CV_Assert()是一个宏,它会测试传递给它的表达式,如果那个表达式是False,它会抛出一个异常。而CV_DbgAssert()只在debug版本中测试。
cv::CV_Error() and CV_Error_()
// example
CV_Error( ecode, estring )
CV_Error_( ecode, fmt, ... )
CV_Error()也是一个宏,它允许传递一个错误代码ecode和一个固定C风格的字符串estring,然后它们会被打包送进cv::Exception,进而传递给cv::error()进行处理。如果需要在运行过程中构建消息,那么可以使用不同的宏CV_Error_(),CV_Error_()接受与CV_Error()相同的错误代码ecode,但需要一个sprintf()风格的字符串紧跟着各种变量参数,就是sprintf()所需要的。
cv::error()
void cv::error(
const cv::Exception& ex // Exception to be thrown
);
cv::error()这个函数一般是由cv::CV_Error()和CV_Error_()调用的。一般不会直接去调用它。但会依赖于cv::CV_Error()和CV_Error_()去抛出异常,这些宏携带者你希望在异常中展示的信息,为我们打包好,然后传递最终的异常结果给cv::error()。
cv::fastMalloc()
void* cv::fastMalloc( // Pointer to allocated buffer
size_t size // Size of buffer to allocate
);
这个函数的工作机制和malloc()类似,但是因为它做了缓存区内存大小对齐,所以执行速度更快。这意味着,如果传递的缓存区大小超过16bit,那么返回的缓存区会被对齐到16bit的边界。
cv::fastFree()
void cv::fastFree(
void* ptr // Pointer to buffer to be freed
);
这个函数释放由cv::fastMalloc()(上面提到)分配的内存。
cv::format()
string cv::format( // Return STL-string
const char* fmt, // formatting string, as sprintf()
... // vargs, as sprintf()
);
这个函数本质上与标准库中的sprintf()相同,但是,它不需要从访问者中获得一个字符缓存区,而是构建一个STL字符串并返回它。它对Exception()构造函数格式化错误信息很有用。
cv::getCPUTickCount()
int64 cv::getCPUTickCount( void ); // long int CPU for tick count
这个函数报告CPU的ticks的数量。
cv::getTickCount()
int64 cv::getTickCount( void ); // long int CPU for tick count
这个函数返回了与一些体系结构相关的时间的tick计数。
cv::getTickFrequency()
double cv::getTickFrequency( void ); // Tick frequency in seconds as 64-bit
这个函常常和上面的getTickCount()合起来使用,来计算事件发生的时间。
cv::getNumThreads()
int cv::getNumThreads( void ); // total threads allocated to OpenCV
返回当前OpenCV适用的线程数。
cv::setNumThreads()
void cv::setNumThreads( int nthreads ); // Set number of threads OpenCV can use
如果在OpenCV库编译时添加了OpenMP支持,这个函数可以设定OpenCV在并行的OpenMP区域使用的线程数。
cv::getThreadNum()
int cv::getThreadNum( void ); // int, id of this particular thread
如果在OpenCV库编译时添加了OpenMP支持,则会返回当前执行的线程的索引。
cv::getOptimalDFTSize()
int cv::getOptimalDFTSize( int n ); // best size array to use for dft, >= n
常用在dft()函数中,一般输入为图像的实际大小,并返回你应该传递给cv::dft()的最佳数组大小。
cvIsInf()
int cvIsInf( double x ); // return 1 if x is IEEE754 "infinity"
如果x为正负无穷,那么该函数返回的值就是1,否则为0。无穷测试是由IEEE754标准提供的。
cvIsNaN()
int cvIsNan( double x ); // return 1 if x is IEEE754 "Not a number"
如果x不是一个数,那么该函数返回的值就是1,否则为0。NaN测试是由IEEE754标准提供的。
cvRound()
int cvRound( double x ); // Return integer nearest to 'x'
计算x最接近的整数,四舍五入。
cv::setUseOptimized()
void cv::setUseOptimized( bool on_off ); // If false, turn off optimized routines
这个函数可以在任何时候开启或关闭一些高性能的优化,比如IPP, SSE2指令集。
cv::useOptimized()
bool cv::useOptimized( void ); // return true if optimizations are enabled
这个函数是用来查看是否使用了高性能的优化,如果这些优化是开启的,则返回True,否则返回False。
至此,我们一起学习了OpenCV中很好用的一些工具函数,下一期,我们将一起学习OpenCV中的王者--图像和大型数组类型。
- 50. RESTful API的简单实现 | 厚土Go学习笔记
- go实现西瓜视频花椒直播等平台智能答题
- 主备切换的准备工作(二) (r7笔记第85天)
- 49. 访问PostgreSQL数据库增删改查 | 厚土Go学习笔记
- Golang中Interface类型详解
- Go语言的网络编程简介
- 一条关于swap争用的报警邮件分析(二)(r8笔记第4天)
- Golang泛型编程初体验
- 厚土Go学习笔记 | 14. switch 的条件写的有点灵活,不过风格还是go的一贯风格
- Go语言·我的性能我做主
- 47. 访问MySql数据库实现增删改查 | 厚土Go学习笔记
- system表空间不足的问题分析(二) (r8笔记第5天)
- golang基于redis lua封装的优先级去重队列
- python基础知识——内置数据结构(元组)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- graylog日志分析系统上手教程
- 使用Seq搭建免费的日志服务
- 拜托!这才是分布式系统CAP的正确打开方式!
- 接口管理这下总会了吧?
- 交子杯 - 2020 - AI赛道 - TOP1
- Valine 一款快速、简洁且高效的无后端评论系统
- 两段有趣的C代码
- 算法数据结构 | 三个步骤完成强连通分量分解的Kosaraju算法
- 并查集算法 详解
- SQL 中 EXISTS 用法详解
- Blazor带我重玩前端(六)
- PB 级大规模 Elasticsearch 集群运维与调优实践
- MySQL实时在线备份恢复方案
- Android通过原生请求直接获取网页内容
- matplotlib | Python强大的作图工具,让你从此驾驭图表(二)