Point类

  • 在大多数程序中,Point类是通过类似于cv::Point2i和cv::Point3f这类别名来实例化的,这些别名的最后一个字母表示构造该点所需要的原语(在这里,b是一个无符号字符,s是一个短整型,i是一个32位整型,f是一个32位浮点数,d是一个64位浮点数)。
  • 表3-1是Point类原生支持的函数列表(相对较短)。注意,这里有几个非常重要的受支持的操作,但它们是间接地通过隐式转换到固定向量类而受支持(在固定向量类中介绍)。这些操作显著包含所有的向量(vector)和标量(singleton),些重载了线性代数的操作符以及比较操作符。

cv::Scalar类

  • cv::Scalar是四维点类。与其他类型类似,它实际上与一个模板类相关,但访问它的别名返回一个该模板的实例,在这个模板中,所有的成员都是双精度浮点数。在计算机视觉中,cv::Scalar类有一些与四元向量相关的特殊成员函数。表3-2列举了一些cv::Scalar支持的操作。

size类

  • size类在实际操作时与Point类相似,而且可以与Point类互相转换。这两者之间主要的区别在于Point类的数据成员是x和y,而size类中对应的成员是width和height。size类的三个别名分别是cv::Size,cv::Size2i,cv::Size2f。前面两个是等价的,表示整数大小,而最后一个是表示32位浮点大小。与Point类相似,size类可以与对应的旧类型的OpenCV类(CvSize和CvSize2D32f)互相转换。表3-3列举了size类支持的操作。

cv::Rect类

  • 矩形类包含Point类的成员x和y (矩形左上角)和size类的成员width和height(代表了矩形的大小)。然而矩形类并不是从Point类或size类继承过来的,所以它并没有从它们那里继承操作(表3-4)。
  • 表3-5显示,cv::Rect也支持一系列的覆写操作符,它们可以用于计算两个矩形、一个矩形或别的对象的各种各样的几何特性。

cv::RotatedRect类

  • cv::RotatedRect类是OpenCV中少数底层没有使用模板的C++接口类之一。同时,它是包含一个中心点cv::Point2f、一个大小cv::Size2f和一个额外的角度float的容器。其中浮点类型(float)的角度代表图形绕中心点旋转的角度。cv::RotatedRect和cv::Rect有一个非常重要的不同点是cv::RotatedRect是以中心为原点的,而cv::Rect则位于左上角为原点。表3-6列举了cv::RotatedRect类直接支持的操作。

固定矩阵类

  • 固定矩阵类是为编译时就已知维度的矩阵打造的,这也是它称为“固定”的原因。因为它们内部的所有数据都是在堆栈上分配的,所以它们的分配和清除都很快。对固定矩阵类的操作运行很快,而且它们还在小型矩阵(2×2,3×3,等等)上做过特别的优化。固定矩阵类同时也是在OpenCV的C++接口中基本类型的核心。固定向量类继承自固定矩阵类,而其他类的重要操作,要么是继承自固定向量类(类似cv::Scalar) ,要么是依赖于转换成固定向量类。通常,固定矩阵类实际上是一个模板。这个模板称为cv::Matx<>,但独立的矩阵则通常通过别名分配。这些别名的基础格式是cv::Matx{1,2,…]{1,2,…}{f,d},其中的数字可以是1到6之间的任何数,尾部的字母与之前的类型—样。
  • 一般来说,当你要表示一个用来处理矩阵代数的矩阵的时候,你就会用到固定矩阵类。而如果你的对象是一个像图像或大型点列表这样的大数组,使用固定矩阵类就不是个好主意。这种情况下你应该使用cv::Mat。固定矩阵类是你在编译的时候就知道矩阵大小的时候使用的(比如相机矩阵)。表3-7列举了cv::Matx支持的操作。

  • 注意,很多固定矩阵的函数相对类是静态的(比如,你访问它们是作为类而不是特定对象的成员)。举个例子,如果想构造一个3×3的单位矩阵,这有一个方便的类函数cv::Mat33f::eye()。注意,在这个例子中,eye()不需要任何参数,因为它是类的成员,并且已经是cv ::Matx<>模板的3×3实例。

