文章目录
- 前言
- 1.帮助类
-
- [1.1 cv::TermCriteria类](#1.1 cv::TermCriteria类)
-
- [1.1.1 应用举例](#1.1.1 应用举例)
- [1.2 cv::Range 类](#1.2 cv::Range 类)
-
- [1.2.1 学习链接](#1.2.1 学习链接)
- [1.3 cv::Ptr 模板和垃圾回收](#1.3 cv::Ptr 模板和垃圾回收)
-
- [1.3.1 学习链接](#1.3.1 学习链接)
- [1.4 cv::Exception类和异常处理](#1.4 cv::Exception类和异常处理)
-
- [1.4.1 学习链接](#1.4.1 学习链接)
- [1.5 cv::DataType<>模板](#1.5 cv::DataType<>模板)
- [1.6 cv::InputArray和cv::OutputArray](#1.6 cv::InputArray和cv::OutputArray)
-
- 1.6.1定义:
- [1.6.2 说明:](#1.6.2 说明:)
- 1.6.3学习链接
- 2.工具函数
-
- [2.1 cv::alignPtr()](#2.1 cv::alignPtr())
-
- [2.1.1 学习链接](#2.1.1 学习链接)
- [2.2 cv::alignSize()](#2.2 cv::alignSize())
- [2.3 cv::allocate()](#2.3 cv::allocate())
- [2.4 cv::deallocate()](#2.4 cv::deallocate())
- [2.5 cv::fastFree()](#2.5 cv::fastFree())
- [2.6 cv::fastMalloc()](#2.6 cv::fastMalloc())
- [2.7 cv::cubeRoot()](#2.7 cv::cubeRoot())
- [2.8 cv::CV_Assert()](#2.8 cv::CV_Assert())
-
- [2.8.1 学习链接](#2.8.1 学习链接)
- [2.9 cv::fastAtan2()](#2.9 cv::fastAtan2())
- [2.10 cv::format()](#2.10 cv::format())
- [2.11 cv::getCPUTickCount()](#2.11 cv::getCPUTickCount())
- [2.12 cv::getNumThreads()](#2.12 cv::getNumThreads())
- [2.13 cv::setNumThreads()](#2.13 cv::setNumThreads())
- [2.14 cv::getThreadNum()](#2.14 cv::getThreadNum())
- [2.15 cv::getOptimalDFTSize()](#2.15 cv::getOptimalDFTSize())
- [2.16 cv::getTickCount()获得系统的tick数](#2.16 cv::getTickCount()获得系统的tick数)
- [2.17 cv::getTickFrequency()](#2.17 cv::getTickFrequency())
- [2.18 cv::setUseOptimized()](#2.18 cv::setUseOptimized())
- [2.19 cv::useOptimized()](#2.19 cv::useOptimized())
- [2.20 CV_Error() & CV_Error_()](#2.20 CV_Error() & CV_Error_())
- [2.21 cv::error()](#2.21 cv::error())
- [2.22 cvIsInf()](#2.22 cvIsInf())
- [2.23 cvIsNaN()](#2.23 cvIsNaN())
- [2.24 cvRound()](#2.24 cvRound())
- [2.25 cvCeil()](#2.25 cvCeil())
- [2.26 cvFloor()](#2.26 cvFloor())
- 3.参考链接
前言
1.帮助类
1.1 cv::TermCriteria类
定义迭代算法终止条件的类。相机用法可参考链接OpenCV库成员------TermCriteria类
默认构造和有参构造
cpp
cv::TermCriteria::TermCriteria()
cv::TermCriteria::TermCriteria(
int type,
int maxCount,
double epsilon
)
type
:判定迭代终止的条件类型。
有3种形式:
1).TermCriteria::COUNT
最大迭代次数;
2).TermCriteria::EPS
要求的收敛阈值;
3).TermCriteria::COUNT + TermCriteria::EPS
达到2个条件之一即可。
maxCount
:即最大迭代次数。
epsilon
:即要求的收敛阈值。
1.1.1 应用举例
cpp
//构造函数
cv::TermCriteria(int type, int maxCount, double epsilon);
cv::TermCriteria tc;
tc.type = cv::TermCriteria::COUNT | cv::TermCriteria::EPS;
tc.maxCount = 1000;
tc.epsilon = 10;
cv::TermCriteria t(cv::TermCriteria::COUNT | cv::TermCriteria::EPS, 1000, 1.0);
1.2 cv::Range 类
cv::Range
类用于确定一个连续的整数序列。cv::Range
对象有两个元素start和end。
cpp
class CV_EXPORTS Range
{
public:
Range();
Range(int _start, int _end);
int size() const; //得到元素数量
bool empty() const; //判断是否为空
static Range all(); //可以用在任何需要获得对象可用范围的时候,不是很懂?
int start, end;
};
函数 | 说明 |
---|---|
cv::Range::size() | 返回一个range对象的元素数量 |
cv::Range::empty() | 返回一个range对象是否含有元素 |
cv::Range::all() | 获得对象可用范围 |
1.2.1 学习链接
1.3 cv::Ptr 模板和垃圾回收
1.C++中的智能指针采用引用计数的方式来标识指针的被引用次数,当引用增加时计数会加1,引用减小时计数会减1;
2.当引用计数为0即指针不再需要时,就会被销毁。
3.OpenCV3中的cv::Ptr<>
与c++智能指针的作用相同。
v使用时需要让Ptr包裹想要创建的指针类型,例如:
cpp
cv::Ptr<Matx33f> p(new cv::Matx33f);
cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>();
函数 | 说明 |
---|---|
cv::Ptr::addref() | 增加指针内部的引用计数 |
cv::Ptr::release() | 减少指针内部的引用计数 |
cv::Ptr::empty() | 确定一个智能指针是否指向一个已经被释放掉的对象 |
cpp
int main()
{
cv::Ptr<cv::Matx33f> p = new(cv::Matx33f);
p[0] = {1,2,2,3,4,5,6,7,8};
std::cout << p[0] << std::endl;
std::cout << "hello world" << std::endl;
return 0;
}
cv::Ptr<>
中最后一个要了解的成员是delete_obj()
,这是一个引用计数为零时自动调用的函数。默认情况下,这个函数定义了但不做任何事情。
1.3.1 学习链接
2.Ptr类模板
1.4 cv::Exception类和异常处理
OpenCV使用异常来处理错误,OpenCV继承自STL的异常类,std::exception
定义了它自己的异常类型cv::Exception
(区别在于在命名空间cv内)。
类成员 | 含义 |
---|---|
code | 一个数字的错误码 |
err | 产生异常的错误的字符串 |
func | 错误发生的函数名 |
file | 错误发生的文件 |
line | 错误发生在文件中的行数 |
err、func、line全部都是STL字符串
有几个内置宏用于自己生产异常:
1.CV_Error
:生产并抛出一个有固定文字描述的异常;
2.CV_Error(errorcode, printf_fmt_str, [printf-args])
:以同样的方式工作,但允许你使用类似printf
格式字符串和参数代替固定的描述;
3.CV_Assert(condition)
和CV_DbgAssert(condition)
都会测试程序中所设定的条件(contidion),如果条件不符合则抛出异常。
1.4.1 学习链接
待补充
1.5 cv::DataType<>模板
当OpenCV库函数需要传递特定数据类型的概念时,它们会创建一个cv::DataType<>
类型的对象。cv::DataType<>
本身是一个模板,传递的实际对象是这个模板的特化。
1.6 cv::InputArray和cv::OutputArray
在OpenCV中,有两个代理类是经常出现的:InputArray
和OutputArray
,它巧妙地利用了C++的定义转换,辅助完成对矩阵的管理。
1.6.1定义:
cpp
typedef const _InputArray& InputArray;
typedef InputArray InputArrayOfArrays;
typedef const _OutputArray& OutputArray;
typedef OutputArray OutputArrayOfArrays;
typedef const _InputOutputArray& InputOutputArray;
typedef InputOutputArray InputOutputArrayOfArrays;
cv::InputArray
类 和cv::OutputArray
类的区别:前者为常量(只读),后者为可变量。
1.6.2 说明:
InputArray是一个代理类,用于将只读输入数组传递到OpenCV函数中。
1.6.3学习链接
2.OpenCV源码详解之InputArray, OutputArray
2.工具函数
1.OpenCV提供一些专用功能,可用于更有效地处理计算机视觉应用中普遍出现的数学和其他问题。它们被称为工具函数。
2.工具函数包含数学操作、测试、错误生产、内存与线程处理、优化及其他的工具。
序号 | 函数名称 | 描述 |
---|---|---|
1 | cv::alignPtr() | 对齐指针到给定字节数 |
2 | cv::alignSize() | 将缓冲区大小与给定的字节数对齐 |
3 | cv::allocate() | 分配一个C风格的数组对象 |
4 | cv::cubeRoot() | 计算一个数的立方根 |
5 | cv::CV_Assert() | 如果给出的条件不为真,则抛出异常 |
6 | cv::deallocate() | 释放一个C风格的数组对象 |
7 | cv::error() | 指示错误并抛出异常 |
8 | cv::fastAtan2() | 向量的二维角度的计算 |
9 | cv::fastFree() | 释放一个内存缓冲区 |
10 | cv::fastMalloc() | 分配一个对齐的内存缓冲区 |
11 | cv::format() | 以sprintf类型格式创建一个STL字符串 |
12 | cv::getCPUTickCount() | 从内部CPU计时器获得tick计数 |
13 | cv::getNumThreads() | cv::getNumThreads() |
14 | cv::getOptimalDFTSize() | 计算要传递给cv::DFT()的数组的最适宜大小 |
15 | cv::getThreadNum() | 获得当前线程的索引 |
16 | cv::getTickCount() | 获得系统的tick计数 |
17 | cv::getTickFrequency() | 获得每秒的tick数 |
18 | cv::setNumThreads() | 设定OpenCV使用的线程数 |
19 | cv::setUseOptimized() | 开启或关闭优化代码(SSE2等) |
20 | cv::useOptimized() | 指示代码优化的启用 |
21 | CV_Error() | 构造cv:Exception(从固定的字符串)并抛出异常的一个宏 |
22 | CV_Error_() | 构造cv:Exception(从格式化的字符串)并抛出异常的一个宏 |
23 | cvIsInf() | 判断一个浮点数x是否无穷 |
24 | cvIsNaN() | 判断一个浮点数x是否不是一个数 |
25 | cvRound() | 判断一个浮点数x到最近的整数 |
26 | cvCeil() | 近似一个浮点数x到不小于x的最近的整数(向上取整) |
27 | cvFloor() | 近似一个浮点数x到不大于x的最近的整数(向下取整) |
2.1 cv::alignPtr()
该函数主要是将给定的指针按照给定的自己来对齐,API形式如下:
cpp
template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))
其中ptr
为传递的原内存地址, n
为按照需要的字节数对齐,默认情况下是按照指针的类型进行对齐
函数返回值为对齐后的指针地址。其函数实现比较简单
csharp
template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))
{
CV_DbgAssert((n & (n - 1)) == 0); // n is a power of 2
return (_Tp*)(((size_t)ptr + n-1) & -n);
}
2.1.1 学习链接
2.2 cv::alignSize()
cpp
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的数。计算使用了下面的公式:
cpp
(sz + n-1) & -n
2.3 cv::allocate()
cpp
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风格数组,为每个对象调用默认构造函数并返回指向数组中第一个对象的指针。
2.4 cv::deallocate()
cpp
template<T> void cv::deallocate(
T* ptr, // Pointer to buffer to free
size_t sz // size of buffer, multiples of sizeof(T)
);
1.cv::deallocate()
函数与数组形式的delete相似,都释放了含n
个T
类型对象的C风格数组,为每个对象调用析构函数。
2.cv::deallocate()
用于释放由cv::allocate()
分配的对象。传递给cv::deallocate()
的元素n
必须与一开始cv::allocate()
分配的对象数量相同。
2.5 cv::fastFree()
cpp
void* cv::fastMalloc( // Pointer to allocated buffer
size_t size // Size of buffer to allocate
);
这个函数的工作机制和malloc()
类似,但是因为它做了缓存区内存大小对齐,所以执行速度更快。这意味着,如果传递的缓存区大小超过16bit,那么返回的缓存区会被对齐到16bit的边界。
2.6 cv::fastMalloc()
cpp
void cv::fastFree(
void* ptr // Pointer to buffer to be freed
);
这个函数释放由cv::fastMalloc()
分配的内存。
2.7 cv::cubeRoot()
cpp
float cv::cubeRoot( // Return value is 32-bit float
float x // input value (32-bit float)
);
该函数返回变量x的立方根。x可正可负。
2.8 cv::CV_Assert()
cpp
// example
CV_Assert( x!=0 )
CV_Assert()是一个宏,它会测试传递给它的表达式,如果那个表达式是False,它会抛出一个异常。而CV_DbgAssert()只在debug版本中测试。
cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("image.jpg", IMREAD_GRAYSCALE);
// 检查图像是否加载成功
CV_Assert(!image.empty());
// 检查图像的尺寸
CV_Assert(image.cols > 0 && image.rows > 0);
// 执行图像处理操作
Mat processedImage;
threshold(image, processedImage, 128, 255, THRESH_BINARY);
imshow("Processed Image", processedImage);
waitKey(0);
return 0;
}
2.8.1 学习链接
2.9 cv::fastAtan2()
cpp
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之间的角度表示。
2.10 cv::format()
cpp
string cv::format( // Return STL-string
const char* fmt, // formatting string, as sprintf()
... // vargs, as sprintf()
);
1.这个函数本质上与标准库中的sprintf()
相同,但是,它不需要从访问者中获得一个字符缓存区,而是构建一个STL字符串并返回它。
2.它对Exception()
构造函数格式化错误信息很有用。
2.11 cv::getCPUTickCount()
cpp
int64 cv::getCPUTickCount( void ); // long int CPU for tick count
int64 cv::getCPUTickCount( void ); // long int CPU for tick count
2.12 cv::getNumThreads()
cpp
int cv::getNumThreads( void ); // total threads allocated to OpenCV
返回当前OpenCV适用的线程数。
2.13 cv::setNumThreads()
cpp
void cv::setNumThreads( int nthreads ); // Set number of threads OpenCV can use
如果在OpenCV库编译时添加了OpenMP
支持,这个函数可以设定OpenCV在并行的OpenMP
区域使用的线程数。
2.14 cv::getThreadNum()
cpp
int cv::getThreadNum( void ); // int, id of this particular thread
如果在OpenCV库编译时添加了OpenMP支持,则会返回当前执行的线程的索引。
2.15 cv::getOptimalDFTSize()
cpp
int cv::getOptimalDFTSize( int n ); // best size array to use for dft, >= n
常用在dft()函数中,一般输入为图像的实际大小,并返回你应该传递给cv::dft()的最佳数组大小。
2.16 cv::getTickCount()获得系统的tick数
cpp
//在程序开头进行读取当前系统的tick数,作为起始点
t = (double)cv::getTickCount();
// getTickcount函数:返回从操作系统启动到当前所经过的毫秒
// getTickFrequency函数:返回每秒的计时周期数
t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); //在程序末尾计算经过的时间,
我们可以写一个计算摄像头的帧率的小程序:
cpp
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat frame;
VideoCapture capture(0); //定义一个视频流对象
double fps;
char string[10];
namedWindow("Camera FPS");
double t = 0;
while (1)
{
t = (double)getTickCount();
if (waitKey(1) == 1)break;
if (capture.isOpened())
{
capture >> frame;
t = t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
fps = 1.0 / t;
sprintf_s(string, "%.2f", fps); // 帧率保留两位小数
//spintf函数容易望文生义,误以为是一个打印函数。实质上是一个字符串格式化命令。
//主要功能是把格式化的数据写入某个字符串中,至于需要打印的话,还是得需要打印函数来对其进行打印。
std::string fpsString("FPS:");
fpsString += string; // 在"FPS:"后加入帧率数值字符串
cout << fpsString << endl;
cv::putText(frame, // 图像矩阵
fpsString, // string型文字内容
cv::Point(5, 20), // 文字坐标,以左下角为原点
cv::FONT_HERSHEY_SIMPLEX, // 字体类型
0.5, // 字体大小
cv::Scalar(0, 0, 0)); // 字体颜色
imshow("Camera FPS", frame);
}
else
{
cout << "NO Camera Input! " << endl;
break;
}
}
}
2.17 cv::getTickFrequency()
cpp
double cv::getTickFrequency( void ); // Tick frequency in seconds as 64-bit
这个函常常和上面的getTickCount()合起来使用,来计算事件发生的时间。
2.18 cv::setUseOptimized()
cpp
void cv::setUseOptimized( bool on_off ); // If false, turn off optimized routines
这个函数可以在任何时候开启或关闭一些高性能的优化,比如IPP, SSE2指令集。
2.19 cv::useOptimized()
cpp
bool cv::useOptimized( void ); // return true if optimizations are enabled
这个函数是用来查看是否使用了高性能的优化,如果这些优化是开启的,则返回True,否则返回False。
2.20 CV_Error() & CV_Error_()
cpp
// example
CV_Error( ecode, estring )
CV_Error_( ecode, fmt, ... )
1.CV_Error()
也是一个宏,它允许传递一个错误代码ecode和一个固定C风格的字符串estring,然后它们会被打包送进cv::Exception
,进而传递给cv::error()
进行处理。
2.21 cv::error()
cpp
void cv::error(
const cv::Exception& ex // Exception to be thrown
);
1.cv::error()
这个函数一般是由cv::CV_Error()
和CV_Error_()
调用的。一般不会直接去调用它。但会依赖于cv::CV_Error()和CV_Error_()去抛出异常,
这些宏携带者你希望在异常中展示的信息,为我们打包好,然后传递最终的异常结果给cv::error()
。
2.22 cvIsInf()
如果x是 正负无穷, 则cvIsInf()返回值是1, 否则返回0。
cpp
int cvIsInf(double x);
2.23 cvIsNaN()
如果x不是一个数,那么该函数返回的值就是1,否则为0。NaN测试是由IEEE754标准提供的。
cpp
int cvIsNan( double x ); // return 1 if x is IEEE754 "Not a number"
2.24 cvRound()
返回跟参数最接近的整数值,即四舍五入;
2.25 cvCeil()
返回跟参数最接近的整数值,即四舍五入;
2.26 cvFloor()
返回不大于参数的最大整数值,即向下取整;
cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
/*
cvRound():返回跟参数最接近的整数值,即四舍五入;
cvFloor() :返回不大于参数的最大整数值,即向下取整;
cvCeil():返回不小于参数的最小整数值,即向上取整;
*/
int main()
{
cout << "cvRound(2.5) : " << cvRound(2.5) << endl;
cout << "cvFloor(2.5) : " << cvFloor(2.5) << endl;
cout << "cvCeil(2.5) : " << cvCeil(2.5) << endl;
cout << "cvRound(2.5) : " << cvRound(2.5) << endl;
cout << "cvFloor(2.5) : " << cvFloor(2.5) << endl;
cout << "cvCeil(2.5) : " << cvCeil(2.5) << endl;
waitKey(0);
return 0;
}
3.参考链接
3.辅助对象
6.OpenMP教程