机器视觉算法(第8期)----OpenCV中事半功倍的工具函数

时间:2022-06-20
本文章向大家介绍机器视觉算法(第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中的王者--图像和大型数组类型。