PythonでOpenCVを使用しWebカメラQRコードスキャナーを作成する

PythonでOpenCVを使用しQRコードスキャナーを作成してみます。

QRコードスキャナーを作成するにあたり、OpenCV,Pyzbar,NumPyモジュールが必要となりますので、事前にインストールする必要があります。

なお、今回はQRコードを読み取るために「Webカメラ」が必要となるので、「ロジクールウェブカメラC310」を使用します。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■OpenCVを使用しQRコードスキャナーを作成する

では、早速OpenCVを使用しQRコードスキャナーを作成していきます。

■コード

import cv2 as cv
import numpy as np
from pyzbar.pyzbar import decode

#Webカメラの読み込み
cap = cv.VideoCapture(0)
#出力ウィンドウの設定
cap.set(3,640)
cap.set(3,480)

while True:
    #カメラから1コマのデータを取得する
    ret,frame = cap.read()
    #バーコードからデータを読み取る
    for barcode in decode(frame):
        print(barcode.data)
        #QRコードデータはバイトオブジェクトなので、カメラ上に描くために、文字列に変換する
        myData = barcode.data.decode('utf-8')
        print(myData)
        #QRコードの周りに長方形を描画しデータを表示する
        pts =np.array([barcode.polygon],np.int32)
        #polylines()関数で複数の折れ線を描画
        cv.polylines(frame,[pts],True,(255,0,0),5)
        pts2 =barcode.rect
        #putText()関数で文字列を描画
        cv.putText(frame,myData,(pts2[0],pts2[1]),cv.FONT_HERSHEY_COMPLEX,1,(255,0,0),2)
    #imshow()関数で出力ウィンドウを表示
    cv.imshow('test',frame)
    #qキーが押されるまで待機
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

■実行

このスクリプトを「qrcode.py」という名前で保存し、その後Webカメラを接続します。接続後、コマンドプロンプトから実行してみます。

実行すると、ウインドウが表示され、Webカメラのデータが出力されます。

出力後、1センチほどのQRコードを読み取るテストを行いましたが、今回使用した「ロジクールウェブカメラC310」の解像度等の影響で、カメラの映像がぼやけてしまい、読み取ることができませんでした。また対象となるQRコードが1センチほどと小さいものになっていたので、これも影響していると考えられる。

WARNING: .\zbar\decoder\pdf417.c:89: <unknown>: Assertion “g[0] >= 0 && g[1] >= 0 && g[2] >= 0” failed.
dir=0 sig=13408 k=0 g0=965 g1=ffffffff g2=6ee buf[0000]=

テストを行っている最中にコマンドプロンプトに上記の警告が出力される。この警告が出力される原因を調べてみると、Webカメラで撮影した画像の中にPyzbarで読み取れるバーコードデータ(QRコード)がないため、このような警告が出力される(https://stackoverflow.com/questions/54487079/zbar-attempting-to-read-pdf417-codes)。

[ WARN:0] global C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-_8k9tw8n\opencv\modules\videoio\src\cap_msmf.cpp (438) `anonymous-namespace’::SourceReaderCB::~SourceReaderCB terminating async callback

警告が出力後、テストを終了するため、「q」キーを押して終了すると、ここでも警告が出力される。

cap = cv.VideoCapture(0,cv.CAP_DSHOW)

警告を出力させないようにするための方法を調べてみると、スクリプト内のWebカメラの読み込みためのコードを上記に変更すると、警告が出力されなくなる。

■対象となるQRコードを拡大したテスト

1センチほどのQRコードを読み取るテストでは、QRコードが読み取れなかったので、今度はQRコードを拡大(大きく)し、読み取るテストを行ってみる。

テストのため、再度スクリプトを実行し、スマートフォン上にダウンロードしたQRコードを拡大。拡大後、QRコードにWebカメラをかざす。すると、今度はQRコードが認識され、QRコードのデータが、コマンドプロンプトに出力されることを確認できました。

コメント

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