【Python・OpenCV】QRコードを作成するには(cv2.QRCodeEncoder)

※当サイトではアフィリエイト広告を利用しています

Python プログラミング 画像処理

【Python・OpenCV】QRコードを作成するには(cv2.QRCodeEncoder)

はじめに

日頃、目にすることの多いQRコードは、情報を瞬時に読み取るための便利な手段として広く利用されています。
OpenCVでも、簡単かつ効率的にQRコードを生成機能が含まれています。
この記事では、簡単なQRコードの仕様の紹介、およびOpenCVのQRCodeEncoderクラスを使用して、QRコードを作成する方法について解説します。

QRコード, QR Codeはデンソーウェーブの登録商標です。

QRコードの仕様

QRコードを作成する前に、その仕様について簡単にまとめました。

  • データ容量は最大4,296文字です。数字のみの場合は最大7,089文字、バイナリデータ(8ビット)の場合は最大16,582バイト、漢字の場合は最大1,817文字です。
    データ容量は設定するパラメーターによって変化しますが、一般的には数百バイト程度のデータを埋め込むことができます。
  • 1つのQRコードにencodeできるデータ型は数値、英数字、バイナリの3種類です。
  • エラー訂正能力は4段階あり、LEVEL_L(7%)、LEVEL_M(15%)、LEVEL_Q(25%)、LEVEL_H(30%)が定められています。
    エラー訂正能力を上げるとデータ容量は減少しますが、読み取り精度は上がります。用途に応じて設定を変更する必要があります。
  • バージョン(QRコードのサイズ)は1から40まで定められており、バージョンが上がるほどデータ容量が大きくなります。
  • マスクパターンはデータを置き換えるためのパターンで、0から7の8種類が定義されています。
  • 1モジュールのサイズは規格上0.3mm x 0.3mmと定められています。したがって、例えばバージョン10の実際のサイズは約17.1mm x 17.1mmになります。

QRコードの各バージョンとサイズの関係は以下の様になっています。

  • バージョン1 : 21x21 モジュール
  • バージョン2 : 25x25 モジュール
  • バージョン3 : 29x29 モジュール
  • バージョン4 : 33x33 モジュール
  • バージョン5 : 37x37 モジュール
  • バージョン6 : 41x41 モジュール
  • バージョン7 : 45x45 モジュール
  • バージョン8 : 49x49 モジュール
  • バージョン9 : 53x53 モジュール
  • バージョン10 : 57x57 モジュール
  • バージョン11 : 61x61 モジュール
  • バージョン12 : 65x65 モジュール

以降も4ずつモジュールが増え、最大のバージョン40では 177x177 モジュールのサイズとなります。

QRCodeEncoderクラス

QRCodeEncoderクラスはOpenCV バージョン4.5.5(2021年12月リリース)以降で追加されました。
本記事で紹介するサンプルコードを実行する際は注意してください。

OpenCVのバージョンを確認する方法はこの記事で紹介していますが、Pythonのプログラムでは以下となります。

import cv2
print(cv2.__version__)
(広告) OpenCV関連書籍をAmazonで探す

QRコード作成の手順

QRCodeEncoderクラスを使用したQRコードの作成は以下の手順となります。

  1. QRコードのパラメーターを設定するParamsオブジェクトを生成する。
  2. QRCodeEncoderクラスのインスタンスを生成する。(cv2.QRCodeEncoder.create()メソッド)
  3. QRコードを作成する。(QRCodeEncoderクラスのencode()メソッド、またはencodeStructuredAppend()メソッド)

QRCodeEncoderクラスのパラメーター

QRCodeEncoderクラスの設定可能なパラメーターは以下の通りです。

Correction Level

エラー訂正レベルを指定します。

エラー訂正能力エラー訂正率
cv2.QRCODE_ENCODER_CORRECT_LEVEL_L約7%が復元可能
cv2.QRCODE_ENCODER_CORRECT_LEVEL_M約15%が復元可能
cv2.QRCODE_ENCODER_CORRECT_LEVEL_Q約25%が復元可能
cv2.QRCODE_ENCODER_CORRECT_LEVEL_H約30%が復元可能

一般的にはcv2.QRCODE_ENCODER_CORRECT_LEVEL_M(15%)で運用されるケースが多いようです。

Encode Mode

QRコードの形式を指定します。

エンコード モード説明
cv2.QRCODE_ENCODER_MODE_AUTO自動
cv2.QRCODE_ENCODER_MODE_NUMERIC数字のみのデータ(0-9)
cv2.QRCODE_ENCODER_MODE_ALPHANUMERIC数字と英字、記号のデータ
cv2.QRCODE_ENCODER_MODE_BYTEバイナリデータ
cv2.QRCODE_ENCODER_MODE_ECIデータの文字エンコーディングにUTF-8を指定します。
cv2.QRCODE_ENCODER_MODE_KANJI漢字のみのデータ
cv2.QRCODE_ENCODER_MODE_STRUCTURED_APPENDデータを複数のQRコードに分割します。

