1.imread函數
首先,我們看imread函數,可以在OpenCV官方文檔中查到其原型如下:
Mat imread(const string& filename, int flags=1 );
其中,第一個參數,const string&類型的filename,填我們需要載入的圖片路徑名。在Windows操作系統下,OpenCV的imread函數支持如下類型的圖像載入:
- JPEG文件 - *.jpeg, *.jpg, *.jpe
- JPEG 2000文件- *.jp2
- PNG圖片 - *.png
- 便攜文件格式- *.pbm, *.pgm, *.ppm
- Sun rasters光柵文件 - *.sr, *.ras
- TIFF 文件 - *.tiff, *.tif
- Windows位圖 - *.bmp,*.dib
第二個參數,int類型的flags,為載入標識,它指定一個加載圖像的顏色類型。可以看到它自帶缺省值1.所以有時候這個參數在調用時我們可以忽略,在看了下面的講解之后,我們就會發現,如果在調用時忽略這個參數,就表示載入三通道的彩色圖像。
可以在OpenCV中標識圖像格式的枚舉體中取值。通過轉到定義,我們可以在higui_c.h中發現這個枚舉的定義是這樣的:
- enum
- {
- /* 8bit, color or not */
- CV_LOAD_IMAGE_UNCHANGED =-1,
- /* 8bit, gray */
- CV_LOAD_IMAGE_GRAYSCALE =0,
- /* ?, color */
- CV_LOAD_IMAGE_COLOR =1,
- /* any depth, ? */
- CV_LOAD_IMAGE_ANYDEPTH =2,
- /* ?, any color */
- CV_LOAD_IMAGE_ANYCOLOR =4
- };
相應的解釋:
- CV_LOAD_IMAGE_UNCHANGED,這個標識在新版本中被廢置了,忽略。
- CV_LOAD_IMAGE_ANYDEPTH- 如果取這個標識的話,若載入的圖像的深度為16位或者32位,就返回對應深度的圖像,否則,就轉換為8位圖像再返回。
- CV_LOAD_IMAGE_COLOR- 如果取這個標識的話,總是轉換圖像到彩色一體
- CV_LOAD_IMAGE_GRAYSCALE- 如果取這個標識的話,始終將圖像轉換成灰度1
如果輸入有沖突的標志,將采用較小的數字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 將載入3通道圖。
如果想要載入最真實的圖像,選擇CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。
因為flags是int型的變量,如果我們不在這個枚舉體中取值的話,還可以這樣來:
- flags >0返回一個3通道的彩色圖像。
- flags =0返回灰度圖像。
- flags <0返回包含Alpha通道的加載的圖像。
需要注意的點:輸出的圖像默認情況下是不載入Alpha通道進來的。如果我們需要載入Alpha通道的話呢,這里就需要取負值。
如果你搞怪,flags取1999,也是可以的,這時就表示返回一個3通道的彩色圖像。
2.namedWindow函數
顧名思義,namedWindow函數,用於創建一個窗口。函數原型是這樣的:
- void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE );
第一個參數,const string&型的name,即填被用作窗口的標識符的窗口名稱。
第二個參數,int 類型的flags ,窗口的標識,可以填如下的值:
- WINDOW_NORMAL設置了這個值,用戶便可以改變窗口的大小(沒有限制)
- WINDOW_AUTOSIZE如果設置了這個值,窗口大小會自動調整以適應所顯示的圖像,並且不能手動改變窗口大小。
WINDOW_OPENGL 如果設置了這個值的話,窗口創建的時候便會支持OpenGL。
函數剖析:
首先需要注意的是,它有默認值WINDOW_AUTOSIZE,所以,一般情況下,這個函數我們填一個變量就行了。
namedWindow函數的作用是,通過指定的名字,創建一個可以作為圖像和進度條的容器窗口。如果具有相同名稱的窗口已經存在,則函數不做任何事情。
我們可以調用destroyWindow()或者destroyAllWindows()函數來關閉窗口,並取消之前分配的與窗口相關的所有內存空間。
但話是這樣說,其實對於代碼量不大的簡單小程序來說,我們完全沒有必要手動調用上述的destroyWindow()或者destroyAllWindows()函數,因為在退出時,所有的資源和應用程序的窗口會被操作系統會自動關閉。
3.imshow函數
在指定的窗口中顯示一幅圖像。
- void imshow(const string& winname, InputArray mat);
-
■ 第一個參數,const string&類型的winname,填需要顯示的窗口標識名稱。
■ 第二個參數,InputArray 類型的mat,填需要顯示的圖像。
imshow 函數詳解:
imshow 函數用於在指定的窗口中顯示圖像。如果窗口是用CV_WINDOW_AUTOSIZE(默認值)標志創建的,那么顯示圖像原始大小。否則,將圖像進行縮放以適合窗口。而imshow 函數縮放圖像,取決於圖像的深度:
- 如果載入的圖像是8位無符號類型(8-bit unsigned),就顯示圖像本來的樣子。
- 如果圖像是16位無符號類型(16-bit unsigned)或32位整型(32-bit integer),便用像素值除以256。也就是說,值的范圍是[0,255 x 256]映射到[0,255]。
- 如果圖像是32位浮點型(32-bit floating-point),像素值便要乘以255。也就是說,該值的范圍是[0,1]映射到[0,255]。
四、輸出圖像到文件——imwrite函數
在OpenCV中,輸出圖像到文件,我們一般都用imwrite函數,它的聲明如下:
- bool imwrite(const string& filename,InputArray img, const vector<int>& params=vector<int>() );
第一個參數,const string&類型的filename,填需要寫入的文件名就行了,帶上后綴,比如,“123.jpg”這樣。
■ 第二個參數,InputArray類型的img,一般填一個Mat類型的圖像數據就行了。
■ 第三個參數,const vector<int>&類型的params,表示為特定格式保存的參數編碼,它有默認值vector<int>(),所以一般情況下不需要填寫。