這個分類記錄自己學習opencv的隨筆檔案,方便以後查詢和複習。python-opencv環境設定網上教學很多,此處就不做贅述了,該檔案記錄opencv最基礎的影象讀寫和顯示,工具是jupyter notebook。
1 opencv中,影象讀取函數是 imread(filename, flags=None)
引數說明:
filename:讀取影象的路徑,通常支援jpg、png、bmp、tiff等格式檔案。
flags:圖片讀入的模式,模式定義在cv::ImreadModels中,預設值為IMREAD_COLOR。還有一個常用的模式是:IMREAD_GRAYSCALE,對應值為 0,以灰度圖方式讀取圖片。
注意:imread函數返回一個BGR形式的影象物件,其型別為一個numpy陣列。
2 顯示影象的函數是 imshow(window_name, image)
引數說明:window_name是一個字串,代表要在其中顯示影象的視窗的名稱。image是它是要顯示的影象。
可以用 namedWindow(window_name, flag) 來定義一個視窗,如果沒有定義會根據 imshow 的引數自動生成一個視窗。已經定義的視窗可以用 resizeWindow(window_name,width,height) 來改變視窗大小。
import cv2 import numpy as np img=cv2.imread('C:/Users/86188/Desktop/test/python/cat.jpg',cv2.IMREAD_COLOR) #讀取圖片
cv2.imshow('showimg',img) #顯示圖片 cv2.waitKey(0) #等待使用者操作 cv2.destroyWindow('window') #銷燬視窗
3 除了直接用opencv的imshow來顯示圖片,也可以用matplotlib來顯示圖片
注意需要在顯示的時候進行圖片通道翻轉(直接用::-1,也可以用cvtColor()函數進行顏色通道翻轉),否則顯示的圖片顏色會異常,因為正常圖片的格式是RGB,但是opencv讀取進來的格式是BGR。
用opencv來顯示影象通常需要好幾行程式碼,可以自己封裝成函數,需要的時候直接呼叫:
4 opencv中影象的屬性
在 OpenCV 中,影象是一個 NumPy 陣列,我們可以使用numpy陣列的屬性來存取影象屬性:
影象形狀 - 它是以 [H, W, C] 格式表示的形狀。其中 H,W 和 C 分別是影象的 高度,寬度和通道數 ,我們可以將其存取為 img.shape 。
影象大小 - 它是影象中畫素的總數。它也是陣列中元素的總數。我們可以將其存取為 img.size 。
資料型別 - 它是影象陣列元素的dtype。我們可以將其存取為 img.dtype 。
5 圖片儲存 imwrite(filename,img)
引數說明: filename 表示儲存的檔名稱,img 是需要儲存的影象物件。
建立視窗,讀取顯示和儲存影象的範例如下:
import cv2 #建立視窗 cv2.namedWindow('img',cv2.WINDOW_NORMAL) cv2.resizeWindow('img',640,480) #讀取圖片 img = cv2.imread('./cat.jpg') while True: cv2.imshow('img',img) key = cv2.waitKey(0) #該函數的返回值為ASCLL碼,引數0表示:等待 0 毫秒後,使用者可以通過按鍵盤上的任意鍵來銷燬所有視窗。 if key == ord('q'): #如果鍵盤輸入q,退出 break elif key == ord('s'): #如果鍵盤輸入s,儲存圖片到 當前資料夾下 cv2.imwrite('./mycat.png',img) else: print(key) cv2.destroyAllWindows() #銷燬當前所有視窗
此外,opencv中也可以進行多幅影象的讀取,函數是 imreadmulti(filename) 引數filename是待讀取的影象檔案路徑,返回的結果是tuple型別,包含兩個值,第一個為bool型別,表示是否讀取成功;第二個引數是list型別,儲存讀取的影象結果。多幅影象儲存可以用imwritemulti(filename,img) .引數filename表示儲存的影象檔名稱,img是影象資料。