將圖片在指定窗口中顯示-OpenCV應用學習筆記一

                                       萌虎嗅薔薇logo

一、OpenCV模塊劃分

OpenCV其實就是一堆用C和C++語言來實現計算機視覺算法的源代碼文件;例如C接口函數cvCany()實現了Canny邊緣提取算法,咱們能夠直接將這些源代碼添加到本身的軟件項目中,而不須要本身去寫代碼實現Canny算法。同時因爲源文件居多,因此根據算法的功能將源文件分到多個模塊中(以下),將每一個模塊中的源文件編譯成一個庫文件(如opencv_core.lib、opencv_highgui.lib),用戶調用時僅將所需的庫文件添加到本身的項目中,與本身的源文件一塊兒鏈接成可執行程序便可。c++

OpenCV2.0主體分爲五個模塊

一、CV圖像處理和視覺算法算法

  二、MLL統計分類器數組

  三、HighGUI圖像和視頻輸入/輸出數據結構

  四、CXCORE(基本結構和算法,XML支持,繪圖函數)函數

  五、CvAux(存放即將被淘汰的算法和函數,新出現的實驗性算法和函數)ui

CVCAM攝像機接口屬於OpenCV1.0版內容,在之後的版本中被棄用)spa

二、命令行參數 argc/argv

c/c++語言中的main函數,常常帶有參數argc,argv,以下:操作系統

int main(int argc,char** argv)或者int main(int argc,char* argv[])命令行

*一、argc:命令行輸入參數個數,以空白符分隔3d

*二、argv:中存儲了命令行參數

*三、以下圖在dos命令下進入到openpictures.exe文件所在目錄下運行命令:openpictures.exe lena.jpg  lena2.jpg

那麼有:argc=3,argv[0] = openpictures.exe,argv[1] = lena.jpg,argv[2] = lena2.jpg。

