背景
众所周知,Mat是OpenCV最核心的核心数据结构,没有这个灵活高效的Mat,OpenCV也就没有了灵魂。
作为一个初学者,只需要会简单用一下Mat当然就够了,但是作为一个有理想的程序猿,我们还是要挖掘挖掘,看看Mat里面还藏着什么宝藏。
mat.hpp
我们将目光投向OpenCV/modules/core/include/opencv2/core/mat.hpp
,这个3600多行(v3.4.1)的头文件,就藏着OpenCV最深处的秘密,我们尝试逐步揭开它!
首先我们需要关注的是,究竟有哪些类?
类的枚举
方法很简单,只需要在这个文件中,搜索class关键词,然后顺着一个个列出来,就得到了如下的列表:
- _InputArray
- _OutputArray
- _InputOutputArray
- MatAllocator
- MatCommaInitializer_
- Mat
- Mat_
- Umat
- SparseMat
- SparseMat_
- MatConstItrator
- MatConstIterator_
- MatIterator_
- SparseMatConstIterator
- SparseMatIterator
- SparseMatConstIterator_
- SparseMatIterator_
- NaryMatIterator
- MatOP
- MatExpr
这个文件中一共有20个class声明的结构,其中16个class的名字中有"Mat",其余四个都是"Array"。
类的关系
有了这个粗略的认识,我们再来看看他们之间的关系,在class的基础上,再看看有没有 : public关键词,也就是看这些类有没有父类,找一圈,发现如下关系:
class | 基类 |
---|---|
_OutputArray | _InputArray |
_InputOutputArray | _OutputArray |
Mat_ | Mat |
SparseMat_ | SparseMat |
MatConstIterator_ | MatConstItrator |
MatIterator_ | MatConstIterator_<_Tp> |
SparseMatIterator | SparseMatConstIterator |
SparseMatConstIterator_ | SparseMatConstIterator |
SparseMatIterator_ | SparseMatConstIterator_<_Tp> |
可以看到他们之间的关系还是比较简单的,最多有两层继承关系,且有继承关系的,名字都长得差不多,这减少了我们认知的难度。
类的实现
在得到他们的关系之后,我们要开始逐个击破了,对这些c++的类,我们已经找到了声明,接下来就要找找他们的实现了。继续搜!
class | 实现 |
---|---|
_InputArray | matrix_wrap.cpp |
_OutputArray | matrix_wrap.cpp |
_InputOutputArray | mat.inl.hpp |
MatAllocator | matrix.cpp |
MatCommaInitializer_ | mat.inl.hpp |
Mat | matrix.cpp |
Mat_ | mat.inl.hpp |
Umat | umatrix.cpp |
SparseMat | mat.inl.hpp |
SparseMat_ | mat.inl.hpp |
MatConstItrator | mat.inl.hpp |
MatConstIterator_ | mat.inl.hpp |
MatIterator_ | mat.inl.hpp |
SparseMatConstIterator | mat.inl.hpp |
SparseMatIterator | mat.inl.hpp |
SparseMatConstIterator_ | mat.inl.hpp |
SparseMatIterator_ | mat.inl.hpp |
NaryMatIterator | matrix_iterator.cpp |
MatOP | matrix_expressions |
MatExpr | matrix_expressions |
我们可以看到,这些类主要是包含在6个文件中,其中Mat和Mat_主要是在matrix.cpp和umatrix.cpp中,还有一些也是在mat.inl.hpp中,矩阵操作相关的,大部分在matrix_expressions.cpp中,其余的实现都在mat.inl.hpp中。
结论
我们尝试对OpenCV的核心数据结构Mat及其相关类做一个介绍,在本文中我们主要是列出来有哪些类,并整理了他们的关系,还找到他们各自的实现。接下来我们就要逐个击破,争取能对所有类都能有个深入的认识。