概要
今回から色んなカメラを使って "タイムラプス"をやって行きます。初回の今回は ”USBカメラ"を使ったタイムラプスです。 ”v4l-utils"と "OpenCV" を使えばRaspberry PIで簡単にUSBカメラの管理と画像の取得加工が出来ます。
"v4l-utils"と"OpenCV"
v4l-utils と OpenCV は、どちらもカメラ映像を扱う上で欠かせないツールです。
- "v4l-utils"(Video4Linux Utilities)
- Linux環境でUSBカメラなどのビデオキャプチャデバイスを管理・制御用コマンドラインツール
- 使用例
- v4l2-ctl -d /dev/video0 --list-formats-ext:画像フォーマット、解像度、フレームレート等を表示
- 今回はこれを元にUSBカメラの解像度を取得しています。
- "OpenCV"(Open Source Computer Vision Library)
- 画像や動画をリアルタイムで処理・分析するためのオープンソースのライブラリ
- 使用例
- cv2.VideoCapture(): 管理対象のオブジェクトを取得
- cap = cv2.VideoCapture(device_id, cv2.CAP_ANY)
(device_id: カメラのインデックス cv2.CAP_ANY: バックエンドAPIの指定) - 取得したオブジェクトで以下の機能を使用。
- cap.isOpened():オブジェクトが正常に開いたか確認(True/False)
- cap.set():解像度やフレームレートなどの設定値を変更する。
- 画像の解像度幅を指定: cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
- 画像の解像度高さ指定: cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
- cap.read():1フレーム分の画像データを取得する
- cap.release():接続を閉じ、確保していたメモリやリソースを解放する
- cap = cv2.VideoCapture(device_id, cv2.CAP_ANY)
- cv2.imencode(): メモリ上の画像データをJPEGやPNGなどにエンコードする関数
- success, encoded_image = cv2.imencode(".jpg", frame)
- 引数:".jpg": 画像フォーマット frame: 元の画像
- 戻り値:success:変換結果(True or False) encoded_image:圧縮されたデータ
- success, encoded_image = cv2.imencode(".jpg", frame)
- cv2.imwrite(): 処理した画像データをファイルとして保存する関数
- cv2.imwrite(filepath, frame, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
(filepath: パス frame: 画像データ cv2.IMWRITE_JPEG_QUALITY: jpeg指定 95: 画質)
- cv2.imwrite(filepath, frame, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
- cv2.VideoCapture(): 管理対象のオブジェクトを取得
v4l-utilsでカメラのハードの状態を、OpenCVで画像(静止画、動画)の処理を行っています。
OSとプログラムのインストール
- サーバ用 "Raspberry-pi”は ”3B" を使用。
- OSは、Legacy,64-bit Lite(CUI)。SSHを有効にしてRaspberry Pi Imagerでセットアップ。
- その後、SSHでRaspberry PIにLogIn。"ssh aaa@bbb.local" aaa:ユーザー名。bbb:ホスト名。
- ホームディレクトリで下記を実行
- ホームディレクトリに "lapes" フォルダが下記の様に製作されます。
プログラムの実行
Raspberry PiにUSBカメラをつなぎ、作業用フォルダに移動し(cd lapes) python3 app.py と入力。
モニタに上記が表示されたらブラウザを上げて、"http://bbb.local:5000"と入力して下さい。 下記のHPが表示されます。
使い方
- "検索"ボタン
- USBカメラを検索しプルダウンリストに登録します。
- カメラを選択するとそのカメラがサポートしている解像度がプルダウンリストに登録されます。
- スタート/ストップ/間隔
- スタート:タイムラプス開始時間を入力。
- ストップ:タイムラプス終了時間を入力。
- 間隔:撮影間隔時間を入力。
- Streamingボタン
- Streamingのオンオフが出来ます。位置合わせに使用。
- Getボタン
- 静止画(写真)をカメラから取得しHPに表示します。
- 保存される画像の最終確認。
- スタートボタン
- タイムラプスを開始します。
- 撮影された画像は "data" フォルダに日時をファイル名にして保存されます。
- ストップボタン
- 終了時間前にタイムラプスを終了した時に使用。
- 終了ボタン
- Raspberry PI をShutdown します。
保存された静止画(JPG)を "FFmpeg" で動画編集すればタイムラプスの完成です。
次回は
USBカメラでタイムラプスが出来るようになったのですが良い題材が見つからずにいました。そんな時たまたま以前購入したデジタル顕微鏡 7inch Digital Microscope