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