OpenCV的数据类型二
文章目录
- 前言
- 1.帮助类
- 1.1 cv::TermCriteria类
- 1.1.1 应用举例
- 1.2 cv::Range 类
- 1.2.1 学习链接
- 1.3 cv::Ptr 模板和垃圾回收
- 1.3.1 学习链接
- 1.4 cv::Exception类和异常处理
- 1.4.1 学习链接
- 1.5 cv::DataType<>模板
- 1.6 cv::InputArray和cv::OutputArray
- 1.6.1定义:
- 1.6.2 说明:
- 1.6.3学习链接
- 2.工具函数
- 2.1 cv::alignPtr()
- 2.1.1 学习链接
- 2.2 cv::alignSize()
- 2.3 cv::allocate()
- 2.4 cv::deallocate()
- 2.5 cv::fastFree()
- 2.6 cv::fastMalloc()
- 2.7 cv::cubeRoot()
- 2.8 cv::CV_Assert()
- 2.8.1 学习链接
- 2.9 cv::fastAtan2()
- 2.10 cv::format()
- 2.11 cv::getCPUTickCount()
- 2.12 cv::getNumThreads()
- 2.13 cv::setNumThreads()
- 2.14 cv::getThreadNum()
- 2.15 cv::getOptimalDFTSize()
- 2.16 cv::getTickCount()获得系统的tick数
- 2.17 cv::getTickFrequency()
- 2.18 cv::setUseOptimized()
- 2.19 cv::useOptimized()
- 2.20 CV_Error() & CV_Error_()
- 2.21 cv::error()
- 2.22 cvIsInf()
- 2.23 cvIsNaN()
- 2.24 cvRound()
- 2.25 cvCeil()
- 2.26 cvFloor()
- 3.参考链接
前言
1.帮助类
1.1 cv::TermCriteria类
定义迭代算法终止条件的类。相机用法可参考链接OpenCV库成员——TermCriteria类
默认构造和有参构造
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 应用举例
//构造函数
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。
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.cv::Range 类详解
1.3 cv::Ptr 模板和垃圾回收
1.C++中的智能指针采用引用计数的方式来标识指针的被引用次数,当引用增加时计数会加1,引用减小时计数会减1;
2.当引用计数为0即指针不再需要时,就会被销毁。
3.OpenCV3中的cv::Ptr<>
与c++智能指针的作用相同。
v使用时需要让Ptr包裹想要创建的指针类型,例如:
cv::Ptr<Matx33f> p(new cv::Matx33f);
cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>();
函数 | 说明 |
---|---|
cv::Ptr::addref() | 增加指针内部的引用计数 |
cv::Ptr::release() | 减少指针内部的引用计数 |
cv::Ptr::empty() | 确定一个智能指针是否指向一个已经被释放掉的对象 |
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 学习链接
1.智能指针类和OpenCV的Ptr模板类
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定义:
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学习链接
1.基本结构对象-cv::_InputArray
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形式如下:
template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp))
其中ptr
为传递的原内存地址, n
为按照需要的字节数对齐,默认情况下是按照指针的类型进行对齐
函数返回值为对齐后的指针地址。其函数实现比较简单
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 2return (_Tp*)(((size_t)ptr + n-1) & -n);}
2.1.1 学习链接
Opencv辅助函数
2.2 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
2.3 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风格数组,为每个对象调用默认构造函数并返回指向数组中第一个对象的指针。
2.4 cv::deallocate()
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()
void* cv::fastMalloc( // Pointer to allocated buffersize_t size // Size of buffer to allocate
);
这个函数的工作机制和malloc()
类似,但是因为它做了缓存区内存大小对齐,所以执行速度更快。这意味着,如果传递的缓存区大小超过16bit,那么返回的缓存区会被对齐到16bit的边界。
2.6 cv::fastMalloc()
void cv::fastFree(void* ptr // Pointer to buffer to be freed
);
这个函数释放由cv::fastMalloc()
分配的内存。
2.7 cv::cubeRoot()
float cv::cubeRoot( // Return value is 32-bit floatfloat x // input value (32-bit float)
);
该函数返回变量x的立方根。x可正可负。
2.8 cv::CV_Assert()
// example
CV_Assert( x!=0 )
CV_Assert()是一个宏,它会测试传递给它的表达式,如果那个表达式是False,它会抛出一个异常。而CV_DbgAssert()只在debug版本中测试。
#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 学习链接
1.CV_Assert用法
2.9 cv::fastAtan2()
float cv::fastAtan2( // Return value is 32-bit floatfloat 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()
string cv::format( // Return STL-stringconst char* fmt, // formatting string, as sprintf()... // vargs, as sprintf()
);
1.这个函数本质上与标准库中的sprintf()
相同,但是,它不需要从访问者中获得一个字符缓存区,而是构建一个STL字符串并返回它。
2.它对Exception()
构造函数格式化错误信息很有用。
2.11 cv::getCPUTickCount()
int64 cv::getCPUTickCount( void ); // long int CPU for tick count
int64 cv::getCPUTickCount( void ); // long int CPU for tick count
2.12 cv::getNumThreads()
int cv::getNumThreads( void ); // total threads allocated to OpenCV
返回当前OpenCV适用的线程数。
2.13 cv::setNumThreads()
void cv::setNumThreads( int nthreads ); // Set number of threads OpenCV can use
如果在OpenCV库编译时添加了OpenMP
支持,这个函数可以设定OpenCV在并行的OpenMP
区域使用的线程数。
2.14 cv::getThreadNum()
int cv::getThreadNum( void ); // int, id of this particular thread
如果在OpenCV库编译时添加了OpenMP支持,则会返回当前执行的线程的索引。
2.15 cv::getOptimalDFTSize()
int cv::getOptimalDFTSize( int n ); // best size array to use for dft, >= n
常用在dft()函数中,一般输入为图像的实际大小,并返回你应该传递给cv::dft()的最佳数组大小。
2.16 cv::getTickCount()获得系统的tick数
//在程序开头进行读取当前系统的tick数,作为起始点
t = (double)cv::getTickCount(); // getTickcount函数:返回从操作系统启动到当前所经过的毫秒
// getTickFrequency函数:返回每秒的计时周期数
t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); //在程序末尾计算经过的时间,
我们可以写一个计算摄像头的帧率的小程序:
#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()
double cv::getTickFrequency( void ); // Tick frequency in seconds as 64-bit
这个函常常和上面的getTickCount()合起来使用,来计算事件发生的时间。
2.18 cv::setUseOptimized()
void cv::setUseOptimized( bool on_off ); // If false, turn off optimized routines
这个函数可以在任何时候开启或关闭一些高性能的优化,比如IPP, SSE2指令集。
2.19 cv::useOptimized()
bool cv::useOptimized( void ); // return true if optimizations are enabled
这个函数是用来查看是否使用了高性能的优化,如果这些优化是开启的,则返回True,否则返回False。
2.20 CV_Error() & CV_Error_()
// example
CV_Error( ecode, estring )
CV_Error_( ecode, fmt, ... )
1.CV_Error()
也是一个宏,它允许传递一个错误代码ecode和一个固定C风格的字符串estring,然后它们会被打包送进cv::Exception
,进而传递给cv::error()
进行处理。
2.21 cv::error()
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。
int cvIsInf(double x);
2.23 cvIsNaN()
如果x不是一个数,那么该函数返回的值就是1,否则为0。NaN测试是由IEEE754标准提供的。
int cvIsNan( double x ); // return 1 if x is IEEE754 "Not a number"
2.24 cvRound()
返回跟参数最接近的整数值,即四舍五入;
2.25 cvCeil()
返回跟参数最接近的整数值,即四舍五入;
2.26 cvFloor()
返回不大于参数的最大整数值,即向下取整;
#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.参考链接
1.OpenCV的数据类型
2.Opencv的点点滴滴
3.辅助对象
4.OpenCV中事半功倍的工具函数
5.Opencv数据类型1
6.OpenMP教程
7.C++ 中 OpenMP 的基本使用方法和注意事项