OpenCV的數據類型——輔助對象

在上一篇文章中,主要介紹了OpenCV的基礎數據類型。接下來在本篇文章中將主要對OpenCV的輔助對象進行介紹。

cv::TermCriteria類

在很多算法中都存在着循環嵌套,只有滿足終止條件時纔會退出。通常情況下,終止條件的形式要麼是達到允許的有限迭代次數(COUNT或MAX_ITER),要麼是某種形式的誤差參數(如果接近如此程度,就退出循環,稱爲EPS,即epsilon的簡稱)。cv::TermCriteria類有三個成員變量(type, maxCount, epsilon),都可以直接設置,因爲它們是公有的。通常只通過其構造函數TermCriteria( int type, int maxCount, int epsilon )進行設置。其中,type的值可爲cv::TermCriteria::COUNT、cv::TermCriteria::MAX_ITER或cv::TermCriteria::EPS,也可把兩個條件並在一起(使用位運算符|)。

cv::Range類

cv::Range類用於確定一個連續的整數序列,含有兩個成員變量start和end,範圍包含start,但不包含end。成員函數有size()(得到Range類中的元素數)和empty()(判斷Range類中是否含有元素)。cv::Range::all()用於任何需要獲得對象可用範圍的時候。

cv::Ptr模板和垃圾收集

智能指針(smart pointer)允許我們創建一個對象的引用,然後把它傳遞到各處並創建更多對該對象的引用,而這些引用都會被計數。當引用超出範圍,智能指針的引用計數就會減少,當所有的引用消失時,該對象將自動清理(釋放)。

可以通過以下兩種方式定義一個指針模板的示例:

① cv::Ptr<cv::Matx33f> p( new cv::Matx33f );

② cv::Ptr<cv::Matx33f> p = makePtr<cv::Matx33f>();

一旦得到p,就可以創建其他相同類型的對象,而不需要把一個指向新的對象的指針傳遞給它們。例如:可以創建一個cv::Ptr<cv::Matx33f> q, 當p的值傳遞給q時,p和q同時指向一個實例。它們都知道自己是兩個指針中的一個,當p被釋放時,q就能知道它是原始矩陣僅存的引用的引用。如果這個時候q也要被釋放,它的析構函數將被隱式調用,由於q發現它是遺留下來的最後一個引用,它會釋放它的原始矩陣。cv::Ptr<>是現成安全的。

Ptr類的附加函數
函數 描述
addref 增加指針內部的引用次數
release 減少指針內部的引用次數
empty

① 確定一個智能指針是否指向一個已經被釋放掉的對象(一個對象調用一次或多次release()的時候);

② 確定智能指針對象內部對象指針是否處於其他原因而爲NULL(賦值時使用了一個剛好首先返回NULL的函數)

delete_obj 引用計數爲0時自動調用的函數,默認情況下,定義了但不做任何事,實際可根據自己的需求重載該函數。

cv::Exception類和異常處理

OpenCV使用異常來處理錯誤,定義了自己的異常類型cv::Exception,它繼承自STL的異常類std::exception。

有幾個內置宏用於自己生成異常,但是在較新的OpenCV版本中,這些功能只能在調試(debug)版本中使用。

Exception內置宏
描述
CV_Error(errorcode, description) 生成並拋出一個有固定文字描述的異常
CV_Error_(errorcode, printf_fmt_str, [printf-args]) 以同樣的方式工作,但允許使用類似printf格式字符串和參數代替固定的描述
CV_Assert(condition) 會在測試程序中所設定的條件(condition),如果不符合條件,則拋出異常。
CV_DbgAssert(condition)

cv::InputArray類和cv::OutputArray類

cv::InputArray類和cv::OutputArray類之間主要的區別在於前者是常量(只讀),後者是可變量。除此之外還有cv::InputOutputArray(就地計算的數據)和cv::noArray()(表示輸入的是並沒有被使用的輸入量或無輸出)。

 

本文主要介紹了OpenCV中的上述輔助對象,還有其他輔助對象,比如cv::DataType<>模板,但未做深入研究,所以在此不進行介紹。

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