この記事では、「Raspberry Pi 3 MODEL B」とライブラリ「OpenCV」を使用して、USBカメラの画像を取得するアプリケーションを紹介します。
機能としては、USBカメラ画像の「取得」「描画」「保存」といった基本的な機能のみを備えており、ライブラリ「OpenCV」の導入を目的としたものとなっています。
1. アプリケーション概要
- [アプリケーション]
https://github.com/hotsmmr/RwRP/blob/master/notebooks/interpret_usb_camera_image.ipynb
本アプリケーションは、USBカメラからの画像取得、ウィンドウに描画、および画像保存機能を有しています。
取得する画像のFPSは30[fps]、サイズは640×360[pixel]に設定しています。
キーボード入力としては、「c」キーと「q」キーを受け付けています。
「c」キーでウィンドウに描画されている画像を保存し、「q」キーでアプリケーションを終了します - [特記事項]
OpenCVのバージョンは「4.1.1」をベースに作成しています。
本アプリケーションは、「UVC(USB Video Class)」対応のUSBカメラがUSB接続されていることを前提としています
LinuxベースのOSであれば、「UVC(USB Video Class)」対応のUSBカメラはUSB接続するのみで認識されます
そのため、interpret_usb_camera_image.ipynbの著作権表示は「OpenCV」の著作権表示を保持すると共に、ライセンス「The 3-Clause BSD License」の免責事項を併記しています。(参考)The 3-Clause BSD License(原文)
2. アプリケーション解説
2-1. Import Libraries
このブロックでは、pythonの標準ライブラリとOSSのライブラリ「OpenCV」をアプリケーションで使用できるようにインポートします。
各ライブラリの用途は以下の通りです。
- 「datetime」: 現在時刻を取得するために使用(現在時刻はユニークな画像保存用フォルダ名を定義するために使用する
- 「logging」: ログレベルの設定変更、実行・エラーログ出力に使用
- 「os」: 画像保存用ディレクトリを作成するために使用
- 「cv2(OpenCV)」: USBカメラ画像を取得し、操作するために使用
2-2. Define Constant Values
2-2-1. for interplet key input
このブロックでは、キー入力された文字識別用の文字を、予め定数として定義します。
各定数の定義は以下の通りです。
- 「GEN_KEYBOARD_KEY_c 」: 文字「c」
- 「GEN_KEYBOARD_KEY_q 」: 文字「q」
2-2-2. for interplet key input
このブロックでは、「OpenCV」のAPI使用時に必要なパラメータを、予め定数として定義します。
各定数の定義は以下の通りです。
- 「CAP_FPS 」: USBカメラで取得する画像のフレームレート[fps]
- 「CAP_IMAGE_WIDTH」: USBカメラで取得する画像サイズ(幅)[pixel]
- 「CAP_IMAGE_HEIGHT」: USBカメラで取得する画像サイズ(高さ)[pixel]
- 「CAP_VIEW_WINDOW_NAME」: 画像を描画するウィンドウ名
- 「OUTPUT_FILE_EXTENSIONT」: 画像を保存する際の拡張子
- 「OUTPUT_ROOT_DIRECTORY」: 画像を保存する際のルートディレクトリ(notebookからの相対パス)
- 「OUTPUT_FOLDER_NAME」: 画像を保存するフォルダ名(「OUTPUT_ROOT_DIRECTORY」からの相対パス)
- 「OUTPUT_DIRECTORY」: 画像を保存するディレクトリ(「OUTPUT_ROOT_DIRECTORY」/「OUTPUT_FOLDER_NAME」)
- 「TIME_WAIT_KEY」: キー入力待ち時間[ms]
- 「MASK_CV_INPUT_KEY」: キー入力により受け取った数値をASCIIコード化するために使用
2-3. Define Global Valiables
このブロックでは、ログ出力用のロガーを定義し、デバッグレベルのログが出力されるように初期設定しています。
2-4. Define Classies
このブロックでは、ライブラリ「OpenCV」を使用してUSBカメラ画像を取得し、操作するクラス「InterpretCaptureImage」を定義します。
クラス内メソッドの概要は以下の通りです。
メソッド名 | __init__ |
メソッド名(和名) | コンストラクタ |
処理概要 | 1. メンバ変数定義、初期化 |
2. USBカメラで取得する画像のパラメータ設定(フレームレート、画像サイズ) | |
3. 画像保存先のディレクトリ生成 | |
入力 | なし |
出力 | なし |
特記事項 | 1. 画像保存先のディレクトリ「OUTPUT_DIRECTORY」が既に存在する場合は、既存のディレクトリが使用される |
メソッド名 | main_loop |
メソッド名(和名) | メイン処理 |
処理概要 | 1. 以下の処理をメイン処理が中断されるまで繰り返す 1-1. USBカメラ画像取得(VideoCapture.read関数を使用) 1-2. 取得したUSBカメラ画像をウィンドウに描画する(VideoCapture.imshow関数を使用) 1-3. キーボードからのキー入力を1.0[ms]待つ(VideoCapture.waitKey関数を使用) |
2. キーボードから「c」キーが入力された場合、USBカメラ画像を保存する | |
3. キーボードから「q」キーが入力された場合、メイン処理を終了する | |
4. メイン処理の終了時にUSBカメラ画像描画用のウィンドウを閉じる | |
入力(メンバ変数) | 1. cap: VideoCaptureクラスのインスタンス |
出力(メンバ変数) | 1. cap_frame: 取得したUSBカメラ画像 |
特記事項 | 1. USBカメラが認識されていない場合は、「camera device can not be connected」と出力される |
2. 「GEN_KEYBOARD_KEY_」定数はorg関数で、ASCIIコード化してから使用する |
メソッド名 | __save_capture_image |
メソッド名(和名) | USBカメラ画像保存 |
処理概要 | 1. USBカメラ画像を保存する |
入力(メンバ変数) | 1. cap_num: 画像を保存した回数 |
出力(メンバ変数) | 1. cap_num: 画像を保存した回数 |
特記事項 | 1. USBカメラ像名は以下の名前で保存される 「OUTPUT_DIRECTORY/{cap_num}.OUTPUT_FILE_EXTENSIONT」 |
2-5. Create Instances
このブロックでは、前ブロックで定義したクラス「InterpretCaptureImage」のインスタンスを生成します。

2-6. InterpretCaptureImage Functions Test
このブロックでは、main_loop関数をテストします。
テストNo. | テスト内容 |
1 | タイトル「CAP_VIEW_WINDOW_NAME」のウィンドウにUSBカメラ画像が描画される |
2 | キーボードから「c」キーが入力された場合、USBカメラ画像が保存される |
3 | キーボードから「q」キーが入力された場合、タイトル「CAP_VIEW_WINDOW_NAME」のウィンドウが閉じられる |



3. 記事内で使用している商品
4. 参考記事
4-1. Raspberry Piの環境整備
OSのインストール・初期セットアップ方法については、以下の記事をご覧ください。
この記事では、Raspberry Piの購入後に実施する以下の2点について、書いています。 1. OS(Raspbian)インストール 2. 初期セットアップ この記事は以下のような方向けのものになります。 Raspberr[…]
開発環境のセットアップ方法については、以下の記事をご覧ください。
この記事では、Raspberry Pi 3 MODEL Bを対象に、ロボット製作に適した開発環境のセットアップ手順を紹介します。 このセットアップ手順を実行することで、以下の記事で紹介したようなロボット用のプログラミングが可能になりま[…]
OpenCVのAPIに関する情報は以下のドキュメントをご参照ください。