こんにちは、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コードの説明
- ライブラリのインポート:
cv2(OpenCV) とstreamlitをインポートします。 - タイトルの設定:
st.title()でWebアプリのタイトルを設定します。 - プレースホルダーの作成:
st.empty()でカメラ映像を表示するためのプレースホルダーを作成します。 - カメラの初期化:
cv2.VideoCapture(1)でWebカメラを初期化します。カメラ番号は環境に合わせて調整してください。 - バーコードリーダーの作成:
cv2.barcode.BarcodeDetector()でOpenCVのバーコード検出器を作成します。 - 検出済みバーコード情報の格納:
detected_codesという集合を作成し、検出されたバーコード情報を格納します。 - メインループ:
while True:で無限ループを開始し、カメラからフレームを取得し続けます。- カメラからフレームを読み込み、OpenCVはBGRフォーマットで画像を扱うため、Streamlitで表示するためにRGBフォーマットに変換します。
try...exceptでエラー処理を行いながら、barcode_reader.detectAndDecode(frame)でバーコードを検出します。- 検出されたバーコード情報を
detected_codesに追加します。 st.image()でプレースホルダーにカメラの映像を表示します。- 2つ以上のバーコードが検出されたらループを終了し、検出されたバーコード情報を表示します。
- カメラの解放:
cap.release()でカメラを解放します。
参考になるWebサイト
- OpenCV公式ドキュメント
- Streamlit公式ドキュメント
- 顔認証にも使われるOpenCVをインストールして使ってみよう! – アンドエンジニア
- 【Python】OpenCV(cv2)のインストール方法(pip install)を簡単に解説 – trends – コードキャンプ
最後に、書籍のPRです。
最新のOpenAIのチャットAPIの使い方もしっかりと解説されている良書です。2024年11月初版発行、「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」西見、吉田、大嶋著。
最後まで読んでいただきありがとうございます。73

