学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型

2023-11-23 03:20

本文主要是介绍学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 总览
  • 2. 基础类型
    • 2.0 基础类型总览
    • 2.1 cv::Vec<>类
    • 2.2 cv::Matx<>类
    • 2.3 cv::Point类(cv::Point3_< >和cv::Point_< >)
    • 2.4 cv::Scalar(cv::Scalar_)类
    • 2.5 cv::Size(cv::Size_)类、cv::Rect(cv::Rect_)类和cv::RotatedRect 类
    • 2.6 基础类型支持的操作
      • 2.6.1 cv::Point
      • 2.6.2 cv::Scalar
      • 2.6.3 cv::Size类
      • 2.6.4 cv::Rect类
      • 2.6.5 cv::RotateRect类
      • 2.6.6 cv::Matx类
      • 2.6.7 cv::Vec类
      • 2.6.8 cv::Complex_
  • 3. 辅助对象
    • 3.1 cv::TermCriteria
    • 3.2 cv::Range
    • 3.3 cv::Ptr模版和垃圾回收
    • 3.4 cv::Exception类和异常处理
    • 3.5 cv::DataType<> 模板(traits)
    • 3.6 cv::InputArray和cv::OutputArray以及cv::_InputOutputArray类
      • 3.6.1 cv::InputArray(cv::InputArrayOfArrays)
      • 3.6.2 cv::OutputArray(cv::OutputArrayOfArrays)
  • 4. 工具函数(系统函数)
  • 5. 总结
  • X. 其他
    • X.1 OpenCV_cheatsheet中的关键数据类型
    • X.2 C++开发桌面程序和js开发
    • X.3 开源库的组织(如何更好的看文档)

1. 总览

关于OpenCV的数据结构,官方文档位于:Core functionality

主要就是下面这几项内容:
在这里插入图片描述

注意,下文中提到的C语言中的结构:例如:CvPoint和CvPoint2D32f
位于C structures and operations,4.x之后的文档就没有这些内容了
虽然文档没有了,但是源文件里依然有opencv-4.8.0/modules/core/include/opencv2/core/types_c.h相应的头文件

根据Learning OpenCV3,可知:
在这里插入图片描述

2. 基础类型

2.0 基础类型总览

在这里插入图片描述

参考:

  • https://docs.opencv.org/4.x/dc/d84/group__core__basic.html
  • https://docs.opencv.org/4.x/d2/d75/namespacecv.html中 搜索即可,这个网页中黑色无链接的类/结构是:“black box”与磁盘相关的文件存储。

2.1 cv::Vec<>类

cv::Vec<>——固定向量类(所存储的元素长度固定),用于维度固定的小型向量

cv::Vec< _Tp, cn > Class Template Reference

  • 尖括号是模板类的意思,
  • 相对于普通的STL的向量类,固定向量类在编译时就已知向量的维度,这样代码处理起来就会更高效。

虽然cv::Vec<>本身已经是模版形式了,但是实际上并不会直接使用这个形式。而是使用typedef定义的别名来使用一些更为通用/专门的实例。

  • 例如:cv::Vec2i就表示有两个元素的整型向量
  • 任何有着cv::Vec{2,3,4,6}{b,w,s,i,f,d}形式的声明,表示6种数据类型中某个具有2~6个元素数量的向量类型。
    • b: unsigned char
    • w: unsigned shor
    • s: short
    • i: int
    • f: float
    • d:double
  • 注意,cv::Vec最长的元素不止是6个,在cv::Vec< _Tp, cn > Class Template Reference中,可以看到cv::Vec<>的构造函数最长可以有14个元素。同时,还可以接受矩阵的某行作为参数。
  • 在Shorter aliases for the most popular specializations of Vec<T,n>中,有:在这里插入图片描述

另外,需要注意的一点是,在cv::Vec< _Tp, cn > Class Template Reference中,有:
在这里插入图片描述
即 cv::Vec< >模版类继承自cv::Matx< >模板类。

代码中可以看到:
在这里插入图片描述

2.2 cv::Matx<>类

除了cv::Vec<>固定向量类,还有cv::Matx<>固定矩阵类,
与cv::Vec<>类似,cv::Matx<>也是用于特定的一些小型矩阵中。
(cv::Mat类是用于任意维度的矩阵,一般用在大矩阵,比如存储图像等)

在计算机视觉中,有很多2X2,3X3以及少量的4X4矩阵(例如:3*3的卷积核,3*3或者2*2的变换矩阵等),cv::Matx<>用于设计容纳这些对象。

