SWAPQR← ガイド

アートQRコードを近づけすぎるとスキャンに失敗することがある理由

QRコードが失敗するのは、小さすぎる、遠すぎる、暗すぎるからだと誰もが思っています。写真QRコードには逆の失敗もあります。離れた場所からは完璧に読めるのに、スマートフォンをぐっと近づけると失敗することがあるのです。その理由を、それを発見した測定の数値とともに説明します。

ブラウザでQRコードを作成する →四角を一度だけ印刷。リンク先は後から決める。

スキャナーはどうやって暗さを判定するか

読み取り機がモジュールを探す前に、写真を白黒に変換しなければなりません。全体で1つの閾値は実際の照明に耐えられません。一角にかかる影がコードの半分を黒く塗りつぶしてしまうからです。そのため多くのデコーダーは局所的に閾値処理をします。バーコードスキャンの多くが今なお派生元とするオープンソースライブラリのZXingは、画像を8×8ピクセルのブロックに分割し、各ブロックの平均を計算し、隣接ブロックと平滑化し、それをその64ピクセルの閾値として使います。ブロックの閾値より暗いピクセルは暗、残りは明です。通常のQRコードではこれはほぼ無償です。ブロックサイズが何であれモジュールはベタ塗りなので、ブロックの平均は暗に近いか明に近いか、あるいはブロックが境界をまたぐときは両者の間にあり、どちらの場合も判定は容易です。この方式は頑丈で安価で広く模倣されており、だからこそ重要です。印刷したコードが現場で出会うデコーダーは、この方法で閾値処理をするものである可能性が十分にあります。

モジュールがディザでできていると何が変わるか

ディザリングコードでは、モジュールはベタ塗りではありません。小さな強制コアと、それを囲む写真を担うピクセルです。平均は正しいですが、テクスチャは均一ではありません。ここでスキャン距離を、唯一意味のある単位、つまりモジュールあたりのカメラピクセル数で考えます。スマートフォンを十分に離して、モジュールが5〜8ピクセルに収まるようにすると、8×8ブロックはモジュールの境界をまたぎます。局所平均はおおよそ「このモジュールと隣接モジュール」になり、閾値は暗と明の間に位置し、コードは読めます。スマートフォンを近づけてモジュールが20ピクセルを覆うようにすると、8×8ブロックは1つのモジュールの内側に完全に収まります。ブロックの平均はそのモジュール自身の局所テクスチャになります。閾値はモジュールではなくディザに追従し、デコーダーはコードではなく斑点を復元します。印刷物は何も変わっていません。変わったのは各モジュールが覆うセンサーピクセルの数と、それに伴うデコーダーのブロックとモジュールの関係だけです。だからこの失敗はサイズや照明ではなく距離の性質なのです。

その数値

SWAPQRの写真モードを構築する際に測定しました。3種類のペイロード長、6種類の画像タイプ、両方の色極性、3段階のバランス設定、7段階のシミュレートされたスキャン距離を、2つの独立したライブラリで復号しました。境界は明確です。各モジュールの約20%を強制した写真寄りの設定と約44%を強制した設定では、コードはモジュールあたり5〜8ピクセルで読め、ZXing系の読み取り機はモジュールあたり10〜28ピクセルの至近距離で不安定になりました。約60%以上を強制すると、あらゆる距離で読めました。モジュール面積の約半分以上がベタ塗りに強制されると、モジュール内に落ちるどの8×8ブロックも大部分がベタ塗りピクセルに当たり、効果は消えます。それ未満では消えません。そして階調バイアスをいくら調整しても直りません。局所閾値はどのみち局所平均を差し引くからです。モジュールをどの階調に傾けても、完全にその内側にあるブロックはその傾きを基準として測定し、閾値処理で打ち消します。唯一効くレバーはモジュールのうちベタ塗りの割合であり、バランスコントロールが存在するのはそのためです。

新しいデコーダーと、それで終わりではない理由

