はじめに
日頃、目にすることの多い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コードの作成は以下の手順となります。
- QRコードのパラメーターを設定する
Params
オブジェクトを生成する。 QRCodeEncoder
クラスのインスタンスを生成する。(cv2.QRCodeEncoder.create()
メソッド)- 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コードに分割します。 |
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コードの読み取り方法について紹介したいと思います。
ご質問や取り上げて欲しい内容などがありましたら、コメントをお願いします。
最後までご覧いただきありがとうございました。
参考リンク
OpenCV: cv::QRCodeEncoder Class Reference
cv::QRCodeEncoder Class Reference
QRcode.com|DENSO WAVE
Answers to your questions about the QR Code!『QRcode.com』
(広告)あなたに合ったプログラミング スクールが見つかるかも
プログラミングの学習が、新しい世界を開きます。副業からキャリアの転換まで、目標に向かって一歩を踏み出しましょう。
これらのプログラミング スクールは、あなたの目的に合わせて選択できるさまざまなプログラムを提供しています。どのスクールを選ぶにせよ、プログラミングは未来への扉を開き、新しい機会を切り開く手段として素晴らしい選択です。あなたの夢や目標を実現する第一歩を踏み出す準備はできていますか?