[Python]OpenCVとwebカメラを使ってリアルタイムにQRコードの内容を読み込む[pyzbar]
検証のきっかけ
最近、自動化やDXが推進されつつあり、QRコードやバーコードを読み取る専用のスキャナー、OCR専用スキャナーなどが身の回りに増えてきました。
その結果、機材ばかりが増え、管理も煩雑に…。しかもスキャナーごとに微調整が必要だったりして、逆に効率が悪くなることもよくあります。
そこで、OpenCV+Webカメラですべてのスキャン環境を統一すれば便利だと思ったことがきっかけ。ディープラーニングによる画像認識などと組み合わせて使えばまさに「webカメラとPython」で自動化の環境が統一されるのでは?とも思いつつ、まずはQRコードをスキャンできるプログラムを作ってみました。
用意した環境
Windows10ノートPC
webカメラ:logicool 900シリーズ(ノートPC内蔵カメラでも可)
Python 3.10.0
実装
webカメラをPCに接続し、pythonの環境構築等々全て済ませます。メモ帳も忘れずに起動します。
なお、opencv,pyzbar,pyautogui,pyperclipといった外部ライブラリはpipでインストールする必要があります。
参考サイト①
QRコードの読み取り部分には以下のサイトを参考にしました。pyzbarというライブラリを使っています。
参考サイト②
今回はQRコードの内容をメモ帳に書き出すという形をとっています。やり方はいろいろあるかと思いますが、今回はpyautoguiのライブラリを活用し、pyperclipでクリップボードにコピーしています。詳しいことは過去の記事をご覧ください。
参考サイト③
QRコードを読み込んだあとにビープ音を鳴らすコードを埋め込んでいます。
winsound.Beep(440,1000)
このwinsoundモジュールはPythonの標準モジュールです。importだけで使えるのがとても便利ですね。また音と長さは自由自在に変えられるのはポイントです。
組み合わせたコードは以下のようになります。
# ライブラリのインポート
import winsound
import cv2
import numpy as np
from pyzbar.pyzbar import decode
#クリップボードにコピー&ペーストするライブラリ
import pyautogui as pag
import pyperclip
#Webカメラの読み込み
cap = cv2.VideoCapture(0)
#出力ウィンドウの設定
cap.set(3,640)
cap.set(3,480)
while True:
ret,frame = cap.read()
key = cv2.waitKey(1) & 0xFF
for barcode in decode(frame):
# QRコードを読み取り、画面にバウンディングボックスと文字列を表示する
myData = barcode.data.decode('utf-8')
pts =np.array([barcode.polygon],np.int32)
cv2.polylines(frame,[pts],True,(255,0,0),5)
pts2 =barcode.rect
cv2.putText(frame,myData,(pts2[0],pts2[1]),cv2.FONT_HERSHEY_COMPLEX,1,(255,0,0),2)
# クリップボードにQRコードの内容をコピー
pyperclip.copy(myData)
# ペーストする。
pag.hotkey('ctrl','v')
# ペーストしたら「ラ」のビープ音を鳴らす
winsound.Beep(440,1000)
#imshow()関数で出力ウィンドウを表示
cv2.imshow('test',frame)
#qキーが押されたらループを終了する
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
認識結果はすばらしいものでした
スマホにQRコードを表示させ、webカメラに表示させるとこうなります。
QRコードの内容はテキストボックスへコピー&ペーストされる仕組みです。
認識はとてもスムーズでした。ビープ音と画面表示で認識していることを確認できるのがポイントです。これを利用するとビープ音を変えたり、画面表示の色を変えたりすることで整合の判定をするとか、いろいろできそうだと思いました。
これを活用すればQRコードだけでなく、OCRもやりやすくなると思うので、いつかそんな記事も書いてみたいと思っています。
この記事が気に入ったらサポートをしてみませんか?