ITや趣味など気軽に投稿しています。

【Python】OpenCVでQRコードを読み取る

OpenCVには画像からQRコードを検出・読み取るための機能が標準で用意されています。 外部ライブラリを追加する必要がなく、数行のコードで実装できます。

この記事では、QRCodeDetectorクラスのdetectAndDecode()を使ってQRコードの内容を読み取る方法を解説します。

サンプルコード

今回は以下のQRコード画像を読み込み、内容を解読します。

qrCode.png

以下がコード全体です。

import cv2
import numpy as np

image = cv2.imread("input/qrCode.png")

qrDetector = cv2.QRCodeDetector()
data, bbox, rectifiedImage = qrDetector.detectAndDecode(image)

print(data)

cv2.imshow("Rectified QRCode", rectifiedImage)
cv2.waitKey(0)
cv2.destroyAllWindows()

QRコード検出と読み取り(cv2.QRCodeDetector.detectAndDecode)

OpenCVにはQRCodeDetectorというQRコード操作専用のクラスが用意されています。その中のdetectAndDecode()関数を使うことで、QRコードの検出と内容の読み取りを同時に行えます。

構文

cv2.QRCodeDetector.detectAndDecode(img[, points[, straight_qrcode]])

引数

引数説明
img入力画像
points検出したQRコードの四角形の頂点座標を格納する配列。戻り値としても取得可能
straight_qrcode検出したQRコードの各セルの白黒情報(0: 黒、1: 白)が格納されたNumPy配列。戻り値としても取得可能

戻り値

detectAndDecode()は3つの値を返します。

戻り値説明
dataQRコードを読み取った文字列(デコード結果)
bbox画像中のQRコードの頂点座標(4点)
rectifiedImageバイナリ化(正規化)されたQRコード画像

コード解説

まずQRCodeDetectorオブジェクトを作成し、detectAndDecode()に画像を渡します。

qrDetector = cv2.QRCodeDetector()
data, bbox, rectifiedImage = qrDetector.detectAndDecode(image)

戻り値のdataにQRコードの内容が格納されています。

print(data)
>> QR code was invented in 1994.

このように、QRコードに埋め込まれたテキストを取得できました。実際のWebサービスでは、QRコードの中身にURLが格納されていることが多く、読み取った値をブラウザで開くことでWebページへ遷移する仕組みになっています。

読み取ったQRコード画像はimshow()で確認できます。

cv2.imshow("Rectified QRCode", rectifiedImage)

まとめ

今回は、OpenCVでQRコードを読み取る方法を紹介しました。

  • QRCodeDetectorクラスのdetectAndDecode()で検出と読み取りを同時に行える
  • 戻り値としてデコード結果(文字列)頂点座標正規化画像の3つが得られる
  • 外部ライブラリ不要で、数行のコードで実装可能