Opencv数据结构整体分为三大类 Ⅰ、基本数据类型 cv::Point类型 点类型也具有其化名形式,如: cv::Point2i表示二维点,整型 cv::Point2f表示二维点,单精度 cv::Point2d表示二维点,双精度 cv::Point3i表示三维点,整型 cv::Point3f表示三维点,单精度 cv::Point3d表示三维点,整型 cv::Scalar类型 实际上类似于相对应的点类型,并可以强制互相转化。主要区别在于,点类型数据成员通过x和y访问,而size类型则通过width和height访问。size类型的三个化名是:cv::Size,cv::Size2i,cv::Size2f;前两个是等价的。 size类型无法强制转化为固定向量类型,但是点类型和固定向量类型可以强制转化为size类型; 矩形类,Rect类包括四个成员,分别是Point类型(x,y)(代表左上角)、Size类型宽width和高height,但是矩形类并未继承Point类或Size类。 该类型非模板类,它是一个容器,包含一个Point2f为中心、一个Size2f为大小,一个单精度数为角度,表示矩形绕中心旋转的角度。它与Rect类型最大的区别在于分别相对于中心和左上角为参考。 固定矩阵类 固定向量类型源于固定矩阵类型; 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)倾向于小向量,维度已知,使编译效率提高; Helper对象在控制各种算法或者在对容器进行各种操作十分重要。此外,还有一种重要对象,智能指针cv::Ptr,使我们免于担心对象内存的分配与销毁。 大多数算法要求明确退出程序的条件,一般停止标准采用的形式有有限次迭代(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以下时,算法需结束。 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,使我们可以创建某个对象的引用,从而使用这个对象,也可以对这个对象创建多个引用,并且引用数量被计数下来。如果引用离开代用范围,则智能指针引用数量减少,当所有引用都消失,则该对象会被销毁。 具体操作情况是:首先,针对某个待使用类对象创建指针模板实例,通过调用cv::Ptr<Matx33f> p(new cv::Matx33f),或者cv::Ptr<Matx33f> p=makePtr<cv::Matx33f>。模板对象的构造器将一个指针指向对象,此时智能指针p就像是普通的指针一样,可以使用operator*()和operator->()的操作。 empty()函数,判断指针所指对象是否被销毁,判断指针是否为空。 addref()增加内部指针数量 release()减少内部指针数量 delete_obj()当指针数量为零时会被自动调用,默认情况下该函数被定义但不进行任何操作; cv::Ceil() cv::cubeRoot() cv::fastAtan2() cv::getTickCount() int64 cv::getTickCount(void),根据系统结构,返回计时数量。每个计时数对应的时间可根据cv::getTickFrequency()得到;但是首选使用cv::getCPUTickCount()计数; cv::getTickFrequency() double cv::getTickFrequency(void),计算每个计时tick对应的时间,取决于系统结构; cv::getNumThreads() cv::getThreadNum() cvIsInf() int cvIsInf(double x),如果x是正或负无穷大返回1,否则返回0; cvIsNaN() cvRound() cvFloor() cv::setUseOptimized() cv::useOptimized() cv::getOptimalDFTSize() cv::fastMalloc() cv::allignSize() cv::allignPtr() |
|