opencv中的Mat結構操作

2021-06-27 21:13:37 字數 4649 閱讀 7485



從檔案中讀入一副影象:

mat

img=

imread

(filename

)

如果你讀入乙個jpg檔案,預設情況下將建立乙個3通道影象。如果你需要灰度(單通道)影象,使用如下語句:

mat

img=

imread

(filename,0

);

將影象儲存到乙個檔案:

mat

img=

imwrite

(filename

);

要獲取畫素的亮度值,你必須知道影象的型別和通道的數目。如下例子展示了獲取單通道灰度圖(型別 8uc1)的(x, y)位置處的畫素值:

scalar

intensity

=img.at

<

uchar

>(x

,y);

intensity.val[0]

中儲存從0到255的值。

現在我們看一下3通道影象如何獲取畫素值,顏色順序為 bgr

( imread

返回的預設順序):

vec3b

intensity

=img.at

<

vec3b

>(x

,y);uchar

blue

=intensity

.val[0

];uchar

green

=intensity

.val[1

];uchar

red=

intensity

.val[2

];

你可以使用同樣的方法處理浮點影象(例如通對乙個3通道影象進行sobel運算得到的浮點影象):

vec3f

intensity

=img.at

<

vec3f

>(x

,y);float

blue

=intensity

.val[0

];float

green

=intensity

.val[1

];float

red=

intensity

.val[2

];

同樣的方法也可用於畫素值的修改:

img.at

<

uchar

>(x

,y)=

128;

一些opencv函式,例如calib3d模組中的 projectpoints

函式,需要以 mat

的格式輸入二維或者三維的點。這樣的矩陣必須有且僅有一列,這樣每行對應乙個點,矩陣型別需要是32fc2或者32fc3。這樣的矩陣可以很容易的從 std::vector

轉換而來:

vector

<

point2f

>

points

;//... fill the array

matpointsmat

=mat

(points

);

您也可以通過 mat::at

方法來讀寫矩陣中的乙個元素:

point2f

point

=pointsmat.at

<

point2f

>(i

,0);

mat內儲存了矩陣/影象的屬性(行數,列數,資料型別等)以及乙個指向資料的指標。因此幾個 mat

例項可以指向同乙個資料。 mat

中還記錄了參考計數(reference count),這樣在 mat

被釋放時就知道是否需要釋放資料。這兒是乙個不需複製資料就建立兩個矩陣的例子:

std

::vector

<

point3f

>

points

;// .. fill the array

matpointsmat

=mat

(points

).reshape(1

);

這樣我們得到了乙個3列的32fc1矩陣,而不是1列的32fc3矩陣。 pointsmat

使用 points

的資料,且當它釋放時不會是否資料。在這個例子中,開發者需要知道 points

的生命比 pointsmat

長。如果我們需要複製資料,那麼請使用 mat::copyto

或 mat::clone

在c api中,開發者必須實現建立輸出影象然後再呼叫函式。與之相比不同的是c++ api支援空的 mat

型別的輸出引數。c++ api會呼叫 mat::create

建立結果矩陣。如果矩陣是空的,那將會申請資料空間;如果非空,且大小和型別符合要求,則該函式不做任何事情;如果大小或型別不符合要求,原來的資料會被釋放,然後申請新的資料空間。例如:

為矩陣定義了一系列方便的操作符。我們可以將乙個已經存在的灰度影象 img

變成全黑色:

img

=scalar(0

);

選擇感興趣區域:

rectr(

10,10,

100,

100);

matsmallimg

=img(r

);

將 mat

轉為 c api 資料型別:

注意此處無資料複製操作。

將彩色影象轉為灰度影象:

將影象的型別從8uc1轉為32fc1:

src

.convertto

(dst

,cv_32f

);

在演算法開發過程中,檢視演算法的中間結果是非常有用的。opencv提供了方便檢視影象的方法。型別為 8u

的影象可以使用如下方法顯示:

呼叫 waitkey()

會進入乙個訊息迴圈,來等待 image

視窗上的按鍵動作。 型別為 32f

的影象需要轉為 8u

型別。如下:

opencv中的Mat詳解

1.初始化 mat the basic image container 最最基本的函式,所有在opencv中都是用mat形式來操作的。初始化乙個mat mat a,c a imread ar 1 imread color mat b a 複製a給b c a 賦值運算 mat d a,rect 10,...

opencv中Mat的屬性

類似cv 8uc1是mat的型別,其定義為type cv 位數 資料型別 通道數 cv 8uc1 0 cv 8uc2 8 cv 8uc3 16 cv 8uc4 24 depth 0 cv 8sc1 1 cv 8sc2 9 cv 8sc3 17 cv 8sc4 25 depth 1 cv 16uc1 ...

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...