OpenCV学习笔记——新版本的数据结构core

来源:互联网 发布:饱和攻击 知乎 编辑:程序博客网 时间:2024/05/21 11:07

2.0新版本对数据结构进行了大幅修改:

定义了DataType

定义了Point_模板类,取代了之前版本的CvPoint、CvPoint2D32f

Point_类不用多言,里面两个成员变量x,y。Point_<int>就是Point2i,也是Point,Point_<float>就是Point2f,Point_<double>就是Point2d

Point3_类不太常用,跟Point_类差不太多,成员变量x,y,z

定义了Point3_模板类,取代了之前版本的CvPoint2D32f

定义了Size_模板类,取代了之前版本的CvSize和CvSize2D32f

Size_类成员变量width、height。Size_<int>就是Size2i,也是Size,Size_<float>就是Size2f大家就要不臆断出来个Size2d啥的让编译器发懵了

定义了Rect_模板类,取代了之前版本的CvRect

Rect_类有些意思,成员变量x、y、width、height,分别为左上角点的坐标和矩形的宽和高。常用的成员函数有Size()返回值为一个Size,area()返回矩形的面积,contains(Point)用来判断点是否在矩形内,inside(Rect)函数判断矩形是否在该矩形内,tl()返回左上角点坐标,br()返回右下角点坐标。值得注意的是,如果想求两个矩形的交集,并集,可以用如下格式

Rect rect = rect1 & rect2;  Rect rect = rect1 | rect2;  
如果想让矩形平移操作,缩放操作,甚至可以这样写

Rect rectShift = rect + point;  Rect rectScale = rect + size;  

RotatedRect模板类,

TermCriteria模板类,取代了之前的CvTermCriteria,这个类是作为迭代算法的终止条件的,这个类在参考手册里介绍的很简单,我查了些资料,这里介绍一下。该类变量需要3个参数,一个是类型,第二个参数为迭代的最大次数,最后一个是特定的阈值。类型有CV_TERMCRIT_ITER、CV_TERMCRIT_EPS、CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,分别代表着迭代终止条件为达到最大迭代次数终止,迭代到阈值终止,或者两者都作为迭代终止条件。以上的宏对应的c++的版本分别为TermCriteria::COUNT、TermCriteria::EPS,这里的COUNT也可以写成MAX_ITER

Matx模板类。Matx模板类是对Mat类的一个拓展,Matx其实是个轻量级的Mat,必须在使用前规定好大小,比如一个2*3的float型的可以声明为Matx23f。从Matx类有派生出Vec类,Vec是Matx的一个派生类,就是一个1维的Matx,跟vector很相似。比如想声明一个10个数据的float数组,可以写成Vec2f。又Vec类又派生出Scalar_类,取代了CvScalar,这个类其实就是一个Vec4x的一个变种,大家常用的Scalar其实就是Scalar_<double>。这样一说,大家是不是就很容易理解了,为啥很多函数的参数输入可以是Mat,也可以是Scalar了。其实OpenCV定义的InputMat,outputMat参数格式,以上的这几种数据结构都可以作为参数的

定义了Range类指定了一个序列的一个连续的子序列,大家可能用的不多,对它不熟悉,其实它就是为了使OpenCV的使用更像Matlab而产生的。比如Range::all()其实就是Matlab里的符号:或者...。而Range(a, b)其实就是Matlab中的a:b。有趣吧,注意a,b都需要是int型的哦,亲。

定义了Ptr类用来对老版本的数据结构进行指针操作,更安全有效,可以防止内存的不正常使用。

最最重要的定义了Mat类来表示矩阵,取代了之前的CvMat和lplImage。介绍该类几个比较重要的成员变量flag(就是我之前说过的header里的结构信息,深度信息,通道数),dims是Mat的维数,要求大于等于2,rows和cols参数代表2维矩阵的行数列数(对于更高维的矩阵,这两个参数都是-1),还有个比较常用的参数应该uchar* data,是Mat的数据指针(比较暴力的同学可以直接调用它好了,不推荐),还有个参数refconst,我理解应该就是我上一讲提到的释放内存的时候要判断这个矩阵是否是最后一个被使用的,这个参数应该就是控制跟当前矩阵结构相关的个数的。Mat结构支持的操作有:

构造析构函数Mat和~Mat

对=、MatExpr、( )、CvMat、IplImage进行了运算符重载

row、col函数

rowRange、colRange

类似matlab的运算操作diag、t、inv、mul、cross、dot、zeros、one、eye

复制转换变形clone、copyTo、convertTo、assignTo、setTo、reshape、create、addref

其中copyTo函数有个妙用,不但可以复制Mat,还可以通过mask提取出感兴趣的部分

数据的操作release、resize、reserve、push_back、pop_back、locateROI、adjustROI

Mat的信息total、isContinuous、elemSize、elemSize1、type、depth、channes、step1、size、empty

其中step1函数返回Mat结构每一行的字节数=列数*通道数,更方便用指针定位特定元素

定位ptr、at、begin、end

还做了几个扩展类Mat_、NAryMatlterator、SparseMat、SparseMat_取代了之前的CvSparseMat。这些类的操作运算与Mat大同小异,类声明参考core的具体头文件

当然,新版本对老版本的数据结构和函数依然支持。

新版本还在这些结构里支持dft、dct变换,我这里讲一下我的新发现PCA类、SVD类

PCA类有构造函数PCA,运算符重载(),project,backProject。SVD类有构造函数SVD,运算符重载(),compute,solveZ,backSubst

这里介绍几个实用函数:

inRange函数可以检查Matsrc的内容是否在Matlower、Matupper之间,输出结果是一个uchar型矩阵,1表示在两者之间,否则为0,值得注意的是,Matlower,Matupper也可以用Scalar的格式

bitwise_xxx函数对两个矩阵进行位运算,结果保存在第三个矩阵当中

mixChannels函数可以实现矩阵的指定通道复制到新矩阵的指定通道

总之,新版本支持更多的数学运算,还支持一些画图操作


0 0
原创粉丝点击