メモ

  • cv2.QRCODE_ENCODER_MODE_BYTEは、画像や音声をデータとして入れる場合に使用できます。
  • 数字のみ、数字と英字、記号の組み合わせのみ、漢字のみがわかっている場合は、それぞれcv2.QRCODE_ENCODER_MODE_NUMERICcv2.QRCODE_ENCODER_MODE_ALPHANUMERICcv2.QRCODE_ENCODER_MODE_KANJIを指定すると、より高いデータエンコード効率が得られます。
  • cv2.QRCODE_ENCODER_MODE_AUTOはエンコードするデータの内容に応じて最適なモードを自動的に選択します。
    - 数字のみのデータ → cv2.QRCODE_ENCODER_MODE_NUMERICを使用
    - 数字と英字のデータ → cv2.QRCODE_ENCODER_MODE_ALPHANUMERIC使用
    - その他のデータ → cv2.QRCODE_ENCODER_MODE_BYTEを使用
    データによってはcv2.QRCODE_ENCODER_MODE_KANJIなどを指定したほうが効率的な場合もありますが、データ内容を意識せずに済むcv2.QRCODE_ENCODER_MODE_AUTOは、簡易なQRコード生成に向いています。したがって、データの内容や変化を予期できない場合や、簡易なQRコード生成を行う場合に、cv2.QRCODE_ENCODER_MODE_AUTOを利用するのがよい様です。

Structure Number

エンコード モードのcv2.QRCODE_ENCODER_MODE_STRUCTURED_APPENDで生成するQR コードの分割数を整数で指定します。エンコード モードがcv2.QRCODE_ENCODER_MODE_AUTOの場合に、Structure Numberを2以上の値に指定した場合、エンコード モードはcv2.QRCODE_ENCODER_MODE_STRUCTURED_APPENDが自動的に設定されます。

Version

QR コードのバージョン を指定します。設定可能範囲は1〜40です。

cv2.QRCodeEncoder_Params関数とパラメータの設定

cv2.QRCodeEncoder_Params関数はQRコードのパラメーターを設定するためのParamsオブジェクトを生成します。
上記で紹介したパラメーターを設定することができます。

以下に設定例のコードを示します。

# Paramsのインスタンスを生成します。
qr_params = cv2.QRCodeEncoder_Params()

# Correction LevelをLEVEL_Mに設定します。
qr_params.correction_level = cv2.QRCODE_ENCODER_CORRECT_LEVEL_M

# Encode Modeを自動に設定します。
qr_params.mode = cv2.QRCODE_ENCODER_MODE_AUTO

# Versionを10に設定します。
qr_params.version = 10 # 設定可能な値 1-40

# 分割せず、QRコードを1つだけ作成する設定とします。
qr_params.structure_number = 1

cv2.QRCodeEncoder.createメソッド

QRCodeEncoderクラスのインスタンスを生成します。

cv2.QRCodeEncoder.create( )

引数

なし

戻り値

QRCodeEncoderクラスのインスタンス

cv2.QRCodeEncoder.encodeメソッド

入力データからQRコードを作成します。

cv2.QRCodeEncoder.encode( encoded_info[, qrcode] )

引数

名称説明
encoded_info(必須)QRコードにエンコードするデータ
qrcode(オプション)生成されたQRコードの画像。指定された場合、生成されたQRコードがこの変数に格納されます。指定されない場合は、新しいQRコードの画像が作成されて結果が格納され戻り値として取得できます。

戻り値

生成されたQRコードの画像

cv2.QRCodeEncoder.encodeStructuredAppendメソッド

cv2.QRCODE_ENCODER_MODE_STRUCTURED_APPENDモードでQRコードを作成します。
大容量のデータを複数のQRコードに分割して保持することができます。

QRコードリーダー側では、複数のQRコードを正しい順序で読み取り、データを結合する必要があります。

cv2.QRCodeEncoder.encodeStructuredAppend( encoded_info[, qrcode] )

引数

名称説明
encoded_info(必須)QRコードにエンコードするデータ
qrcode(オプション)生成されたQRコードの画像。指定された場合、生成されたQRコードがこの変数に格納されます。指定されない場合は、新しいQRコードの画像が作成されて結果が格納され戻り値として取得できます。

戻り値

生成されたQRコードの画像の配列。Structure Numberで指定された数が要素数となります。
一つのQRコードのデータはStructure Numberで指定された数で等分されたものです。

