今回はJetsonNanoで動画を撮影する方法について紹介していきます。
JetsonNanoで動画を撮影する場合、以下のいずれかのカメラを使用することになると思います。
①WEBカメラ(USBコードで接続)
②RaspberryPiカメラモジュールを接続して動画を撮影する場合
②JetbotのJetcamを利用する場合
Jetbotを購入した場合には③のJetcamも利用できると思います。WebカメラとRaspberryPiカメラモジュールは持っていなければ別途購入します。
WEBカメラを接続して動画を撮影する場合
WEBカメラを接続して動画を撮影する場合についてです。JetsonNanoに入れたPythonとOpenCVで動画の撮影を行いたい場合、「VideoCapture」クラスを使用します。
「VideoCapture.py」でファイルを作成し、以下の内容をコピペしてから保存してください。なお、日本語のコメントはエラーになることが多いので実際に使用するときは日本語を削除してから実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import cv2 camera = cv2.VideoCapture(0) # カメラCh.(ここでは0)を指定 # 動画ファイル保存用の設定 fps = int(camera.get(cv2.CAP_PROP_FPS)) # カメラのFPSを取得 w = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)) # カメラの横幅を取得 h = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)) # カメラの縦幅を取得 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # 動画保存時のfourcc設定(mp4用) video = cv2.VideoWriter('video.mp4', fourcc, fps, (w, h)) # 動画の仕様(ファイル名、fourcc, FPS, サイズ) # 撮影=ループ中にフレームを1枚ずつ取得(qキーで撮影終了) while True: ret, frame = camera.read() # フレームを取得 cv2.imshow('camera', frame) # フレームを画面に表示 video.write(frame) # 動画を1フレームずつ保存する # キー操作があればwhileループを抜ける if cv2.waitKey(1) & 0xFF == ord('q'): break # 撮影用オブジェクトとウィンドウの解放 camera.release() cv2.destroyAllWindows() |
以下のようにして実行することができます。
1 |
python VideoCapture.py |
参考にさせていただいた記事はこちらです。
Python, OpenCVで動画を読み込み(ファイル・カメラ映像)
Python/OpenCVでWebカメラ!撮影した動画を保存する
RaspberryPiカメラモジュールを接続して動画を撮影する場合
RaspberryPiカメラモジュールを接続して動画を撮影する場合は以下のようにします。動画のサイズを変更するときはwidth=(int)640, height=(int)480の部分を変更します。
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 |
import cv2 GST_STR = 'nvarguscamerasrc \ ! video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)30/1 \ ! nvvidconv ! video/x-raw, width=(int)640, height=(int)480, format=(string)BGRx \ ! videoconvert \ ! appsink' WINDOW_NAME = 'Camera Test' def main(): cap = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER) while True: ret, img = cap.read() if ret != True: break cv2.imshow(WINDOW_NAME, img) key = cv2.waitKey(10) if key == 27: # ESC break if __name__ == "__main__": main() |
以下のようにして実行することができます。終了するときはエスケープキーを押下します。
1 |
sudo python csicamera.py |
参考にさせていただいた記事はこちらです。
Jetson Nano 開発者キットで Raspberry Pi カメラを使う
JetbotのJetcamを利用する場合
次にJetbotのJetcamを利用する場合について説明していきます。
Jetbotを購入した場合、Jetcamがインポートできる状態となっているのでこちらを利用します。なお、Jetcamを利用した場合はカメラモジュールとWEBカメラの両方を使用することができます。
Jetcamを利用する場合はこちらの手順に沿って実行していきます。Jupiternotebookが利用できる状態になっている前提となります。
jetcam/notebooks/usb_camera/usb_camera.ipynb
上記の手順では以下のパターンで使い分けることができます。
CSI cameraを使う場合
1 2 3 |
from jetcam.csi_camera import CSICamera camera = CSICamera(width=224, height=224, capture_width=1080, capture_height=720, capture_fps=30) |
USB cameraを使う場合
1 2 3 |
from jetcam.usb_camera import USBCamera camera = USBCamera(capture_device=1) |
画像を読み込むとき
1 |
image = camera.read() |
コールバックで処理を実施
1 2 3 4 5 6 7 |
camera.running = True def callback(change): new_image = change['new'] # do some processing... camera.observe(callback, names='value') |
コールバックの中に実施したいコードを書けばカメラ映像が更新されるたびに処理が実施されるようになっています。
Jetcamについてはこちらを参考にさせていただきました。
からあげさんの記事(参考)
からあげさんの記事でもカメラモジュールとWEBカメラを使用した動画の撮影方法が紹介されていますので、こちらもリンクを張り付けておきます。
コメントを残す