真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

OpenCV中輔助對象指的是什么

今天就跟大家聊聊有關(guān)OpenCV中輔助對象指的是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)主營仙居網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,仙居h5微信小程序搭建,仙居網(wǎng)站營銷推廣歡迎仙居等地區(qū)企業(yè)咨詢

1. TermCriteria類

在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。

2. Range類

Range類用于確定一個(gè)連續(xù)的整數(shù)序列,Range對象有兩個(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(),用來獲取對象的可用范圍。

3. Ptr模板和垃圾收集

我們知道智能指針是C++中一個(gè)非常有用類型。這個(gè)指針允許我們創(chuàng)建一個(gè)對象的引用,然后把它傳遞到世界各地,可以創(chuàng)建更多的對該對象的引用,然后這些引用都會(huì)被計(jì)數(shù),當(dāng)引用超出作用范圍的時(shí)候,智能指針的引用計(jì)數(shù)就會(huì)減少,一旦所有的引用都消失,那么這個(gè)對象就會(huì)自動(dòng)清理釋放。而作為程序員的我們,不必去記錄這些東西。
接下來,我們了解下它的工作原理。首先,我們需要對想要封裝的類對象定義一個(gè)指針模板的實(shí)例??梢酝ㄟ^如下調(diào)用實(shí)現(xiàn):

cv::Ptr p( new cv::Matx33f )
or
cv::Ptr p = makePtr()

實(shí)現(xiàn)之后,就擁有一個(gè)智能指針p,可以當(dāng)做標(biāo)準(zhǔn)指針來用比如支持操作符*和->等。一旦我們得到p,就可以創(chuàng)建其他相同類型的對象了,而不需要把一個(gè)指向新對象的指針傳遞給他們。
舉個(gè)例子,比如像創(chuàng)建一個(gè)Ptr 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)被釋放掉的對象。
delete_obj()函數(shù),這個(gè)函數(shù)是當(dāng)引用清零之后自動(dòng)調(diào)用,自定義類型的時(shí)候需要重載,用來釋放對象的。
下面我們來通過一個(gè)例子來學(xué)習(xí)一下智能指針的應(yīng)用。
這里我們創(chuàng)建一個(gè)指向FILE的智能指針,這里需要為Ptr模板重載delete_obj()函數(shù)。

template<> inline void cv::Ptr::delete_obj()
{
   fclose(obj);
}

接下來就可以使用這個(gè)指針做一些操作,而在離開范圍的時(shí)候,不用自己去釋放,如下:

{
   cv::Ptr 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)存。

4. Exception類和異常處理

OpenCV用異常來處理錯(cuò)誤,OpenCV定義了自己的異常類cv::Exception,它繼承自STL的std::exception。Exception類型有成員code,err,func,file和line,分別指一個(gè)數(shù)字對應(yīng)的錯(cuò)誤代碼,對應(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ù),文件和行。

5. DataType<>模板

當(dāng)OpenCV庫函數(shù)需要傳遞特定數(shù)據(jù)類型的概念時(shí),它們會(huì)創(chuàng)建一個(gè)DataType<>類型的對象,DataType<>本身是一個(gè)模板,傳遞的實(shí)際對象是這個(gè)模板的特化。

6. InputArray類和OutputArray類

許多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)不需要對應(yīng)的輸出時(shí),可以傳遞noArray()。

看完上述內(nèi)容,你們對OpenCV中輔助對象指的是什么有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


網(wǎng)頁題目:OpenCV中輔助對象指的是什么
URL標(biāo)題:http://weahome.cn/article/jiedos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部