文章目錄
- 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