- 學習OpenCV 4:基于Python的算法實戰
- 肖鈴
- 1194字
- 2022-05-05 19:40:08
2.2.1 案例7:圖像讀取
單幅圖像讀取操作由imread函數完成,該函數從圖像文件中載入一幅圖像并返回,若讀取失敗,則返回空矩陣(Mat:data==NULL)。
目前支持的圖片格式如表2.1所示。
表2.1

imread函數的C++語言函數定義如下:

imread函數的Python語言函數定義如下:

imread函數的參數說明如下。
● filename:待讀取的圖像文件路徑。
● flags:圖像讀取模式,模式定義在cv:ImreadModels中,默認值為IMREAD_COLOR。
● retval:讀取的圖像矩陣,返回值類型為Mat(Mat數據結構將在第3章講解)。
imread函數通過文件內容而不是文件擴展名來確定圖像的類型,對于彩色圖像,圖像將按照BGR的通道順序解碼。
知識點:OpenCV中所有的接口均定義在命令空間cv中,因此,C++語言開發需要使用命名空間cv,如cv:imread。
圖像讀取模式ImreadModels的定義如下:

ImreadModes為枚舉類型,因此,讀者在傳入該參數時,可以使用cv:IMREAD_GRAYSCALE枚舉值形式,也可以直接傳入枚舉值的數值1,這兩種形式等價。
提示:為了便于講解,在案例中會先用到后續章節所講的OpenCV函數,分別如下。
● imshow:圖像顯示。
● waitKey:等待讀者按鍵操作。
● destroyWindow:窗口銷毀。
讀者如果想了解這些函數的功能細節,則可以跳轉到第6章。
本案例實現圖像讀取的Python代碼如下:

如果在目錄中沒有圖像文件src.jpg,則圖像讀取會失敗,返回None,在進行代碼調試時,可以查看變量的值,如圖2.1所示。

圖2.1
此時,如果繼續運行程序,則會報錯,如圖2.2所示。

圖2.2
圖2.2中的報錯原因為斷言失敗。因為在顯示圖像之前,程序會斷言讀取的圖像矩陣的寬高尺寸均大于0(size.width>0 && size.height>0),而讀取空圖像返回值為None,顯然不滿足斷言條件,所以出現斷言失敗報錯,程序崩潰。
因此,在讀取一幅圖像并將讀取的圖像矩陣用于后續操作之前,需要先判斷讀取的內容是否為空,若為空則不進行相關操作;否則可能會出現意想不到的錯誤。

這樣,程序執行就不會出錯了,只會打印圖像讀取錯誤信息。
知識點:在進行圖像讀取操作之前,判斷圖像矩陣是否為空或圖像的尺寸是否大于0是一個好的編碼習慣,在C、C++語言中,對指針等使用前的判空也是如此。
圖像讀取失敗的原因一般有3種:文件不存在、沒有讀取權限、文件格式錯誤。本案例的原因為圖像文件不存在,因此,在路徑下添加圖像文件之后,讀取結果如圖2.3所示。

圖2.3
圖像讀取還有另外一個函數imreadmulti,作用是從一個文件中讀取多幅圖像。
imreadmulti函數的C++語言函數定義如下:

imreadmulti函數的Python語言函數定義如下:

imreadmulti函數的參數說明如下。
● filename:待讀取的圖像文件路徑。
● mats:讀取的圖像文件集合(返回值)。
● flags:圖像讀取模式,模式定義在cv:ImreadModels中。
● retval:函數調用是否成功的狀態值,bool類型。
從一個文件中讀取多幅圖像案例的代碼如下:

案例中首先讀取圖像文件,然后將讀取到的多幅圖像顯示出來。在第7行打斷點調試,可以查看imreadmulti的返回值,如圖2.4所示。

圖2.4
函數imreadmulti返回的結果res的類型為tuple,包含兩個值,第一個值為bool類型,該值表示函數調用的狀態,即圖像文件讀取是否成功;若成功則第二個參數為list類型,保存的就是讀取的圖像結果。
讀取的圖像結果顯示如圖2.5所示(讀取的圖像為imwritemulti函數保存多幅圖像的結果)。

圖2.5
- Microsoft Exchange Server PowerShell Cookbook(Third Edition)
- 深度學習經典案例解析:基于MATLAB
- Mastering Ember.js
- Visual Basic編程:從基礎到實踐(第2版)
- Three.js開發指南:基于WebGL和HTML5在網頁上渲染3D圖形和動畫(原書第3版)
- PHP+MySQL網站開發技術項目式教程(第2版)
- 數據結構(C語言)
- Python機器學習:手把手教你掌握150個精彩案例(微課視頻版)
- TypeScript項目開發實戰
- Python深度學習:基于TensorFlow
- Node Cookbook(Second Edition)
- 小型編譯器設計實踐
- QPanda量子計算編程
- 從零開始學Selenium自動化測試:基于Python:視頻教學版
- SAP Web Dynpro for ABAP開發技術詳解:基礎應用