《學習OpenCV3》第3章 瞭解OpenCV的數據類型

基礎數據類型分爲三類:

  • 直接從C++繼承的基礎數據類型(比如int,float),包括簡單的數組和矩陣,簡單的幾何概念,比如點、矩形、大小
  • 輔助對象(Helper objects),更抽象,比如垃圾收集指針類、用於數據切片的範圍對象(range objects)以及抽象的終止條件類等
  • 大型數組類型,比如cv::Mat類,用來代表任意維度的包含任意基礎元素的數組;稀疏矩陣cv::SparseMat,適用於直方圖

基礎類型概述

cv::Vec<>

  • C語言原語類型(如int或float)的容器,也就是固定向量類
  • 與STL類的不同之處是,固定向量類用於在編譯時已經知道維度的小型向量,更高效
  • 有很多別名(typedef),比如cv::Vec2i、cv::Vec4d(2個元素的整型向量、4個元素的雙精度浮點向量),任何有着 cv::Vec{2,3,4,6}{b,w,s,i,f,d} 形式的聲明,對2個到6個維度的6種數據類型的任何組合都有效
b = unsigned char
w = unsigned short
s = short
i = int
f = float
d = double

cv::Matx<>

  • 固定矩陣類,用於在編譯時已經知道維度的小型矩陣
  • cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d}

cv::Point類

  • 由自己的模板派生的,也可以從固定向量類轉換得到
  • 與固定向量類最大的不同是他們的成員通過名稱變量訪問(mypoint.x, mypoint.y)而不是通過下標(myvec[0], myvec[1])
  • 通過別名調用,比如cv::Point2i

輔助對象

cv::TermCriteria類

  • 很多算法需要一個終止條件來確定何時退出,要麼是達到允許的有限迭代次數,要麼是某種形式的誤差參數(EPS, epsilon)
  • cv::TermCriteria對象把一個或兩個終止條件封裝,以便傳入算法函數裏,有三個成員變量,type, maxCount, epsilon,都可以直接設置,更常見的做法是隻通過他們的構造函數 TermCriteria(int type, int maxCount, double epsilon) 進行設置
  • type設置爲 cv::TermCriteria::COUNT 或者cv::TermCriteria::EPS,也可以把兩個條件通過位運算符|並在一起

cv::Range類

  • 用於確定一個連續的整數序列
  • 有兩個元素 start, end,常在構造函數 cv::Range(int start, int end) 中設定,包含頭不含尾,如cv::Range(0,4)包含0,1,2,3
  • size() 函數得到range類的元素數量
  • empty() 用於測試range是否含有元素
  • all() 用於獲得對象可用範圍

cv::Ptr模板和垃圾收集

  • 智能指針 smart pointer 允許我們創建多個對象的引用,然後傳遞到各處,所有這些引用都會被計數,當引用超過範圍,引用次數就會減少,一旦所有的引用消失,這個對象將自動清理
  • 首先爲你需要封裝的對象定義一個指針模板的實例
 cv::Ptr<Matx33f> p( new cv::Matx33f )
 cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>() 
  • 這個模板類的構造函數擁有指向對應對象的指針,你就會得到一個智能指針p,你可以像使用標準指針一樣使用他
  • 創建其他系統類型的對象就不需要把一個指向新的對象的指針傳遞給他們,比如 Ptr< Matx33f > q,這裏實際上只有一個 cv::Matx33f 實例,p和q都指向他
  • addred()release() 增加和減少指針內部的引用次數
  • empty() 確定一個智能指針是否指向一個已經被釋放掉的對象
  • delete_obj() 引用次數爲零時自動調用的函數

cv::Exception類和異常處理

  • 繼承自STL的異常類 std::exception
  • 有成員 code(由數字的錯誤碼代表), err(錯誤的字符串), func(錯誤的函數名), file(錯誤發生的文件) 和 line(錯誤出現在文件中的行數)
  • 有幾個內置宏用於自己生成異常,比如 CV_Error(errorcode, description)會生成並拋出一個有固定文字描述的異常

cv::DataType<>模板

template<typename _Tp> class DataType 
{  
	typedef _Tp value_type;
  	typedef value_type work_type;
    typedef value_type channel_type;
    typedef value_type vec_type;
    
  	enum {
  		generic_type = 1,    
  		depth        = -1,    
  		channels     = 1,    
  		fmt          = 0,    
  		type         = CV_MAKETYPE(depth, channels)  
  	}; 
 }; 

cv::InputArray類和cv::OutputArray類

  • 表示支持任何數組類型
  • 前者假設爲常量(只讀),後者爲可變量
  • cv::noArray() 返回 cv::InputArray

工具函數

在這裏插入圖片描述
在這裏插入圖片描述

template<T> T* cv::allocate(
	size_t sz
);
template<T> void cv::deallocate(
	T* ptr,
	size_t sz
);

void* cv::fastMalloc(
	size_t sz
);
void cv::fastFree(
	void* ptr
);
  • cv::allocate() 函數與數組形式的 new 相似,分配了含n個T類型對象的C風格數組,爲每個對象調用默認構造函數並返回指向數組中的第一個對象的指針
  • cv::deallocate() 函數與數組形式的 delete 相似,釋放含n個T類型對象的C風格數組
  • cv::fastMalloc() 工作機制跟 malloc() 類似
  • cv::fastFree() 釋放由 cv::fastMalloc() 分配的緩存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章