上期我们一起学习了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中的王者--图像和大型数组类型。
智能算法,与您携手,沉淀自己,引领AI!