Pythonスキルの習得

【 Python OpenCV 】カメラで撮影した動画を、リアルタイムで表示させる – Windows, Mac, Linux 対応 –

【 Python OpenCV 】カメラ(内蔵、USB接続)撮影動画を、リアルタイム表示 - Windows, Mac, Linux 対応 -

こんにちは、Zero-Cheeseです。

本記事ではOpenCVを使って、カメラで撮影したデータを、リアルタイムにウインドウ表示させるコードをご紹介します。

本記事は、下記の方を対象としています。

  • Python 入門者レベル以上の方 (オブジェクト指向等、ご存じない方でも大丈夫です。)

◆ 完成形イメージ

USBカメラで、被写体を撮影して、ウインドウに表示する

応用事例

Wifiやディープラーニング等の組合せにより、下記のような使い方もできると思います。

・ リアルタイム物体認識

この他にも、監視カメラや、外出先から自宅にいるペットの観察など、様々なものを自分で作って、楽しめるかと思います。

準備物(ハードウェアー)

  • Python インストール済みのPC
  • Webカメラ(本記事では、UDB接続のカメラを使用)

webカメラの選定

Webカメラ製品は廉価版含め各社発売されていますが、品質面からロジクール(世界的には「Logitech」ブランドで展開)製品を選んでおけば、無難だと思います。

Webカメラは、UVC(USB Video Class)に対応しているものが、オススメです。

カメラとPCの間の通信が規格化されていて、OS側がその規格にそったドライバーを提供しています。

特にLinuxの場合:

筆者はLinuxで、OSのバージョンアップした際に、ドライバの入れ直しがうまくいかず、大量の時間を浪費しました・・・

以後、必ずUVC規格の物 & そのOSに対応(ドライバ インストール不要)しているか、確認してから購入しています。

Linuxが対応している、具体的な製品(UVC規格対応品)は、こちらのサイトが参考になります。

オススメのWEBカメラ

低画質でOK! という方

特徴

  • Windows、Mac、Linux 対応(ラズパイも確認済)
  • 720p(1280×720) / 30fps
  • 内蔵カメラ付き(モノラル)
  • 固定フォーカス
  • 2000円以下
高画質を求める方
  • Windows、Mac、Linux 対応
  • 1080p(1920×1080) / 30fps
  • オートフォーカス
  • 内蔵カメラ付き(ステレオ)
created by Rinker
Logicool(ロジクール)
¥14,999 (2024/05/05 06:49:50時点 Amazon調べ-詳細)

上記、商品紹介リンクを開くと

  • C920n

も併せて表示されると思いますが、C920(n 無し)になります。

「C920n」は、Linuxで標準で動作するかどうか、
検証ができておりませんm(_ _)m

一方、Windows、Macは問題なく、対応しています。

OpenCVのインストール

OS別に、インストール方法を、ご紹介します。

OpenCVをWIndowsへインストールする方法

「コマンドプロンプト」、もしくは「PowerShell」を開きます。

OpenCVは、pipでインストール可能です。

まずは、pipを最新バージョンにした上、OpenCVをインストールします。

pip install -U pip
pip install opencv-python

OpenCVをMacへインストールする方法

「Homebrew」を使用して、簡単にインストールする事が可能です。

brew install opencv

その後に、pipにてインストールします。

下記コードでは、最初にpipを最新版にしてから、インストールしています。

# pipを最新版に更新
pip install -U pip

# opencvをインストール
pip install opencv-python

OpenCVをUbuntuへインストールする方法

aptとpipを使用します。

# aptをアップデート
sudo apt -y update
# pipを最新版に更新
pip install -U pip

# OpenCVをインストール
sudo apt -y install libopencv-dev opencv-data
sudo pip install opencv-python

【全OS対象】OpenCVがインストールできたかを確認する

  • Windowsの場合:「コマンドプロンプト」、もしくは「PowerShell」
  • Mac、Ubuntuの場合:「ターミナル」

から操作します。

まずは、pythonと打ち込み、対話型シェル画面に入ります。

下記コマンドを打ち込んで、「エラーメッセージ」が出なければ、大丈夫です。

