Opencv學習筆記-----理解Mat

一、Mat基礎
        1、在計算機內存中,數字圖像是採用矩陣的方式保存的。Opencv2中,保存圖像像素信息的是數據結構Mat陣,它包含兩部分:矩陣頭和一個指向像素數據的矩陣針。矩陣頭主要包含:矩陣尺寸、存儲方式、存儲地址、引用計數等。矩陣頭的大小是一定的,不會隨着圖像的大小改變而改變,通常圖像像素數據都會很大。因此,在圖像的複製和傳遞過程中不需要複製整個Mat數據,只複製矩陣頭和指向像素矩陣的指針即可。        
        2、由此會出現多個Mat共用一個矩陣數據的情況,那麼內存回收的時候會存在什麼時候釋放矩陣數據的問題,對於釋放內存的時候引用計數就會起作用了,當Mat對象被複制一次時,引用計數會加一,而銷燬一個Mat對象(共用同一個圖像矩陣數據)時引用計數減一,當引用計數爲0的時候,矩陣數據就會被除。
       3、在使用Mat的時候:
        a、OpenCV中內存通常是自動分配,特殊情況需要特別指定。
        b、使用OpenCV的C++接口時不用考慮內存釋放問題。
        c、需要複製矩陣數據,可以使用Image.clone()Image1.copyTo(Image2)

二、Mat存儲方法
        Mat矩陣中不同的每個元素可以使用不同數據類型,最小的數據類型是char型,佔用一個字節(1byte=8bits),可以是有符號(0到255)和無符號(-127到127)的。在RGB顏色空間中,使用三個char型可以表示1600萬種顏色.在Opencv中可以使用cv::Scalar(b,g,r)或者CV_RGB(r,g,b)表示。

三、Mat的創建
1、構造函數
     官方文檔指定規則如下:
     CV_[The number of bits per item][Signed or Unsigned][TypePrefix]C[The channel number]
        四部分分別指定:元素的大小,是有符號還是無符號,數據類型以及通道數。 cv::Mat img(20, 20, CV_8UC3, cv::Scalar(0,0,255));
       上述代碼創建了一個20行20列的矩陣,矩陣元素使用8位無符號char類型保存,具有3通道,每個像素的初始值是(0,0,255)即紅色,Scalar是short型的vector,提供矩陣的初始化。
2、Create方法
        該方法不能爲矩陣設置初始值,只是在改變尺寸時爲矩陣數據重新分配內存。         創建一個4行4列有2個通道的矩陣:
        img.create(4, 4, CV_8UC2);

3、幾種特殊矩陣初始化方式的說明
        cv::Mat e = cv::Mat::eye(4,4,CV_64F);
        cv::Mat o = cv::Mat::ones(2,2,CV_32F);
        cv::Mat z = cv::Mat::zeros(3,3,CV_8UC1);
        Mat e是4行4列的對角矩陣
        Mat z是2行2列的單位矩陣
        Mat o是3行3列的零矩陣

4、小矩陣的初始化
        Mat m =(Mat_<double>(3,3)<<-3,-2,-1,0,1,2,3,4,5);

四、Mat的輸入輸出
使用imread函數,向Mat對象中寫入一個圖像:
        Mat m = cv::imread(".//res//lena.png");//讀入圖像imread的原型:
        cv::Mat imread(const string& filename,int flags=1)
filename指定要讀取圖像的位置flags指定圖像的顏色空間
        flags > 0 三通道的彩色圖像
        flags = 0 灰度圖像
        flags < 0 不作改變也可以有以下的枚舉值
        CV_LOAD_IMAGE_ANYDEPTH、
        CV_LOAD_IMAGE_COLOR、
        CV_LOAD_IMAGE_GRAYSCALE
使用imwrite函數,將Mat對象保存到指定的文件中。imwrite的函數原型如下:

bool imwrite(const string& filename,InputArray img,constvector<int>& params=vector<int>())
filename,指定的文件
img  要保存的Mat對象
params 用來指定圖像的保存編碼方式。
使用filename的擴展名來指定圖像的保存格式(.jpg  .png  .bmp),對於不同的圖像保存類型,params是不同的值

        JPEG,params用來指定圖像的質量(0到100),CV_IMWRITE_JPEG_QUALITY

默認的是95 .

        PNG,params用來指定圖像的壓縮級別(0到9),壓縮級別越高圖像佔用的空間越小,保存圖像所用的時間越久。默認值是3. CV_IMWRITE_PNG_COMPRESSION

        PPM,PGM,PBM,params是一個標記(0或者1),CV_IMWRITE_PXM_BINARY

默認的是1。imwrite只能保存8位(或者是16位無符號(CV_16UC)的PNG,JPEG200或者TIFF圖像)單通道或者三通道的圖像,如果要保存的不是這樣的圖片,可以使用convertTo或者cvtColor來進行轉變。




        




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章