第1回: Python で(静止画)ビデオキャプチャー

※ 更新 ’24/9月
この回自体には影響しませんが、次回「第2回 : キャプチャー画像を機械学習で判別、声でお知らせ」で使用するライブラリ ”Tensorflow” のインストール部分を新バージョン対応のため更新しました。
旧記事はこちら
’24/9月より前に本ブログを実行した方は「4. 仮想環境の構築」から再実行して下さい。

※ 修正 「HDMI切替機」の型番。GH-HSPG2-BKではなくGH-HSPA2-BKでした。'24/9/9

※ はてなブログから引っ越し: '24/8/15
    
  

しょくぶつ(^^) です。
前回( 第 0 回 )では次回予告として
「スプラトゥーン3のプレイ映像を機械学習で分析。対戦相手のスペシャルを声でお知らせ。」
と書きました。

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

1. 必要な機器

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

  • Windows10以降のPC
  • HDMIキャプチャー機器
      動作確認済み エレコムのAD-HDMICAPBK
  • HDMIケーブル, 1本
  • Nintendo Switch本体
  • ドック
  • ★HDMIケーブル,追加で2本
  • ★windowsPC用とは別に、ディスプレイかTV
  • ★HDMI分配器(HDMIスプリッターとも言います。)
     注意! 「HDMI切替機」ではありません。
     私はグリーンハウスのGH-HSPA2-BKを使っています。
    (現在はGH-HSPG2-BKという後継品あり。'24/9月現在だとヨドバシで1,900円くらい。)

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

300x166必要な機器、その接続

なお、"HDMIキャプチャー機器" にパススルー機能があれば、"HDMI分配器" は無くてもよさそうです (私は未検証) 。
下記のように接続すればOKなはずです。

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

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

前回の記事と同じように画面が出るか確認しましょう。
“カメラ” を起動して、Nintendo Switchの画面は表示されたでしょうか?

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

Python実行環境はいろいろあるのですが、本ブログでは、
  miniconda の下で Spyder を使用。
とします。

4. 仮想環境の構築

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

(1) miniconda専用のPowershellを開く

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

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

miniconda専用のPowershellが開いた様子

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

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

conda info -e

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

300x118conda 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) channel(パッケージ の リポジトリ)の設定 ※初めてminicondaを使う人は飛ばしてOK

「リポジトリ」とは"ネット上にある保管場所のこと" だそうです。
(私なりの理解では、Pythonライブラリのダウンロード元のことです。)
ここではまず、Pythonライブラリのリポジトリが conda-forge に設定されていることを確認します。

conda config --show channels

次のように表示されているか確認してみてください。

%conda config --show channels
channels:
- conda-forge

上のような表示ならばOKです。
もし”conda-forge”が最上段にない場合は、次のコマンドを実行します。

conda config --add channels conda-forge

なお、”conda-forge” の他には”default”, ”intel”などもあります。

  • --add channel : 指定したチャンネルを最優先にするオプション
(6) 仮想環境の作成

仮想環境作成には次のように入力してください。

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

ここでは仮想環境名は「py312-cnn」としましょう。
名前の変更はOKです。
Pythonのバージョンは「3.12」とします。
詳しくない人はバージョンの変更はNGです。
具体的には次のように入力します。

conda create -n py312-cnn python=3.12

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

(7) 仮想環境を起動しましょう

次のように入力します。

conda activate 仮想環境名

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

conda activate py312-cnn

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

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

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

spyder, matplotlib, scikit-learn, pandas

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

conda install spyder matplotlib scikit-learn pandas

※ 詳しい方: 使わないならばspyderは無くてもOKです。

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

pyttsx3, opencv-python, tensorflow
具体的には、次のように入力します。

pip install pyttsx3 tensorflow==2.16.1 opencv-python

( この際にnumpyが2.0から1.26へのダウングレードがあります。ここで時間ロスしないようなもっと良いインストール手順があるかも。)

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

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

  • 仮想環境を終了
    conda deactivate
  • 仮想環境を削除
    conda remove -n py312-cnn --all
  • 上記 4の(4)からやり直し。

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

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

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

Powershell の中で “spyder” と入力
( スタート → Miniconda3  → spyder 、でも起動できますが失敗することあり。)
初めだとすごく驚くのですが、遅いときは起動に1~2分掛かります。

300x248spyder起動直後

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

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

https://miseruit.com/2022/09/17/post-3360/

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

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

# # # # # # # #
cap_dev_no = 1
# # # # # # # #

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”をクリックしてください。

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

300x261Pythonでビデオキャプチャー成功 !

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

cap_dev_no = 0

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

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

cap_dev_no =1
cap_dev_no = 2

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

止めるときはCtrl + c などを入力してください。
そのほか、spyderの使い方は次のサイト様が詳しいです。
日本語化の方法も載っています。
Spyderの起動と設定

本題の
「スプラトゥーン3のプレイ映像を機械学習で分析。対戦相手のスペシャルを声でお知らせ。」
の実行にはもう少し準備がいるので、今回はここまでです。
おつかれさまでした ! !

プロフィール
この記事を書いた人
しょくぶつ (^ ^)

機械系の技術者です。学会発表13、論文掲載6(和・英)。プログラミング歴40年(つまり8bit世代ですね)。ゲーム歴40年(ファミコン世代ですね)。
お問い合わせは下記のメールアドレスにお寄せください。
plantsmilehatena@gmail.com

しょくぶつ (^ ^)をフォローする
python
しょくぶつ (^ ^)をフォローする
タイトルとURLをコピーしました