質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

0回答

698閲覧

QRコードのデータコード語の配置転換と復元を行い,配置転換と復元の結果をQRコードに出力したい.

saltmoon

総合スコア0

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2021/10/21 10:45

前提・実現したいこと

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

試したこと

配置転換前のQRコード
配置転換後のQRコード
復元後のQRコード
上の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が格納されてしまうため).

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問