文章目录
- 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::Point2i
是typedef 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::Size
和cv::Rect
cv::RotatedRect类表示非轴对称的矩形,即矩形的四条边不与所在坐标轴平行,表示旋转的矩形。其包括:
RotatedRect (const Point2f ¢er, 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