T:handqrcode

出典: Tariki

二次元バーコード(QRコード)

大学院生で誤り訂正符号を勉強したてのころ、『紙にビットマップを描いてスキャナで取り込んだらA4一枚に何ビット記録できるか』なんて妄想をしたことがある。まあそれ以前に私の世代では、雑誌『RAM』にソースコードが紙テープで付属(読者が光電式の紙テープリーダを作るのだ(!))しているのをみたことがあったり、そういうローテク経由のハイテクには素地があったかもしれない。

上記の妄想の答えは忘れたが、確か数~数百KBとかで、とてもこれじゃフロッピーディスク(当時は5インチ640KBが主流だったと思う)の代わりにならないな、と、それ以上考えるのはやめた。

20世紀も末になって、二次元バーコードなるものが出たとき、どうしてもちょっと突き詰めて考えて(特許とかとって(笑))おかなかったんだろう、と思った。小規模なデータ量を短い文字列(URLが多い)に適用するというのもまた、応用の妙である。きょうび、雑誌から電柱まで『QRコード』が氾濫している。

さて、一次元のバーコードは10年ほど前に手描き(フリーハンド)にチャレンジしてみたことがある。確かタバコの箱の横の8桁の数だったと思うが、実にうまくいかなかった。何回目かでやっと読み取れた覚えがある。



手描きQRコード

完全フリーハンドのバージョン1。
拡大
完全フリーハンドのバージョン1。

今回、android機のアプリQR2DBarCodeでURLを表示させ、まずそれをフリーハンドで写してみた。このアプリは任意の文字列をQRコードにできるお手軽モノである。DMコード版のDM2DBarCodeもある。エンコードしたときは気づかなかったが、このアプリでは生成できる最小のQRコードがバージョン3の29×29らしく、掲載した手描きバーコードのURL程度ならバージョン2の25×25でエンコードできる。その点ではshareしたコードを最小バージョンでエンコードしてくれるShareQRのほうが優れていた。

読み取りは同じくandroidのアプリ、QRコードスキャナ。これはandroid機のカメラのAFをしゃかしゃか言わせて (最近の携帯電話・PDA付属カメラは薄いくせにAFがついているが、QRコードをマクロで読むためだ、ということは自分で所有するまで気づかなかった)、画像を取り込みQRコードをデコードするものだ。なんと1次元のバーコードも各種形式を勝手に読んでくれるので、いろんなものをスキャンすると面白い。さらにそれをブラウザに送ったりメールしたり、いろいろなアプリにshareできる。

結果は全然ダメ(笑)。というか、自分でも書いていて縦横の整合性が取れなくなってきていることに気づいていた。

升目を作ってみた。
拡大
升目を作ってみた。

次に升目を引いてみた。ちょっとずるいかな、という気もしたが、あくまでもフリーハンドなので物差しは使わない。29×29の升目は、まず正方形を2×2に分割してそれぞれを3分割ずつ、さらにそれを5分割して30×30にしてみる。こう書くと割と正確にできそうな気がするが、実際できた1ビット分の升目は、長方形だったり大きさが二倍違ったり。

それでもやけくそになって塗ってみたら、今度は一発で読み取った。升目の補助線も消していない状態である。

成功。
拡大
成功。

誤り訂正符号化の能力にも余裕があるのだろう。実際最近は、誤り訂正能力にモノを言わせて(?)、ロゴを埋め込んだふざけたQRコードをみかける。シャノン先生がみたら嘆く(喜ぶ?)だろう。それと紙が歪んだ状態で読み取れたりしなければならないので、ある程度縦横の部分的な、モーフィング的な変形には強いようにスキャニングしていると考えられる。要するに補助線があって縦横の整合性が取れていれば何とかなるわけだ。

ちなみに手で描いているといろいろな事に気づく。3隅の位置決めパターンは誰でも気づくと思うが、その他7行目・7列目がクロックになっていること(あとから規格書を読んでみてその通りだと確認した)、白や黒で連続して塗られないようにエンコードされていること、などなど。

というようなことを1時間もかけてやっている私はバカですか?


QR仁丹

これを読めたひとがいたら、読んだ端末の機種名を教えてください。
拡大
これを読めたひとがいたら、読んだ端末の機種名を教えてください。

次にモノを並べてQRコードを作ってみることにした。

同じURLだが、今度はより賢いエンコーダ(ShareQR)でエンコードしてみる。25×25のバージョン2が最小の大きさになるようだ。25枡四方とか29枡四方とかいうと大変そうだが、実際は手で塗る場合など、3隅の位置決めパターンは四角を描いてえいやっと塗れるし、その他の部分もテトリスみたいなブロックを描いていって中を塗ればよいからそれほどでもない。

