[Opencv-C++] 3. opencv数据类型
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数据类型的更多相关文章
- OpenCV学习笔记——OpenCV安装
关于OpenCV安装 1.下载和安装OpenCV SDK 在官网:http://opencv.org/上找到OpenCV windows版下载 . 后得到一个 opencv-2.X.X.exe的文件, ...
- OpenCV Tricks[OpenCV 笔记3]
官方例程 事例程序位于opencv-3.1.0/samples/cpp/ 目录下,可以通过编译整个工程,编译所有的Sample Code 显示当前使用的OpenCV版本 CV_VERSION为标识当前 ...
- VS2010下安装Opencv 分类: Opencv 2014-11-02 13:51 778人阅读 评论(0) 收藏
Opencv作为一种跨平台计算机视觉库,在图像处理领域得到广泛的应用,下面介绍如何在VS2010中安装配置Opencv 一.下载Opencv 下载网址:http://sourceforge.net/p ...
- 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 ...
- opencv滤镜-使用opencv实现各种图像滤镜特效
图像处理-滤镜 链接:https://mangoroom.cn/opencv/image-processing-filter.html opencv滤镜-实现晕影vignetting效果 链接:htt ...
- OpenCV中MAT中数据类型的设置(转)
前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量. ...
- OpenCV 中的三大数据类型:CvMat 类型
前言 本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法. 更多的矩阵处理函数还请参阅相关资料. CvMat 的类型定义 typedef struct CvMat { ...
- OpenCV 中的三大数据类型:IplImage 类型
前言 本文将介绍 OpenCV 中的图像结构 IplImage 并提供一些很实用的技巧. 更多的矩阵处理函数还请参阅相关资料. IplImage 的类型定义 typedef struct _IplIm ...
- OpenCV 中的三大数据类型( 概述 )
前言 OpenCV 提供了许多封装好了的类型,而其中,以三大类型最为核心.本文将大致介绍这三大类型. CvArr:不确定数组 它可以被视为一个抽象基类,后面的两大类型都继承此类型并扩展.只要某个函数的 ...
- 利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
最近在上计算机视觉这门课程用到了OpenCV,于是找到了"Using OpenCV Java with Eclipse"这篇博文,是英文的,我将它翻译如下与大家分享 正文: 从2. ...
随机推荐
- This will upgrade your R installation.
sudo add-apt-repository ppa:marutter/rrutter sudo apt update sudo apt full-upgrade
- 持续集成环境(5)-Maven安装和配置
在Jenkins集成服务器上,我们需要安装Maven来编译和打包项目. 安装Maven 1.下载Maven软件到jenkins服务器上 wget https://mirrors.aliyun.com/ ...
- yapi的一些基本操作
一.yapi能干什么 强大的接口管理平台 提供mock功能 提供测试功能 项目管理功能 插件齐全 二.yapi的权限 项目权限 操作 游客 项目开发者 项目组长 超级管理员 浏览公开项目与接口 √ √ ...
- beast加密
Beast: https://github.com/liexusong/php-beast?tdsourcetag=s_pctim_aiomsgbeast-安裝到/root------------- ...
- MySQL count(*) 和 count(字段) 区别
count(字段)不会取Null的 select count(*) from test01 7条 select count(0) from test01 ...
- mysql 中 insert 大量数据 避免时间戳相同 !!
时间函数 now() current_timestamp() 和 sysdate() CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms fo ...
- java 程序运行机制
java 程序运行同时拥有 编译型语言和解释型语言的特点 程序运行流程: 源程序 .java文件 --> Java 编译器--> 字节码 .class 文件 --> 类装饰器 --& ...
- SimpleITK和nibable读取nii文件
import SimpleITK as sitk path = 'nii全路径' nii_obj = sitk.GetArrayFromImage(sitk.ReadImage(path)) #sha ...
- R 字符串操作超全总结
paste函数和paste0()函数 连接字符 > paste("a", 1:3) #默认空格符连接,即sep=" " [1] "a 1&quo ...
- 整合Swagger2
整合Swagger2 1.Swagger介绍 前后端分离开发模式中,api文档是最好的沟通方式. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web ...