固定向量类

  • 固定向量类是从固定矩阵类派生出来的。它们其实只是为了更方便地使用cv::Matx<>。在C++继承的意义上,可以说固定向量模板cv;:Vec是列为1的cv::Matx<>。为特定实例准备好的别称有这样的形式cv::Vec{2,3,4,6}{b,s,w,I,f,d},最后一个字母意义如前文所述(另外加上w,表示unsigned short)。表3-8展示了cv::Vec支持的操作。

复数类

  • 还有一个应该包含在基础类型中的类,它就是复数类。OpenCV的复数类与STL复数类模板complexc>不一样,但是与之兼容,可以相互转换。它们最大的区别在于成员获取。在STL类中,虚部和实部是通过成员函数real()和imag()获取的,而在OpenCV中,直接通过成员变量re和im获取。表3-9列出了复数类支持的操作。

工具函数

  • 除了本章前面所提供的专门的原始数据类型外,OpenCV库还提供了一些专用功能,可用于更有效地处理计算机视觉应用中普遍出现的数学和其他问题。在库的环境中,它们被称为工具函数。工具函数包含数学操作、测试、错误生成、内存与线程处理、优化及其他的工具。表3-10列举了这些函数并概括了它们的功能,详细描述紧随其后。

模板结构

  • OpenCV 2.1版本以及后续的版本建立在类似于STL、boost及其他类似库的模板元编程风格之上。这些库的设计十分强劲,不管是在质量上还是速度上都非常领先,并且对开发者保持了最大限度的自由。从惯例来说,OpenCV中所使用的模板结构允许算法以一种抽象的形式表达并且不需要依赖于C++的基本结构,甚至不依赖于OpenCV的基本结构。
  • 我们从cv::Point类开始。尽管这个类是作为基本类型介绍的,但是当你实例化一个cv::Point类的时候,实际上是在实例化一个更基础的类cv::Point_。显然,这个模板不仅可以以int类型初始化而且可以以支持如同int类型的基本操作的任何类型初始化。比如说,OpenCV提供了类型cv::Complex,你也可能使用过OpenCV的复数完全不一样的STL的复数类型std::complex。对于其他的自己构造的类型也是如此。同样的概念可以推广到cv::Scalar_<>以及cv::Rect_<>,cv::Matx_<>和cv: :Vec_<>。
  • 当实例化自己这些模板的时候,必须提供实例化类型以建立模板以及模板的维度。通用模板的参数如表3-11所示。

[Opencv-C++] 3. opencv数据类型的更多相关文章

  1. OpenCV学习笔记——OpenCV安装

    关于OpenCV安装 1.下载和安装OpenCV SDK 在官网:http://opencv.org/上找到OpenCV windows版下载 . 后得到一个 opencv-2.X.X.exe的文件, ...

  2. OpenCV Tricks[OpenCV 笔记3]

    官方例程 事例程序位于opencv-3.1.0/samples/cpp/ 目录下,可以通过编译整个工程,编译所有的Sample Code 显示当前使用的OpenCV版本 CV_VERSION为标识当前 ...

  3. VS2010下安装Opencv 分类: Opencv 2014-11-02 13:51 778人阅读 评论(0) 收藏

    Opencv作为一种跨平台计算机视觉库,在图像处理领域得到广泛的应用,下面介绍如何在VS2010中安装配置Opencv 一.下载Opencv 下载网址:http://sourceforge.net/p ...

  4. ubuntu 16.04源码编译OpenCV教程 | compile opencv on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/15f5c3e8/,欢迎阅读! compile opencv on ubuntu 16.04 Series Part 1: comp ...

  5. opencv滤镜-使用opencv实现各种图像滤镜特效

    图像处理-滤镜 链接:https://mangoroom.cn/opencv/image-processing-filter.html opencv滤镜-实现晕影vignetting效果 链接:htt ...

  6. OpenCV中MAT中数据类型的设置(转)

    前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...

  7. OpenCV 中的三大数据类型:CvMat 类型

    前言 本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法. 更多的矩阵处理函数还请参阅相关资料. CvMat 的类型定义 typedef struct CvMat { ...

  8. OpenCV 中的三大数据类型:IplImage 类型

    前言 本文将介绍 OpenCV 中的图像结构 IplImage 并提供一些很实用的技巧. 更多的矩阵处理函数还请参阅相关资料. IplImage 的类型定义 typedef struct _IplIm ...

  9. OpenCV 中的三大数据类型( 概述 )

    前言 OpenCV 提供了许多封装好了的类型,而其中,以三大类型最为核心.本文将大致介绍这三大类型. CvArr:不确定数组 它可以被视为一个抽象基类,后面的两大类型都继承此类型并扩展.只要某个函数的 ...

  10. 利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)

    最近在上计算机视觉这门课程用到了OpenCV,于是找到了"Using OpenCV Java with Eclipse"这篇博文,是英文的,我将它翻译如下与大家分享 正文: 从2. ...

