サイトアイコン アマチュア無線局JS2IIU

【Streamlit】Webカメラの映像を表示する方法

こんにちは、JS2IIUです。

この記事では、StreamlitとOpenCVを使ってWebカメラの映像をWebアプリ上に表示する方法を解説します。

Streamlitは、Pythonで記述したコードからインタラクティブなWebアプリを簡単に作成できるフレームワークです。データサイエンスや機械学習の分野で人気があり、データの可視化やモデルのデプロイなどに活用されています。

OpenCVとは?

OpenCV (Open Source Computer Vision Library) は、画像処理やコンピュータビジョンに特化したオープンソースライブラリです。画像や動画の読み込み、表示、処理など、様々な機能を提供しています。顔認識、物体検出、画像分類など、幅広いアプリケーションで利用されています。

OpenCVのインストール

OpenCVは、pipを使って簡単にインストールできます。コマンドプロンプトまたはターミナルで以下のコマンドを実行してください。

Python
pip install opencv-python

Streamlitとカメラ映像を組み合わせたアプリのアイデア

Webカメラの映像をStreamlitアプリに組み込むことで、以下のような様々なアプリケーションを作成できます。

StreamlitでWebカメラの映像を表示する手順

Webカメラの映像をStreamlitアプリに表示する手順は以下の通りです。

  1. OpenCVでWebカメラの映像を取得する
  2. Streamlitのst.empty()でプレースホルダーを作成する
  3. st.image()でOpenCVから取得した画像を表示する

OpenCVでWebカメラの映像を取得する

OpenCVでWebカメラの映像を取得するには、cv2.VideoCapture(0)を使用します。引数0は、デフォルトのWebカメラを示します。もしうまく映らないときは引数は1, 2, ・・・に変えてみて下さい。

Python
import cv2

cap = cv2.VideoCapture(0)

while True:
  ret, frame = cap.read()
  # retはフレームが正しく読み取れたかどうかを示すブール値
  # frameは読み取った画像データ

  if not ret:
    break

  cv2.imshow('Webcam', frame)

  if cv2.waitKey(1) & 0xFF == ord('q'):
    break

cap.release()
cv2.destroyAllWindows()

WEBカメラにアクセスするために、セキュリティの警告が出ることがあります。

Streamlitのst.empty()でプレースホルダーを作成する

st.empty()は、Streamlitアプリ上に空のコンテナを作成する関数です。このコンテナは、後でst.image()などの関数で画像やテキストを配置するために使用します。

シグネチャ:

Python
st.empty()

st.image()でOpenCVから取得した画像を表示する

st.image()は、Streamlitアプリ上に画像を表示する関数です。OpenCVで取得した画像データを引数に渡すことで、Webカメラの映像をアプリ上に表示できます。

シグネチャ:

Python
st.image(image, caption=None, width=None, use_column_width=None, clamp=False, channels="RGB", output_format="auto", *, use_container_width=False)

st.image()関数は、Streamlitアプリに画像を表示するための関数です。以下に、各パラメータの詳細を説明します。

これらのパラメータを適切に設定することで、Streamlitアプリに画像を思い通りに表示することができます。

サンプルプログラム

Python
import cv2
import streamlit as st

st.title('Webcam')

# カメラ映像を配置するプレースホルダーを作成
placeholder = st.empty()

cap = cv2.VideoCapture(0)

while True:
  ret, frame = cap.read()
  if not ret:
    break

  # OpenCVはBGRフォーマットなので、RGBに変換
  frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

  # `st.image()`でプレースホルダーに画像を表示
  placeholder.image(frame, channels="RGB")

cap.release()

映像はぼやかしてありますが、このような形でStreamlitとWEBカメラを組み合わせることができます。

プログラムの解説

このコードは、Streamlitを使ってWebカメラの映像をWebアプリ上に表示するシンプルなプログラムです。以下に、コードの詳細な解説をステップごとに行います。

1. ライブラリのインポート

Python
import cv2
import streamlit as st

2. アプリのタイトル設定

Python
st.title('Webcam')

3. プレースホルダーの作成

Python
# カメラ映像を配置するプレースホルダーを作成
placeholder = st.empty()

4. Webカメラへのアクセス

Python
cap = cv2.VideoCapture(0)

5. 無限ループ

Python
while True:
  # 処理

6. フレームの取得

Python
  ret, frame = cap.read()

7. フレーム取得の確認

Python
  if not ret:
    break

8. カラーフォーマットの変換

Python
  # OpenCVはBGRフォーマットなので、RGBに変換
  frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

9. 画像の表示

Python
  # `st.image()`でプレースホルダーに画像を表示
  placeholder.image(frame, channels="RGB")

10. リソースの解放

Python
cap.release()

コードの全体的な流れ

このコードは、Webカメラにアクセスし、そこからフレームを繰り返し取得してStreamlitアプリ上に表示するプログラムです。OpenCVを使ってWebカメラの映像を取得し、Streamlitを使ってWebアプリに表示することで、リアルタイムな画像処理アプリケーションを簡単に作成することができます。

参考になるWebページ

StreamlitとWEBカメラを組み合わせたアプリの紹介記事です。色々なアプリに挑戦してみて下さい!

最後に、書籍のPRです。

最新のOpenAIのチャットAPIの使い方もしっかりと解説されている良書です。2024年11月初版発行、「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」西見、吉田、大嶋著。

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了