【python】opencv 利用電腦攝像頭捕獲影象並儲存
阿新 • • 發佈:2018-12-29
-
目標
- 利用筆記本的的內建攝像頭錄影並且儲存。
cv2.VideoCapture()
、cv2.VideoWriter()
、read()
、write()
的使用。
-
示例程式碼
python # -*- coding:utf-8-*- import numpy as np import cv2 def video_capture(filePath): cap = cv2.VideoCapture(0) fps = cap.get(cv2.cv.CV_CAP_PROP_FPS) size = (int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))) fourcc = cv2.cv.FOURCC(*'CVID') out = cv2.VideoWriter(filePath, fourcc, fps, size) while (cap.isOpened()): ret, frame = cap.read() if ret == True: frame = cv2.flip(frame, 0) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('iframe', gray) out.write(gray) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break cap.release() out.release() cv2.destroyAllWindows() if __name__ == '__main__': filePath = 'D:\output.avi' video_capture(filePath)
-
獲取視訊
cap = cv2.VideoCapture(0)
開啟筆記本的內建攝像頭。cap = cv2.VideoCapture('D:\output.avi')
開啟視訊檔案
** 注意**:若初始化攝像頭或者開啟視訊檔案不成功,opencv不會提示你。使用print cap.isOpened()
檢視,若返回值是True
,則表明成功,否則返回值是False
。
-
讀入視訊
cap.read()
按幀讀取視訊,它的返回值有兩個:ret
,frame
。其中ret
是布林值,如果讀取幀是正確的則返回True,如果檔案讀取到結尾,它的返回值就為False。frame
-
播放視訊
cv2.imshow('iframe', gray)
播放視訊,第一個引數是視訊播放視窗的名稱,第二個引數是視訊的當前幀。cv2.waitKey(25)
每一幀的播放時間,毫秒級。
-
停止捕獲視訊
本示例中有兩種停止捕獲視訊的方式:
if ret == True: frame = cv2.flip(frame, 0) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('iframe', gray) out.write(gray) if cv2.waitKey(25) & 0xFF == ord('q'): break else: break
- 通過外部鍵盤輸入
cv2.waitKey(25) & 0xFF == ord('q'):
break
在25毫秒內如果鍵盤輸入了“q”,則停止捕獲視訊;
- 通過
cap.read()
的返回值ret,若ret值為False,則停止捕獲視訊。這種適合讀取視訊檔案時進行判定,通過攝像頭錄影則只能通過第一種方式停捕獲視訊。
-
視訊的一些處理方式
- 灰度視訊
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
本例中是將攝像頭捕獲的視訊轉換為灰色並且儲存。 - 視訊旋轉
cv2.flip(frame, 0)
第一個引數表示要旋轉的視訊,第二個引數表示旋轉的方向,0表示繞x軸旋轉,大於0的數表示繞y軸旋轉,小於0的負數表示繞x和y軸旋轉。
-
獲取視訊的引數資訊
使用函式 cap.get(propId)
來獲得視訊的一些引數資訊,使用cap.set(propId, value)
設定視訊的一些引數資訊,propId的值從0到18分別為:
- **CV_CAP_PROP_POS_MSEC ** Current position of the video file in milliseconds or video capture timestamp.
- CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
- CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 - start of the film, 1 - end of the film.
- CV_CAP_PROP_FRAME_WIDTH 視訊每一幀的寬。
- CV_CAP_PROP_FRAME_HEIGHT 視訊每一幀的高。
- CV_CAP_PROP_FPS 視訊的幀速。
- CV_CAP_PROP_FOURCC 4個字元表示的視訊編碼器格式。
- CV_CAP_PROP_FRAME_COUNT 視訊的幀數。
- CV_CAP_PROP_FORMAT Format of the Mat objects returned byretrieve().
- CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
- CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
- CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
- CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
- CV_CAP_PROP_HUE Hue of the image (only for cameras).
- CV_CAP_PROP_GAIN Gain of the image (only for cameras).
- CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
- CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
- CV_CAP_PROP_WHITE_BALANCE Currently not supported
- CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
注意:當你查詢的屬性是VideoCapture()不支援的屬性時,返回值為0.
-
儲存視訊
out = cv2.VideoWriter(filePath, fourcc, 800, size)
設定輸出視訊的名稱,視訊的格式,視訊的幀速,視訊的大小等。fourcc = cv2.cv.FOURCC(*'CVID')
設定要儲存視訊的格式。
-
釋放物件和銷燬視窗
cap.release()
out.release()
cv2.destroyAllWindows()
作者:刑素素
連結:https://www.jianshu.com/p/182d83926b45
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。