Opencv数据类型:

1.基本数据类型:int、float (包括简单的矢量和矩阵)(简单几何概念的表示:点、矩形、大小)
2.辅助对象:表示更抽象的概念
(例如垃圾收集指针类,用于数据切片的范围对象(range objects),以及终止条件类等)
3.大型数组的类型:(基于元组件,或者基本数据类型)
这类对象原本目的是涵盖数组或一些其他的原语,程序集或更常见的基础数据类型.
这类典型代表是cv::Mat类,该类用来代表(任意维度的,包含任意基础数据元素的)数组. 4.C++标准模板库(STL)
OPenCV特别依赖于Vector类,许多opencv库函数在其参数列表中都有矢量模板对象。

基础类型概述

固定向量类class cv::Vec<>

固定向量类:class cv::Vec<> 基本的容器类,适用于尺寸在编译时已知的小向量。

这允许特别有效的代码来处理小的常见的错误。

大多数情况不适用这种形式,并且存在typedef用于cv::Vec<>模板的常见实例化的别名。

名称类似于:

cv::Vec2i   两元素整数向量
cv::Vec3i 三元素整数向量
cv::Vec4d 四元素双精度浮点向量

一般情况下,形式的cv::Vec{2,3,4,6}{b,w,s,i,f,d}是有效的六个数据类型两到四个维度的任何组合和。

固定矩阵类cv::Matx<>

固定矩阵类:cv::Matx<> 不用于大型数组,而是设计用于处理某些特定的小矩阵运算。

在计算级视觉中,周围有许多22或33的小矩阵,并且有少数4*4矩阵用于各种变换。

cv::Matx<>设计用于容纳这些类型的对象,与cv::Vec<>类似。

cv::Matx通常是通过以下形式的别名访问cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d}。

重要的是注意使用固定矩阵类的维度必须在编译时已知,正是这种知识使得固定矩阵类的运算效率高,

从而消除了许多动态内存分配操作。

点类 Point class

点类:于固定向量类密切相关,是一种容器,用于其中一种基本类型的两个或者三个值。

点类是从它们自身的模板派生的,因此不是直接来自固定的矢量类,而可以在它们之间进行转换。

点类和固定向量类之间的主要区别:

在于它们的成员是通过名称变量访问的(mypoint.x,mypoint.y),而不是由向量索引访问得到(myvec[0],myvec[1])等。

和cv::Vec<>类似,Point类是通过别名调用作为一个正确模板的实例.类似于cv::Point2i,cv::Point2f,cv::Point2d或者

cv::Point3f,cv::Point3i,cv::Point3d.

cv::Scalar

cv::Scalar本质上一个四维Point类,因此与Point类相似,cv::Scalar实际上与一个可以产生任意四元素向量的模板相关.

但cv::Scalar一般是双精度四元素向量的别名.

与Point类不一致的是,cv::Scalar对象的元素是通过整数下标来访问的,这与cv::Vec<>相似.

这是因为cv::Scalar直接继承cv::Vec<>实例(更准确地说,继承自cv::Vec<double,4>)

深入了解基础类型

cv::Point类

用于二维点,用于三维点。

点类的最大优点是它们很简单并且开销很小。

在本地,它们没有定义很多操作,但是在需要时可以将它们转换为更通用的类型。

在大多数程序中,点类通过别名实例化采用像cv::Point2i或之类的形式cv::Point3f。

最后一个字母表示要从中构造点的所需基元。

(b是无符号数,s是短整型,i是一个32位整数,f是32位浮点数,d是一个64位浮点数)

操作 示例
默认构造函数 cv::Point2i p ;
cv::Point3f p ;
复制构造函数 Point3f p2(p1) ;
值构造函数 Point2i p(x0,x1) ;
Value constructors Point3d p(x0,x1,x2) ;
构造成固定向量类 (cv::Vec3f)p ;
成员访问 P.x; P.y; //并且是三维的 //点类:P.z
点乘法Dot product float x = p1.dot(p2) ;
双精度点积 double x = p1.ddot(p2) ;
叉乘Cross product p1.cross(p2) ;
查询点p是否在矩形r内 p.inside(r) ;
这些类型可以与C接口类型CvPoint和CvPoint2D32f互相转换.
若一个Point类的浮点值实例被转换成整型,那么那个值将被自动取整.

cv::Scalar 类

cv::Scalar是四维点类.与其他类型相似,它实际上与一个模板类相关,但访问它的别名返回一个该模板的实例,

在这个模板中,所有的成员都是双精度浮点数.在计算机视觉中,cv::Scalar类有一些与四元向量相关的特殊成员函数.

操作 示例
默认构造函数 cv::Scalar s ;
复制构造函数 cv::Scalar s2(s1) ;
值构造函数 cv::Scalar s(x0);
Value constructors cv::Scalar s(x0,x1,x2,x3);
元素乘法 s1.mul(s2);
(四元数)共轭 s.conj(); //返回cv::Scalar(s0,-s1,s2,-s2)
(四元素)真值测试 s.isReal(); //(如果s1 == s2 == s3 == 0则返回true)
cv::Scalar 中没有出现“强制转换为固定向量类”的操作
这是因为,与点类不同,它 直接从固定向量类模板的实例化继承。
因此,它继承 了固定向量类中的所有向量代数运算,成员访问函数(即)和其他属性。

