今天我們來學習一個最簡單的程序,即從文件讀取圖像並且創建窗口顯示該圖像。
目錄
【imread】圖像讀取
【namedWindow】創建window窗口
【imshow】圖像顯示
【imwrite】圖像寫入文件
【waitKey】等待按鍵按下
前言
在說正文之前先簡單介紹一下Mat類。Mat類是opencv2.0的主流圖像類型,在之前opencv1.0使用的Iplimage*類型,Iplimage*是C語言接口類型,使用Iplimage*時需要考慮到關閉窗口時圖形內存的釋放問題。而使用Mat則在一定程度上不需要手動管理內存,窗口關閉時會自動釋放圖像內存。
以下兩點這是我在運行程序時遇到的問題,當然如果大家沒有碰到的話就可以直接無視了。
第一點是關於waitKey()函數的,在學習圖像顯示之前我先寫了一個waitKey()等待按鍵按下退出的程序。
1 int main() 2 { 3 int c; 4 while (1) 5 { 6 c = waitKey(0); 7 if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q鍵或者ESC鍵退出程序 8 break; 9 } 10 return 0; 11 }
發現這個程序無論我怎么按按鍵都沒有用。一通百度之后終於發現在waitKey()函數的說明文檔中有這么一段注意事項:
翻譯過來就是waitKey()函數只有存在一個或一個以上highGUI窗口並且該窗口處於激活狀態時才有效。於是我修改了以上代碼如下:
1 int main() 2 { 3 int c; 4 Mat img1 = imread("1.jpg"); 5 namedWindow("圖像顯示"); 6 while (1) 7 { 8 imshow("圖像顯示", img1);//顯示圖像 9 c = waitKey(0); 10 if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q鍵或者ESC鍵退出程序 11 break; 12 } 13 return 0; 14 }
測試之后發現還是不可以,於是博主又是一通折騰,將我創建的窗口移一下位置,發現我創建的窗口竟然有兩個:
無論怎么點前面帶圖像的窗口都沒有把窗口激活,只有點后面那個不帶圖像的才算選擇窗口,然后按鍵才有效。到這里已經測試實現了waitKey()函數的作用。但是有強迫症的博主當然不能容忍有兩個同名窗口。於是又是一通百度。發現了兩個解決發法。親測都可用:
1.之前博主是在debug模式下運行的,調到release模式下就可以。但是都說了博主有強迫症怎么就想在debug模式下使用,所以博主用的是第二這個方法。
2.在配置VS環境的時候,我們按照網上大部分的教程(包括博主自己轉載的教程),在配置附加依賴項的時候將debug版本與release版本的都添加了,所以會出現上面的問題,把debug下配置的不帶d的lib刪掉就可以了。需要注意的是,如果勾選的從父項繼承,而父項里面有不帶d的lib時,上述問題還是會出現。博主取消了勾選父項繼承,不知道以后會不會有問題。
正文
【imread】圖像讀取
Mat imread( const String& filename, int flags = IMREAD_COLOR );
第一個參數const string& filename:要讀取的文件名稱。需要注意的是這里給的圖片名稱是帶有后綴的,並且后綴需要與文件后綴一致。這個文件名稱可以是圖片的絕對路徑(F:\\2.jpg或F:/2.jpg)也可以是相對路徑。當給相對路徑時,必須將該圖片放到工程目錄與.cpp文件統一目錄下。圖片格式可以是一下類型之一:
- Windows bitmaps - \*.bmp, \*.dib (always supported) - JPEG files - \*.jpeg, \*.jpg, \*.jpe (see the *Notes* section) - JPEG 2000 files - \*.jp2 (see the *Notes* section) - Portable Network Graphics - \*.png (see the *Notes* section) - WebP - \*.webp (see the *Notes* section) - Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm (always supported) - Sun rasters - \*.sr, \*.ras (always supported) - TIFF files - \*.tiff, \*.tif (see the *Notes* section) - OpenEXR Image files - \*.exr (see the *Notes* section) - Radiance HDR - \*.hdr, \*.pic (always supported) - Raster and Vector geospatial data supported by Gdal (see the *Notes* section)
第二個參數int flags:讀取的圖片格式。圖片格式可以是imageMode枚舉:
IMREAD_UNCHANGED = -1, //讀取原圖 IMREAD_GRAYSCALE = 0, //灰度圖像 IMREAD_COLOR = 1, //彩色圖像 IMREAD_ANYDEPTH = 2, //原圖圖像深度 IMREAD_ANYCOLOR = 4, //原圖色彩 IMREAD_LOAD_GDAL = 8, // IMREAD_REDUCED_GRAYSCALE_2 = 16, // IMREAD_REDUCED_COLOR_2 = 17, // IMREAD_REDUCED_GRAYSCALE_4 = 32, // IMREAD_REDUCED_COLOR_4 = 33, // IMREAD_REDUCED_GRAYSCALE_8 = 64, // IMREAD_REDUCED_COLOR_8 = 65, // IMREAD_IGNORE_ORIENTATION = 128 //
【namedWindow】創建window窗口
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
第一個參數const string& winname:要創建的窗口名稱。窗口名稱是窗口的唯一標識,如果要創建的窗口名稱已經存在,則該函數不執行任何操作。
第二個參數int flags:窗口屬性。支持WindowFlags枚舉:
WINDOW_NORMAL = 0x00000000, //用戶可任意調整窗口大小(無限制) WINDOW_AUTOSIZE = 0x00000001, //根據圖像自動調整窗口大小,用戶不可調節 WINDOW_OPENGL = 0x00001000, // WINDOW_FULLSCREEN = 1, //全屏 WINDOW_FREERATIO = 0x00000100, //最大化 WINDOW_KEEPRATIO = 0x00000000, //保持原圖比例 WINDOW_GUI_EXPANDED=0x00000000, // WINDOW_GUI_NORMAL = 0x00000010, //
【imshow】圖像顯示
void imshow(const String& winname, InputArray mat);
第一個參數const string& winname:用於顯示圖片的窗口。
第一個參數InputArray mat:要顯示的圖像數據。
【imwrite】圖像寫入文件
bool imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
第一個參數const string& filename:文件名稱。支持的文件類型與imread相同。
第二個參數InputArray img:圖像數據。
第三個參數params:圖像保存的參數,可以不填。
【waitKey】等待按鍵按下
int waitKey(int delay = 0);
等待按鍵按下。括號內參數為延時時間,單位是毫秒ms,有默認參數0,當參數為0時表示一直等待按鍵按下。需要說明的是waitKey()函數只有在至少有一個window窗口並且窗口處於激活作態時才有效。
實例
1 //************頭文件包含************* 2 #include "stdafx.h" 3 #include<iostream> 4 #include<opencv.hpp>//包含opencv的頭文件 5 //*********************************** 6 7 8 //************命名空間*************** 9 using namespace cv;//使用opencv命名空間 10 using namespace std; 11 //*********************************** 12 13 14 //************主函數***************** 15 int main() 16 { 17 int c; 18 Mat img1 = imread("1.jpg"); 19 20 namedWindow("圖像顯示");//創建窗口 21 22 while (1) 23 { 24 imshow("圖像顯示", img1);//顯示圖像 25 26 c = waitKey(0);//等待按鍵按下 27 if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q鍵或者ESC鍵退出程序 28 break; 29 } 30 31 return 0; 32 }
運行之后的顯示結果:
下載
功能很簡單,代碼很少,建議自己寫一下或者在博文中復制一下,當然實在是懶的不要不要的土豪可以去下面的連接直接下載。