分享

Opencv系列1.3--Opencv数据结构

 SLAM之路 2022-04-24

Opencv数据结构整体分为三大类

i.基本数据类型,直接由C++数据元素(int,float,等等)组成,如简单向量、简单矩阵或者表示几何概念的点、矩形、大小等等;
ii.helper objects,用于表示抽象的概念,如garbage-collecting pointer class、range objects;
iii.大数组类型,用于包含大规模数组、大规模几何元素、大规模基本数据类型;典型例子如cv::Mat类,用于表示任意维度数组包含任意基本数据类型;
iv.标准容器库,STL;

Ⅰ、基本数据类型

cv::Point类型

点类型,与固定向量类型cv::Vec紧密相连,它是两个或三个基本元素值得容器,当然点也可以根据其本身的模板生成;点类型和固定向量类型的主要区别在于:它可以通过变量名访问(mypoint.x,mypoint.y等等),而不是通过向量序号(myvec[0],myvec[1]等等);

点类型也具有其化名形式,如:

cv::Point2i表示二维点,整型

cv::Point2f表示二维点,单精度

cv::Point2d表示二维点,双精度

cv::Point3i表示三维点,整型

cv::Point3f表示三维点,单精度

cv::Point3d表示三维点,整型

下表是点类型支持的操作:默认构造、复制构造、值构造、强制转化为固定向量类型、访问成员、点积、叉乘;

cv::Scalar类型

实际上是一个四维点类型;但本质上cv::Vec<double,4>

对于Scalar类型,强制转化为固定向量类型并未出现在上表,这是因为,它直接继承与固定向量类型模板的实例化。所以它继承了固定向量类型的所有代数操作、成员访问函数和其他性质。
cv::Size类型

实际上类似于相对应的点类型,并可以强制互相转化。主要区别在于,点类型数据成员通过x和y访问,而size类型则通过width和height访问。size类型的三个化名是:cv::Size,cv::Size2i,cv::Size2f;前两个是等价的。

size类型无法强制转化为固定向量类型,但是点类型和固定向量类型可以强制转化为size类型;

cv::Rect类型

矩形类,Rect类包括四个成员,分别是Point类型(x,y)(代表左上角)、Size类型宽width和高height,但是矩形类并未继承Point类或Size类。


cv::RotatedRect类型

该类型非模板类,它是一个容器,包含一个Point2f为中心、一个Size2f为大小,一个单精度数为角度,表示矩形绕中心旋转的角度。它与Rect类型最大的区别在于分别相对于中心和左上角为参考。

固定矩阵类

cv::Matx<>:模板类,固定矩阵类型,主要用于具体的小型矩阵,它的维度已知;常用的是其化名如:cv::Matx{1,2,3,4,5,6}{1,2,3,4,5,6}{f,d};

固定向量类

固定向量类型源于固定矩阵类型;

cv::Vec<>:模板类,固定向量类型,包含元素的容器类;

cv::Vec<>模板类不一定会常用,常用的是其化名如:

cv::Vec2i表示二维整型向量;

cv::Vec3i表示三维整型向量

cv::Vec4d表示4维双精度向量

cv::Vec{2,3,4,6}{b,2,s,i,f,d}表示{2-6维}{六种数据结构}:任意组合;

注:为何不适用STL类型,区别在于固定向量类型(cv::Vec)倾向于小向量,维度已知,使编译效率提高;

复数类
   复数类型complex<>,与STL中复数类型的区别在于,前者通过re和im访问变量,后者通过real()和imag()。

Ⅱ、Helper对象

Helper对象在控制各种算法或者在对容器进行各种操作十分重要。此外,还有一种重要对象,智能指针cv::Ptr,使我们免于担心对象内存的分配与销毁。

cv::TermCriteria类型

大多数算法要求明确退出程序的条件,一般停止标准采用的形式有有限次迭代(COUNT或MAX_ITER)或者某种误差参数(足够接近时退出,成为EPS,epsilon)。大多数情况下,会同时使用两种停止标准。

cv::TermCriteria类型有三个成员变量,type/maxCount/epsilon,它们可以直接设定,也可以通过构造器设定TermCriteria(int type, int maxCount, double epsilon)。

