USBカメラの画像取得アプリケーション作成(Raspberry Pi 3B + OpenCV)

この記事では、「Raspberry Pi 3 MODEL B」とライブラリ「OpenCV」を使用して、USBカメラの画像を取得するアプリケーションを紹介します。

機能としては、USBカメラ画像の「取得」「描画」「保存」といった基本的な機能のみを備えており、ライブラリ「OpenCV」の導入を目的としたものとなっています。

ライブラリ「OpenCV」は、画像や動画処理に役立つAPIが豊富に備わっており、画像処理による物体認識や機械学習用の教師データ生成など、工学の分野で広く使用されています。
広告

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接続するのみで認識されます
本アプリケーションでは、ライセンス「The 3-Clause BSD License」で公開されているライブラリ「OpenCV」を動的リンクにより使用しています。
そのため、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」のインスタンスを生成します。

クラス「InterpretCaptureImage」のインスタンス生成前には、USBカメラをUSB接続する必要があります。前述のとおり、「UVC」対応のUSBカメラはUSB接続するのみで認識されます。USBカメラが正しく認識されているかどうかは、ターミナル上で「lsusb」とコマンド入力し、接続したUSBカメラがリストアップされているかどうかで確認できます。
ls-usb-result

2-6. InterpretCaptureImage Functions Test

このブロックでは、main_loop関数をテストします。

テストNo. テスト内容
1 タイトル「CAP_VIEW_WINDOW_NAME」のウィンドウにUSBカメラ画像が描画される
2 キーボードから「c」キーが入力された場合、USBカメラ画像が保存される
3 キーボードから「q」キーが入力された場合、タイトル「CAP_VIEW_WINDOW_NAME」のウィンドウが閉じられる
(テスト結果画像)
■テスト1
capture-image-test
■テスト2
□ファイル構成
cap-image-result
□1.jpg
cap-image-result
広告

3. 記事内で使用している商品


4. 参考記事

4-1. Raspberry Piの環境整備


OSのインストール・初期セットアップ方法については、以下の記事をご覧ください。

関連記事

この記事では、Raspberry Piの購入後に実施する以下の2点について、書いています。 1. OS(Raspbian)インストール 2. 初期セットアップ この記事は以下のような方向けのものになります。 Raspberr[…]

raspberry-pi-initial-set-up

開発環境のセットアップ方法については、以下の記事をご覧ください。

関連記事

この記事では、Raspberry Pi 3 MODEL Bを対象に、ロボット製作に適した開発環境のセットアップ手順を紹介します。 このセットアップ手順を実行することで、以下の記事で紹介したようなロボット用のプログラミングが可能になりま[…]

make-jupyter-notebook

OpenCVのAPIに関する情報は以下のドキュメントをご参照ください。

OpenCV 4.1.1 Documentation

広告