新しいデコーダーはこれに強くなっています。同じ測定で、異なる二値化戦略を使うjsQRはあらゆる構成をあらゆる距離で読み、現行スマートフォンに内蔵されたスキャナーはさらに強力です。しかし「ほとんどのスマートフォンで読める」は「すべての読み取り機で読める」と同じではなく、印刷されたコードはたまたま向けられた読み取り機に出会います。古いスマートフォン、POSスキャナー、キオスク、ZXing派生ライブラリを同梱したアプリなどです。したがって写真寄りのバランスはそのトレードオフについて正直です。スタジオは、最新のスマートフォンスキャナーはあらゆる距離で読めるが、古くて単純な読み取り機は極端な至近距離で苦戦することがあると注記しています。バランス上のどこに位置するかの判断は、誰がどれくらいの距離からスキャンするかによります。スマートフォンが自然にどこに置かれるかにもよります。ポスターに対してスマートフォンを腕の長さで構える人はいませんが、名刺には誰もがぐっと近づけます。それが写真寄りのコードと単純な読み取り機が出会いうる場面です。

どうすればよいか

コードが通常の距離からスキャンされる場所、たとえばポスター、テーブルテント、棚のラベルに行くなら、写真寄りの設定で問題ありません。その距離ではモジュールが数個のカメラピクセルを覆い、ブロックは本来のように境界をまたぎます。人がスマートフォンを押し当てる場所、たとえば小さなステッカー、名刺、画面に行くなら、バランスを「コード」側に動かして、各モジュールの半分以上をベタ塗りにし、あらゆる種類の読み取り機で至近距離の効果が消えるようにしてください。どちらにせよ、1枚印刷してスマートフォンでスキャンしてください。モニター上のスクリーンショットではなく、実際の印刷物を、実際のサイズで、人が実際に使う距離から、できれば複数のスマートフォンでです。SWAPQRはこの警告を注釈の小さな文字ではなくスタジオ自体に表示しています。現場で失敗するコードは、機能する無地のコードより悪く、印刷前に気づけば修正は再印刷ではなくスライダーで済むからです。

各モジュールの強制割合遠距離/通常(モジュールあたり5〜8 px)至近距離(モジュールあたり10〜28 px)
約20%(写真寄り)読めるZXing系の読み取り機は不安定
約44%(中間)読めるZXing系の読み取り機は不安定
約60%以上(コード寄り)読める読める
任意の設定、jsQR系および現行スマートフォンスキャナー読める同じ測定で読める

よくある質問

私のスマートフォンはどの距離からでも写真コードを読めます。なぜ警告があるのですか?

現行のスマートフォンスキャナーはより強力な二値化を使い、私たちの測定ではすべての構成を読みました。警告は、8×8ブロックで閾値処理をする古いまたは単純な読み取り機についてのもので、印刷されたコードはそれに出会う可能性があります。

スマートフォンを遠ざけると直るのはなぜですか?

遠ざかるほど各モジュールが覆うカメラピクセルが減り、デコーダーの8×8ブロックが複数のモジュールをまたいで、その平均が暗と明の間に位置するからです。近づくとブロックが1つのモジュールの内側に落ち、代わりにディザのテクスチャに追従します。

階調バイアスを上げれば至近距離で役立ちますか?

いいえ。局所閾値は局所平均を差し引くため、モジュール内の一様な傾きは閾値処理で打ち消されます。結果を変えるのは、モジュールのうちベタ塗りに強制される割合だけです。

名刺に安全なバランスはどれですか?

「コード」側に動かして、各モジュールの約半分以上をベタ塗りにしてください。その時点で私たちの測定ではZXing系の読み取り機があらゆる距離で読め、絵はまだ見えますが、少し薄くなります。

四角を一度だけ印刷。リンク先は後から決める。 SWAPQRは静的QRコードを無料で作成できます。すべてのスタイルオプション付きで、アカウント登録も透かしもありません。有料プランではコードが動的になります。印刷した四角はそのままで、リンク先を変更でき、日別・デバイス別にどれくらいスキャンされたかを確認できます。

ブラウザでQRコードを作成する
言語: TR EN DE ES FR IT PT AR RU JA KO