Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

455
245

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

QRコードを人力で読み取る

Last updated at Posted at 2018-12-31

QRコードを人力で読み取る

QRコードといえば1994年にデンソーが開発した四角いバーコードですが、これ、何も見ずに読めたらかっこよくね? という安易な考えで人力読み取りしてみようと思います
目grepがあるなら目OpenCVもあっていいと思う...うん

QRコードの生成

まず人力読み取りするために必要なQRコードを生成していきましょう

今回はGoogle Charts APIのQRコード生成を利用していきます。 Reference
しかしこのAPIはDeprecatedなのでいつ消えてもおかしくありません... 使用は非推奨です

このAPIの使い方は基本的にこんな感じです、文字コードを指定しないとデフォルトでUTF-8になります。
https://chart.googleapis.com/chart?cht=qr&chs=<width>x<height>&chl=<data>
今回は"Sweak"という文字列を300×300の大きさでQRコードにしていきたいと思うのでこんな感じになります
https://chart.googleapis.com/chart?cht=qr&chs=300x300&chl=Sweak
ブラウザで先程のURLを開くとこんな感じのQRコードが生成されると思います
qrcode1.png

QRコードの読み取り

QRコードの基本構造

QRコードは3辺に大きな四角があるのが基本です。
これはコードが上下左右どこを向いているのか読み取り機に示すものになります。
この画像で紫や赤で囲われた所がフォーマット情報が記載されている場所です。
(赤と紫が2箇所ずつありますが、同じデータです。)

bit 機能
14:13 誤り訂正レベル
12:10 マスク情報
9:5 誤り訂正機能情報
4:0 エラー訂正bit

この上の値に対してマスクが掛けられているので、解読する場合は101010000010010とXORします。

オレンジがモード指定 (数字, 英数字, バイナリ(8bit)、漢字(13bit))
黄色がデータ内の文字数指定
緑色が実データになります。
qrcode2.png

※MSB: 最上位bit, LSB: 最下位bit

マスク判定

QRコードには真っ黒や真っ白にならないようにマスクというものが施されています。
QRコードには8種類のマスクがあり、内容を解読するためにはマスクを解く必要があるので、どのマスクが掛けられているのか判定します。
マスクを判定するにはフォーマット情報の中からマスク情報が記述された部分(12:10のbit)を101とXORした数になります。

8種類のマスク概要

Mask Number Pattern
000 (i + j) % 2 = 0
001 i % 2 = 0
010 j % 3 = 0
011 (i + j) % 3 = 0
100 (i / 2 + j / 3) % 2 = 0
101 (i * j) % 2 + (i * j) % 3 = 0
110 ((i * j) % 3 + i * j) % 2 = 0
111 ((i * j) % 3 + i + j) % 2 = 0

(WikipediaにCC0ライセンスでとても分かりやすい画像が添付してあったので引用させて頂きました)
QR_Code_Mask_Patterns.png

今回のQRコードでのマスクは010なので101とXORすると111になります
ということは8つ目のマスクでパターンと重複した色を反転します

反転した後のQRコードがこちらになります (データ部のみ反転済み)
after.png

いざ解読

QRコードは右下から

12 11 10 9
14 13 8 7
16 15 6 5
18 17 4 3
20 19 2 1

の順番で読んでいくので

モード指定部を見ていくと0100 (バイナリモード(8bit))
文字数指定部 (00000101)₂ = 5文字
となっていることが分かります。

緑色のデータ部を読み、UTF-8-character tableと照らし合わせると

(01010011)₂ : S
(01110111)₂ : w
(01100101)₂ : e
(01100001)₂ : a
(01101011)₂ : k

となり、解読することが出来ました

感想

(Qiita初投稿がこんな物で本当に良いのだろうか...?)

参考

What Is A QR Code And How Does It Work? http://www.ucreative.com/articles/what-is-a-qr-code-and-how-does-it-work/
QR code - Wikipedia https://en.wikipedia.org/wiki/QR_code
https://en.wikipedia.org/wiki/QR_code#/media/File:QR_Character_Placement.svg
QRコードの概要 - 株式会社デンソーエスアイ https://www.denso-si.jp/dictionary/dic_qr/GeneralDescriptionoftheQRCode.pdf

455
245
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
amanao

@amanao

フィーリングでぷよぐやむかいてる組み込みプログラマ 句読点の入れ方がわからない
sweak
様々な Web アプリケーションを開発するサークルです。

Linked from these articles

Comments

Kta-M
@Kta-M

目OpenCVはマスクの除去が鬼門ですねw
誤り訂正までする場合はこちらもどうぞ:kissing_heart:
https://qiita.com/Kta-M/items/6f7049a1e78b1fe7e883

0
amanao
@amanao

@Kta-M コメントありがとうございます
誤り訂正は次の記事にでもまとめようかなー、とか思ってましたが文字にするのって難しいですねぇ…

1
HMMNRST
@HMMNRST

昔、QRコードで時計を作ってみたことがあります。
計算量の都合でマスクを固定にしたことで、右下のパターンだけ見たら変化が少なくて、人力で読める抜け穴ができてしまったことを思い出しました。

3

勉強になりました!マスク反転後の緑色の枠がずれていて、?となりましたが、Wikipediaのhttps://en.wikipedia.org/wiki/QR_code#/media/File:QR_Character_Placement.svg を見て納得しました。

4
amanao
@amanao

@smilkobuta
マスク反転後の画像は編集しようと思いつつ結局してませんでしたね…帰宅したら修正します…

0
@______

何も見ずに読めたらかっこよくね?

一年に数回ふとしたときに思いますが、実行しようとは思いませんでした。(笑)
実行されたのがすごいと思います……。
面白く良い記事ありがとうございます。

1

Let's comment your feelings that are more than good

Qiita Conference 2025 Autumn will be held!: 11/5(Wed) - 11/7(Fri)

Qiita Conference is Qiita's largest tech conference, dedicated to engineers in the age of AI!

Keynote Speaker

piacere, Tsuyoshi Ushio, Esteban Suarez, Takuto Wada, seya, MinoDriven, Toshihiro Ichitani, Karaage, Yoshimasa Iwase, Matz, Minorun and more…

View event details

Being held Article posting campaign

455
245

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address