您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)OpenCV中輔助對(duì)象指的是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
在OpenCV中的很多算法都需要一個(gè)終止條件以確定何時(shí)退出。通常終止條件的形式要么是達(dá)到允許的有限迭代次數(shù)(稱為COUNT或MAX_ITER),要么是某種形式的誤差參數(shù)(如果接近于如此程度,就可以退出,稱為EPS,即epsilon的簡稱)。在程序中,可以通過TermCriteria的公有變量來設(shè)置,當(dāng)然,最常用的是通過他的構(gòu)造函數(shù)進(jìn)行設(shè)置。
TermCriteria( int type, int maxCount, double epsilon )
其中type設(shè)置為COUNT或EPS,也可以同時(shí)使用(用|連接)。設(shè)置過type之后,還需要設(shè)置相應(yīng)的maxCount或epsilon。
Range類用于確定一個(gè)連續(xù)的整數(shù)序列,Range對(duì)象有兩個(gè)元素start和end,跟上面的TermCriteria相似,通常在構(gòu)造函數(shù)中設(shè)置。
cv::Range( int start, int end )
這個(gè)Range的范圍包括初始值start,但不包括終止值end。該類中有兩個(gè)成員函數(shù),一個(gè)是empty()用來測試一個(gè)range是否為空,另一個(gè)是all(),用來獲取對(duì)象的可用范圍。
我們知道智能指針是C++中一個(gè)非常有用類型。這個(gè)指針允許我們創(chuàng)建一個(gè)對(duì)象的引用,然后把它傳遞到世界各地,可以創(chuàng)建更多的對(duì)該對(duì)象的引用,然后這些引用都會(huì)被計(jì)數(shù),當(dāng)引用超出作用范圍的時(shí)候,智能指針的引用計(jì)數(shù)就會(huì)減少,一旦所有的引用都消失,那么這個(gè)對(duì)象就會(huì)自動(dòng)清理釋放。而作為程序員的我們,不必去記錄這些東西。
接下來,我們了解下它的工作原理。首先,我們需要對(duì)想要封裝的類對(duì)象定義一個(gè)指針模板的實(shí)例??梢酝ㄟ^如下調(diào)用實(shí)現(xiàn):
cv::Ptr<Matx33f> p( new cv::Matx33f )
or
cv::Ptr<Matx33f> p = makePtr<cv::Matx33f>()
實(shí)現(xiàn)之后,就擁有一個(gè)智能指針p,可以當(dāng)做標(biāo)準(zhǔn)指針來用比如支持操作符*和->等。一旦我們得到p,就可以創(chuàng)建其他相同類型的對(duì)象了,而不需要把一個(gè)指向新對(duì)象的指針傳遞給他們。
舉個(gè)例子,比如像創(chuàng)建一個(gè)Ptr<Matx33f> q,當(dāng)你把p的值傳遞給q時(shí),在后臺(tái)的某個(gè)地方,智能指針就開始計(jì)數(shù)了。你可以像正常指針一樣使用,但是這里實(shí)際上仍然只存在一個(gè)Mat33f實(shí)例,p和q同時(shí)指向它。當(dāng)p超出生命周期被釋放后,q就知道它是原始矩陣僅存的引用了,這個(gè)時(shí)候如果q的生命周期也結(jié)束的時(shí)候,就會(huì)去釋放原始矩陣。有點(diǎn)類似于教室里最后一個(gè)同學(xué)離開的時(shí)候要關(guān)門關(guān)燈一樣。
cv::Ptr()<>模板類有一些成員函數(shù)可以了解下:
addref()和release()增加和減少指針內(nèi)部的引用計(jì)數(shù)(慎用)。
empty()函數(shù),用來確定一個(gè)智能指針是否指向一個(gè)已經(jīng)被釋放掉的對(duì)象。
delete_obj()函數(shù),這個(gè)函數(shù)是當(dāng)引用清零之后自動(dòng)調(diào)用,自定義類型的時(shí)候需要重載,用來釋放對(duì)象的。
下面我們來通過一個(gè)例子來學(xué)習(xí)一下智能指針的應(yīng)用。
這里我們創(chuàng)建一個(gè)指向FILE的智能指針,這里需要為Ptr<FILE>模板重載delete_obj()函數(shù)。
template<> inline void cv::Ptr<FILE>::delete_obj()
{
fclose(obj);
}
接下來就可以使用這個(gè)指針做一些操作,而在離開范圍的時(shí)候,不用自己去釋放,如下:
{
cv::Ptr<FILE> f(fopen("myfile.txt", "r"));
if(f.empty())
throw ...; // Throw an exception, we will get to this later on...
fprintf(f, ...);
...
}
也就是說在最后的大括號(hào),f離開作用范圍,f內(nèi)部的引用計(jì)數(shù)變?yōu)?,delete_obj()被f的析構(gòu)函數(shù)調(diào)用,自動(dòng)釋放內(nèi)存。
OpenCV用異常來處理錯(cuò)誤,OpenCV定義了自己的異常類cv::Exception,它繼承自STL的std::exception。Exception類型有成員code,err,func,file和line,分別指一個(gè)數(shù)字對(duì)應(yīng)的錯(cuò)誤代碼,對(duì)應(yīng)產(chǎn)生異常錯(cuò)誤的字符串,錯(cuò)誤發(fā)生的函數(shù)名,錯(cuò)誤發(fā)生的文件和錯(cuò)誤出現(xiàn)在文件中的行數(shù)。err,func和file都是STL字符串。
有幾個(gè)內(nèi)置的宏,用于自己生成異常。CV_Error(errorcode, description)會(huì)生成并拋出一個(gè)有固定文字描述的異常,CV_Assert(condition)和CV_DbgAssert(condition)都會(huì)測試程序中所設(shè)定的條件,如果條件不符合,則拋出異常。這些宏是拋出異常的首選方法,因?yàn)樗鼈儠?huì)自動(dòng)為你處理函數(shù),文件和行。
當(dāng)OpenCV庫函數(shù)需要傳遞特定數(shù)據(jù)類型的概念時(shí),它們會(huì)創(chuàng)建一個(gè)DataType<>類型的對(duì)象,DataType<>本身是一個(gè)模板,傳遞的實(shí)際對(duì)象是這個(gè)模板的特化。
許多OpenCV的函數(shù)都把數(shù)組作為變量并把數(shù)組作為返回值,但是在OpenCV中有各種各樣的數(shù)組。我們已經(jīng)了解到OpenCV支持一些小的數(shù)組類型,比如:Scalar,Vec,Matx,還有std::vector<>和后面講討論的大型數(shù)組(Mat和SparseMat),為了防止接口變得復(fù)雜,OpenCV定義了InputArray類和OutputArray類,它們表示“上面的任何一個(gè)”。
其實(shí),InputArray和OutputArray之間的區(qū)別主要在于前者假設(shè)為常量(只讀),后面的是變量。與InputArray相關(guān)的是特殊函數(shù)noArray(),它的返回值可以被用在任何需要InputArray的地方,以強(qiáng)調(diào)輸入的是并沒有被使用的輸入量,有些函數(shù)有可選的輸出數(shù)組,當(dāng)不需要對(duì)應(yīng)的輸出時(shí),可以傳遞noArray()。
看完上述內(nèi)容,你們對(duì)OpenCV中輔助對(duì)象指的是什么有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。