OpenCV學(xué)習(xí)筆記再談OpenCV數(shù)據(jù)結(jié)構(gòu)Mat詳解_第1頁(yè)
OpenCV學(xué)習(xí)筆記再談OpenCV數(shù)據(jù)結(jié)構(gòu)Mat詳解_第2頁(yè)
OpenCV學(xué)習(xí)筆記再談OpenCV數(shù)據(jù)結(jié)構(gòu)Mat詳解_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、再談OpenCV數(shù)據(jù)結(jié)構(gòu)MatOpenCV學(xué)習(xí)筆記(四十)詳解分類: OpenCV 2011-12-28 10:331464 人閱讀評(píng)論收藏舉報(bào)我記得開始接觸 OpenCV就是因?yàn)橐粋€(gè)算法里面需要2維動(dòng)態(tài)數(shù)組,那時(shí)候看core這部分也算是走馬觀花吧,隨著使用的增多,對(duì)Mat這個(gè)結(jié)構(gòu)越來(lái)越喜愛(ài),也覺(jué)得有必要溫故而知新,于是這次再看看Mat。Mat最大的優(yōu)勢(shì)跟STL很相似,都是對(duì)內(nèi)存進(jìn)行動(dòng)態(tài)的管理,不需要之前用戶手動(dòng)的管理 內(nèi)存,對(duì)于一些大型的開發(fā),有時(shí)候投入的 lpImage內(nèi)存管理的時(shí)間甚至比關(guān)注算法實(shí)現(xiàn) 的時(shí)間還要多,這顯然是不合適的。除了有些嵌入式場(chǎng)合必須使用c語(yǔ)言,我任何時(shí)候都強(qiáng)烈像大家

2、推薦Mat。Mat這個(gè)類有兩部分?jǐn)?shù)據(jù)。一個(gè)是matrix header,這部分的大小是固定的,包含矩陣的大小,存儲(chǔ)的方式,矩陣存儲(chǔ)的地址等等。另一個(gè)部分是一個(gè)指向矩陣包含像素值的指針。cpp view pla in copyMat A, C; / creates just the header partsA = imread(argv1, CV_LOAD_IMAGE_COLOR); / here wel know the method used(allocate matrix)Mat B(A); / Use the copy constructorC = A; / Assignment ope

3、rator需要注意的是,copy這樣的操作只是 copy 了矩陣的matrix header和那個(gè)指針,而不是 矩陣的本身,也就意味著兩個(gè)矩陣的數(shù)據(jù)指針指向的是同一個(gè)地址,需要開發(fā)者格外注意。比如上面這段程序,A、B、C指向的是同一塊數(shù)據(jù),他們的header不同,但對(duì)于 A的操作同樣也影響著 B、C的結(jié)果。剛剛提高了內(nèi)存自動(dòng)釋放的問(wèn)題,那么當(dāng)我不再使用A的時(shí)候就把內(nèi)存釋放了,那時(shí)候再操作B和C豈不是很危險(xiǎn)。不用擔(dān)心,OpenCV的大神為我們已經(jīng)考慮了這個(gè)問(wèn)題,是在最后一個(gè) Mat不再使用的時(shí)候才會(huì)釋放內(nèi)存,咱們就放心用就行了。如果想建立互不影響的Mat,是真正的復(fù)制操作,需要使用函數(shù)cione

4、()或者copyTo()。說(shuō)到數(shù)據(jù)的存儲(chǔ),這一直就是一個(gè)值得關(guān)注的問(wèn)題,Mat_對(duì)應(yīng)的是CV_8U,Mat_ 對(duì)應(yīng)的是 CV_8U,Mat_ 對(duì)應(yīng)的是 CV_8S,Mat_ 對(duì)應(yīng)的是 CV_32S,Mat_ 對(duì)應(yīng)的是 CV_32F,Mat_ 對(duì)應(yīng)的是 CV_64F,對(duì)應(yīng)的數(shù)據(jù) 深度如下:? CV_8U - 8-bit unsigned integers ( 0.255 )? CV_8S - 8-bit signed integers ( -128.127 )? CV_16U - 16-bit unsigned integers ( 0.65535 )? CV_16S - 16-bit sign

5、ed integers ( -32768.32767 )? CV_32S - 32-bit sig ned in tegers ( -2147483648.2147483647 )? CV_32F - 32-bit ?oat in g-poi nt numbers ( -FLT_MAX.FLT_MAX, INF, NAN )? CV_64F - 64-bit ?oati ng-poi nt numbers ( -DBL_MAX.DBL_MAX, INF, NAN )這里還需要注意一個(gè)問(wèn)題, 很多OpenCV的函數(shù)支持的數(shù)據(jù)深度只有8位和32位的,所以要少使用CV_64F,但是vs的編譯器又會(huì)把

6、float數(shù)據(jù)自動(dòng)變成double型,有些不太爽。 還有個(gè)需要注意的問(wèn)題,就是流操作符對(duì)于Mat的操作,僅限于 Mat是12維的情況。還有必要說(shuō)一下 Mat的存儲(chǔ)是逐行的存儲(chǔ)白廠|。再說(shuō)說(shuō)Mat的創(chuàng)建,方式有兩種,羅列一下:1.調(diào)用create (行,列,類型)2.Mat (行,列,類型(值)。例如:cpp view pla in copy/ make a 7x7 complex matrix filled with 1+3j.Mat M(7,7,CV_32FC2,Scalar(1,3);/ and now turn M to a 100x60 15-channel 8-bit matrix.

7、/ The old content will be deallocatedM.create(100,60,CV_8UC(15);要是想創(chuàng)建更高維的矩陣,要寫成下面的方式cpp view pla in copy/ create a 100x100x100 8-bit arrayint sz = 100, 100, 100;Mat bigCube(3, sz, CV_8U, Scalar:all(0);對(duì)于矩陣的行操作或者列操作,方式如下:(注意對(duì)列操作時(shí)要新建一個(gè)Mat,我想應(yīng)該跟列地址不連續(xù)有關(guān))cpp view pla in copy/ add the 5-th row, multiplie

8、d by 3 to the 3rd rowM.row(3) = M.row(3) + M.row(5)*3;/ now copy the 7-th column to the 1-st column/ M.col(1) = M.col(7); / this will not workMat M1 = M.col(1);M.col(7).copyTo(M1);下面的東西就比較狂暴了,對(duì)于外來(lái)的數(shù)據(jù),比如你從別的地方接受了一幅圖片,但可以不是Mat結(jié)構(gòu)的,而只有個(gè)數(shù)據(jù)的指針,看看接下來(lái)的代碼是如何應(yīng)付的,重點(diǎn)哦,親cpp view pla in copyint width, int height,

9、 int step)Mat img(height, width, CV_8UC3, pixels, step);GaussianBlur(img, img, Size(7,7), 1.5, 1.5);親,有木有很簡(jiǎn)單!還有一種快速初始化數(shù)據(jù)的辦法,如下:cpp view pla in copydouble m33 = a, b, c, d, e, f, g, h, i;Mat M = Mat(3, 3, CV_64F, m).inv();也可以把原來(lái)的IplImage格式的圖片直接用Mat( IplImage)的方式轉(zhuǎn)成 Mat結(jié)構(gòu),也可以像Matlab 樣調(diào)用zeros()、ones()、eye()這樣的函數(shù)進(jìn)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論