玩轉OpenCv(六): Mat類

怎麼表示圖像

我們需要一個數據類型來表示圖像,這樣才能方便後續對圖像的各種操作。在計算機內部,圖像用矩陣表示。圖像的度量單位是像素。比如一幅640*480的圖像,寬(水平方向)有640個像素,高(豎直方向)有480個像素。

很自然的,想到用一個640*480大小的二維矩陣來表示這幅圖,但這還不夠,還需要表示每個像素。在RGB顏色空間下,一個像素的顏色由紅色分量(R)、綠色分量(G)、藍色分量(B)組成,這需要3個值來分別存儲三個顏色分量的大小。因此把640*480二維矩陣改成640*480*3的三維矩陣。

然而這還不夠,存一張圖像,不僅僅需要存儲像素信息,還需要存儲圖像的名稱、圖像大小等信息。所以矩陣還需要拓展。

Mat類

Mat是一個類,包含兩個數據部分:矩陣頭(包含矩陣尺寸、存儲方法、存儲地址等信息)和一個指向存儲所有像素值的矩陣。

矩陣頭的尺寸是常數值,但像素矩陣會依圖像的不同而不同,通常比矩陣頭大幾個數量級,因此在傳遞圖像時要儘量避免圖像的深複製以減少開銷。

深複製與淺複製

代碼示例

Mat A,B,C;//僅創建矩陣頭
A=imread("test.jpg");
A.copyTo(B);//B深複製A,B和A是獨立的,改變A不會改變B
C=A;//C淺複製A,改變A會改變C

Mat類的常用構造函數

Mat()//默認構造函數
Mat(int rows,int cols,int type)//創建一個rows行、cols列、type型的矩陣
Mat(Size size,int type)//創建一個大小為size、type型的矩陣
Mat(int rows,int cols,int type,const Scalar &s)//參數s用於初始化
Mat(Size size,int type,const Scalar &s)

其中type定義如下:

CV_[位數][帶符號與否][類型前綴]C[通道數]

比如常用的CV_8UC3表示8位的unsigned char型,每個像素由三個元素組成三通道。

實例

#include 
using namespace cv;
int main( int argc, char** argv ) 
{
	Mat src(480,680,CV_8UC3,Scalar(255,255,255));//創建原圖像,初始化為(255,255,255),即白色
	Mat dst1,dst2;
	dst1=src;
	src.copyTo(dst2);
	class="lazy" src="//p2.ttnews.xyz/loading.gif" data-original=Scalar::all(0);//將原圖像改為黑色
	namedWindow("淺複製");
	namedWindow("深複製");
	imshow("淺複製",dst1);
	imshow("深複製",dst2);
	waitKey(0);
	return 0;
}
 

效果

玩轉OpenCv(六): Mat類

玩轉OpenCv(六): Mat類


分享到:


相關文章: