こんにちは、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
- オートフォーカス
- 内蔵カメラ付き(ステレオ)
上記、商品紹介リンクを開くと
- 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フレームごとの静止画データを取得して、
- GUIに表示させる。
- ①、②の処理を、「特定のキー」が押されるまで、繰り返す。
以下、使用したメソッドの詳細を、解説していきます。
カメラの読込み
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()
カメラから、現在映っている瞬間を静止画(フレーム画像)として取得するメソッドです。
戻り値:下記二つのタプルです。
- フレーム画像が、取得できたか(bool型)
- 取得したフレーム画像データ(ndarray型)
GUI表示
13行目のコード
cv2.imshow("Camera", frame)
画面に出力するメソッドです。
- 第1引数:ウインドウ名(任意名でOK)
- 第2引数:画像データを指定
終了処理
19〜20行目
cap.release()
cv2.destroyAllWindows()
- 読込んだカメラデバイスを解放する処理と、
- 画像表示のため、開いている全てのウインドウを、閉じる処理です。
Pythonコードを実行してみる
筆者の家で、実行したものになります。(Mac環境です。)
- 画面 左の三脚に、USBカメラをセット
- 被写体を、右側に設置(3Dプリンタで作ってみました(笑))
- 真ん中のPCで、コードを実行
しています。
正常に動作している事を、確認しました!
筆者のつぶやき
小さい頃、家庭用のコンピュータから、家中の全ての物(エアコン、家電等々)を制御している未来の風景を、予想した雑誌を目にしました。
(今と違って)純粋だったのもので、憧れをもって、その雑誌を何回を読んでいました。
それが昨今では、ほぼ実現できてしまいました。(あの雑誌、だいだい、当たったな〜。)
その雑誌で取り上げられていた事例ですが、例えば、不審者が来ていないかチェックするため、監視カメラの設置を考えた場合、今では、DIYレベルで簡単に制作する事ができてしまいます。
カメラも安くなりましたし(小型にもなりました)、制御の部分もOpenCV等を使えば、本当に簡単に実現できてしまいます。
改めて、凄い時代になったな〜と、しみじみ感じてしまいます(笑)
おちのない話になってしまい、恐縮です。
今後とも、Pythonに関係する役に立つ情報を、発信していきます。
今回も最後までお付き合い頂き、ありがとうございました。
また、お会いしましょう!