官术网_书友最值得收藏!

2.2.1 案例7:圖像讀取

單幅圖像讀取操作由imread函數完成,該函數從圖像文件中載入一幅圖像并返回,若讀取失敗,則返回空矩陣(Mat:data==NULL)。

目前支持的圖片格式如表2.1所示。

表2.1

img

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所示。

img

圖2.1

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

img

圖2.2

圖2.2中的報錯原因為斷言失敗。因為在顯示圖像之前,程序會斷言讀取的圖像矩陣的寬高尺寸均大于0(size.width>0 && size.height>0),而讀取空圖像返回值為None,顯然不滿足斷言條件,所以出現斷言失敗報錯,程序崩潰。

因此,在讀取一幅圖像并將讀取的圖像矩陣用于后續操作之前,需要先判斷讀取的內容是否為空,若為空則不進行相關操作;否則可能會出現意想不到的錯誤。

這樣,程序執行就不會出錯了,只會打印圖像讀取錯誤信息。

知識點:在進行圖像讀取操作之前,判斷圖像矩陣是否為空或圖像的尺寸是否大于0是一個好的編碼習慣,在C、C++語言中,對指針等使用前的判空也是如此。

圖像讀取失敗的原因一般有3種:文件不存在、沒有讀取權限、文件格式錯誤。本案例的原因為圖像文件不存在,因此,在路徑下添加圖像文件之后,讀取結果如圖2.3所示。

img

圖2.3

圖像讀取還有另外一個函數imreadmulti,作用是從一個文件中讀取多幅圖像。

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

img

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

img

imreadmulti函數的參數說明如下。

● filename:待讀取的圖像文件路徑。

● mats:讀取的圖像文件集合(返回值)。

● flags:圖像讀取模式,模式定義在cv:ImreadModels中。

● retval:函數調用是否成功的狀態值,bool類型。

從一個文件中讀取多幅圖像案例的代碼如下:

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

img

圖2.4

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

讀取的圖像結果顯示如圖2.5所示(讀取的圖像為imwritemulti函數保存多幅圖像的結果)。

img

圖2.5

主站蜘蛛池模板: 白玉县| 怀安县| 沅陵县| 门源| 红原县| 忻州市| 枣阳市| 达日县| 新郑市| 马龙县| 屏东县| 昔阳县| 会昌县| 茶陵县| 永宁县| 壶关县| 金山区| 东海县| 当涂县| 芜湖县| 鸡东县| 安溪县| 保定市| 英吉沙县| 花莲市| 华宁县| 双辽市| 台北县| 五大连池市| 长岛县| 西盟| 肇庆市| 新泰市| 东丰县| 苍梧县| 龙口市| 柏乡县| 思茅市| 仙居县| 苍山县| 景宁|