Opencv 例程講解1 ----如何載入並顯示圖片

       今天介紹一個簡單的但最常用的例程,從電腦中讀入圖片並顯示出來。如果小夥伴們已經編譯好了tutorial和examle例程程序(沒有的可以參考Opencv 例程講解 開頭篇----window下例程編譯),可以在tutorial文件夾下找到一個名叫“(TUTORIAL) introduction_windows_vs”,或者”(TUTORIAL) display_image“的例程程序,這兩個程序是一樣的。

源代碼如下(中文部分爲我自己的理解):

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
    if( argc != 2)    //參數個數2個, 使用示例  Project.exe imagePath/test.jpg
    {
     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
     return -1;
    }

    Mat image;  // opencv中最主要的數據存儲格式
    image = imread(argv[1], IMREAD_COLOR); // Read the file  

    // 爲highgui庫中的API 函數,第一個參數爲圖片路徑,可以是相對路徑也可以是絕對路徑,第二個參數控制讀入圖片的方式,可以有以下幾種選擇
    //  IMREAD_UNCHANGED =-1    // 8bit, color or not
    //  IMREAD_GRAYSCALE    = 0    // 8bit, gray
    //  IMREAD_COLOR            = 1    //  color
    //  IMREAD_ANYDEPTH      = 2   // any depth, 
   //   IMREAD_ANYCOLOR     = 4   //  any color
   //  以上爲在highgui.hpp中的定義,感覺還是不是很具體,

 if(! image.data ) // Check for invalid input  //  data爲Mat  格式的數據入口指針,默認爲uchar* 類型,沒有數據時候,爲空
    {
        cout << "Could not open or find the image" << std::endl ;
        return -1;
    }

    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.   // 爲highgui庫中的API函數
    // 有兩個參數,第一個參數爲窗口名,類型爲std::string,第二個參數爲窗口控制參數,通常設置爲 WINDOW_NORMAL 或 WINDOW_AUTOSIZE
    imshow( "Display window", image ); // Show our image inside it.                                            // 爲highgui庫中的API 函數
    // 有兩個參數,第一參數爲窗口名,可以獲得窗口handle,第二個參數爲要顯示的圖像
     waitKey(0); // Wait for a keystroke in the window   
    return 0;
}

可以看出來,例程通過main參數傳遞圖片路徑,可以在cmd下輸入命令運行程序。


如果不想覺得cmd命令行顯示圖片過於麻煩,我們可以直接指定圖片的路徑,註釋掉以下語句,然後給定圖片路徑,即可,第二個參數可以不填,默認IMREAD_COLOR

//     if( argc != 2)
//     {
//      cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
//      return -1;
//     }

    Mat image;
//    image = imread(argv[1], IMREAD_COLOR); // Read the file
	image = imread("F:\\image_set\\lena.jpg");


注意,這裏的路徑輸入需要用 \\ ,

按下任意鍵,程序結束。

另外,imread的第二個參數如 IMREAD_COLOR 等,在highgui.hpp中說明不是很詳細,如果想要了解,imread過程中,這個參數到底是如何起作用的,我們可以在源碼中找到答案,跟蹤進入imread的源碼文件中,我們可以發現以下這個參數通過以下語句來發揮作用

     int type = decoder->type();
    if( flags != -1 )
    {
        if( (flags & CV_LOAD_IMAGE_ANYDEPTH) == 0 )
            type = CV_MAKETYPE(CV_8U, CV_MAT_CN(type));

        if( (flags & CV_LOAD_IMAGE_COLOR) != 0 ||
           ((flags & CV_LOAD_IMAGE_ANYCOLOR) != 0 && CV_MAT_CN(type) > 1) )
            type = CV_MAKETYPE(CV_MAT_DEPTH(type), 3);
        else
            type = CV_MAKETYPE(CV_MAT_DEPTH(type), 1);
    }
其中,type爲圖片解碼後的類型,flags即爲傳人的第二個參數,從if語句的控制流可以看出,當傳人蔘數不是IMREAD_ANYDEPTH時候,Mat 的默認創建類型爲CV_8U,表示一個像素點數據用8位的無符號char表示,值的範圍爲0~255,當傳人蔘數中有IMREAD_COLOR時,通道爲3;當傳人蔘數有IMREAD_ANYCOLOR時,則根據源圖像的通道數決定,如果是單通道的灰度圖像,則也爲灰度圖像,如果通道數>1,則也爲3通道;如果是IMREAD_GRAYSCALE則爲單通道;如果是CV_LOAD_IMAGE_UNCHANGED,則按照原圖type創建。注意IMREAD_ANYDEPTH可以與IMREAD_ANYCOLOR或者IMREAD_COLOR配合使用,如果只有IMREAD_ANYDEPTH輸入的話,則默認以單通道載入圖像。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章