size类

size在实际操作时与Point类相似,而且可以与Point类互相转换.

这两者之间主要的区别在于Point类的数据成员是x和y,而size类中对应的成员是width和height.

size类的三个别名分别是cv::Size,cv::Size2i,cv::Size2f.

cv::Size与cv::Size2i等价,表示整数大小,cv::Size2f表示32位浮点大小.

操作 示例
默认构造函数 cv::Size sz ;
cv::Sizezi sz ;
cv::Size2f sz ;
复制构造函数 cv::Size sz2(sz1) ;
值构造函数 cv::Size2f sz(w,h) ;
成员访问 sz.width ; sz.height ;
计算面积 sz.area()
与Point类不同的是,size类不支持转换到固定向量类.
这意味着size类有更受限的用途,另一方面,Point类和固定向量类毫无疑问可以被转换成size类

cv::Rect类

矩形类包含Point类的成员x和y(矩形左上角)和size类的成员width和height(代表矩形大小)

然而矩形类并不是从Point类或者size类继承过来的,因此通常它们不继承运算符。

操作 示例
默认构造函数 cv::Rect r ;
复制构造函数 cv::Rect r2(r1) ;
值构造函数 cv::Rect(x,y,w,h) ;
由起点和大小构造 cv::Rect(p,sz) ;
由两个对角构造 cv::Rect (p1,p2) ;
成员访问 r.x; r.y; r.width; r.height ;
计算面积 r.area() ;
提取左上角 r.tl() ;
提取右下角 r.bl() ;
确定点p是否在矩形内 r.contains(p)

Rect还支持各种重载运算符,可以用于计算两个矩形或矩形和另一个对象的几何属性。

操作 示例
矩形r1和r2的交集 cv::Rect r3 = r1 & r2 ; r1 &= r2
同时包含矩形r1和r2的最小区域矩形 cv::Rect r3 = r1
平移矩形r 大小s的距离 cv::Rect rx = r + x ; r += x ;
按尺寸s给出的量放大矩形r cv::Rect rs = r + s ; r += s ;
比较矩形r1和r2是否相等 bool eq = (r1 == r2) ;
比较矩形r1和r2是否不相等 bool ne = (r1 != r2) ;

cv::RotatedRect class类

cv::RotatedRect类是OpenCV中少数底层没有使用模板的C++接口类之一.

同时,它是包含一个中心点cv::Point2f,一个大小cv::Size2f和额外的角度float的容器.

其中浮点类型(float)的角度代表图形绕中心点旋转的角度.

cv::RotateRect和cv::Rect有一个非常重要的不同点是cv::RotatedRect是以中心为原点的,

而cv::Rect则位于左上角为原点.

操作 示例
默认构造函数 cv::RotatedRect rr() ;
复制构造函数 cv::RotatedRect rr2(rr1) ;
从两个角点构建 cv::RotatedRect (p1,p2) ;
值构造函数 cv::RotatedRect rr(p,sz,theta) ; //由两个对角构造
成员访问 rr.center ; rr.size ; rr.angle ;
返回角点列表 rr.points(pts[4]) ;

cv::Matx 固定矩阵类:

固定矩阵类是为编译时就已知维度的矩阵打造的,这也是它称为"固定"的原因.

因为它们内部的所有数据都是在堆栈上分配,所以它们的分配和清除都很快.

对固定矩阵类的操作运行很快,而且它们还在小型矩阵有特别优化的实现。

一般来说,当你表示的东西实际上是你要用矩阵代数做的矩阵时,你应该使用固定矩阵类。

如果您的对象实际上是一个大数据数组,如图像或大量的点列表,

则固定矩阵类不是正确的解决方案; 你应该使用cv::Mat。

cv::Matx支持的操作

