zoukankan      html  css  js  c++  java
  • OpenCV的数据类型

      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),TYPE是,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>完全相同)
  • 相关阅读:
    CSS3 target伪类简介
    不用position,让div垂直居中
    css3 在线编辑工具 连兼容都写好了
    a标签伪类的顺序
    oncopy和onpaste
    【leetcode】1523. Count Odd Numbers in an Interval Range
    【leetcode】1518. Water Bottles
    【leetcode】1514. Path with Maximum Probability
    【leetcode】1513. Number of Substrings With Only 1s
    【leetcode】1512. Number of Good Pairs
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/12970407.html
Copyright © 2011-2022 走看看