前提・実現したいこと
Pythonのqrcodeライブラリを使用して,QRコードのデータコード語の配置転換を行って,その結果をテキストファイルに保存し,復号時にそのファイルをもとにデータコード語の復元を行って結果をQRコードに出力するプログラムを作成したいと考えています.
発生している問題・エラーメッセージ
データコード語の配置転換と復元は正常に動作するのですが,何度プログラムを実行しても配置転換後と復号後の結果をQRコードに反映できません.具体的に言いますと下の画像のようにデータコード後の配置転換・復号は正しく行われているのですが,その結果がQRコードに反映されていないという問題があります.
該当のソースコード
Python
1from numpy.random import default_rng # 乱数ジェネレータの生成で使用 2import cv2 3import numpy as np 4 5rng = np.random.default_rng() # 乱数ジェネレータのインスタンスを作成(np.random.permutation()よりも高速) 6if __name__ == "__main__": 7 qr = QRCode(version = 3, 8 error_correction = constants.ERROR_CORRECT_L, 9 box_size = 10, 10 border = 4, 11 ) 12 13""" データコード語の配置転換 """ 14qr.add_data("Sample") # データを追加 15data_cache = np.array(qr.makeImpl(True,qr.best_mask_pattern())) # データコード語を取得 16print("元のデータコード語:\n{}".format(data_cache)) 17index = np.array([i for i in range(len(data_cache))]) # data_cacheの要素数に対応するインデックス番号 18array = np.vstack([index,data_cache]) # インデックス番号と符号語領域の要素の行列を結合 19array = array[:,rng.permutation(array.shape[1])] # 行列の1行目のみシャッフル 20print("配置転換後のデータコード語:\n{}".format(array[1])) 21np.savetxt('table.txt',array,fmt = '%3d') # arrayをテキストデータに保存 => 置換表として使用. 22qr.map_data(array[1], qr.best_mask_pattern()) # 配置転換したデータ配列の写像 23qr.setup_type_info(False, qr.best_mask_pattern()) # 形式情報の構築 24if qr.version >= 7: 25 qr.setup_type_number(False) # 型番が7以上の場合型番情報も構築 26img = qr.make_image() # QRコードの画像を生成 27img.save("qrcode_interleaved.png") 28qr.clear() 29 30""" 元のデータコード語の復元 """ 31array = np.loadtxt('table.txt',dtype = int) # txtファイルの読み込み 32array = np.c_[array.T] # 行列を転置 33array = np.ndarray.tolist(array) # ndarray配列をリスト型に変換 34array = np.array(sorted(array)) # インデックス番号を昇順にソート 35array = np.c_[array.T] # 行列を転置 36print("復元後:\n{}".format(array[1])) 37qr.map_data(array[1],qr.best_mask_pattern()) # デインタリーブした符号語系列をQRコードにマッピングする. 38qr.setup_type_info(False,qr.best_mask_pattern()) 39if qr.version >= 7: 40 qr.setup_type_number(False) 41img = qr.make_image() # QRコードの画像を生成 42img.save("qrcode_deinterleaved.png") 43qr.clear()
試したこと
上の3つのQRコードは順に配置転換前のQRコード,配置転換後のQRコード,復元後のQRコードとなっています.なおこれらのQRコードは配置転換と復元が正しく行われているかを確認するためにマスクパターンを外しています.プログラムを詳しく調べたところqr.map_data()関数が原因となっているのではないかと考えています.インターネット等でも解決策を調べましたが今のところ何も手がかりは得られておりません.プログラム等で何かお気づきになったことがございましたらご教授いただけますと幸いです.
補足情報(FW/ツールのバージョンなど)
使用言語:Python2.7.16
使用ツール:numpy(バージョン1.21.3),qrcode(バージョン7.3.1)
開発環境:IDLE
使用機器:MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
※プログラムはqrcodeライブラリに追記しています(他のPythonスクリプトファイルでこのプログラムを実行すると配置転換処理のdata_cacheにNoneが格納されてしまうため).
あなたの回答
tips
プレビュー