• 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>完全相同)
  • 相关阅读:
    减小war包体积
    监视oracle执行的SQL语句(正在执行,已执行,执行性能查看)
    SqlServer性能检测和优化工具使用详细
    redis 超时失效key 的监听触发
    ActiveMQ实现延迟消息队列
    TDDL:来自淘宝的分布式数据层
    灰度发布
    Jenkins 定时构建和Poll SCM的区别
    SpringBoot 配置文件application.properties配置参数替换或者注入的几种方式
    HTML5基础 label 为input标签添加标记
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/12970407.html
Copyright © 2020-2023  润新知