OpenCV訪問Mat容器類的畫素單元

2021-08-20 12:33:44 字數 1386 閱讀 3884

1、利用.at函式來訪問mat容器的畫素單元

image.at(i, j)  

(1)這就訪問到了unsigned char型的二維矩陣image的第i行第j列的元素。這種情況可以直接應用在灰度影象素的訪問上。因為灰度圖是單通道的,每個元素位置可以單獨表徵的乙個畫素元素的畫素值。

(2)對於rgb影象來說,有三個通道(opencv中三通道的排列方式是bgr),則用 代替就可以了。它的含義是,將rgb圖看做是三個二維矩陣按頁數排列起來。即將rgb圖看作是乙個x行y列3頁的三維矩陣,其中的3頁分別按0、1、2的序號順序存著b、g、r分量對應的數值,對於rgb影象上的(i,j)位置元素的畫素值,是3頁上相應位置的分量值按一定加權係數的方式相加得到的結果。

因此訪問rgb影象的畫素單元就要分別訪問三個分分量,方式如下:

image.at(i,j) [0] 

//> b  

image.at(i,j) [1] //> g  

image.at(i,j) [2] //> r  

(3)對於任意d維度的mat容器,訪問任意元素也是可以用.at函式來實現的。

mat.at(i, j, k...n) 

//> n為矩陣第i行第j列第k頁...第n維的元素

當然,在d=3的時候可以認為訪問的就是rgb影象。

2、step類物件和size類物件

(1)對於大小為row行col列的二維影象來說,size類物件的成員變數size.p[0]=row,size.p[1]=col;step類物件的成員變數step.p[0]=size.p[0]*sizeof(unsigned char),

step.p[1]=sizeof(unsigned char)。既size內存放的是影象每個維度的元素數量,step存放的是每個維度佔據的記憶體空間大小。對於非影象的其他二位mat容器物件,也有類似的定義,只不過需要注意sizeof(style)的型別就可以了。

(2)對於int型別的三維矩陣cube(row,col,page)來說,我們把他理解為二維水平面x、y在豎直深度方向z的堆疊。因此size.p[0]=row、size.p[1]=col、size.p[2]=page分別代表x、y、z方向的元素數目。step.p[0]=row*clo*sizeof(int)、step.p[1]=row*sizeof(int)、step.p[2]=sizeof(int)。比如想要訪問三維矩陣cube的第(i,j,k)個元素,則可以通過cube.at(i, j, k)來達到訪問這個元素的目的。但是如果想訪問這個元素所佔的記憶體單元(就像c風格指標操作那樣),則需要point = k*step.p[0] + i*step.p[1] + j*step.p[2]。

(3)對於大於三維的mat容器物件,介面函式.at則不能繼續工作了,通過.at訪問畫素的功能僅支援3維及以下的資料形式,對於大於三維的資料,只能通過上面介紹的訪問記憶體的方式來進行讀寫。

OpenCV基礎類容器Mat類詳解

我記得開始接觸opencv就是因為乙個演算法裡面需要2維動態陣列,那時候看core這部分也算是走馬觀花吧,隨著使用的增多,對mat這個結構越來越喜愛,也覺得有必要溫故而知新,於是這次再看看mat。mat最大的優勢跟stl很相似,都是對記憶體進行動態的管理,不需要之前使用者手動的管理記憶體,對於一些大...

OpenCV之Mat類詳解

學習mat矩陣,了解影象的儲存和mat矩陣的使用 2001年opencv剛出來的時候,是基於c語言介面而建。為了在記憶體 memory 中存放影象,當時採用名為 iplimage 的c語言結構體。其中最大的不足要數手動記憶體管理,使用者要為開闢和銷毀記憶體負責。一旦 開始變得越來越龐大,會越來越多地...

opencv的Mat類基本操作

官方對mat介紹的原話 the class mat represents an n dimensional dense numerical single channel or multi channel array.it can be used to store real or complex va...