学习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

主要就是下面这几项内容:
学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第1张图片

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

根据Learning OpenCV3,可知:
学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第2张图片

2. 基础类型

2.0 基础类型总览

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

参考:

  • 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中,有:学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第4张图片

另外,需要注意的一点是,在cv::Vec< _Tp, cn > Class Template Reference中,有:
学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第5张图片
即 cv::Vec< >模版类继承自cv::Matx< >模板类。

代码中可以看到:
学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第6张图片

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中,可以看到:
学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第7张图片

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

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

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

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中,可以看到:
    学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第8张图片
    实际上是分别来自两个3d和2d的模板类构成的cv::PointXX。

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

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

在cv::Scalar_< _Tp > Class Template Reference中,可以看到:
学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第9张图片

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

代码中可以也看到:
学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第10张图片

cv::scalar类直接继承自cv::Vec4d(cv::Vec)

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中,可以看到:
    学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第11张图片
  • 最常见的就是直接使用整数型的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

学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第12张图片
Cast to the fixed vector classes,映射成固定向量类,类似强制类型转换。

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

2.6.2 cv::Scalar

学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型_第13张图片

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

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

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

你可能感兴趣的:(opencv,#,学习Opencv,学习,opencv,c++)