操作 示例
默认构造函数 cv::Matx33f m33f ; cv::Matx43d m43d ;
复制构造函数 cv::Matx22d m22d(n22d) ;
值构造函数 cv::Matx21f m(x0,x1) ;
cv::Matx44d m(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10) ;
相同元素矩阵 m33f = cv::Matx33f::all(x) ;
全零矩阵 m23d = cv::Matx23d::zeros() ;
全一矩阵 m16f = cv::Matx16f::ones() ;
创建单位矩阵 m33f = cv::Matx33f::eye() ;
创建一个保持另一个对角线的矩阵 m31f = cv::Matx33f::diag() ;
创建具有正态分布条目的矩阵 m33f = cv::Matx::nrandn(mean, variance) ;
成员访问 m(i,j) , (i) ; //一个参数 //仅限一维矩阵
单例代数 m * a; a * m; m / a ;
比较 m1 == m2; m1 != m2 ;
点积 m1.dot(m2) ; //元素之和 //乘法,m的精度
双精度点积 m1.ddot(m2) ; //元素乘法的总和 //双精度
重塑矩阵 m91f = m33f.reshape<9,1>() ;
转型操作符 m44f = (Matx44f)m44d ;
在(i,j)处提取2*2的子矩阵 m44f.get_minor<2,2>(i,j) ;
提取行i m14f = m44f.row(i) ;
提取列j m41f = m44f.col(j) ;
提取矩阵对角线 m41f = m44f.diag() ;
计算转置 n44f = m44f.t() ;
逆矩阵 n44f = m44f.inv(方法) ; //默认方法是:cv::DECOMP_LU
解线性系统 m31f = m33f.solve(rhs31f,方法) ;
m31f = m33f.solve(rhs31f,方法) ;
转型操作符 m32f = m33f.sovle<2>(rhs32f,方法) ; //模板形成一个默认方法是: DECOMP_LU
每元素乘法 m1.mul(m2) ;

cv::Vec 固定向量类

固定向量类是从固定矩阵类派生出来的,它们其实只是为了更方便地使用cv::Matx<>.

在C++继承的意义上,可以说固定向量模板cv::Vec是列为1的cv::Matx<>.

为特定实例准备好的别称有这样的形式cv::Vec { 2 ,3 ,4 ,6 } { b ,s ,w ,i ,f ,d },

中最后一个字符具有通常的含义(加入的w ,表示一个unsigned short)

操作 示例
默认构造函数 Vec2s v2s ; Vec6f v6f ;
复制构造函数 Vec3f u3f(v3f) ;
值构造函数 Vec2f v2f(x0,x1) ;
Vec6d v6d(x0,x1,x2,x3,x4,x5) ;
成员访问 v4f[i] ; v3w(j) ;//(operator()和operator []都工作)
矢量交叉积 v3f.cross(u3f) ;

复数类cv::Complexf

基本类型中还应包含一个类类型:复数类。

OpenCV复数类与它们不相同,但与相关的类兼容 - 并且可以与之相关 使用STL复数类模板complex<> 。

OpenCV和STL复数类之间最重要的区别在于成员访问。

在STL类,实部和虚部通过成员函数访问real() 和imag(),

而在OpenCV的类,它们是可直接访问(公共)成员变量re 和im 。

cv::Complexf

操作 示例
默认构造函数 Vec2s v2s ; Vec6f v6f ;
复制构造函数 cv::Complexf z2(z1) ;
值构造函数 cv::Complexf z1(re0);
cv::Complexf(re0,im1) ;
复制构造函数 cv::Complexf u2f(v2f) ;
成员访问 z1.re; z1.im ;
复共轭 z2 = z1.conj() ;

辅助对象 Helper Objects

还有一个非常重要的对象,即“智能”指针对象cv::Ptr 。

展望一下cv::Ptr ,我们将研究垃圾收集系统,它是OpenCV的C ++接口的组成部分。

该系统使我们免于担心在早期基于C的OpenCV接口(即2.1版之前)中如此繁重的对象分配和释放的细节。

cv::TermCriteria class

这些cv::TermCriteria 对象封装了一个或两个停止标准,以便它们可以方便地传递给OpenCV算法函数。

他们有三名成员 变量- type ,maxCount 和epsilon -这 可以直接设置(它们是公共的),

或者更常见的是,只是由构造函数使用表单设置TermCriteria(int type, int maxCount, double epsilon ) 。

变量type 设置为cv::TermCriteria::COUNT 或TermCriteria::EPS 。

你也可以将“或”(即| )两者结合在一起。

该值cv::TermCriteria::COUNT 是其同义词cv::TermCriteria::MAX_ITER ,

因此您可以根据需要使用该值。如果终止标准包括cv::TermCriteria::COUNT ,

那么您告诉算法在maxCount 迭代后终止。如果终止标准包括cv::TermCriteria::EPS ,

那么您告诉算法在与算法的收敛相关的某个度量下降之后终止epsilon 。

所述的 参数具有用于向进行相应的设置 或 使用。

cv::Range class

在cv::Range 类用于指定 连续 序列 整数。cv::Range 对象有两个元素,

start并且-通常使用构造函数设置end-类似于cv::TermCriteria-

cv::Range( int start, int end ) 。范围均包括其初始值的,但不包括他们的最终价值,

所以cv::Range rng( 0, 4 ) 包括变量0 ,1 ,2 ,和3 ,但不会4 。

使用size() ,您可以找到范围内的元素数量。在前面的例子中,rng.size() 将等于4 。

还有一个成员,empty() 用于测试范围是否没有元素。

最后,cv::Range::all() 可以在需要范围的任何地方使用,以指示对象可用的范围。

cv::Ptr 模板和垃圾收集

一个非常有用 C ++中的对象类型是“智能”指针。7 这个 指针 允许我们创建对某事物的引用,然后传递它。

您可以创建更多对该事物的引用,然后 将计算所有这些引用。 由于引用超出范围,智能指针的引用计数递减。

