imread函數、namedWindow函數、imshow函數、imwrite函數


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中發現這個枚舉的定義是這樣的:

  1. enum  
  2. {  
  3. /* 8bit, color or not */  
  4.    CV_LOAD_IMAGE_UNCHANGED  =-1,  
  5. /* 8bit, gray */  
  6.    CV_LOAD_IMAGE_GRAYSCALE  =0,  
  7. /* ?, color */  
  8.    CV_LOAD_IMAGE_COLOR      =1,  
  9. /* any depth, ? */  
  10.    CV_LOAD_IMAGE_ANYDEPTH   =2,  
  11. /* ?, any color */  
  12.    CV_LOAD_IMAGE_ANYCOLOR   =4  
  13. };

 

相應的解釋:

  • 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函數,用於創建一個窗口。函數原型是這樣的:

  1. 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函數

在指定的窗口中顯示一幅圖像。

  1. 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函數,它的聲明如下:

  1. 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>(),所以一般情況下不需要填寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM