learning opencv3第三章

基本的数据类型

1.基本数据类型是cv::Vec<>(里面的元素数量最多不能超过9),为什么不直接使用stl::Vec<>呢,这是因为cv::Vec<>是专门用于维度已知的小vector的。这个cv::Vec<>有许多别名,例如cv::Vec2i(2元素的整数向量),cv::Vec3i,cv::Vec4d,通式是这样的:

                                                                               cv::Vec{2,3,4,6}{b,w,s,i,f,d}

其中,b = unsigned,char, w = unsigned short, s = short, i = int, f = float, d = double.

2.同样的还有cv::Matx,如下式,使用这种能确定数量的mat和vec可以更加效率,消除了动态内存分配。

                                                                                 cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d}
3.还有一种类cv::point 与cv::Vec不同的是,cv::point的存取是用变量的名字来存储的,而不是vec中的索引,例如:(mypoint.x, mypoint.y, etc.) rather than by a vector index (myvec[0],myvec[1], etc.),同样的也有不同类型:

cv::Point2i, cv::Point2f, and cv::Point2d, or cv::Point3i, cv::Point3f, and cv::Point3d.

还有一种cv::Scalar,是一个4变量的,double-precision的vector,与cv::Vec<double,4>等价。

4.cv::Size(它的别名是cv::Size2i)里面的成员是width,height,并且都是整数,而不像cv::point一样里面是x,y。而cv::Rect(里面都是整数,和前面的cv::Size一样)同时包含4个,也就是width,height,x,y.还有一种数据结构叫cv::RotatedRect.里面有一个center(cv::Point2f),一个size(cv::Size2f),和一个angle(float).

以上这些类保存在/opencv2/core/core.hpp里面。

The point classes

point类是最简单的一个类,这个类只有两个模板,一种为two-dimensional另一种是three-dimensional的,并且在必要的时候可以转换为其他的类型,例如fixed vector classes以及the fixed matrix classes。cv::point中的操作如下:这些操作是隐式的把ponit转换为fixed vector得到的。

 The cv::Scalar class

cv::Scalar is really a four-dimensional point class。里面都是double-precision floating-point numbers。它的操作都是继承the fixed vector classes的,也就是the fixed vector classes有的它都有,所以里面不像上一个表那样,有一个强制转换操作。

 The size classes

里面有三种类型:cv::Size,cv::Size2i,cv::Size2f,其中cv::Size=cv::Size2i.并且cv::Size不能转换为fixed vector,所以非常有局限性。但是fixed vector和point类可以转换为size类。

 

The cv::Rect class

这个类包含x,y(矩形的左上角坐标)以及width,heigh(矩形的长宽),cv::Rect 是rectangle模板
 

The cv::RotatedRect class

 The fixed matrix classes

这个类就是在编译阶段, dimensions已知的matrix,所以叫fixed.调用的时候这么调用:cv::Matx{1,2,...}{1,2,...}{f,d},最大支持数字6.假如是图片这种比较大的矩阵,要用cv::Mat。这种fixed matrix适合用来作矩阵代数。

还有很多操作(参考书),因为这个类是最基本的。 

例如要创建3x3的identity matrix,只要这样cv::Mat33f::eye(),不用在eye()里面规定参数,因为前面已经定义了是3x3的了。

The fixed vector classes

这是一种特殊的cv::Matx<>,可以说cv::Vec<>是一种只有一列的cv::Matx.使用模板可以如下:

                                                                           cv::Vec{2,3,4,6}{b,s,w,i,f,d}
 

 所有的fixed matrix class 的方法都适用与vector,因为vector只是matrix的特例,上面只是列举了额外的方法。

The complex number classes

这个类和stl的类差不多,唯一区别就是 member access.在STL中,使用real(),imag()分别取出实数,虚数部分,而这个类是用如下操作:


The cv::TermCriteria class

终止条件:一般使得一个程序终于需要有两个条件

  1. 达到最大迭代次数
  2. 误差小于某个值(epsilon)

现在直接有一个类,用于传进opencv算法中来终于算法,cv::TermCriteria

TermCriteria( int type, int maxCount, double epsilon ),其中的参数

  1. int type: cv::TermCriteria::COUNT 或者 TermCriteria::EPS,或者使用   |  符号,把两个都填上去,
     


The cv::Range class

这个类用于创建一个连续的整数序列,可以这么构造cv::Range( int start, int end ),例如cv::Range rng(0,4 )会包括0,1,2,3,但是没有4.这时候 对rng使用rng.size(),值应该是4.

The cv::Ptr template and Garbage Collection 101

这个cv::Ptr就是创建一个指针,方便在函数中引用,因为指针的效率高(不需要传值)。可以如下这么做:

cv::Ptr<Matx33f> p( new cv::Matx33f ), 又或者    cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>()

然后就可以像指针那样使用了,例如:operator*() and operator->()。

假如现在已经有一个指针p,然后又创建了Ptr<Mat33f> q,使用q=p,那么p和q都指向同一个矩阵,p和q都知道他们指向同一个矩阵,然后一旦p消失了,那么q知道它是唯一的一个指向这个矩阵的指针,假如q也消失了,那么会释放(deallocate)原始矩阵。

猜你喜欢

转载自blog.csdn.net/Gussss/article/details/89356452