一旦所有引用(指针的实例)消失,“事物”将自动被清除(解除分配)

[运行过程]

首先,为要“包装”的类对象定义指针模板的实例。

您可以使用cv::Ptr p( new cv::Matx33f )

或等调用来执行此操作cv::Ptr p = makePtrcv::Matx33f() 。

模板对象的构造函数获取指向要指向的对象的指针。一旦你这样做,你就有了一个智能指针p ,

它是一种类似指针的对象,你可以传递它并像普通指针一样使用(即它支持诸如operator*() 和

之类的运算符operator->() )。一旦拥有p ,您可以创建相同类型的其他对象,

而不向它们传递指向新对象的指针。例如,您可以创建Ptr q ,并在分配值的p 时间q

在幕后的某个地方,智能指针的“智能”动作发挥作用。你看,就像通常的指针一样,

那里仍然只有一个实际的cv::Mat33f 对象,p 并且q 都指向。

所不同的是,这两个p并q 知道他们是两个指针中的每一个。

应该p 消失(例如通过超出范围),q 知道它是对原始矩阵的唯一剩余参考。

如果q 应该消失并且它的析构函数被调用(隐式),q 会知道这是剩下的最后一个,它应该释放原始矩阵。

您可以将此视为建筑物中最后一个负责关灯和锁门的人(在这种情况下,也将建筑物烧毁到地面)。

[注意]大师的提示:

一个严肃的程序员可能会担心引用计数的递增和递减可能不足以使Ptr<>模板在多线程应用程序中安全。

但是,情况并非如此,并且Ptr<> 是线程安全的。

类似地,OpenCV中的其他引用计数对象在同样的意义上都是线程安全的

cv::Exception类和异常处理

OpenCV使用异常来处理错误。 OpenCV定义 它自己的异常类型,

cv::Exception 它是从STL异常类派生的std::exception 。

实际上,这个异常类型没有什么特别之处,除了在cv:: 命名空间中,

因此可以与其他也从中派生的对象区分开来std::exception 。

类型cv::Exception 有成员code ,err ,func ,file ,和line ,

其中(分别)是一个数字错误代码,表明产生的例外,其中发生错误的函数的名称,

该文件的错误的性质的字符串,其中该错误发生了,并且整数表示该文件中发生错误的行。

err , func 和file 都是STL字符串。

cv::DataType<>模板

当OpenCV库运行时 需要 传达特定数据类型的概念,他们通过创建类型的对象来实现cv::DataType<> 。

cv::DataType<> 本身是一个模板,因此传递的实际对象是该模板的特化。

模板类定义 : DataType

template class DataType

{

typedef _Tp value_type;

typedef value_type work_type;

typedef value_type channel_type;

typedef value_type vec_type;

enum {

generic_type = 1,

depth = -1,

channels = 1,

fmt = 0,

type = CV_MAKETYPE(depth, channels)

};

};

首先,我们可以看到这cv::DataType<> 是一个模板,并期望专门用于一个名为的类_Tp 。

然后它有四个typedef 语句,允许 在编译时cv::DataType<>

从cv::DataType<>实例化对象中提取类型以及其他一些相关类型。

在模板定义中,这些都是相同的,但我们将在我们的模板专业化示例中看到它们不必(通常不应该)。

这些是,所述的数目,格式,和 generic_typedepthchannelsfmttype 。

要了解所有这些组件的含义,我们cv::DataType<> 将从core.hpp中查看两个示例特化 。

第一个是以下cv::DataType<> 定义float :

template class DataType

{

typedef _Tp value_type;

typedef value_type work_type;

typedef value_type channel_type;

typedef value_type vec_type;

enum {

generic_type = 1,

depth = -1,

channels = 1,

fmt = 0,

type = CV_MAKETYPE(depth, channels)

};

};

首先要注意的是,这是C ++内置类型的定义。

对内置类型进行此类定义很有用,但我们也可以将它们用于更复杂的对象。

在这种情况下,value_type 当然是float 和work_type ,channel_type 和vec_type 都是相同的。

cv::InputArray和cv::OutputArray类

许多OpenCV函数将数组作为参数并返回数组作为返回值,但在OpenCV中,有许多种类的数组。

OpenCV的支持一些小数组类型(cv::Scalar ,cv::Vec ,cv::Matx )和STL的std::vector<>

(大数组类型cv::Mat 和cv::SparseMat)。为了防止界面变得过于复杂(和重复),

OpenCV定义了类型cv::InputArray 和cv::OutputArray 。

实际上,这些类型对于库支持的许多数组形式而言意味着“上述任何一种”。

甚至有一个cv::InputOutputArray ,为就地计算指定一个数组。

cv::InputArray 和之间的主要区别在于cv::OutputArray 假设前者const (即,只读)。

您通常会在库例程的定义中看到这两种类型。

您不会自己使用它们,但是当您被介绍到库函数时,它们的存在意味着您可以使用任何数组类型,

包括单个数组,cv::Scalar 结果应该是您所期望的。

相关的cv::InputArray 是特殊的cv::noArray() 返回一个的 函数cv::InputArray 。

返回的对象可以传递给任何需要cv::Inpu⁠t​Array 指示此输入未被使用的输入。

某些函数还具有可选的输出数组,您可以cv::noArray() 在不需要相应输出时传递。

效用函数 Utility Functions

除了提供专门的原始数据类型,OpenCV库也提供了 一些专门的功能,

可用于更有效地处理计算机视觉应用中常见的数学和其他操作。在库的上下文中,这些被称为实用函数 。

实用程序功能包括用于数学运算,测试,错误生成,内存和线程处理,优化等的工具。

【实用程序和系统功能】

功能 描述

——————————————————————————————————————————————————————————————————

cv::alignPtr() 将指针与指定的字节数对齐

——————————————————————————————————————————————————————————————————

cv::alignSize() 将缓冲区大小与给定的字节数对齐

——————————————————————————————————————————————————————————————————

cv::allocate() 分配C风格的对象数组

——————————————————————————————————————————————————————————————————

cvCeil() a 圆形浮点数x 到最小整数不小于x

——————————————————————————————————————————————————————————————————

cv::cubeRoot() 计算数字的立方根

——————————————————————————————————————————————————————————————————

cv::CV_Assert() 如果给定条件不为真,则抛出异常

——————————————————————————————————————————————————————————————————

CV_Error() 用于构建cv::Exception (从固定字符串)并抛出它的宏

——————————————————————————————————————————————————————————————————

CV_Error_() 用于构建cv::Exception (从格式化的字符串)并抛出它的宏

——————————————————————————————————————————————————————————————————

cv::deallocate() 释放C风格的对象数组

——————————————————————————————————————————————————————————————————

cv::error() 指出错误并抛出异常

——————————————————————————————————————————————————————————————————

cv::fastAtan2() 以度为单位计算矢量的二维角度

——————————————————————————————————————————————————————————————————

cv::fastFree() 释放内存缓冲区

——————————————————————————————————————————————————————————————————

cv::fastMalloc() 分配对齐的内存缓冲区

——————————————————————————————————————————————————————————————————

cvFloor() 圆形浮点数x 到最接近的整数不大于x

——————————————————————————————————————————————————————————————————

cv::format() 使用sprintf 类似格式创建STL字符串

——————————————————————————————————————————————————————————————————

cv::getCPUTickCount() 从内部CPU计时器获取计数

——————————————————————————————————————————————————————————————————

cv::getNumThreads() 计算OpenCV当前使用的线程数

——————————————————————————————————————————————————————————————————

cv::getOptimalDFTSize() 计算您计划传递到的数组的最佳大小 cv::DFT()

——————————————————————————————————————————————————————————————————

cv::getThreadNum() 获取当前线程的索引

——————————————————————————————————————————————————————————————————

cv::getTickCount() 从系统获取滴答计数

——————————————————————————————————————————————————————————————————

cv::getTickFrequency() 每秒获得数字或刻度(请参阅cv::getTickCount() )

cvIsInf() 检查浮点数x 是否为无穷大

——————————————————————————————————————————————————————————————————

cvIsNaN() 检查浮点数x 是否为“非数字”

——————————————————————————————————————————————————————————————————

cvRound() 将浮点数x舍 入为最接近的整数

——————————————————————————————————————————————————————————————————

cv::setNumThreads() 设置OpenCV使用的线程数

——————————————————————————————————————————————————————————————————

cv::setUseOptimized() 启用或禁用优化代码(SSE2等)的使用

——————————————————————————————————————————————————————————————————

cv::useOptimized() 指示优化代码启用的状态(请参阅cv::setUseOptimized() )

——————————————————————————————————————————————————————————————————

cv::alignPtr()

template T * cv :: alignPtr(//返回T *类型的对齐指针

T * ptr,//指针,未对齐

int n = sizeof(T)//与块大小对齐,幂为2

);

给定任何类型的指针,此函数计算一个根据以下计算对齐相同类型的指针:

(T *)(((size_t)ptr + n + 1)&-n)

cv::alignSize()

size_t cv :: alignSize(//最小尺寸> ='sz'可被'n'整除

size_t sz,//缓冲区的大小

int n = sizeof(T)//与块大小对齐,幂为2

);

给定一个数字n (通常是一个回报 from sizeof() )和缓冲区 的大小sz ,

cv::alignSize()计算此缓冲区的大小,以便包含整数个大小的对象n - 即大于或等于可sz 被整除的最小数n。

使用以下公式:

(sz + n-1)&-n

cv::allocate()

template T * cv :: allocate(//返回指向已分配缓冲区的指针

size_t sz //缓冲区大小,sizeof(T)的倍数

);

该功能cv::allocate() 功能相似 到的阵列形式new ,

因为它 分配n 类型对象的C风格数组,T 为每个对象调用默认构造函数,并返回指向数组中第一个对象的指针。

cv::deallocate()