import cv2

「エラーメッセージ」が出る方へ

OpenCVのインストールに使用したコマンドプロンプト(ターミナル)を、1回閉じて下さい。

再立上げ後、「pytnon起動 → import cv2」を入力してさい。

うまくいく場合があります。

Pythonコード

最初にコードの完成形をご紹介した後に、詳細部分を解説していきます。

コードの完成形

コードの完成形を、最初に表示します。

import cv2

# カメラの読込み
# 内蔵カメラがある場合、下記引数の数字を変更する必要あり
cap = cv2.VideoCapture(0)

# 動画終了まで、1フレームずつ読み込んで表示する。
while(cap.isOpened()):
    # 1フレーム毎 読込み
    ret, frame = cap.read()

    # GUIに表示
    cv2.imshow("Camera", frame)
    # qキーが押されたら途中終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 終了処理
cap.release()
cv2.destroyAllWindows()

詳細部分の解説

コードの骨格:

  1. カメラから、1フレームごとの静止画データを取得して、
  2. GUIに表示させる。
  3. ①、②の処理を、「特定のキー」が押されるまで、繰り返す。

以下、使用したメソッドの詳細を、解説していきます。

カメラの読込み

5行目のコード

# カメラの読込み
# 内蔵カメラがある場合、下記引数の数字を変更する必要あり
cap = cv2.VideoCapture(0)

cv2.VideoCaptureメソッドにて、

  • 動画データを取得するカメラの指定(引数の番号で、カメラIDを指定)

をします。

上記の例では、0 としていますが、内蔵カメラを有するPCの場合、そちらが選択されます。

その場合、1 とか、2 とか、順番に試して頂ければと思います。

カメラが正常に読み込めたか、確認する

8行目のコード

cap.isOpened()

カメラが正常に読込めたか、チェックするメソッドです。

(正確には、引数capに、正常に初期化されたオブジェクトが代入されているか)

戻り値は、True or False (bool型)になります。

動画データを、1フレーム読込む

10行目のコード

ret, frame = cap.read()

カメラから、現在映っている瞬間を静止画(フレーム画像)として取得するメソッドです。

戻り値:下記二つのタプルです。

  1. フレーム画像が、取得できたか(bool型)
  2. 取得したフレーム画像データ(ndarray型)

GUI表示

13行目のコード

cv2.imshow("Camera", frame)

画面に出力するメソッドです。

  • 第1引数:ウインドウ名(任意名でOK)
  • 第2引数:画像データを指定

終了処理

19〜20行目

cap.release()
cv2.destroyAllWindows()
  • 読込んだカメラデバイスを解放する処理と、
  • 画像表示のため、開いている全てのウインドウを、閉じる処理です。

Pythonコードを実行してみる

筆者の家で、実行したものになります。(Mac環境です。)

  • 画面 左の三脚に、USBカメラをセット
  • 被写体を、右側に設置(3Dプリンタで作ってみました(笑))
  • 真ん中のPCで、コードを実行

しています。

正常に動作している事を、確認しました!

筆者のつぶやき

小さい頃、家庭用のコンピュータから、家中の全ての物(エアコン、家電等々)を制御している未来の風景を、予想した雑誌を目にしました。

(今と違って)純粋だったのもので、憧れをもって、その雑誌を何回を読んでいました。

それが昨今では、ほぼ実現できてしまいました。(あの雑誌、だいだい、当たったな〜。)

その雑誌で取り上げられていた事例ですが、例えば、不審者が来ていないかチェックするため、監視カメラの設置を考えた場合、今では、DIYレベルで簡単に制作する事ができてしまいます。

カメラも安くなりましたし(小型にもなりました)、制御の部分もOpenCV等を使えば、本当に簡単に実現できてしまいます。

改めて、凄い時代になったな〜と、しみじみ感じてしまいます(笑)

おちのない話になってしまい、恐縮です。

今後とも、Pythonに関係する役に立つ情報を、発信していきます。

今回も最後までお付き合い頂き、ありがとうございました。

また、お会いしましょう!