OpenCV的数据类型

Posted on 2020-05-27 09:14  金色的省略号  阅读(774)  评论(0编辑  收藏  举报

  OpenCV的数据类型

  OpenCV设计了有许多数据类型,这使得重要的计算机视觉概念的表述和处理相对容易和直观

  三个主要分类,the basic data types是由原子类型组合而成的基本数据类型helper objects,这些类是较为抽象的类,比如垃圾回收指针类等;large array types,这些对象的基本目的,是包含数组或其他原子类型组合或常用的基本的数据类型,典型的例子,比如cv::Mat类;

  除此之外,OpenCV还充分利用标准模板库,STL,还特别依赖向量类vector;

  一、基本数据类型

  最简单的基本数据类型,是固定向量类,cv::Vec<>,是模板类,原子容器类,适用于小型向量(不超过9个元素),其维度在编译之前是明确的;固定矩阵类,cv::Matx<>,是模板类,适用于小型矩阵的运算,类似于固定向量类而与cv::Mat类不同;与固定向量类密切相关的的是,cv::Point类,并不是直接继承于固定向量类,它继承自自身的模板,但是可以与固定向量类相互转换cv::Scalar,继承于固定向量类的实例,是一个四维的点,生成四维向量而与固定向量类相关联;cv::Size类和cv::Rect类,与cv::Point类一样,也是派生于它们自己的模板;具体细节请查阅,.../opencv2/core/core.hpp 

  The point classes,点类

   OpenCV基本数据类型中,最简单的类,基于模板结构实现,一个二维点的模板,一个三维点的模板;点类可以强制转换成其他的类;点类的别名cv::Point2i或cv::Point3f,其后面的数字代表构造点的原子数据类型的个数;

  点类的基本操作 

//1.默认构造
cv::Point2i p;
cv::Point3f p;
//2.copy构造
cv::Point3f p2(p1);
//3.有参构造
cv::Point2i p(x0,x1);
cv::Point3d p(x0,x1,x2);
//4.强制类型转换
(cv::Vec3f) p;
//5.访问数据成员
p.x; p.y; //3维点类: p.z;
//6.点积
float x = p1.dot(p2);
//7.双精度点积
double x = p1.ddot(p2);
//8.向量积
p1.cross(p2); //3维点类only
//9.查询点p是否在矩形r之内
p.inside(r); 

  The cv::Scalar class,标量类

  Scalar类,本质上是4维Point类,实际上与模板类相关联,访问其别名会返回一个模板对象,对象内的所有成员都是双精度的浮点Point成员;Scalar类直接继承于实例化的cv::Vec<>模板类,具有向量类的操作及其属性;

  Scalar类的基本操作

//默认构造
cv::Scalar s;
//copy构造
cv::Scalar s2(s1);
//有参构造
cv::Scalar s(x0);
cv::Scalar s(x0,x1,x2,x3);
//按元素相乘
s1.mul(s2);
//四元结合
s.conj();//返回cv::Scalar(s0,-s1,-s2,-s3);
//四元判断
s.isReal();//如果s1==s2==s3==0 返回true

  The size classes,size类

  Size类,实际上与其相对性的Point类相似,并且可以相互转换;其主要的不同点是Point类的数据成员以x,y命名,Size类的数据成员以width,height命名;
  Size类的3个别名cv::Size,cv::Size2i, 和cv::Size2f,前2个别名是等价的;

  Size类的基本操作

//有参构造
cv::Size2f sz(w,h);
//访问成员
sz.width; sz.height;
//计算面积
sz.area();

  The cv::Rect class,矩形类

   Rect类,包含Point类的成员x,y 及 Size类的成员width和height,但并不是继承于Point,Size类;它实际上是矩形模板类的具有整形成员变量的实例的别名;

  Rect类的基本操作

//默认构造
cv::Rect r;
//copy构造
cv::Rect r2(r1);
//有参构造
cv::Rect(x,y,w,h);
//起点及大小构造
cv::Rect(p,sz);
//访问数据成员
r.x; r.y; r.width; r.height;
//计算面积
r.area();
//提取左上角
r.tl(); //upper-left
//提取右下角
r.br(); //bottom-right
//判断点p是否在矩形r内
r.contains(p);

  运算符重载

//矩形r1和r2的交集
cv::Rect r3 = r1 & r2;
r1 &= r2;
//包含矩形r1和r2的最小矩形区域
cv::Rect r3 = r1 | r2;
r2 |= r2;
//矩阵平移
cv::Rect rx = r + x;
r += x;
//放大矩阵size s
cv::Rect rs = r + s;
r += s;
//比较二个矩阵是否完全相等
bool eq = (r1 == r2);
//比较二个矩阵是否不相等
bool ne = (r1 != r2);  

  The cv::RotatedRect class  

  cv::RotatedRect类,是为数不多的非模板的C++ OpenCV 底层接口类,它是一个容器,包含一个cv::Point2f中心,一个cv::Size3f宽高,一个围绕中心旋转的单精度浮点角度;cv::RotatedRect类与cv::Rect类最大的区别是,cv::RotatedRect类,位于相对于中心的区域,cv::Rect类,位于相对于其左上角的区域;

  cv::RotatedRect类的基本操作

//默认构造
cv::RotatedRect rr();
//copy构造
cv::RotatedRect rr2(rr1);
//从2个角构造
cv::RotatedRect(p1,p2);
//有参构造
cv::RotatedRect rr(p,sz,theta);
//访问成员
rr.center; rr.size; rr.angle;
//返回角列表
rr.points(pts[4]);

  The fixed matrix classes  

  The fixed matrix 类,固定矩阵类,实际上是一个模板类,因其规模在编译之前是确定了的,所以是固定的,其数据内存分配是在栈区,分配和回收内存很快;为小型矩阵特别优化的实现,在其之上的操作也很快;OpenCV C++接口中,该类是其他基础类型的核心;固定向量类继承于该类,其他类继承于固定向量类;若是大数据阵列,比如图像,请使用 cv::Mat 类;

  fixed matrix类的基本操作

//默认构造
cv::Matx33f m33f; cv::Matx43d m43d;
//copy构造
cv::Matx21f m(x0,x1); 
cv::Matx44d m(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15);
//相同元素的矩阵
m33f = cv::Matx33f::all(x);
//zeros矩阵
m23d = cv::Matx23d::zeros();
//ones矩阵
m16f = cv::Matx16f::ones();
//创建一个单元矩阵
m33f = cv::Matx33f::eye();

  注意,很多固定矩阵类的函数相对于类是静态的,比如你想构建一个3×3的完全相同的矩阵,可以使用类函数,cv::Mat33f::eye()

  二、Helper Objects 

  The cv::TermCriteria class

  很多算法需要一个终止条件以确定何时退出,终止条件的形式,COUNT或MAX_ITER,EPS(epsilon),TYPES,COUNT, EPS 或 COUNT + EPS

TermCriteria( int type, int maxCount, double epsilon ); //构造函数
enum Type {
    COUNT =1,
    MAX_ITER =COUNT,
    EPS =2
}

  The cv::Range class

  用于确定一个连续的整数序列,对象有两个元素start和end,在构造函数中设定,范围包含初始值start,但不包含终止值end,cv::Range rng( 0,4);包含值0,1,2,3,rng.size();等于4

cv::Range( int start, int end );

  The cv::Ptr 模板和垃圾回收

  智能指针,是c++中一个非常有用的类型,这个指针允许我们创建一个对象的引用,然后把它传递到各处;你可以创建更多的该对象的引用,然后所有这些引用都会被计数,当引用超出范围智能指针的引用计数就会减少一旦所有的引用消失,这个对象将自动清理释放
  这个模板类的构造函数就拥有指向对应对象的指针,可以类似cv::Ptr<Matx33f> p( new cv::Matx33f );或 cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>();调用;

  The cv::Exception class 和异常处理

  它继承自STL的异常类std::exception,这个异常类除了在cv::命名空间内,以使其有别于其他从std::exception中继承而来的对象以外没有任何特别的;

  The cv::DataType<>模板

  当OpenCV库函数需要传递特定数据类型的概念时,它们会创建一个cv::DataType<>类型的对象;

  The cv::InputArray 类和 cv::OutputArray 类

  许多OpenCV的函数都把数组作为变量并把数组作为返回值,但在OpenCV中有各种各样的数组,为了防止接口变得复杂,OpenCV定义了
The cv::InputArray和cv::OutputArray类,它们的主要区别在于前者假设为常量,后者是可变量;当不需要对应的输出时,可以传递cv::noArray();

  Utility Functions 

  工具函数包含数学操作、测试、错误生成、内存与线程处理、优化及其他的工具

  The Template Structures

  OpenCV建立在类似STL、boost及其他类似库的模板元编程风格上,通用的固定长度模板:

cv::Point_<Type T>              //包含二个T类型对象的点
cv::Rect_<Type T>               //位置、宽度和高度,均为类型T
cv::Vec<Type T, int H>          //一个T类型H个对象的集合
cv::Matx<Type T, int H, int W>  //一个T类型H*W个对象的集合
cv::Scalar_<Type T>   //一个包含四个T类型的对象的集合(与cv::Vec<T, 4>完全相同)