對OpenCV直方圖的數(shù)據(jù)結(jié)構(gòu)CvHistogram的理解_第1頁
對OpenCV直方圖的數(shù)據(jù)結(jié)構(gòu)CvHistogram的理解_第2頁
對OpenCV直方圖的數(shù)據(jù)結(jié)構(gòu)CvHistogram的理解_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、前幾天被OpenCV的直方圖的數(shù)據(jù)結(jié)構(gòu)CvHistogram弄得很糾結(jié)。上網(wǎng)一搜,也沒什么相關(guān)的資料。現(xiàn)在有點(diǎn)頭緒了,就寫點(diǎn)東西,讓后面的人好走一些吧。先來看看CvHistogram的定義:typedef struct CvHistogram int type; CvArr* bins; float threshCV_MAX_DIM2; /* For uniform histograms. */ float* thresh2; /* For non-uniform histograms. */ CvMatND mat; /* Embedded matrix header for array h

2、istograms. */CvHistogram;第一個(gè)成員type,相信大家都見過很多結(jié)構(gòu)都有其。比如:CvMat、CvMatND、IplImage(圖像結(jié)構(gòu)中,其用nSize成員代替)。這個(gè)成員用來區(qū)分各個(gè)類型的。OpenCV很多函數(shù)的原型都用到了一個(gè)CvArr*類型。這個(gè)類型說明可以接受一個(gè)CvMat或者IplImage類型的指針。這是我們對它的最初理解。其實(shí),看過CvArr定義的人都知道,其實(shí)是typedef void CvArr;并非派生關(guān)系。 對于OPenCV函數(shù)內(nèi)部,得到的是一個(gè)void指針,這時(shí)就有必要確切的知道得到的到底是一個(gè)什么類型(是CvMat指針還是IplImage指針

3、,還是CvMatND指針)。這樣type的作用就體現(xiàn)了。第二個(gè) 成員bins。一個(gè)CvArr(即void)指針。大家可以先把其理解成一個(gè)快捷方式。其等于mat成員的data成員。等一下再說這個(gè)成員。第三個(gè)成員是thresh。是一個(gè)二維數(shù)組。而且第二維是2.設(shè)想一下,這個(gè)函數(shù)是求圖像的分布像素值(像素灰度值)分布情況。而不同的人,對不同的灰度值感興趣。這時(shí),OpenCV就必須能夠讓用戶自行指定一個(gè)灰度值的范圍。這就需要一個(gè)上界和下界來指定一個(gè)范圍。這就是第二維的大小是2的原因。在講第一維前,先來說說直方圖的維數(shù)。一開始我對什么“一維直方圖”、“二維直方圖”不是很明。不知道怎么樣才算是二維的。后面

4、找到了一張二維直方圖才明白。學(xué)習(xí)OpenCV、網(wǎng)上都有很多一維的直方圖。我也在這里給出一個(gè)一維的直方圖:一維直方圖最重要的還是二維的直方圖。二維直方圖,其中第一維是16.第二維為8.大家可以在圖中看到最左邊的8條紅柱(當(dāng)然第一條是白色的)。其紅的程度不同。對于其他顏色也是分成了8中不同的程度。一共有16種。下面的是圖片的網(wǎng)址,還有代碼。BE%E5%83%8F%E9%A2%9C%E8%89%B2%E5%88%86%E5%B8%83%E7%9B%B4%E6%96%B9%E5%9B%BE現(xiàn)在,大家對直方圖的維數(shù),應(yīng)該有一點(diǎn)認(rèn)識了。現(xiàn)在來說說thresh成員。正是因?yàn)橹狈綀D可以有多維的,所以,必須得用

5、thresh來指明各維的上下界。所以這個(gè)thresh成員是一個(gè)二維的指針?,F(xiàn)在到了thresh2成員。先一下這個(gè)問題:直方圖的bin的個(gè)數(shù)和各個(gè)bin的大小 是怎么確定的?bin的個(gè)數(shù)是通過cvCreateHist函數(shù)的參數(shù)來設(shè)定的。而各個(gè)bin的大小就有兩種情況了。1:每個(gè)bin都一樣大。2:每個(gè)bin的大小不一樣大。對于每個(gè)bin一樣大的話,bin的大小是比較容易解決的。相信大家都想到了,平均即可,因?yàn)橛辛松舷陆绾蚥in的個(gè)數(shù)。而對于種情況就要用到thresh2這個(gè)成員了。試想一下,要是不將每一個(gè)bin的大小設(shè)為一樣的話,那么就得由用戶自己設(shè)定每一個(gè)bin的大?。ň褪窃O(shè)定每一個(gè)bin的上下

6、界)。當(dāng)然要是多維的直方圖,那么就要為每一維的所有bin都設(shè)定上下界。這就需要一個(gè)二維數(shù)組來存儲這樣的數(shù)據(jù)。從CvHistogram這個(gè)結(jié)構(gòu)體可以看到thresh2成員是一個(gè)二維指針。這就是thresh2的來由了。最后一個(gè)成員mat。這個(gè)成員是用來存數(shù)據(jù)的。前面的bins指針其實(shí)是等于mat成員的data的。所以,只能在mat里存放數(shù)據(jù)了。cvCalcHist函數(shù)對圖像進(jìn)行操作后,得到了每一個(gè)bin的大小,并存放到mat的data成員指向的內(nèi)存中。至于bings成員。請看下面的代碼 if( type = CV_HIST_ARRAY ) hist->bins = cvInitMatNDHe

7、ader( &hist->mat, dims, sizes, CV_HIST_DEFAULT_TYPE ); cvCreateData( hist->bins ); else if( type = CV_HIST_SPARSE ) hist->bins = cvCreateSparseMat( dims, sizes, CV_HIST_DEFAULT_TYPE );所以,bins成員的值和mat里的data成員的值一樣。之所以說是快捷方式,應(yīng)該可以通過它可以快速得到存放直方圖信息的地址。mat成員還有一個(gè)dim的結(jié)構(gòu)體。這個(gè)結(jié)構(gòu)體的size成員用來存儲直方圖中各維的bin的個(gè)數(shù)。而該結(jié)構(gòu)體的step成員是從本維本數(shù)據(jù)跳到下本維的下一個(gè)數(shù)據(jù)的字節(jié)數(shù)。比如說,對于前面那個(gè)二維直方圖的例子。其dim0.step = 32;而dim1.step = 4.對于第二維來說,之所以是4.是因?yàn)槊恳粋€(gè)bin都是用float類型存儲的。所以跳4.就像一個(gè)float數(shù)組。下標(biāo)為2的地址和下標(biāo)為3的地址就是相差4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論