1. 程式人生 > >OpenCV(六)細說HighGUI(建立視窗,載入影象,顯示影象)

OpenCV(六)細說HighGUI(建立視窗,載入影象,顯示影象)

由此可見,這個函式接受兩個引數,第一個引數用來表示視窗的名字,就是給新建的視窗起個合適的名字,這個名字顯示在視窗的頂部,HighGUI的其他函式也是根據這個名字來呼叫該視窗。第二個引數是一個標誌,用來表示是否需要視窗大小自動適應讀入的影象大小。      注意第二個引數,其實它就只有兩個值,一個是0,或者是保持預設設定CV_WINDOW_AUTOSIZE。設定成0的話,視窗的大小就不能自動調整了。      釋放視窗也是十分簡單,直接呼叫函式cvDestroyWindow()就可以,這個函式接受一個字串引數,想必都能想到,這個字串引數就是之前我們對視窗的起的名字。      在OpenCV中,視窗的引用是根據名稱而不是一些控制代碼。控制代碼和視窗名稱之間的轉換都由HighGUI在後臺處理,我們不必要太過關心。 不過HighGUI還是提供了以下函式: void* cvGetWindowHandle(const char* name); const char* cvGetWindowName(void* window_handle); 這些函式允許我們在OpenCV所使用的視窗名稱與各個視窗系統所使用的視窗控制代碼之間進行轉換。      如果想調整視窗的大小該怎麼辦吶?HighGUI提供了cvResizeWindow()函式。
void cvResizeWindow(
     const char*  name,
     int width,
     int height
);

載入影象 為了在視窗中顯示影象,我們需要了解如何從磁碟中載入影象。OpenCV則提供了cvLoadImage()函式,如下:
IplImage* cvLoadImage(
     const char* filename,
     int iscolor = CV_LOAD_IMAGE_COLOR

);
開啟一幅影象時,cvLoadImage()並不分析副檔名,而是通過分析影象檔案的前幾個位元組來確定影象的編碼格式。第二個引數iscolor有幾個值可以選擇。預設情況下,影象是以每個通道8位,3個通道的形式被讀入;CV_LOAD_IMAGE_ANYDEPTH 非8位的影象;CV_LOAD_IMAGE_GRAYSCALE 影象強制轉換單通道;CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH 16位的彩色影象。  CV_LOAD_IMAGE_UNCHANGED 讀入資料與原始影象通道數以及位數保持一致。 注意:當cvLoadImage()讀入失敗時,並不會產生執行時錯誤,而是返回一個空指標。 當想儲存一幅影象時就要用到另外一個函式cvSaveImage(),看看它的定義:
int cvSaveImage(
     const char* filename,
     const CvArr* image

);
第一個引數表示檔名,其中字尾部分用來指定影象儲存的編碼格式。第二個引數指向要儲存影象的資料。對於大部分檔案格式,cvSaveImage()只能儲存8位單通道或者8位3通道格式的影象。新的檔案格式PNG,TIFF或者JPEG2000,允許儲存16位甚至浮點型格式,同樣也部分支援4通道格式(BGRA)的影象。儲存成功時,返回1,否則返回0。 顯示影象 顯示影象其實也是十分簡單了,只需要cvShowImage()函式就可以了。
void cvShowImage(
          const char* name,
          const CvArr* image

);
第一個引數用來指定顯示影象的視窗,第二個引數指定要顯示的影象。        讓我們再來看一個比較重要的函式:cvWaitKey() 這個函式在一個給定的時間內(單位ms)等待使用者按鍵觸發,如果在給定的時間內使用者按下了一個鍵,函式返回使用者按下的鍵,否則,返回0,。具體使用如下:
 while(1){
          if(cvWaitKey(100)==27)break;
}
在這個程式中,我們告訴OpenCV等待使用者觸發事件100ms,如果在100ms中沒有使用者觸發,則繼續迴圈;      cvWaitKey(),需要介紹的是:這個函式是可以接受0引數的,在這種情況下,cvWaitKey()會無限期等待,直到使用者觸發一個按鍵。