template void cv :: deallocate(

T * ptr,//指向缓冲区释放的指针

size_t sz //缓冲区大小,sizeof(T)的倍数

);

该功能cv::deallocate() 功能相似 到数组形式delete,因为它解除了C n 类型的对象数组T ,

并为每个对象调用析构函数。cv::deallocate() 用于释放分配的对象cv::allocate() 。

n 传递给的元素数cv::deallocate() 必须与最初分配的对象数相同cv::allocate() 。

cv::astAtan2()

float cv :: fastAtan2(//返回值是32位浮点数

float y,// y输入值(32位浮点数)

float x // x输入值(32位浮点数)

);

这个函数计算 一x,y 对的反正切并返回 从原点到指示点的角度。结果报告在度从0.0 到360.0 ,包容0.0 但不包括的360.0 。

cvCeil()

int cvCeil(//返回最小的int> = x

float x //输入值(32位浮点数)

);

给定一个浮点数x ,cvCeil() 计算 不小于的最小整数x 。

如果输入值超出可由32位整数表示的范围,则结果是未定义的。

cv::cubeRoot()

float cv :: cubeRoot(//返回值是32位浮点数

float x //输入值(32位浮点数)

);

这个函数计算争论的立方根x 。x 正确处理负值(即返回值为负)。

cv :: CV_Assert()和CV_DbgAssert()

//示例

CV_Assert(x!= 0)

CV_Assert() 是一个将测试表达式的宏 传递给它,如果该表达式求值为False (或0 ),它将抛出异常。

该CV_Assert() 宏始终测试。或者,您可以使用CV_DbgAssert(),仅在调试编译中进行测试。

cv :: CV_Error()和CV_Error_()

//示例

CV_Error(ecode,estring)

CV_Error_(ecode,fmt,...)

宏CV_Error() 允许您传入 一个错误 代码ecode 和固定的C风格字符串estring ,

然后将其打包成一个cv::Exception 然后传递cv::error() 给要处理的字符串。CV_Error_()

如果需要动态构造消息字符串,则使用变量宏。CV_Error_() 接受相同ecode 的CV_Error() ,

但随后期望一个sprintf() 风格格式字符串随后的参数个数可变,如将被预期sprintf() 。

cv::error()

void cv::error(

const cv::Exception& ex //抛出异常

);

这个功能是主要是来自CV_Error() 和CV_Error_() 。

如果您的代码是在非调试版本中编译的,那么它将抛出异常ex 。

如果您的代码是在调试版本中编译的,那么它会故意引发内存访问冲突

,以便执行堆栈和所有参数可用于您运行的任何调试器。

您可能不会cv::error() 直接调用,而是依赖宏CV_Error() 并CV_Error_() 为您抛出错误。

这些宏获取您希望在异常中显示的信息,为您打包,并将生成的异常传递给cv::error() 。

CV :: fastFree()

void cv :: fastFree(

void * ptr //指向要释放的缓冲区的指针

);

此例程释放缓冲区 分配cv::fastMalloc() (覆盖下一个)。

CV :: fastMalloc()

void * cv :: fastMalloc(//指向已分配缓冲区的指针

size_t size //要分配的缓冲区大小

);

cv::FastMalloc() 工作正常 就像malloc() 你熟悉的那样,除了它通常更快,它确实缓冲大小对齐。

这意味着如果传递的缓冲区大小超过16个字节,则返回的缓冲区将与16字节边界对齐。

cvFloor()

int cvFloor(//返回最大的int <= x

float x //输入值(32位浮点数)

};

给定一个浮点数x ,cv::Floor() 计算最大值 整数不大于x 。

如果输入值超出可由32位整数表示的范围,则结果是未定义的。

cv::format()

string cv :: format(//返回STL-string

const char * fmt,//格式化字符串,作为sprintf()

... // vargs,as sprintf()

);

这个功能是 sprintf() 与标准基本相同库,

但不是要求来自调用者的字符缓冲区,它构造一个STL字符串对象并返回它。

对于Exception()构造函数(在其参数中需要STL字符串)格式化错误消息特别方便。

cv::getCPUTickCount()

int64 cv :: getCPUTickCount(void); // long int CPU用于滴答计数

此函数报告这些体系结构上的CPU滴答数 具有这样的构造(包括但不限于x86架构)。

然而,重要的是要知道,在许多体系结构中,此函数的返回值很难解释。

特别是,因为在多核系统上,一个线程可以在一个内核上休眠并在另一个内核上唤醒,

结果与两个后续调用之间的差异cv::getCPUTickCount() 可能会产生误导或完全无意义。

因此,除非您确定自己知道自己在做什么,否则最好使用cv::getTickCount() 定时测量。

此功能最适用于初始化随机数生成器等任务。

cv::getNumThreads()

int cv :: getNumThreads(void); //分配给OpenCV的总线程数

返回当前使用的线程数 通过OpenCV。

cv::getOptimalDFTSize()

int cv :: getOptimalDFTSize(int n); //用于dft的最佳大小数组,> = n

