OpenCVには画像からQRコードを検出・読み取るための機能が標準で用意されています。 外部ライブラリを追加する必要がなく、数行のコードで実装できます。
この記事では、QRCodeDetectorクラスのdetectAndDecode()を使ってQRコードの内容を読み取る方法を解説します。
サンプルコード
今回は以下のQRコード画像を読み込み、内容を解読します。

以下がコード全体です。
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つの値を返します。
| 戻り値 | 説明 |
|---|---|
| data | QRコードを読み取った文字列(デコード結果) |
| 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つが得られる
- 外部ライブラリ不要で、数行のコードで実装可能