今天介紹一個簡單的但最常用的例程,從電腦中讀入圖片並顯示出來。如果小夥伴們已經編譯好了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輸入的話,則默認以單通道載入圖像。