【opencv學習筆記五】一個簡單程序:圖像讀取與顯示


 今天我們來學習一個最簡單的程序,即從文件讀取圖像並且創建窗口顯示該圖像。

 

目錄

 

【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 }

 

 

運行之后的顯示結果:

 

下載

 

功能很簡單,代碼很少,建議自己寫一下或者在博文中復制一下,當然實在是懶的不要不要的土豪可以去下面的連接直接下載。

【opencv學習筆記五】圖像讀取與顯示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM