從檔案中讀入一副影象:
matimg=
imread
(filename
)
如果你讀入乙個jpg檔案,預設情況下將建立乙個3通道影象。如果你需要灰度(單通道)影象,使用如下語句:
matimg=
imread
(filename,0
);
將影象儲存到乙個檔案:
matimg=
imwrite
(filename
);
要獲取畫素的亮度值,你必須知道影象的型別和通道的數目。如下例子展示了獲取單通道灰度圖(型別 8uc1)的(x, y)位置處的畫素值:scalar
intensity
=img.at
<
uchar
>(x
,y);
intensity.val[0]
中儲存從0到255的值。
現在我們看一下3通道影象如何獲取畫素值,顏色順序為 bgr
( imread
返回的預設順序):
vec3bintensity
=img.at
<
vec3b
>(x
,y);uchar
blue
=intensity
.val[0
];uchar
green
=intensity
.val[1
];uchar
red=
intensity
.val[2
];
你可以使用同樣的方法處理浮點影象(例如通對乙個3通道影象進行sobel運算得到的浮點影象):
vec3fintensity
=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
方法來讀寫矩陣中的乙個元素:
point2fpoint
=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...