随机推荐

  1. Eclipse's Content Assist

    在Eclipse里面的辅助智能索引只有"."才会提示,或者手动按alt+/补全提示.因为Eclipse的补全功能的默认设置只有".",其实你只需要稍微修改一下就 ...

  2. CH573 CH579 CH582程序烧录讲解

    WCH的蓝牙芯片CH57x/CH58x系类大部分是支持串口烧录.USB烧录和LINK烧录的,除了一些特殊的封装,如571K,它引脚较少,只支持串口免按键烧录. 仿真下载:ARM内核的CH579支持Jl ...

  3. TCP连接实践解析

    1.初始化. 2.FD_ISSET,是select机制的一个成员,用来检测sockfd是否有动作,对应读写异常等. 3.FD_ZERO 宏完成的工作就是一个初始化套接字集合 4.FD_SET把sock ...

  4. 安卓自动化查看包名和activity名的方法

    1,cmd下,adb shell "dumpsys window | grep mCurrentFocus" 2,CMD中输入adb logcat ActivityManager: ...

  5. 后端004-JWT工具类的编写

    登录功能采用springsecurity安全框架和jwt令牌 首先需要添加依赖信息 在yml中添加JWT的配置文件 有了上述的配置之后,我们可以准备一个JWT的工具类,方便后面和JWT相关的内容去使用 ...

  6. Github说明--如何在Github里面上传自己的代码

    1.注册一个账号 这是必须的啦!不清楚注册步骤的,可以去看看我之前的博客,里面的步骤也是挺详细的呢! 2.进入到用户主界面 我们会看到这样的一个+标识: 选择其中的New Repository选项,点 ...

  7. 使用MyBatis时需要注意到的事情------执行添加、修改和删除操作时,一定要记得提交事务

    今天在重写添加操作代码时,发现自己写的代码没有任何报错,使用断点进行查询,发现一切正常,但是注册使用的数据就是无法添加到数据库里面 然后就去之前看过的视频里面去找错误,就发现这样一个小细节: 在视频里 ...

  8. AI 影评家:用 Hugging Face 模型打造一个电影评分机器人

    本文为社区成员 Jun Chen 为 百姓 AI 和 Hugging Face 联合举办的黑客松所撰写的教程文档,欢迎你阅读今天的第二条推送了解和参加本次黑客松活动.文内含有较多链接,我们不再一一贴出 ...

  9. vue 和 react 的区别有哪些

    vue 和 react 有什么区别呢?下面从这 4 个角度来说一说! (1)从编程范式的角度讲 在 vue-loader.vue-template-compiler 的支持下,vue 可以采用 SFC ...

  10. 【单元测试】Junit 4(八)--junit4 内置Rule

    1.0 Rules ​ Rules允许非常灵活地添加或重新定义一个测试类中每个测试方法的行为.测试人员可以重复使用或扩展下面提供的Rules之一,或编写自己的Rules. 1.1 TestName ​ ...