【ようこそ初心者】第 1 回: python でビデオキャプチャー(更新'23/10/29)

しょくぶつ(^^) です。

前回( 第 0 回 )では次回予告として

スプラトゥーン3のプレイ映像を機械学習で分析。対戦相手のスペシャルを声でお知らせ。」

と書きました。 しかし1回では大変なので、この第 1 回では「pythonビデオキャプチャー」だけやります。 それでもPowershellで最低7回コマンド入力が必要です。 頑張りましょう !

なお、「もうpythonopencvを使ってキャプチャーできているよ」という方も「仮想環境の構築」と「ライブラリのインストール」だけは目を通してください。

1. 必要な機器

「★」がついているのは前回『1万円以下、もっと安く、ノートPCにNintendo Switch画面を映したい』から追加されたものです。

・Windows10以降のPC

HDMIキャプチャー機器

  動作確認済み エレコムのAD-HDMICAPBK

HDMIケーブル, 1本

Nintendo Switch本体

・ドック

HDMIケーブル,追加で2本

★windowsPC用とは別に、HDMIのディスプレイかTV

HDMI分配器(HDMIスプリッターとも言います。)

 注意! 「HDMI切替機」ではありません。

 私はグリーンハウスのGH-HSPG2-BKを使いました。2023年9月現在だと2,100円くらいでヨドバシで買えます。

図にするとこんな感じです。

必要な機器、その接続

ただし、上記のもののうちHDMIキャプチャー機器にパススルー機能があれば、無くてもよさそうです (私は未検証) 。

HDMIキャプチャー機器にパススルー機能がある場合(本ブログでは未検証)

2. HDMIキャプチャー機器の動作確認

前回の記事と同じように画面が出るか確認しましょう。 “カメラ” を起動して、キャプチャー機器に接続した映像機器の画面が表示されたでしょうか?

3. python実行環境を整えます。

本サイトでは実行環境としては、

  miniconda の下で Spyder を使用。

とします。既にこれができている前提としたいのですがやはり不親切なので、簡単に書きますね。

  • minicondaのインストール
      まずminicondaから整えましょう。これは簡単にできます。たとえば下記URL通りに行って下さい。

  Miniconda3をWindows 10にインストール - Qiita

  • spyderについて
      これは後からインストールします。

4. 仮想環境の構築

面倒だし時間もかかりますが必ず作りましょう。一番大きな理由は次の「ライブラリのインストール」でミスると後戻りが困難だからです。

次のように仮想環境を作ってください。

(1) miniconda専用のPowershellを開く

スタート → Miniconda3 (64bit) → Anaconda Powershell Prompt (miniconda3)

とします。miniconda専用のPowershellが開きます。

miniconda専用Powershellの画面

(2) 現在の仮想環境の確認

次のコマンドを実行しましょう。

conda info -e

表示に数秒かかります。初めてpython環境を作成したならば base しか無いはずです。

conda info -e で現在の仮想環境の確認

(3) proxyの設定 ※ 一般の環境では不要です

社内などproxy環境が設定な場合は次の設定をしましょう。

( なぜかコピペすると “ “ が消えてエラーになることがあるので注意 )

$env:HTTPS_PROXY=”http://(proxyのアドレス: ポート番号)”

(4) condaやpipのアップデート (環境構築直後でも必要)

次のコマンドを実行してください。

conda update --all

pip install --upgrade pip setuptools

※ 途中で  Proceed ([y]/n)?  と聞かれたらEnterを入力です。

(5) 仮想環境の作成

conda create -n 仮想環境名 python=バージョン

と入力します。ここでは仮想環境名は「py310-cnn」としましょう。変更OKです。pythonのバージョンは「3.10」とします。詳しくない人は変更NGです。

次のように入力してください。

conda create -n py310-cnn python=3.10

メッセージを多数表示しながら仮想環境が構築されていきます。速くて10秒、遅いと2分くらいです。

(6) 仮想環境の起動しましょう

conda activate 仮想環境名

と入力します。具体的には次のように入力します。

conda activate py310-cnn

5. ライブラリのインストール

作成した仮想環境に、今後使いそうなものも含めて一気に「ライブラリ」を9個、インストールします。仮想環境構築までで経験したとおり、入力するたびに数秒から数分かかります。ここでの作業も5分以上、長いと20分必要です。

(1) 次のライブラリをconda でインストール。

spyder, numpy, matplotlib, scikit-learn, pandas

具体的には、次のように入力します。

conda install -c conda-forge spyder numpy matplotlib scikit-learn pandas

(2) 次のライブラリを pip でインストール。

pyttsx3, opencv-python, tensorflow

具体的には、次のように入力します。

pip install pyttsx3 opencv-python tensorflow==2.8 protobuf==3.20.1

※protobufをダウングレードしています。こうしないとtensorflowが機能しません。

(参考) もしうまくいかないときは。

タイプミス (たとえばopencv-python ではなく opencv にした ) などでうまくいかなくなります。そのときは、思い切って仮想環境を作り直しましょう。

  ・仮想環境を終了

   conda deactivate

  ・仮想環境を削除

   conda remove -n py310-cnn --all

  ・上記 4の(4)からやり直し。

6. pythonでキャプチャー動作確認

いよいよpython でキャプチャーを実行します !!

(1) spyderを起動してください。

スタート → Miniconda3  ※「Miniconda3 (64bit)」ではありません。→ spyder

としてspyderをクリックすると起動。 初めだとすごく驚くのですが、遅いときは起動に1~2分掛かります。

spyder起動直後

(2) New file(ctrl+N)してください。
(3) 下記のコードを貼り付けてください。

下記のサイトのコードを参考にして画像をspyderの中に表示する等の改造をしたものです。

Pythonライブラリ | OpenCVでカメラから画像/動画を取得する │ 魅せるIT編集部

# -*- coding: utf-8 -*-
"""
Created on Thu Sep 31 21:24:02 2023

@author: plant-smile
"""
import cv2
import matplotlib.pyplot as plt
import datetime

#def main():
#if __name__ == '__main__':
# # # # # # # #
cap_dev_no = 0
# # # # # # # #

def save_capture():
    # 1)カメラIDを設定
    camera = cv2.VideoCapture(cap_dev_no,cv2.CAP_DSHOW)
    # 2)設定したカメラから画像を取得
    ret, img = camera.read()
    # 3)画像を表示する
    img1= cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(img1)
    # 4)カメラのメモリを解放する
    camera.release()
    plt.show(block=False)
    # 5) このコードを保存したフォルダの下に"cap_screen"というフォルダを作れば画像をjpegで保存します。
    now = datetime.datetime.now()
    f_name = './cap_screen/cap_' + now.strftime('%Y%m%d_%H%M%S') 
    cv2.imwrite(f_name + ".jpg", img)

if __name__ == '__main__':
    while True:
        input("Enterキーを押したら実行")
        save_capture()
(4) Run file(F5)してください。

画面の指示通りEnterを押してください。

画面の右中央の”Plot”をクリックしてください。

次のような画面は出たでしょうか?

pythonビデオキャプチャー成功 !
もし接続したカメラデバイスHDMIキャプチャー機器だけならば、コードの12行目の

cap_dev_no = 0

はこのままで、カラーバー、もしくは、キャプチャーした画面が表示されます。

もしカメラデバイスが複数あるならば、

cap_dev_no = 1

cap_dev_no = 2

と数字を増やしてみてください。

止めるときはctrl + c などを入力してください。 そのほか、spyderの使い方は次のURLが詳しいです。 日本語化の方法も載っています。

https://edu.isc.chubu.ac.jp/hsuzuki/iip/anaconda/spyder.html#:~:text=%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AB,%E6%97%A5%E6%9C%AC%E8%AA%9E%20%E3%82%92%E9%81%B8%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82

本題の

スプラトゥーン3のプレイ映像を機械学習で分析。対戦相手のスペシャルを声でお知らせ。」

の実行にはもう少し準備がいるので、今回はここまでです。

おつかれさまでした ! !