OpenCV Mat相关结构体详细介绍 [0]

背景

众所周知,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及其相关类做一个介绍,在本文中我们主要是列出来有哪些类,并整理了他们的关系,还找到他们各自的实现。接下来我们就要逐个击破,争取能对所有类都能有个深入的认识。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章