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

※ 更新'24/9/13
※ 「HDMI切替機」の型番の誤り修正。GH-HSPG2-BKではなくGH-HSPA2-BKでした。'24/9/9
※ はてなブログから引っ越し: '24/8/15


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

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

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

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

1. 必要な機器

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

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

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

必要な機器、その接続

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

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が開きます。

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

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

conda info -e

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

(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
  • Tensorflow 2.8だと上記のようにprotobufのダウングレードという一工夫が必要。
    Tensorflow 2.16だと不要です。
(参考) もしうまくいかないときは。

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

・仮想環境を終了

conda deactivate

・仮想環境を削除

conda remove -n py310-cnn --all

・上記  4. 仮想環境の構築 の(4)からやり直し。

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

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

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

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

画像に alt 属性が指定されていません。ファイル名: 20230930173351.png
spyder起動直後
(2) New file(ctrl+N)してください。
(3) 下記のコードを貼り付けてください。

下記のサイトのコードを参考にして画像をspyderの中に表示する等の改造をしたものです。https://miseruit.com/2022/09/17/post-3360/#google_vignette

# -*- 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が詳しいです。
日本語化の方法も載っています。

Python3

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

おつかれさまでした ! !

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

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

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