[OpenCV]fpsを指定して、Webカメラの映像をMP4で保存する方法について
- 2022.08.28
- IT
ネットには、Open CVとWeb USBカメラを使って、MP4ファイルに録画するという記事がいくつかあります。
ただ、どれもfps値はカメラの特有のfps値を使うものでした。
私は、1秒に1回おきに映像を撮り、それをMP4ファイルに保存したかったので、そのコードを書きました。
利用環境
利用環境は、M1 Macですが、Intelでもいけるはずです。
1 2 3 4 5 6 7 8 9 10 |
test@tests-Air ~ % sw_vers ProductName: macOS ProductVersion: 12.3.1 BuildVersion: 21E258 test@tests-Air ~ % sysctl machdep.cpu.brand_string machdep.cpu.brand_string: Apple M1 test@tests-Air ~ % python -V Python 3.9.10 test@tests-Air ~ % pip -V pip 22.0.4 |
コード
pythonで記述しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import cv2 from datetime import datetime import sys import time def record(fps:int, camera_num:int): camera = cv2.VideoCapture(camera_num) w = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)) h = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)) print("fps",fps, " w :",w," h:",h) fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # ファイル名に日付を指定 date = datetime.now().strftime("%Y%m%d_%H%M%S") path = "./" + date + ".mp4" video = cv2.VideoWriter(path, fourcc, fps, (w, h)) time_sta = time.time() while True: cv2.namedWindow("window", cv2.WINDOW_NORMAL) cv2.resizeWindow("window", 1500, int(1500*h/w)) ret, frame = camera.read() cv2.imshow('window', frame) video.write(frame) key = cv2.waitKey(int(1000/fps)) if key == 27:#if ESC is pressed, exit loop camera.release() cv2.destroyAllWindows() break time_end = time.time() tim = time_end- time_sta # print(tim) camera.release() cv2.destroyAllWindows() print("done") sys.exit() if __name__=="__main__": fps = 0.1 # fpsの設定 0.1の場合10秒 camera_num= 0 record(fps, camera_num) |
使い方
引数
fpsとcamera_numを指定して使います。
fpsは、数値が大きくなるほど、コマ数が増えます。(カメラの性能を超えた値の場合、カメラの最大FPSで撮影されます)
また、0,001以下にするとエラーが起こります。(0.1で10秒に1回撮影します)
停止方法
OpenCVで生成されたWindowをクリックして、ESCキーを押すと録画が終了します。
補足
Windowのサイズは、適当に設定してあります。お好きな値でお使いください。
まとめ
time.sleepを使うとキー入力を受け付けないので、このような実装となりました。
もっと良い方法がある方は、ご教授いただければと思います。