当你调用cv::dft()时 , OpenCV用来计算变换的算法对传递给的数组的大小非常敏感cv::dft() 。

优选的大小确实遵循它们生成的规则,但是该规则足够复杂,

以至于每次都计算正确的大小以填充阵列(最多)是烦恼。

该函数cv::getOptimalDFTSize() 将您传递给的数组的大小作为参数cv::dft(),

并返回应传递给的数组的大小cv::dft() 。

OpenCV使用此信息创建一个更大的数组,您可以在其中复制数据并用零填充其余数据。

cv::getThreadNum()

int cv :: getThreadNum(void); // int,此特定线程的id

如果您的OpenCV库是使用OpenMP支持编译的,那么它将会 返回当前正在执行的线程的索引(从零开始)。

cv::GetTickCount的()

int64 cv :: getTickCount(void); // long int CPU用于滴答计数

这个功能 返回相对于某些与体系结构相关的时间的滴答计数。

然而,刻度的速率也取决于架构和操作系统; 每个滴答的时间可以通过cv::getTickFrequency()

计算。此功能优于cv::getCPUTickCount() 大多数计时应用程序,因为它不受低级问题的影响,

例如运行您的线程的核心和CPU频率的自动限制(大多数现代处理器出于电源管理的原因)。

cv::getTickFrequency()

double cv :: getTickFrequency(void); //以秒为单位记录频率为64位

何时cv::getTickCount() 用于时序分析, 一般来说,刻度的确切含义取决于架构。该函数cv::getTickFrequency() 计算时钟时间(即秒)和抽象“滴答”之间的转换。

[注意]

要计算某些特定事物发生所需的时间(例如要执行的函数),只需要cv::getTickCount()

在函数调用之前和之后调用,减去结果,然后除以值cv::getTickFrequency() 。

cvIsInf()

int cvIsInf(double x); //如果x是IEEE754“infinity”,则返回1

返回值cvIsInf() 是1 if x 是加号还是减号 无穷大和0 其他。无穷大测试是IEEE754标准所暗示的测试。

cvIsNaN()

int cvIsNan(double x); //如果x是IEEE754则返回1“不是数字”

该 返回值cvIsNaN() 是1 if x 是“不是数字”,0 否则。NaN测试是IEEE754标准所暗示的测试。

cvRound()

int cvRound(double x); //返回最接近'x'的整数

给定一个浮点数x ,cvRound() 计算整数 最接近x 。如果输入值超出可由32位整数表示的范围,

则结果是未定义的。在OpenCV 3.0中有重载cvRound( float x)(以及cvFloor 和cvCeil),这在ARM上更快。

cv::setNumThreads()

void cv :: setNumThreads(int nthreads); //设置OpenCV可以使用的线程数

使用OpenMP支持编译OpenCV时,此功能 设置OpenCV将在并行OpenMP区域中使用的线程数。线程数的默认值是CPU上的逻辑核心数(即,如果我们有四个核心,每个核心有两个超线程,默认情况下将有八个线程)。如果nthreads 设置为0 ,则线程数将返回到此默认值。

cv::setUseOptimized()

void cv :: setUseOptimized(bool on_off); //如果为false,请关闭优化的例程

虽然早期版本的OpenCV依赖 用于访问高性能优化的外部库(例如IPP,Intel Performance Primitives库) 例如SSE2指令,后来的版本越来越多地转向在OpenCV本身中包含该代码。默认情况下,启用这些优化例程的使用,除非您在构建库安装时专门禁用它们。但是,您可以随时打开和关闭这些优化的使用cv::setUseOptimized() 。

[注意]

优化使用的全局标志的测试在OpenCV库函数内部以相对较高的级别完成。这意味着您不应该cv::setUseOptimized() 在任何其他例程运行时调用(在任何线程上)。只有当您确定自己知道什么是什么以及什么不运行时,您应确保调用此例程,最好是从应用程序的最顶层开始。

cv::useOptimized()

bool cv :: useOptimized(void); //如果启用了优化,则返回true

在任何时候,你 可以检查全局标志的状态,cv::setUseOptimized() 通过调用可以使用高性能优化

(请参阅参考资料)cv::useOptimized() 。True 仅在当前启用了这些优化时才会返回; 否则,此功能将返回False 。

[模板结构]

OpenCV提供了您可以使用的类型。您也可以使用STL复杂类型intintcv::Complexstd::complex,

这与OpenCV毫无关系。对于您自己的其他类型的建筑也是如此。

此相同的概念推广到其他类型的模板,如cv::Scalar_<> 和cv::Rect_<>,以及cv::Matx_<>和cv::Vec_<> 。

在自己实例化这些模板时,必须提供用于组成模板的单一类型,以及(在相关时)模板的尺寸。

常用的固定长度模板

功能 描述

——————————————————————————————————————————————————————————————————

cv::Point_ 由一对类型的对象组成的点T 。

——————————————————————————————————————————————————————————————————

cv::Rect_ 所有类型的位置,宽度和高度T 。

——————————————————————————————————————————————————————————————————

