【總結】OpenCV-Python常用API(一)—— 基本IO

1. 前言

最近在學習OpenCV的Python版本,是計算機視覺方面必須掌握的一個跨平臺庫,裏面針對圖形圖像視頻的處理方法有很多,爲了避免遺忘和以後隨用隨查,記錄分享在此。歡迎各位大佬指出不足之處!

2. 圖片讀取

2.1 函數簡述和原型

該函數用於讀取各種常見格式的圖片,讀取結果均爲ndarray。對於單通道灰度圖像即爲二維矩陣,對於彩色3通道圖像即爲heigh*width*channels的三維矩陣。應注意作爲矩陣,第一個下標爲行數,對應圖片的高,第二個下標爲列數,對應圖片的寬。官方文檔:https://docs.opencv.org/3.4.2/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56

img = cv2.imread(filename[, flags])

2.2 參數

  • filename:要讀取的圖片的路徑,可以是相對路徑,字符串形式;
  • flags:讀取圖片的模式,常用的有以下幾種:
    • cv2.IMREAD_UNCHANGED: 包含圖片透明度信息(alpha通道)的彩色圖片,有透明度信息時則圖片有4通道,常見於png格式圖片;
    • cv2.IMREAD_GRAYSCALE: 以灰度方式的讀取圖片,讀取出的是單通道灰度圖片;
    • cv2.IMREAD_COLOR: 讀取3通道BGR彩色圖片,讀取出的是3通道BGR色彩空間下的圖片;

2.3 返回值

  • img:返回的圖像數據,均爲numpy.ndarray類型,並且其中數據類型也均爲numpy.uint8,圖像大小由圖像文件決定,圖像通道數由讀圖模式決定。

3. 色彩空間轉換

3.1 函數簡述和原型

該函數用於將讀取到的圖片色彩空間進行轉換。注意OpenCV中的RGB彩色空間的通道順序相反,順序爲BGR,故在使用matplotlib等庫進行圖像展示時,需要將圖像轉換至RGB彩色空間。官方文檔:https://docs.opencv.org/3.4.2/d7/d1b/group__imgproc__misc.html#ga397ae87e1288a81d2363b61574eb8cab

dst = cv2.cvtColor(src, code)

3.2 參數

  • src:要轉換色彩空間的圖片,ndarray;
  • code:色彩空間轉換方式,常用有以下幾種:
    • cv2.COLOR_GRAY2BGR: 單通道灰度圖像轉換到3通道BGR色彩空間;
    • cv2.COLOR_BGR2GRAY: 3通道BGR圖片轉換爲單通道灰度圖;
    • cv2.COLOR_BGR2RGB: BGR色彩空間轉換爲RGB色彩空間,常用於使用其他圖像庫展示;
    • cv2.COLOR_BGR2HSV:BGR色彩空間轉換爲HSV色彩空間;

3.3 返回值

  • dst:返回色彩空間轉換後的圖像數據,寬高與轉換前一致,通道數目根據轉換的色彩空間決定。

4. 圖片展示

4.1 函數簡述和原型

該函數用於將圖片展示到OpenCV的GUI窗口中。官方文檔:https://docs.opencv.org/3.4.2/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563

cv2.imshow(winname, mat)

4.2 參數

  • winname:展示窗口的名稱,如果目前還沒有定義該名稱的展示窗口,則OpenCV會自動新建一個;
  • mat:要展示的圖片,應注意對於RGB色彩空間,OpenCV中的順序爲BGR;

4.3 用法舉例

img = cv2.imread(r'.\image.jpg', cv2.IMREAD_COLOR)

cv2.imshow('show image', img)

# 應注意在展示圖片後需要hold住程序,否則窗口也就一閃而過了
cv2.waitkey(0)
# 最後銷燬一下窗口回收資源
cv2.destroyAllWindows()

5. 圖片寫入

5.1 函數簡述和原型

該函數主要用於將處理後的圖像保存至文件。官方文檔:https://docs.opencv.org/3.4.2/d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce

retval = cv2.imwrite(filename, img[, params])

5.2 參數

  • filename:保存的圖片路徑和名稱;
  • img:要保存的圖像數據;
  • params:保存時的參數,可選;

5.3 返回值

  • retval:布爾類型,圖片是否保存成功;

6. 視頻處理類初始化

OpenCV中使用VideoCapture類作爲視頻的處理類,既可以從視頻文件中讀取視頻流,也可以從攝像頭設備中讀取視頻流。官方文檔:https://docs.opencv.org/3.4.2/d8/dfe/classcv_1_1VideoCapture.html

6.1 函數簡述和原型

該函數主要用於初始化VideoCapture視頻處理類。

cap = cv2.VideoCapture(filename/index)

6.2 參數

初始化的參數既可以是要打開的視頻文件的路徑(filename),也可以是攝像頭設備的ID(index)。攝像頭設備的ID默認從0開始。

6.3 返回值

  • cap:返回的就是VideoCapture視頻流處理對象;

7. 獲取視頻流信息

7.1 函數簡述和原型

建立VideoCapture後,可以通過該類中的get函數獲取視頻流的各種信息。

retval = cv2.VideoCapture.get(propId)

7.2 參數

  • propId:要獲取的信息對應的ID,常用的有如下幾種:
    • cv2.CAP_PROP_FRAME_WIDTH: 視頻流中幀的寬度;
    • cv2.CAP_PROP_FRAME_HEIGHT: 視頻流中幀的高度;
    • cv2.CAP_PROP_FRAME_COUNT: 視頻流中幀的總數量,對於攝像頭來說,該值爲-1;
    • cv2.CAP_PROP_FPS: 視頻流中的幀速率;

7.3 返回值

  • retval:返回的就是要獲取的視頻流屬性值,應注意返回的類型均爲double,因此對於寬度、高度、幀總數等往往需要轉型;

8. 設置視頻流屬性

8.1 函數簡述和原型

可以通過該函數設置VideoCapture中視頻流的各種屬性。

retval = cv2.VideoCapture.set(propId, value)

8.2 參數

  • propId:要設置的屬性對應的ID,與獲取的屬性ID一致,常設置的屬性有如下幾種:
    • cv2.CAP_PROP_POS_FRAMES: 視頻流中幀的位置,可以通過設置該屬性直接跳到視頻中的某一幀;

8.3 返回值

  • retval:布爾類型,返回是否成功設置視頻流屬性;

9. 獲取視頻幀

9.1 函數簡述和原型

可以通過該函數獲取VideoCapture中視頻流的下一幀。

retval, image = cv2.VideoCapture.read()

9.2 返回值

  • retval:布爾類型,返回是否成功獲取到視頻流中的幀;
  • image:幀圖像數據,一個ndarray;

9.3 用法舉例

# 打開第一個攝像頭設備
cap = cv2.VideoCapture(0)

# 根據FPS計算每一幀應該停留的時間
timeElapse = int(math.floor(1000/cap.get(cv2.CAP_PROP_FPS)))

# 創建窗口以備展示視頻
cv2.namedWindow('Video Player', cv2.WINDOW_NORMAL)

while True:
    ret, frame = cap.read()
    if not ret:
        print('Cannot Get Frame From Camera')
        break
    
    cv2.imshow("Video Player", frame)
    if cv2.waitKey(timeElapse) == ord('q'):
        break

# 釋放資源
cv2.destroyAllWindows()
cap.release()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章