OpenCVとUSBカメラで動画撮影
OpenCVとUSBカメラを使って動画を撮影する。
用意するUSBカメラはその辺で3000円くらいで売っているもので充分。
動画撮影に使うコードはこんな感じで作った。
#video_record.py import numpy as np import cv2 windowname = "Camera View" camera_number = input("カメラ番号を入力してください(デフォルトは0)\n") cap = cv2.VideoCapture(int(camera_number)) if(cap==None): print("カメラが見つかりません") record = False size = (int(cap.get(3)), int(cap.get(4))) fourcc = cv2.VideoWriter_fourcc(*'DIVX') #コーデックの指定 cv2.namedWindow(windowname) print("sで録画開始、qで録画終了、eでプログラム終了\n") while(cap.isOpened()): # カメラ映像が取得できなくなったら止める if(cap==None): print("カメラが見つかりません\n") break ret, frame = cap.read() cv2.imshow(windowname, frame) if(record): #フレーム書き込み rec.write(frame) keyvalue = cv2.waitKey(1) & 0xFF else: #録画停止中はカメラ映像を描画のみ keyvalue = cv2.waitKey(1) & 0xFF if(keyvalue==ord("e")): #ord()で文字列をAsciiコードに変換 if(record): print("録画終了") break elif(keyvalue==ord("s") and not record): #ビデオファイル書き込みの設定 rec = cv2.VideoWriter('test.avi', fourcc, 30, size) print("録画開始") record = True elif(keyvalue==ord("q") and record): rec.release() print("録画終了") record = False # 録画を終えたらVideoWriterをリリース if(record): rec.release() cv2.destroyAllWindows() print("プログラムを終了します")
最初にカメラ番号を入力する必要があるが、1つしか接続していない場合は0を入力すればOK。カメラを何個も接続した場合、自動的に0,1,2...と番号が割り振られていくので、使いたいカメラの番号を指定する。
「Camera View」と名前の付いたウィンドウをクリックした後、対応するキー(s,q,eの3種類)を入力することで録画の制御が可能。
cv2.waitKey()
を使うことで、引数に指定した時間(単位はms)キー入力を待機させられる。cv2.waitKey()の返り値は文字ではなくASCIIコードらしいので、ord()によるASCIIコード取得と組み合わせるとキー入力を判定できる。 この部分は 画像を扱う — OpenCV-Python Tutorials 1 documentation を参考にしてそのまま使ったため、完全には理解できておらず学びが必要。16進数の数値と&を取ることで、見たい部分だけを取り出しているんだろうことは何となく予想できる。Pythonとか関係なくパソコンの仕組みの基礎で出てきそう。基本情報技術者の本、何故か持ってるからもう一回ちゃんと読もうかな…
カメラの映像を1フレーム(露光時間1回分)毎に取り込んで、それをモニタに表示してから、cv2.VideoWriter()に渡して動画にしている、という仕組み。なので、USBカメラ自体のプロパティを開いて、露光時間を直接弄ってやる(製品によって弄れたり弄れなかったりするが)と色々面白い動画が撮れたりする。そのあたりの話はまた別でまとめようと思う。
コーデックの指定については、以下の記事の該当箇所を参照されたし。
OpenCV: cv::VideoWriter Class Reference
fourcc:
4-character code of codec used to compress the frames. For example, VideoWriter::fourcc('P','I','M','1') is a MPEG-1 codec, VideoWriter::fourcc('M','J','P','G') is a motion-jpeg codec etc. List of codes can be obtained at Video Codecs by FOURCC page. FFMPEG backend with MP4 container natively uses other values as fourcc code: see ObjectType, so you may receive a warning message from OpenCV about fourcc code conversion.