文章目錄
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()