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

QRコードはテレビやアプリ、紙のチラシなど様々な場面で使われています。アプリを自作するにあたり、QRコードを読み取りたいといった場面も出てくるのではないでしょうか。

OpenCVを使えば、画像中からQRコードを認識し、その中身を読み取ることができます。今回は、PythonのOpenCVでQRコードを読み取る方法を紹介します。

QRコードとは

QRコードはデンソーウェーブが開発した二次元コードで、以下の特徴を有しています。

省スペース、大容量

QRコードは二次元平面的に情報を保持するため、より小さなスペースで多くの情報を保持することができます。バーコードと比較すると10分の1程度のサイズになるそうです。

また、QRコードは数字、英字、漢字、かな、制御コード等豊富な種類のデータを扱うことができます。

どの方向からでも読み取れる

QRコードは方向にとらわれることなく読み取ることができます。利用する中でこのメリットは大きく、広く普及している大きな理由でもあると思います。

汚れ、破損に強い

QRコードは「誤り訂正機能」を持っています。なので、コードの一部が破損していたり汚れていたりしても正確に読み取ることができます。もちろん程度によりますが。

PythonでQRコードを読み取る

前置きはこれくらいに、実際にPythonでQRコードを読み取ってみます。今回は、QRコードの画像があるという前提からスタートします。

インプットとなるコード

今回はこちらのQRコード画像を読み取ってみます。

インプットとなるQRコード

cv2.QRCodeDetector()

QRコードの読み取りには、QRCodeDetector() を用います。画像を読み込んだら、 QRCodeDetector()オブジェクトを作成します。

import cv2


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

qrDetector = cv2.QRCodeDetector()

つづいて、qrDetector.detectAndDecode()で画像からQRコードを検出し、さらにデコードして内容を取得します。

QRCodeDetector().detectAndDecode(インプット画像)

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

戻り値は3つあります。1つ目(data)はQRコードを読み取った内容を保持します。2つ目(bbox)は画像中のQRコードの頂点座標、3つ目(rectifiedImage)はバイナリ化された画像です。

試しにQRコードの内容を確認してみます。

print(data)
QR code was invented in 1994.

今回のQRコードにはこの文字列が隠されていました。

切り出したQRコードを表示する

detectAndDecode()で切り出したQRコードを表示させてみます。

cv2.imshow("Rectified QRCode", rectifiedImage)

背景が写ったQRコード画像をインプットとしていると、QRコードだけが切り取られていることがよくわかると思います。

コードまとめ

ここまでのコードをまとめると、以下のようになります。

import cv2

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()

OpenCVの学習におすすめ書籍

PythonでOpenCV始めてみようという方におすすめなのが以下書籍です。実装例も豊富なので、1からコードを書かずとも学習を進めることができます。

オライリーの1冊は読み物というより辞書としての利用におすすめです。お値段結構しますが、細かい情報までしっかりと詰め込まれています。

まとめ

PythonでOpenCVを使ってQRコードを読み取る方法を紹介しました。QRコードの画像さえ用意できれば、簡単にQRコードの内容を読み取ることができます。数行で完結する点も魅力です。

QRコードを読み取れると、色々なアプリを作れそうな気がしますね^^

OpenCVの基礎を身につけるためのロードマップは以下を参考にしてください。

ではでは👋