cv::Vec<Type T, int H> 一组H 类型的对象T 。

——————————————————————————————————————————————————————————————————

cv::Matx<Type T, int H, int W> 一组H * W 类型的对象T 。

——————————————————————————————————————————————————————————————————

cv::Scalar_ 一组四个类型的对象T (相同cv::Vec<T, 4> )。

——————————————————————————————————————————————————————————————————

<学习opencv>opencv数据类型的更多相关文章

  1. Opencv基本数据类型

    1.OpenCV中数据类型和常用数据类型对应 Mat<uchar>                            CV_8U Mat<char>            ...

  2. OpenCV Mat数据类型及位数总结(转载)

    OpenCV Mat数据类型及位数总结(转载) 前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量, ...

  3. OpenCV学习(22) opencv中使用kmeans算法

    kmeans算法的原理参考:http://www.cnblogs.com/mikewolf2002/p/3368118.html 下面学习一下opencv中kmeans函数的使用.      首先我们 ...

  4. OpenCV学习:OpenCV文件一览

    了解一些OpenCV代码整体的模块结构后,再重点学习自己感兴趣的部分,会有一种一览众山小的感觉~ Come on! C:\OpenCV\opencv\build\include文件夹下包含两个文件夹: ...

  5. OpenCV Mat数据类型指针ptr的使用

    OpenCV Mat数据类型指针ptr的使用 cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600 uchar * data00 = imag ...

  6. <学习opencv> opencv 概述及初探

    目录 Opencv3 当前模块 OpenCV 贡献库(opencv_contrib) OpenCV 头文件 旧式C风格头文件 新式C++风格头文件 例程 DEMO1 - 显示图片 DEMO2 - 视频 ...

  7. OpenCV学习笔记——OpenCV安装

    关于OpenCV安装 1.下载和安装OpenCV SDK 在官网:http://opencv.org/上找到OpenCV windows版下载 . 后得到一个 opencv-2.X.X.exe的文件, ...

  8. OpenCV学习:OpenCV源码编译(vc9)

    安装后的OpenCV程序下的build文件夹中,只找到了vc10.vc11和vc12三种编译版本的dll和lib文件,需要VS2010及以上的IDE版本,而没有我们常用的VS2008版本. 于是,需要 ...

  9. JavaScript学习10 JS数据类型、强制类型转换和对象属性

    JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...

  10. 走近OPENCV // opencv 2.4.9+vs2013配置

    一直很懒去配opencv,这几周忍不了终于抽空来配了一下环境... 用的是旧版opencv2.4系列,最新到3.0了,之后再看看教程不知道有什么特别大的区别. (FF14国服没有4.0 // 8.19 ...

随机推荐

  1. day06 python代码操作MySQL

    day06 python代码操作MySQL 今日内容 python代码操作MySQL 基于python与MySQL实现用户注册登录 python操作MySQL python 胶水语言.调包侠(贬义词& ...

  2. Spark(十)【RDD的读取和保存】

    目录 一.文件类型 1.Text文件 2.Json文件 3.对象文件 4.Sequence文件 二.文件系统 1. MySQL 2. Hbase 一.文件类型 1.Text文件 读写 读取 scala ...

  3. JavaScript的数据结构快速学-链表的实现

    1-单项链表 function LinkedList() { let Node = function(element) { // 辅助类,表示要添加到链表中的项 this.element = elem ...

  4. 网口程序udp

    # -*- coding: utf-8 -*- """ Created on Thu Nov 12 15:02:53 2020 @author: Administrato ...

  5. C++11的auto自动推导类型

    auto是C++11的类型推导关键字,很强大 例程看一下它的用法 #include<vector> #include<algorithm> #include<functi ...

  6. Linux学习 - 条件判断

    一.判断格式 test -e /root/install.log 或 [ -e /root/install.log ] 使用echo $?查看是否正确,当返回0时表示返回正确 1 按照文件类型进行判断 ...

  7. 06 - Vue3 UI Framework - Dialog 组件

    做完按钮之后,我们应该了解了遮罩层的概念,接下来我们来做 Dialog 组件! 返回阅读列表点击 这里 需求分析 默认是不可见的,在用户触发某个动作后变为可见 自带白板卡片,分为上中下三个区域,分别放 ...

  8. Jenkins集成jira

    目录 一.Jenkins中Jira插件安装 二.Jenkins中Jira配置 一.Jenkins中Jira插件安装 点击 Manage Jenkins-->Manage Plugins--> ...

  9. HBuilderX无法启动微信小程序?仅三步

    1.复制微信开发者工具启动路径 : "C:\Program Files (x86)\Tencent\微信web开发者工具\微信web开发者工具.exe" 不要后面的 "微 ...

  10. epx中设置断掉调试

    以前总听师傅们说,做pwn题,多调试,多调试. 师傅都说用gdb,但是我刚接触linux程序调试的时候用的是pwndbg,后来就用顺手了.但是调试一些简单程序还好,直接用pwndbg打开.但是这年头简 ...