しかしモノを並べるとなると、おおむね同じ大きさの粒が数百個必要である。25四方というと625枡、そのうち1/3~半分くらいが黒であるとすると、200~300粒からの形が揃ったモノが必要だ。

いろいろ考えてみた。

  • キャビア: 色的にはインパクトがある。高そうにみえるが、実はIKEAのフードコーナーにあるキャビアは一瓶200円くらいと激安だ(ランプフィッシュ == アンコウの仲間の卵である)。並べている最中に乾燥しそうなのが気になる。
  • 正露丸: 安い薬の代表として思いついたが(色も良い)、調べてみると結構な値段。400粒で3000円以上する。あと使った正露丸400粒を消費するのに何年掛かるだろうか、と考えて断念した。
  • 梅仁丹: これは適価だ。350粒で350円ほど。小さいので作業が難航しそうだ。
  • 豆類: うちに緑豆がある。形が不ぞろいだが、それがかえってよいだろう。

まずは外出ついでに、仁丹を購入してみることにした。仁丹といえばキオスクだ。「仁丹ありますか?」「仁丹? 置いてな~いのよ~」。

仁丹といえばタバコ、タバコといえばキオスク、と思っていたが、考えてみたら折からの禁煙ブームでタバコすらろくに売っていない。まして仁丹 (喫煙者が愛用する仁丹は銀色の苦いアレだが) をしゃらしゃら、くちゃくちゃやっているおじさんなど、そういえばここ20年くらいみたことない(笑)。

発泡スチロールの台。5枡ごとに穴が打ってある。
拡大
発泡スチロールの台。5枡ごとに穴が打ってある。

ということで、台湾で買ってきた緑豆を使うことにした。

緑豆は (グリーンピースではない)、日本ではあまりみない食材だが、台湾ではご飯に炊き込んだり薬膳系の料理にしたり、果ては甘く煮てカキ氷の具にしたり(これがんまい)、と広く使っている。台湾に行った際はお茶や食材などどっさり船便で送るので、うちにはいっぱいあるのだ。

最初、パイロット版で位置決めパターンあたりをコタツ板に並べてみるが、どうも位置がうまく決まらない。

セメダインCを塗って固定していく。
拡大
セメダインCを塗って固定していく。

そこで発泡スチロールの台にセメダインCで固定(セメダインCはスチロールは溶かすので、接着というより長い時間ずらしたり剥がしたりできる)することにした。パイロット版より豆の平均直径を4mmと仮定し、5枡 == 20mmごとに穴も打っておく。

最初は、緑豆がもう古くなっているので食えなくなってもいいや、と思ってはじめたが、思いのほか傷んでいない。後半はやっぱり食材がもったいなくなって(笑)、傷んだ(茶色くなった)豆だけを選んで貼り付けたので、なんとなくグラデーションになってしまった。

完成。これはこれでオブジェクトとして美しい。
拡大
完成。これはこれでオブジェクトとして美しい。

酒を飲みながら結局1時間半かかって作ったが……ちょっと誤算だったのが直径の4mmだった。小さい豆を選べばおおむね満たすのだが、豆 (パターンの黒) が縦横に並ぶ部分では、豆が押し合いへしあいして、結局縦横に並んでいるとは言いがたい状況になってしまった。

さっそく(実物を)androidのバーコードリーダで読んでみる。やはりダメである。念のため嫁のガラケーでも読んでみるがやはりダメ。

やっぱり仁丹とか正露丸とか人造的に同じ大きさのものでないとダメかなー、と思った。くやしいので、縦横アラインしていない箇所・豆が空白をふさいでいるところなどを、あとでPhotoShopのモーフィング機能を使って修正すべく、きちんと写真を撮っておく。

と、ここであることに気づいた。


テキストファイルで作ったQR? コード (別の文字列)。
拡大
テキストファイルで作ったQR? コード (別の文字列)。
これでもダメ。先にテストすべきだった。
拡大
これでもダメ。先にテストすべきだった。

テキストファイルで等幅フォント『●』から成るパターンを作ってみた(こちらは豆を並べたのとは別の文字列)。これを表示してバーコードリーダで読んでみると、ダメではないか。

やっぱり。縦横の升目はドットではダメなのだ。隙間があってはならないのである。文字をより升目占有率の高い『■』に換えてみてもダメである。

ということは、この手の小さな粒粒系のモノを並べても、QRコードは作れない、ということになる。見積もりが甘かった。作業の前に、まずテキストファイルでシミュレーションしてみるべきだったのである。

まあそれでも緑豆QRコードは、モノとしてまあ美しいので記念に取っておくことにはする(泣笑)。

バーコードリーダのアルゴリズムによるとは思うが、結局位置決めパターンを判別するとき『(黒画素が連続した)大きな二重四角形』を画像内からサーチしているのかもしれない。