使い方

cv2.QRCODE_ENCODER_MODE_AUTOでcv2.QRCodeEncoder.encodeメソッドを使用したサンプルコードを下に示します。

import cv2
from matplotlib import pyplot as plt

# QRコードにする文字列
encoded_info = "漢字テスト"  

# QRコード エンコーダーの設定
qr_params = cv2.QRCodeEncoder_Params()
qr_params.correction_level = cv2.QRCODE_ENCODER_CORRECT_LEVEL_Q
qr_params.mode = cv2.QRCODE_ENCODER_MODE_AUTO
qr_params.version = 10 # 設定可能な値 1-40
qr_params.structure_number = 1

# QRCodeEncoderクラスのインスタンスを作成
QRencoder = cv2.QRCodeEncoder.create(qr_params)

# QRコードを作成
qrcode = QRencoder.encode(encoded_info)

# 結果の可視化
title = "cv2.QRCodeEncoder: codevace.com"
plt.figure(title)                                       # ウィンドウタイトルを設定
plt.imshow(qrcode, cmap='gray')                         # ウィンドウ上に画像を配置
plt.show()                                              # ウィンドウを表示する。

結果を次に示します。
qr_params.correction_level = cv2.QRCODE_ENCODER_CORRECT_LEVEL_Q、version = 10のQRコードのため、57x57 モジュールとなっています。

cv2.QRCODE_ENCODER_MODE_STRUCTURED_APPENDでcv2.QRCodeEncoder.encodeStructuredAppendメソッドを使用して、文字列データを3つに分割してQRコードを作成するサンプルコードを以下にに示します。

import cv2
from matplotlib import pyplot as plt

# QRコードにする文字列
encoded_info = "123456789漢字"  

# QRコード エンコーダーの設定
qr_params = cv2.QRCodeEncoder_Params()
qr_params.correction_level = cv2.QRCODE_ENCODER_CORRECT_LEVEL_Q
qr_params.mode = cv2.QRCODE_ENCODER_MODE_STRUCTURED_APPEND
qr_params.version = 5 # 設定可能な値 1-40
qr_params.structure_number = 3 # encoded_infoを分割する個数

# QRCodeEncoderクラスのインスタンスを作成
QRencoder = cv2.QRCodeEncoder.create(qr_params)

# QRコードを作成
qrcode = QRencoder.encodeStructuredAppend(encoded_info)

# 結果の可視化
plt.rcParams["figure.figsize"] = [12,5]                             # 表示領域のアスペクト比を設定
title = "cv2.QRCodeEncoder Structured Append Mode: codevace.com"
plt.figure(title)                                                   # ウィンドウタイトルを設定
plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95)   # 余白を設定

plt.subplot(131)                                                    # 1行3列の1番目の領域にプロットを設定
plt.imshow(qrcode[0], cmap='gray')                                  # 1つ目のQRコードを表示
plt.title("QR Code #1")                                             # 画像タイトル設定

plt.subplot(132)                                                    # 1行3列の2番目の領域にプロットを設定
plt.imshow(qrcode[1], cmap='gray')                                  # 2つ目のQRコードを表示
plt.title("QR Code #2")                                             # 画像タイトル設定

plt.subplot(133)                                                    # 1行3列の3番目の領域にプロットを設定
plt.imshow(qrcode[2], cmap='gray')                                  # 3つ目のQRコードを表示
plt.title("QR Code #3")                                             # 画像タイトル設定

plt.show()                                                          # ウィンドウを表示する。

結果は下の様になります。
qr_params.correction_level = cv2.QRCODE_ENCODER_CORRECT_LEVEL_Q、version = 5、structure_number = 3のQRコードのため、37x37 モジュールのQRコードが3つ出力されます。

■(広告)OpenCVの参考書としてどうぞ!■

おわりに

OpenCVを使用してQRコードを生成することは非常に簡単であり、効率的にカスタマイズすることができることがわかりました。

また、別の記事でQRコードの読み取り方法について紹介したいと思います。

ご質問や取り上げて欲しい内容などがありましたら、コメントをお願いします。
最後までご覧いただきありがとうございました。

参考リンク

(広告)あなたに合ったプログラミング スクールが見つかるかも

プログラミングの学習が、新しい世界を開きます。副業からキャリアの転換まで、目標に向かって一歩を踏み出しましょう。

これらのプログラミング スクールは、あなたの目的に合わせて選択できるさまざまなプログラムを提供しています。どのスクールを選ぶにせよ、プログラミングは未来への扉を開き、新しい機会を切り開く手段として素晴らしい選択です。あなたの夢や目標を実現する第一歩を踏み出す準備はできていますか?

-Python, プログラミング, 画像処理
-