type:可设定为cv::TermCriteria::COUNT或TermCriteria::EPS,前者等同于cv::TermCriteria::Max_ITER;当达到最大迭代次数时,算法需结束;当使用EPS时,在误差收敛达到epsilon以下时,算法需结束。

cv::Range类型

Range类型用于指定连续的整数序列,包含两个元素start和end,通过构造器cv::Range(int start, int end)进行初始化。生成结果包括起始值,但不含终值,如cv::Range rng(0,4)包括1,2,3,但不含4。

size()函数,可以得到其元素数量,如上面实例,rng.size()=4;

empty()函数,可以判断是否为空;

all()函数,可以得到可用范围;

cv::Ptr类型和垃圾回收101

智能指针cv::Ptr,使我们可以创建某个对象的引用,从而使用这个对象,也可以对这个对象创建多个引用,并且引用数量被计数下来。如果引用离开代用范围,则智能指针引用数量减少,当所有引用都消失,则该对象会被销毁。

具体操作情况是:首先,针对某个待使用类对象创建指针模板实例,通过调用cv::Ptr<Matx33f> p(new cv::Matx33f),或者cv::Ptr<Matx33f> p=makePtr<cv::Matx33f>模板对象的构造器将一个指针指向对象,此时智能指针p就像是普通的指针一样,可以使用operator*()和operator->()的操作。

empty()函数,判断指针所指对象是否被销毁,判断指针是否为空。

addref()增加内部指针数量

release()减少内部指针数量

delete_obj()当指针数量为零时会被自动调用,默认情况下该函数被定义但不进行任何操作;

cv::Exception类型和异常处理
cv使用异常处理错误,其异常类cv::Exception类源于STL异常类std::exception,并不存在任何特殊,仅是存在于cv:命名空间。
cv::Exception成员有code/err/func/file/line,分别表示错误数值代码、表示错误的字符解释、错误所在函数名字、错误所在文件名、错误所在行数。
cv::DataType<>模板,待后期补充;
cv::InputArray和cv::OutputArray类,待后期补充;
Ⅲ、实用函数
实用函数在处理数学或其他操作时效率更高,主要涉及数学、测试、错误生成、内存和线程处理、优化等等;

cv::Ceil()

int cvCeil(float x),给定单精度浮点数x,计算不小于x的最大整数;

cv::cubeRoot()

float cv::cubeRoot(float x);计算x的立方根;

cv::fastAtan2()

float cv::fastAtan2(float y, float x);

cv::getTickCount()

int64 cv::getTickCount(void),根据系统结构,返回计时数量。每个计时数对应的时间可根据cv::getTickFrequency()得到;但是首选使用cv::getCPUTickCount()计数;

cv::getTickFrequency()

double cv::getTickFrequency(void),计算每个计时tick对应的时间,取决于系统结构;

cv::getNumThreads()

int cv::getNumThreads(void),返回OpenCV正在使用的线程数量;

cv::getThreadNum()

int cv::getThreadNum(void),正在执行的线程序号;

cvIsInf()

int cvIsInf(double x),如果x是正或负无穷大返回1,否则返回0;

cvIsNaN()

int cvIsNaN(double x),如果x非数返回1,否则返回0;

cvRound()

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

cvFloor()

int cvFloor(float x),返回不大于x的最大整数;

cv::setUseOptimized()

void cv::setUseOptimized(bool on_off);如果false,关闭优化算法;如果在安装库时没有取消,默认情况下,是开启;

cv::useOptimized()

bool cv::useOptimized(void);如果开启优化,返回true;

cv::getOptimalDFTSize()

int cv::getOptimalDFTSize(int n):该函数将数组大小作为参数返回最适合cv::dft()的大小;使用该结果创造一个更大数组,将数据复制填充进去并用0填充剩余部分;

cv::fastMalloc()

void* cv::fastMalloc(size_t size):如果缓冲大小超过16个字节,则返回的缓冲按照16个进行对齐;

cv::allignSize()

size_t cv::allignSize(size_t sz, int n=sizeof(T));

cv::allignPtr()

template<T> T* cv::allignPtr(T* ptr, int n=sizeof(T)):给定任意类型指针,计算相同类型对齐后的指针;
(T*) (((size_t)ptr+n+1)& -n)

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多