天天看點

opencv學習筆記——【OpenCV3】圖像的讀取、顯示與儲存

OpenCV3和OpenCV2大同小異,圖檔的讀取,通過函數cv::imread()來實作的;顯示通過函數cv::imshow()來實作;而儲存則通過cv::imwrite()來實作。

1、圖檔的讀取,通過函數cv::imread()讀取。

第一個參數為圖檔檔案的相對路徑或絕對路徑(注意:路徑一定要正确,同時也要確定檔案的格式正确);

第二個參數為flag,cv::imread()支援的flag有:

cv::IMREAD_COLOR(總是讀取到三通道數組中)、

cv::IMREAD_GRAYSCALE(讀取到單通道數組中)、

cv::IMREAD_ANYCOLOR(讀取的通道由具體的檔案決定,最高3通道)、

cv::IMREAD_ANYDEPTH(允許讀取超過深度超過8位的圖像)、

cv::IMREAD_UNCHANGED(完全按照檔案的原有形式進行讀取)、

預設情況下讀取3通道。

cv::Mat cv::imread(  
    const string& filename, // Input filename  
    int flags = cv::IMREAD_COLOR // Flags set how to interpret file  
    ); 
           

2、圖檔的顯示使用的是cv::imshow()函數。

第一個參數為視窗的名稱,第二個參數為要顯示的圖檔檔案,也可以通過函數cv::namedWindow()先建立一個視窗供cv::imshow()使用。

view plain copy
void cv::imshow(  
    const string& name, // Handle used to identify window  
    cv::InputArray image // Image to display in window  
);  
           

3、圖檔的儲存,通過cv::imwrite()函數來實作。其中,第一個參數為儲存目标檔案的路徑名稱,圖檔的類型通過路徑的字尾進行辨別,opencv3支援寫圖檔的類型有:

“.jpg”或“.jpeg”:基線JPEG;8位,單通道或3通道輸入。

“.jp2”:JPEG2000;8位或16位,單通道或3通道輸入。

“.tiff”或“tif”:TIFF;8位或16位,單通道、3通道或4通道輸入。

“.png”:PNG;8位或16位,單通道、3通道或4通道輸入。

“.bmp”:BMP;8位,單通道、3通道或4通道輸入。

“.ppm”或“pgm”:NetPBM;8位,單通道(PGM)或3通道(PPM)。

第二個參數,是圖像資料輸入,注意與寫圖檔的類型比對。

第三個參數,可選,用于參數化的類型,opencv3中支援的params如下:

cv::IMWRITE_JPG_QUALITY:表示JPEG的品質,取值範圍0-100,預設值為95;

cv::IMWRITE_PNG_COMPRESSION:PNG的壓縮率(值越高壓縮率越高),取值範圍0-9,預設值為3;

cv::IMWRITE_PXM_BINARY:使用二進制形式寫PPM、PGM、PBM檔案,取值0或1,預設值1;

bool cv::imwrite(  
    const string& filename, // Input filename  
    cv::InputArray image, // Image to write to file  
    const vector<int>& params = vector<int>() // (Optional) for parameterized fmts  
    ); 
           

最後,為了顯示儲存的效果,使用了函數cvtColor将原圖從BGR彩色空間變換為灰階空間中的圖形(第三個變量表為flag,表示轉換前後的形式)。

從上看我們可以看出,OpenCV2系列中的flag的風格為CV_XXXX,而在OpenCV3中flag的定義風格均變為cv::XXXX)。

實作的具體代碼如下

#include <opencv2/opencv.hpp>  

int main()  
{  
    cv::Mat image, image_gray;  
    image = cv::imread("lenna.jpg", cv::IMREAD_COLOR);  
    cv::imshow("lenna", image);  
    cv::cvtColor(image, image_gray, cv::COLOR_BGR2GRAY);  
    cv::imwrite("lenna_gray.jpg", image_gray);  
    cv::waitKey();  
    return ;  
} 
           

當然這隻是将圖檔儲存為圖檔格式,還可以儲存為txt格式,以便于在MATLAB中處理。