与cv::Vec<>类似,cv::Matx<>通常也是用别名的形式进行使用,其形式为:
cv::Matx{1,2,3,4,5,6}{1,2,3,4,5,6}{f,d},只有浮点数类型和双浮点数类型。

  • f: float
  • d:double

在OpenCV——Basic structures——Typedefs中,可以看到:
在这里插入图片描述

固定矩阵类的维度在编译前已知,因此其运算效率高,消除很多动态内存分配操作。

2.3 cv::Point类(cv::Point3_< >和cv::Point_< >)

typedef Point2i Point;
默认使用cv::Point时其实调用的是cv::Point2i
cv::Point2itypedef cv::Point_<int>

cv::Point_类和cv::Point3_类

  • 与cv::Vec<>固定向量类很像。
  • cv::PointX类是用来存储2~3个原语类型的容器,用来表示2d或者3d的点
  • 不是从cv::Vec<>类继承的,是由自己的模板派生的,但也可以由固定向量类转变得到
  • cv::Point和cv::Vec<>最大的区别是:
    • 成员通过变量名称访问,如point.x,point.y,而不是通过下标访问,如vec[0],vec[1]等

OpenCV中的Point类包括cv::Point3_和cv::Point_

  • cv::Point3_< >:3D点坐标x,y,z的模板,这个结构可以与C语言中的结构CvPoint2D32f互换。
  • cv::Point_< >:2D点坐标x,y的模板,可以与C语言中的结构:CvPoint和CvPoint2D32f

与cv::Vec<>类似,cv::PointX通常也通过别名调用,

  • cv::Point{2,3}{i,d,f,I}
    • i: int
    • f: float
    • d:double
    • I: int64
  • 在OpenCV——Basic structures——Typedefs中,可以看到:
    在这里插入图片描述
    实际上是分别来自两个3d和2d的模板类构成的cv::PointXX。

2.4 cv::Scalar(cv::Scalar_)类

在OpenCV——Basic structures——Typedefs中,有:
在这里插入图片描述

在cv::Scalar_< _Tp > Class Template Reference中,可以看到:
在这里插入图片描述

cv::Scalar_继承自cv::Vec<_Tp,4>,即本质上是一个4维的固定向量。

代码中可以也看到:
在这里插入图片描述

cv::scalar类直接继承自cv::Vec4d(cv::Vec<double,4>)

2.5 cv::Size(cv::Size_)类、cv::Rect(cv::Rect_)类和cv::RotatedRect 类

typedef cv::Point2i cv::Point
typedef cv::Size2i  cv::Size
typedef cv::Rect2i  cv::Rect

cv::Size类和cv::Rect类与cv::Point类类似,但是也并不继承自cv::Point类,而是继承自己的模板类

  • 主要区别在于cv::Size有width和height这两个属性,而不是cv::Point_类的x和y
  • cv::Rect则是包含width、height、x和y这四个属性。

cv::Size_类和cv::Rect_一般也是通过别名使用,比如:

  • 在OpenCV——Basic structures——Typedefs中,可以看到:
    在这里插入图片描述
  • 最常见的就是直接使用整数型的cv::Sizecv::Rect

cv::RotatedRect类表示非轴对称的矩形,即矩形的四条边不与所在坐标轴平行,表示旋转的矩形。其包括:

RotatedRect (const Point2f &center, const Size2f &size, float angle)
1. Point2f类型的中心点
2. Size2f类型的高宽
3. float的角度

2.6 基础类型支持的操作

2.6.1 cv::Point

在这里插入图片描述
Cast to the fixed vector classes,映射成固定向量类,类似强制类型转换。

根据cv::Point3_< >和 cv::Point_< >的Public Member Functions可知:
cv::Point_< >类的对象有inside方法,cv::Point_< >类的对象是没有该方法的

2.6.2 cv::Scalar

在这里插入图片描述

  • Quaternion四元数,
  • conjugation共轭,连接
  • iff 当且仅当,if and only if
  • cv::Scalar可以和旧的C语言的接口类CvScalar自由转换

根据cv::Scalar_< _Tp > Class Template Reference可知,

  • scalar类除了有自己的一些方法,还有继承自cv::Vec以及更上层的cv::Matx的方法。
  • 例如:
    #include <iostream>
    #include <opencv2/opencv.hpp>
    int main(int argc, char 

这篇关于学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414972

相关文章

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee