【Streamlit】Webカメラでバーコードを読み取るアプリを作ろう!

Streamlit
この記事は約6分で読めます。

こんにちは、JS2IIUです。
今回は、Webカメラを使ってバーコードを読み取るStreamlitアプリケーションの作り方を紹介します。OpenCVを使ってバーコードを検出し、StreamlitでWebアプリとして表示するシンプルなプログラムです。よろしくお願いします。

サンプルコード

早速サンプルコードから見ていきます。Streamlit上にWEBカメラの映像を映す方法については、別の記事を参照して下さい。詳しく説明しています。

Python
import cv2
import streamlit as st

st.title('Webcam Barcode Reader')

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

cap = cv2.VideoCapture(1)  # カメラ番号は環境に合わせて調整してください

# バーコードリーダーを作成
barcode_reader = cv2.barcode.BarcodeDetector()

# 検出されたバーコード情報を格納する集合
detected_codes = set()

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

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

    # バーコード情報を取得
    try:
        # バーコードを検出
        ok, decoded_info, decoded_type, corners = barcode_reader.detectAndDecode(frame)
    except ValueError:
        decoded_info, decoded_type, corners = barcode_reader.detectAndDecode(frame)
        ok = bool(decoded_info)

    # st.write(f"decoded_info: {decoded_info}")  # デバッグ出力
    if len(decoded_info) > 2:
        detected_codes.add(f'{decoded_info}')

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

    # バーコードが検出されたらループを終了
    if len(detected_codes) >= 2:
        l = list(detected_codes)
        st.header(f'Barcodes: {l[0]}, {l[1]}')
        break

cap.release()

streamlit runを実行するとWEBカメラがONになり、撮影が始まります。書籍のバーコード、JANコードとISBNコードの2種類を取得したところで画像撮影が止まって、コードを表示します。

画像部分は一部ぼやかしています。実際にはクリアに映っていました。

解説

OpenCVのインストール

まず、OpenCVをインストールする必要があります。OpenCVは、画像処理やコンピュータビジョンに広く使われているライブラリです。

今回使用するcv2.barcode.BarcodeDetectorは、OpenCVの拡張モジュールに含まれています。そのため、opencv-contrib-pythonパッケージをインストールする必要があります。

ターミナルまたはコマンドプロンプトで、以下のコマンドを実行してください。

Bash
pip install opencv-python opencv-contrib-python

コードの説明

  1. ライブラリのインポート: cv2 (OpenCV) と streamlit をインポートします。
  2. タイトルの設定: st.title()でWebアプリのタイトルを設定します。
  3. プレースホルダーの作成: st.empty()でカメラ映像を表示するためのプレースホルダーを作成します。
  4. カメラの初期化: cv2.VideoCapture(1)でWebカメラを初期化します。カメラ番号は環境に合わせて調整してください。
  5. バーコードリーダーの作成: cv2.barcode.BarcodeDetector()でOpenCVのバーコード検出器を作成します。
  6. 検出済みバーコード情報の格納: detected_codesという集合を作成し、検出されたバーコード情報を格納します。
  7. メインループ:
    • while True:で無限ループを開始し、カメラからフレームを取得し続けます。
    • カメラからフレームを読み込み、OpenCVはBGRフォーマットで画像を扱うため、Streamlitで表示するためにRGBフォーマットに変換します。
    • try...exceptでエラー処理を行いながら、barcode_reader.detectAndDecode(frame)でバーコードを検出します。
    • 検出されたバーコード情報をdetected_codesに追加します。
    • st.image()でプレースホルダーにカメラの映像を表示します。
    • 2つ以上のバーコードが検出されたらループを終了し、検出されたバーコード情報を表示します。
  8. カメラの解放: cap.release()でカメラを解放します。

参考になるWebサイト

最後に、書籍のPRです。

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

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

コメント

タイトルとURLをコピーしました