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及其相關類做一個介紹,在本文中我們主要是列出來有哪些類,並整理了他們的關係,還找到他們各自的實現。接下來我們就要逐個擊破,爭取能對所有類都能有個深入的認識。

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