S7[S{Y_7O70Y1X{~[MJSQAC_thumb[4]

三、麻雀雖小五臟俱全之典例精析

實現功能:

    輸入openpictures.exe lena.jpg命令符後,執行:顯示lena.jpg圖片的功能

    輸入openpictures.exe lena.jpg lena2.jpg命令符後,執行:顯示lena.jpg圖像、並將其寫入lena2.jpg文件           

  (你會發如今lena.jpg所在文件目錄下多出來一個lena2.jpg文件而且跟lena.jpg圖片信息同樣)

函數精析:

  1. cvLoadImage(fileName,flag)

    • 將圖像文件fileName以flag表明的格式加載至內存
    • fileName包含文件的擴展名,肯定被加載文件的格式;例如lena.jpg
    • flag<0:默認讀取圖像的原通道數;flag=0:強制以單通道灰度形式讀取;flag>0:強制以三通道形式讀取
    • 高層調用接口,經過fileName肯定被加載文件的格式,而且該函數將自動分配圖像數據結構所需的內存。函數執行完後將返回一個指針,此指針指向一塊爲描述該圖像文件的數據結構而分配的內存塊。
  2. cvNamedWindow(「win1」,CV_WINDOW_AUTOSIZE)

    • 用於在屏幕上建立一個窗口,將被顯示的圖片包含於該窗口中
    • win1:指定了窗口的標題,其餘函數與該窗口進行交互使用時,經過該參數值引用這個窗口
    • 第二個參數定義了窗口的屬性,一般設爲CV_WINDOW_AUTOSIZE/1,二者等價:表示窗口大小會自動調整以適應被顯示的圖像,而且不可以手動調節大小。設爲>=0的其餘數值時:圖像只能在窗口中根據窗口大小進行拉伸或縮放。
  3. cvShowImage(「win1」,img)

    • 將在制定的窗口win1中顯示圖像img
    • 參數1:顯示圖像的窗口標識符;參數2:要被顯示的圖像
    • 該函數調用時窗口將被從新繪製,同時圖像也會顯示在窗口中
    • 只要有一個與某個圖像文件相對應的IplImage*類型指針,咱們就能夠在一個已建立好的窗口中使用該函數顯示該圖像
  4. cvWaitKey(int delay)

    • delay<=0時:永久等待;delay>0時:等待至少delay毫秒時間,由於考慮到操做系統切換時間
    • 在沒有按鍵按下時,函數等待delay 毫秒時間長後返回-1;若是按鍵按下則返回按鍵的ASCII碼,而後繼續執行程序
    • fileName包含文件的擴展名,肯定被加載文件的格式;例如lena.jpg
    • flag<0:默認讀取圖像的原通道數;flag=0:強制以單通道灰度形式讀取;flag>0:強制以三通道形式讀取
  5. cvReleaseImage(&img)

    • 一旦用完加載到內存的圖像文件,咱們就能夠釋放該圖像文件所分配的內存。調用完畢後img指針將被設置爲NULL。
  6. cvDestoryWindow(「win1」)

    • 銷燬顯示圖像文件的窗口;關閉窗口並釋放該窗口所分配的全部內存(包括窗口內部的圖像內存緩區:保存了與img指針相關的圖像文件像素的一個副本)。
    • 當應用程序的窗口被關閉時,該應用程序窗口所佔用的一切資源都會由操做系統自動釋放,因此對一些簡單的程序,沒必要調用cvDestroy()或cvReleaseImage()函數顯式釋放資源。可是,養成習慣每次都調用這些函數顯式釋放資源老是好的
  7. cvMoveWindow(「win1」,int x,int y)

    • 移動win1窗口到指定的座標(x,y)位置
    • 默認顯示屏左上角爲原點;x,y:爲偏移位置
  8. cvResizeWindow(「win1」,int width,int height)

    • 設定窗口尺寸爲指定寬度和高度
    •   設定的窗口尺寸是指顯示圖像的窗口尺寸,不包含拖動條
    • 只有建立的窗口flag屬性不爲CV_WINDOW_AUTOSIZE時纔可以調用此函數
  9. cvGetSize(const CvArr* arr)

    • 函數返回輸入矩陣或者圖像arr的行數和列數;當爲圖像時返回感興趣區域的尺
  10. cvCreateImage(CvSize size,int depth,int channels)
      • 建立圖像頭而且分配圖像數據;返回IplImage結構
      • size:圖像的寬度和高度;depth:圖像像素的位深度;channels:圖像的通道數
      • 位深度:可使有的選擇以下:

    IPL_DEPTH_8U:無符號8bit整型

    IPL_DEPTH_8S:無符號8bit整型

    IPL_DEPTH_16U:無符號16bit整型

    IPL_DEPTH_16S:有符號16bit整型

    IPL_DEPTH_32S:有符號32bit整型

    IPL_DEPTH_32F:單精度浮點數

    IPL_DEPTH_64F:雙精度浮點數

  11. cvCopy(const CvArr* src,const CvArr* dst,const CvArr* mask)

    • 函數複製一個數組數據到另外一個數組中
    • src:源輸入數組;dst:輸出數組;mask:操做掩碼,必須爲8位單通道數組,指定輸出數組的被改變元素
    • dst(i) = src(i) if mask(i) != 0
    • 輸入輸出數組必須爲同類型,維數大小相同;若是是IplImage類型,則ROI和COI將被使用
  12. cvSaveImage(const char* filename,const CvArr* Image)

    • 保存圖像Image到指定文件filename

附源代碼:

#include "stdafx.h"
#include "highgui.h"

int main(int argc, char** argv)
{
    IplImage* pImg;                         //聲明IplImage指針

    if(argc == 2 && (pImg = cvLoadImage(argv[1],1)) !=  0)     //當(「輸入兩個字符串」而且「成功讀入圖片」)時
        {
        cvNamedWindow("Image",1);          //建立標題爲Image的窗口,而且隨實際圖片大小改變窗口尺寸
        cvShowImage("Image",pImg);          //在Image窗口內顯示pImg指針所指圖像
        cvWaitKey();                        //等待按鍵
        cvDestroyWindow("Image");           //銷燬窗口
        cvReleaseImage(&pImg);              //釋放圖像
        return 0;
        }

    else if(argc == 3 && (pImg = cvLoadImage(argv[1],1)) !=  0)    //當(「輸入三個字符串」而且「成功讀入圖片」)時
        {
        IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels);  //以圖像pImg的格式建立圖像pImg2
        cvCopy(pImg,pImg2,NULL);          //複製pImg圖像數據到pImg2
        cvSaveImage(argv[2],pImg2);       //把圖像pImg2寫入以輸入第三個字符串爲名字的文件中
        cvNamedWindow("Image",1);          //建立窗口
        cvShowImage("Image",pImg);         //顯示圖像
        cvWaitKey(0);                      //等待按鍵
        cvDestroyWindow("Image");          //銷燬窗口
        cvReleaseImage(&pImg);             //釋放圖像
        return 0 ;
        }
    return -1;
}
相關文章
相關標籤/搜索