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

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

今回はPythonでQRコードを読み取る方法を紹介しよう。

QRコードも読み取れるんですか!?

画像解析の分野に入るからな。
OpenCVにQRコード読み取りの関数が用意されている。今回はそれを紹介しよう。

Pythonで実装する

今回は以下の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(type(rectifiedImage))
print(data)

# rectifiedImage = np.uint8(rectifiedImage);
cv2.imshow("Rectified QRCode", rectifiedImage)

print(type(rectifiedImage))

cv2.waitKey(0)
cv2.destroyAllWindows()

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

OpenCVにはQRCodeDetectorというQRコード操作のクラスが用意されている。今回はその中のdetectAndDecode()関数を使う。

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

引数

OpenCV共通の引数はこちら

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

コード解説

コード上では、QRCodeDetectorオブジェクトを作成し、その後qrDetector.detectAndDecode()を呼び出している。

qrDetector.detectAndDecode()の結果として、画像中のQRコードの位置とその内容を取得している。

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

戻り値が3つありますが、それぞれどんな情報です?

1つ目(data)はQRコードを読み取った内容が、2つ目(bbox)は画像中のQRコードの頂点座標が返される。3つ目(rectifiedImage)はバイナリ化されたQRコードの画像が返される。

今回のQRコードの内容は、戻り値として取得したdataに格納されている。

print(data)

>> QR code was invented in 1994.

意外とシンプルな文章が隠れてましたね。お宝、、

世の中そんなに甘くはない。QRコードを読んでWebサイトに飛ぶサービスなどは、中身にURLが仕込まれていたりするわけだ。

ちなみに、読み込んだQRコードは以下で表示している。

cv2.imshow("Rectified QRCode", rectifiedImage)

まとめ

QRコードの読み取り、意外と簡単だったろう?

はい、シンプルに実装できましたね。僕はこれからお宝QRコードを探しに旅に行ってきます。

(もう帰ってこなくていいぞ、、)

まあ、今回はここまでにしよう。

ありがとうございました~~♪