IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ ジック アーゲーの特許一覧

<>
  • 特許-光学コードの読み取り 図1
  • 特許-光学コードの読み取り 図2
  • 特許-光学コードの読み取り 図3
  • 特許-光学コードの読み取り 図4
  • 特許-光学コードの読み取り 図5
  • 特許-光学コードの読み取り 図6
  • 特許-光学コードの読み取り 図7
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-12-09
(45)【発行日】2022-12-19
(54)【発明の名称】光学コードの読み取り
(51)【国際特許分類】
   G06K 7/14 20060101AFI20221212BHJP
   G06K 7/10 20060101ALI20221212BHJP
【FI】
G06K7/14 060
G06K7/14 017
G06K7/14 043
G06K7/10 372
G06K7/10 456
【請求項の数】 14
【外国語出願】
(21)【出願番号】P 2021009431
(22)【出願日】2021-01-25
(65)【公開番号】P2021118005
(43)【公開日】2021-08-10
【審査請求日】2021-02-12
(31)【優先権主張番号】20153885.7
(32)【優先日】2020-01-27
(33)【優先権主張国・地域又は機関】EP
(73)【特許権者】
【識別番号】591005615
【氏名又は名称】ジック アーゲー
(74)【代理人】
【識別番号】110001069
【氏名又は名称】弁理士法人京都国際特許事務所
(72)【発明者】
【氏名】サッシャ ブルクハルト
(72)【発明者】
【氏名】ジャン スタヴィアスキー
【審査官】河合 弘明
(56)【参考文献】
【文献】特開2004-362053(JP,A)
【文献】特開2009-129222(JP,A)
【文献】特開2007-206738(JP,A)
【文献】米国特許第06360948(US,B1)
(58)【調査した分野】(Int.Cl.,DB名)
G06K 7/14
G06K 7/10
(57)【特許請求の範囲】
【請求項1】
コード(12)の下地が平坦でないために歪みの生じた光学的なコード(12)、特に2次元的な前記コード(12)を読み取るための方法であって、前記コード(12)を含む画像データを取得し、該画像データにおいて前記コード(12)を含む領域を見出し、該領域の前記画像データから前記コード(12)のコード内容を読み取る方法において、
複数の走査点から成る走査格子を、最初に前記コード(12)上に局所的に設定し、
最初に設定された前記走査格子を、前記複数の走査点により前記コード(12)のモジュールの明暗の情報が取得されるよう、前記画像データに基づいて前記コード(12)の歪みに対して局所的に適合させ、
局所的に適合された前記走査格子を、反復的に拡大し、該拡大の度に前記画像データに基づいて前記コード(12)の歪みに対して適合させ、
反復的に拡大された前記走査格子が設定された前記コード(12)の前記画像データから前記コード(12)を読み取ること
を特徴とする方法。
【請求項2】
前記走査格子を前記平坦でない下地の湾曲についての知識なしで決定することを特徴とする請求項1に記載の方法。
【請求項3】
前記コード(12)のモジュールサイズ及び/又は前記走査格子を前記コード(12)上に全体的に設定するために必要な前記走査格子のサイズをファインダーパターンから特定することを特徴とする請求項1又は2に記載の方法。
【請求項4】
前記走査格子が前記コード(12)のモジュール毎に走査点を有していることを特徴とする請求項1~3のいずれかに記載の方法。
【請求項5】
前記走査格子を、ファインダーパターンから出発し、前記コード(12)上に全体的に設定されるまで反復的に拡大することを特徴とする請求項1~4のいずれかに記載の方法。
【請求項6】
最初に前記走査格子の走査点をファインダーパターンのために設定すること、特に平坦な下地に対応するまだ規則的な配置で設定することを特徴とする請求項1~5のいずれかに記載の方法。
【請求項7】
各走査点を該走査点により明暗の情報が取得されるモジュールの中心へシフトさせることを特徴とする請求項1~6のいずれかに記載の方法。
【請求項8】
前記コード(12)の勾配画像と大きさ画像を算出し、前記大きさ画像に基づいて各走査点が、輝度が極値を示す位置にあるかどうかを確認し、該位置の方向を前記勾配画像から特定することを特徴とする請求項7に記載の方法。
【請求項9】
シフト操作を、モジュールサイズより小さいシフト長で、輝度が極値を示す位置に達するまで、シフトがモジュールから外へ出るまで、又は最大の繰り返し回数に達するまで繰り返し、その際、特に、前記極値を示す位置を見つけることができなかった場合はそのときの走査点をシフトさせないことを特徴とする請求項7又は8に記載の方法。
【請求項10】
各走査点の輝度が極値を示す位置へのシフトから成るシフト行列を平滑化すること、特にガウスフィルタで平滑化を行うことを特徴とする請求項7~9のいずれかに記載の方法。
【請求項11】
各走査点の輝度が極値を示す位置へのシフトから成るシフト行列をシフト操作の度に定することを特徴とする請求項7~10のいずれかに記載の方法。
【請求項12】
前記走査格子を、それが前記コード(12)上に全体的に設定されるまで及び/又は所定のサイズに達するまで、少なくとも1つの縁部において追加の走査点で反復的に拡大することを特徴とする請求項1~11のいずれかに記載の方法。
【請求項13】
別のファインダーパターンから出発して更に別の走査格子を決定することを特徴とする請求項1~12のいずれかに記載の方法。
【請求項14】
コード(12)の下地が平坦でないために歪みの生じた光学的なコード(12)、特に2次元的なコード(12)を読み取るためのコード読み取り装置(10)であって、前記コード(12)を含む画像データを取得するための画像センサ(14)と、前記画像データにおいて前記コード(12)を含む領域を見出し、該領域の前記画像データから前記コード(12)のコード内容を読み取るように構成された制御及び評価ユニット(16)とを備える装置において、
前記制御及び評価ユニット(16)が更に、
複数の走査点から成る走査格子を、最初に前記コード(12)上に局所的に設定し、
最初に設定された前記走査格子を、前記複数の走査点により前記コード(12)のモジュールの明暗の情報が取得されるよう、前記画像データに基づいて前記コード(12)の歪みに対して局所的に適合させ、
局所的に適合された前記走査格子を、反復的に拡大し、該拡大の度に前記画像データに基づいて前記コード(12)の歪みに対して適合させ、
反復的に拡大された前記走査格子が設定された前記コード(12)の前記画像データから前記コード(12)を読み取る
ように構成されていること
を特徴とするコード読み取り装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、請求項1又は14のプレアンブルに記載の、コードの下地が平坦でないために歪みの生じた光学コード、特に2次元コードを読み取るための方法及びコード読み取り装置に関する。
【背景技術】
【0002】
コードリーダは、スーパーマーケットのレジ、荷物の自動識別、郵便物の仕分け、空港での手荷物の発送等、物流での利用が知られている。コードスキャナの場合、読み取り光線が回転ミラー又はポリゴンミラーホイールでコードを横切るように案内される。カメラベースのコードリーダは画像センサを用いて物体の画像をその表面のコードとともに撮影し、画像評価ソフトウエアがその画像からコード情報を抽出する。カメラベースのコードリーダは、1次元バーコード以外の種類のコード、例えばマトリックスコードのように2次元的に構成され、より多くの情報を利用できるコードでも問題なく処理できる。
【0003】
ある重要な一群の利用形態では、コードを付した物体がコードリーダの近くを通過するように搬送される。そして、コードスキャナがその読み取り領域内に次々に入ってくるコードをそれぞれ検出する。一方、カメラベースのコードリーダでは、ライン走査カメラがコード情報を持つ物体画像を相対運動に伴って次々に1ラインずつ読み取る。2次元画像センサを用いる場合は、撮像レートと搬送速度に応じて多少重なり合う複数の画像データが規則的に取得される。物体をコンベア上で任意の向きに配置できるようにするため、読み取りトンネルに複数のコードリーダを設け、物体を複数の側又は全ての側から撮影できるようにすることも多い。同様に、例えばより幅の広いベルトコンベアをカバーするために複数のコードリーダの読み取り領域を組み合わせることも知られている。
【0004】
コードが歪んで撮影されてしまうことは頻繁に起きる。その原因の1つは平坦でない表面にコードが付されることである。そうすると折れや膨らみ、そして最終的には全く予期せぬ幾何学的な歪みが生じる恐れがある。この問題は、印刷、コードマークの刻印、コードラベルの貼り付け又は他の方法等、コードを作成するやり方に関係なく生じる。
【0005】
ところで、様々な2次元コードの仕様にはエラー訂正の仕組みが組み込まれている。しかしそれは複雑な変形を検出できるようになってはおらず、むしろ平坦でない表面の影響はあったとしても僅かであるということを暗に前提としている。しかし、その密かな前提が特殊な場合にすら満たされないという用途もある。典型例の1つはプラスチック包装のような軟らかい梱包材に付したコードである。その場合、リード・ソロモン誤り訂正など、用意しておいた仕組みはたちまち限界に達し、一定の変形を超えると2次元コードがもはや読み取れなくなる。
【0006】
従来技術において、本来のコード読み取りの前にコードの撮影画像の歪みを除去する試みが一部でなされている。しかしそれは、コードリーダの撮像誤差の修正や撮影の視点の換算のような場合であって、具体的なコード及びその下地に関するものではない。特許文献1又は特許文献2は適切な視点の変換について記載している。しかしそこでもまた、コードそのものは平坦であり、それを斜めの視点から撮影しているに過ぎないという仮定が成されている。故に、コード内の個々の幾何学的な歪みはやはり読み取りエラーにつながる。特許文献3は、湾曲した表面にコードを書くという相補的な問題提起に取り組んでいる。そのために表面が3次元的に測定されるのであるが、これは多大なコストを意味する。しかもそれは円柱等、特定の規則的な幾何学形状の場合にしか機能せず、軟らかい下地の場合のように変形の仕方が絶えず変わる場合にはもう全く機能しない。
【0007】
別の従来のアプローチでは、読み取り対象のコードの幾何学的構造を例えば凸状の包絡面に基づいて大まかに認識する。歪みが軽微でとりわけ規則的であればそれが可能である場合もかなりあるが、例えばしわの寄ったプラスチック包装が下地の場合、大まかな幾何学形状に含まれる情報はとにかく少なすぎるため、コードの読み取りはやはり失敗する。
【先行技術文献】
【特許文献】
【0008】
【文献】US 7 878 402 B2
【文献】EP 2 843 616 A1
【文献】US 8 235 296 B2
【発明の概要】
【発明が解決しようとする課題】
【0009】
故に、本発明の課題は、歪んだ光学コードを読み取るための改良された方法を提示することである。
【課題を解決するための手段】
【0010】
この課題は、請求項1又は14に記載の、コードの下地が平坦でないために歪みの生じた光学コードを読み取るための方法及びコード読み取り装置により解決される。そのコードは、その湾曲又は変形した下地により、あるいは折れ、膨らみ又はその他の幾何学的な特性により歪み、従って最初は読み取りが困難又は全く不可能である。前記光学コードは特に様々な公知の規格に準拠した2次元コードである。コードを含み、好ましくは少なくとも大まかにセグメント分けされることでコード領域にまで切り詰められた画像データが生成される。画像データは典型的にはカメラベースのコードリーダの画像センサで取得されるが、原理的にはコードスキャナが1ラインずつ強度プロファイルを取得するというやり方で画像データを生成することもできる。コードは、それ自体は公知である復号法で読み取られる。
【0011】
本発明の出発点となる基本思想は、本来のコード読み取りの前に、コードの下地の変形に適合した、走査点から成る走査パターン又は走査格子を生成することにある。そしてこれらの走査点における画像データがコード読み取りのために用いられる。従って走査パターンは規則的な格子ではなく、少なくとも近似的にコードそのものと同じように歪んでいる。
【0012】
本発明には、走査パターンが変形を模写し、以てそれを補償するという利点がある。そうするとコードが大きく不規則に変形していてもなお読み取ることができ、それにより読み取り率が高まる。当然ながら、全領域が隠れてしまうようにコードが畳まれている場合等、限界はある。本方法は極めて様々な種類のコードに対して機能する。ホイル包装のような要求の厳しい用途の場合ですら、本方法を用いれば高い読み取り率が達成される。
【0013】
走査パターンは平坦でない下地の湾曲についての知識なしで決定されることが好ましい。画像データの他に利用できる情報はなく、特に3次元の輪郭の測定はない。補正対象の幾何学的形状は事前には分からず、また本方法の間にも特定されない。それどころか、走査パターンは歪んだコードに対して局所的に適合化される。
【0014】
好ましくは、コードのモジュールサイズ及び/又は必要な走査パターンのサイズをファインダーパターンから特定する。ファンダーパターンとは、2次元コードのうち、該2次元コード及びその特定の特性を認識するための特別なパターンを持つ部分である。従って、ファインダーパターンがどのコード要素又はモジュールを有しているかはコードの仕様から分かる。従って、はっきりと撮影されたコードの中でモジュールサイズを推定することができる。更に、捕らえられたコード領域を推定することにより、走査パターンがコードを完全に覆うために合計何個の走査点を含む必要があるかを導き出すことができる。そのために、QRコードの場合は追加的にファインダーパターン同士の間隔が利用可能であり、DataMatrixコードの場合はコードを2つの側から完全に囲んでいるファインダーパターンの長さが利用できる。
【0015】
走査パターンはコードのモジュール毎に走査点を有していることが好ましい。少なくとも1つの走査点がなければならない。そうしなければいくつかのモジュールが全く表現されなくなるからである。一方、逆に走査点は1つあれば十分である。なぜなら、各モジュールはその2次元的な位置を除けば明暗の情報しかもともと持っておらず、それは代表として配置された1つの走査点によって完全に取得されるからである。故に、モジュール毎に少なくとも1つの走査点を持つ走査パターンがあれば十分であり、それどころか正確に1つだけ走査点を持つ走査パターンが、無駄なコストのない、最適で、なおも完全な構成である。
【0016】
走査パターンは、ファインダーパターンから出発し、コードを完全に覆うまで反復的に拡大されることが好ましい。ファインダーパターンの場所は確実に突き止めることができる。そして、この最初の小さい走査パターンから段階的な拡大により全体の走査パターンが作り上げられる(Grid Growing)。
【0017】
好ましくは、最初に走査パターンの走査点をファインダーパターンのために設定し、特に平坦な下地に対応するまだ規則的な配置で設定する。ファインダーパターンは構成が仕様で決まっているため、その中にどのモジュールが含まれているか分かっている。故にここでは最初の走査パターンを非常に確実に設定して適合させることができる。例えば、QRコードのファインダーパターンは、入れ子状に配置された長方形から抽出される7×7個のモジュールを含んでいる。従って、7×7個の走査点から成る走査パターンから始めることができる。初期化の際にはまず規則的な走査パターンを用いることが好ましい。なぜなら、歪みに関して予め分かっている情報は一切ないからである。
【0018】
各走査点をそれにより表されるモジュールの中心へシフトさせるようにすれば有利である。歪みのない平坦なコードの場合、それは、見積もられたモジュールサイズに対応する一定の走査点間隔を有する規則的な走査パターンを使用し、その全体を一緒に中心へ寄せることにより、非常に簡単に実現できる。平坦でない下地に適合させる場合、それぞれの局所的な歪みを補償するために走査点を個別にシフトさせる。「中心」は決してモジュールの厳密な幾何学的重心である必要はなく、重要なのは、走査点が当該モジュールを代表する輝度値を捕らえるように、モジュール間のエッジを確実に避けるということだけである。
【0019】
好ましくは、コードの勾配画像と大きさ画像を算出し、大きさ画像に基づいて各走査点が極値にあるかどうかを確認し、まだ必要なシフトの方向を勾配画像から特定する。具体的には、大きさを表す画像と、X方向及びY方向における勾配を表すそれぞれ1つの画像を決定することができる。勾配はベクトルであるから方向と大きさに分解される。この関係で言えば、画像とは勾配の任意の表現を表す概念である。この勾配の算出はコード領域の画像データに対して一度だけ行えば十分であり、その結果は全ての繰り返しにおいて全ての走査点に対して適用できる。大きさが極値を示しているとき、言い換えれば少なくともゼロ付近にあるとき、走査点は十分にそのモジュールの中心にあるとみなされる。これは、走査点がモジュール間のエッジから十分に離れていて、言わばモジュールの明るい又は暗い領域の真ん中にある、ということの数学的な表現である。勾配画像は、大きさの条件がまだ満たされていないときに、極値がどの方向にあるかを示す。
【0020】
シフト操作は、モジュールサイズより小さいステップで、極値に達するまで、シフトがモジュールから外へ出るまで、又は最大数のステップが試行されるまで、段階的に試み、その際、特に、極値を見つけることができなかった場合はそのときの走査点をシフトさせないことが好ましい。ここでは反復的なやり方で極値が探索される。別のモジュール内にある間違った極値を見つけてしまうことがないように、ステップ幅は小さく選択される。そうしなければ、特に複数の明るい又は暗いモジュールが隣接している場合にその問題が生じる可能性がある。シフトが見積もられたモジュールサイズを超えたらその操作を中止する。その場合、それまでに確定したシフトでは恐らく有意な結果が得られないので、それ以上操作を続けず、むしろ差し当たりその走査点をシフトさせないことが好ましい。
【0021】
各走査点の極値へのシフトから成るシフト行列を平滑化すること、特にガウスフィルタで平滑化を行うことが有利である。つまり、個々の走査点に対してシフトを定めてシフト行列に書き込む。上述のように、適切なシフトが見つからない走査点が相当あり、それらの点は出発位置に留まる。そこでシフト行列を平滑化することにより、見つかった各シフトが相互にある程度補償されるだけでなく、平滑化なしでは出発位置に留まっていたであろう走査点もそれに隣接する点を通じて適合化される。
【0022】
好ましくは、各走査点の極値へのシフトを保持する新たなシフト行列を決定してその都度走査パターンに適用することを、新たなシフト行列ではもはや許容閾値を超えるシフトが生じなくなるまで、又は、最大の繰り返し回数に達するまで繰り返す。シフトはプロセスが収束してそれ以上改善が見られなくなるまで繰り返す。念のために特定のステップ数による中止条件も設けるべきであり、それとともに、利用可能な最大の計算時間の経過等、外部から予め定められる他の条件も含めるべきである。
【0023】
走査パターンは、それがコードを完全に覆うまで及び/又は所定のサイズに達するまで、少なくとも1つの縁部において追加の走査点で反復的に拡大されることが好ましい。好ましくは走査パターンを反復の度に1列及び/又は1行ずつ大きくする。一度に複数の行又は列を追加することも考えられるが、そうすると局所的な湾曲が大きく変化している場合に適合化の精度が低くなる。以上のように走査パターンを拡大した後、追加された走査点、全体の走査点又はそれらの中間の集合(例えば追加された走査点と、既存の走査パターンのうちそれに隣接する点)に対し、それぞれのモジュール内で中心に合わせる前述の処理を行うことが好ましい。コードが完全に覆われたら、拡大操作、そして適合した走査パターンを生成するプロセスを終了する。これは特に、コード領域のサイズと見積もられたモジュールサイズに基づいて走査パターンの所要サイズを見積もることにより確認される。
【0024】
ここに提示したステップのいくつかを一緒に実行する場合、それは多重的な入れ子の反復処理になるということに注意が必要である。上位の反復処理は小さい走査パターンで、好ましくはファインダーパターンの箇所から始まり、それをコード領域にわたって連続的に拡大していく。適合化の度に多重反復的にシフト行列を決定して適用する。1つのシフト行列の決定の中に、各走査点をそのモジュールの中心へ段階的にシフトさせてシフト行列中の一つ一つの入力値を得ることを試みる第3の反復レベルを追加することができる。
【0025】
好ましくは、別のファインダーパターンから出発して更に別の走査パターンを決定する。当然ながらこれは、複数のファインダーパターンを備えるQRコードのような種類のコードの場合のみ可能である。それ以外の種類のコードの場合、代わりに、ファインダーパターンではないものの、それ以前の試行的な読み取りにおいて又は画像処理により明確に検出できたモジュールを持つ領域から走査パターンを拡大することを試みてもよい。このようにすれば、最初に用いたファインダーパターンが何らかの理由から出発点として好ましくなかった場合に、なおも追加の試行的な読み取りを行うことができる。
【0026】
本発明に係る方法は、前記と同様のやり方で仕上げていくことが可能であり、それにより同様の効果を奏する。そのような効果をもたらす特徴は、例えば本願の独立請求項に続く従属請求項に模範的に記載されているが、それらに限られるものではない。
【0027】
以下、本発明について、更なる特徴及び利点をも考慮しつつ、模範的な実施形態に基づき、添付の図面を参照しながら詳しく説明する。
【図面の簡単な説明】
【0028】
図1】コードリーダの概略図。
図2】模範的な2次元コードとその歪みに適合させた走査パターンを示す図。
図3】適合させた走査パターンがファインダーパターンから始まってコード全体にわたって反復的に広がる過程のフローチャート。
図4図3における反復の度に実行される走査パターンの適合化のフローチャート。
図5】コード領域における大きさ画像と勾配画像の模範的な図。
図6】個々のコードモジュールにおける図6の拡大図。
図7】拡大していく走査パターンを図3のフローの様々な反復回数の後で示した模範的な図。
【発明を実施するための形態】
【0029】
図1は、単に模範例として示したコード12を読み取るための光電式コードリーダ10を示している。このコードリーダ10は画像センサ14でコード12を含む画像データを取得し、そのデータが制御及び評価ユニット16により画像解析及び復号法を用いて更に処理される。具体的な撮像方法は本発明にとって重要ではないため、コードリーダ10はそれ自体公知である何らかの原理に従って構成し、使用することができる。コード12は単一の画像で撮影することができる。コードリーダ10とコード12の間に相対運動がある場合は各時点に1ラインだけ捕らえることも考えられる。それはライン状画像センサ又はスキャン法のいずれを用いてもよく、後者の場合、画像センサ14としてはフォトダイオード等の簡単な受光器で十分である。その後、複数のラインを組み合わせて1枚の画像にする。相対運動は、ベルトコンベア付近にコードリーダを取り付け、ベルトコンベアがコード付きの物体をコードリーダ10の読み取り領域を通過するように搬送するという好ましい使用状況において生じる。
【0030】
制御及び評価ユニット16の画像処理の目的は、コード領域を認識し、そこに付されたコード12を読み取ることである。本発明は、下地が平坦でなくなることにより生じるコード12の歪みに適合した走査点の走査パターンを生成する部分的なステップに関わるものである。そのような走査パターンを生成するための方法については後で図2図7を参照して詳しく説明する。走査パターンの走査点における画像データに基づいて復号を行うという、本来のコード読み取り自体は公知であるから詳しく説明しない。ただし、それら公知の復号法は、一般的なエラー訂正法を除き、コード12の歪みに対応できない。
【0031】
インターフェイス18を介してコードリーダ10は読み取ったコードや画像データといった情報を出力する。制御及び評価ユニット16を本来のコードリーダ10内に設けるのではなく、独立した制御装置として一又は複数のコードリーダ10に接続することも考えられる。その際、インターフェイス18は内部と外部の制御部及び評価部の間の接続にも用いられる。制御及び評価の機能16は内部と外部の構成部品にほぼ任意に分配することができ、その場合、外部の構成部品はネットワーク又はクラウドを通じて接続されたものとすることもできる。以下ではそれら全てを区別せず、制御及び評価ユニット16はその具体的な実装に関わらずコードリーダ10の一部とみなす。
【0032】
図示したコード12の各例はQRコードであるが、本発明はそれに限定されるものではなく、DataMatrixコード、マキシコード(MaxiCode)、Aztecコード等、他の2次元コードにも適用可能である。QRコードはある意味で特に要求が多いとさえ言える。なぜなら、例えばDataMatrixコードには外周を囲むファインダーパターンがあるため、それだけでも多少は変形を逆推定できるが、QRコードにはそれがないからである。原則的にはバーコードも本発明の方法で読み取り可能ではある。しかし、バーコードはそうでなくても本願が扱う歪みに対してはるかに許容性が高い。なぜなら、全てのコードモジュールを切断するようにコードを横断する読み取り線が1本でも見つかれば十分だからである。
【0033】
図2はコード12の歪みに適合した走査点の走査パターンを見つけるための後述の方法により得られる結果の例を示している。この走査パターンは、好ましくは各コードモジュールの中心にそれぞれ1個だけ走査点が配置されることにより、湾曲と変形に沿っている。図から分かるように、それは柔軟な下地の表面にある規則的な格子に対応している。この格子はコード12上に配置され、該コードの平坦でない状態に順応している。
【0034】
図3及び図4はこの結果を得る模範的なフローを示している。このフローでは、走査パターンが画像データを元にして小さい領域から始まり、反復的且つ局所的に、いわば自己組織化された構築的な拡大を行う。なお、図4図3のフローのステップの一部を切り出してより詳しく説明したものである。図5図7はそのフローを更に例示している。
【0035】
まずステップS1においてコード12を含む画像データを取得する。この入力データは、例えば前処理において認識されたコード領域(ROI、関心領域)の4つの頂点ととともに画像データとして渡される。求める走査パターンのための行と列の数も同様に予め決めることができる。別のやり方ではこれらのパラメータそのものを決定する。
【0036】
ステップS2ではコード領域の勾配画像と大きさ画像を算出する。図5はその一例を示している。上段左から時計回りに、コード領域の出力画像、大きさ画像、X方向の勾配画像、及びY方向の勾配画像である。
【0037】
ステップS3では小さい最初の走査パターンを生成する。これはファインダーパターンに該当することが好ましい。各図に示した模範的なコード12の場合、ファインダーパターンは角部にある入れ子状に配置された3つの長方形である。QRコードの場合、1つのファインダーパターンは7×7個のコードモジュールから成るから、それに対しては7×7個の走査点から成る大きさの走査パターンが適している。ファインダーパターンの領域におけるコード12の湾曲に関する情報はないから、最初の走査パターンはまだ規則的である。更に、ファインダーパターンのサイズからモジュールサイズを見積もることができる。ステップS1において走査パターンのための行と列の必要数が与えられなかった場合には、それらをモジュールサイズとファインダーパターン同士の間隔から特定することができる。
【0038】
ステップS4では、それまでに得られた走査パターン(つまりここでは最初の走査パターン)をコード12の湾曲に適合させる。このステップを図4に再度詳細に示す。図から分かるように、この適合化の目的は走査点をそれにより表されるモジュール内でそれぞれ中心に配置することである。平坦なコードの場合、それは規則的な格子を用いて全ての走査点について同時に達成される。変形した下地の表面にあるコード12の場合、個別のシフトにより走査パターンを湾曲に適合させる。
【0039】
まず、ステップS41において、適合化すべき各走査点に対するシフトを保持したシフト行列を初期化する。最初はシフトがまだ決まっていないから値はゼロである。
【0040】
続く複数のステップは走査パターンの複数(好ましくは全て)の走査点に対して実行されるが、代表して1つの走査点についてのみ説明する。ステップS42では各走査点が既に中心にあるかどうかを調べる。その有利な基準の1つは大きさ画像中においてその点に対応する値を調べることである。すなわち、その大きさがゼロ又はゼロに非常に近い値を持っていれば、走査点は輝度の極値にある。最終的に重要なのは、全ての走査点がそれぞれ1つのモジュールを表し、モジュール間のエッジを表してはいないということであり、数学的に正確な幾何学的合致はさほど重要ではない。つまり、大きさ画像中で隣接する複数の点が値ゼロを示しているとしたら、それらの点のどれかに達するようなシフトを選べば、その点がコードモジュールの正確な中心ではなくても結果が損なわれることはない。
【0041】
まだ十分中心にない走査点については、ステップS43において、そのコードモジュールの極値又は中心の方向へのシフトを決定する。これを図6に例示する。ここでは、図5に示した大きさ画像と勾配画像の一部拡大図を、同じ配置で、観察されたコードモジュールの周辺部において示している。明るい円形の点は走査点の現在位置、明るい長方形の点は極値付近の目標位置を示している。シフトの方向は対応する勾配画像から分かる。即ち、走査点は輝度の増大又は減少が最大となる経路をたどる。走査点がコードモジュールから出ないように、シフトの個々のステップ長は意図的に小さく選ばれている。
【0042】
ステップS44では、それまでのシフトを行ったとしたら走査点がコードモジュールを出てしまうかどうかを調べる。これはとりわけ、複数の明るい又は暗いコードモジュールが隣接している場合に小さいステップを複数回繰り返したときに生じ得る。明暗が逆になる隣接コードモジュールは勾配に対して逆方向にあるから、そもそもシフトによりその中へ入ることはない。コードモジュールを出てしまうようなら、この走査点についての極値の探索は失敗したとみなされ、好ましくはその点を全くシフトさせず、出発位置に留める。なぜなら、それまでのシフトでは改善よりむしろ悪化が見込まれるからである。そうでなければステップS42において極値の探索を継続するが、ここではまず、最後のシフトが既にそこまで達したかどうかを調べ、そうでなければステップS43で再び小さいステップのシフトを試行する。
【0043】
ステップS42~S44のループが全ての走査点に対して終了したら、シフト行列は値で埋められている。この行列は一部の走査点を極値までシフトさせる一方、探索に失敗した残りの部分は全くシフトさせない。ステップS45では、特にガウスフィルタを用いてシフト行列を平滑化する。これにより、格子が全体としてより均一になるだけでなく、個別には適切なシフトを決めることができなかった走査点も隣接点に基づいて一緒にシフトされる。
【0044】
シフト行列によるシフトをそれまでの走査パターンに適用した後、今度はステップS46で、そもそも最小閾値を超える注目すべきシフトがまだ生じるかどうかを調べる。即ち、もはやそうではなく、走査点がそれ以上動かないのであれば、収束したものとみなし、ステップS47において適合化を終了する。そうでなければステップS41へ戻ってシフトを反復的に繰り返す。中断の別の基準として最大の反復回数(1回のみの反復も含む)を予め定めることができる。
【0045】
再び図3において、以上により適合化のステップS4が終わる。次はステップS5で、適合化された走査パターンが既にコードを完全に覆っているかどうかを調べる。走査パターンの所要サイズはステップS1で決められているか、モジュールサイズやファインダーパターンそのものの位置及び間隔といった見積値に基づいて決定されている。前記のようになっていなければ、ステップS6において走査パターンを反復的に拡大し、その度にステップS4以降の適合化を、走査パターン全体に対して、新たに追加される走査点に対して、又は新たに追加される走査点といくつかの既存の走査点(特に拡大部分の隣接領域から選ばれたもの)に対して繰り返す。
【0046】
図7はステップS6による反復処理とともに走査パターンが拡大する様子を例示している。上段左は開始時の状況を示している。ここではファインダーパターンだけが走査パターンにより捕らえられている。上段右と中段左は1回目乃至2回目の反復後の状態であり、それぞれ1行と1列が追加されている。この拡大は、例えばまず見積もられたモジュールサイズの間隔を空けて走査点を追加することにより行われる。そのためには何と言ってもそれまでの走査パターンから得られる追加的な見積もり根拠が存在する。例えば、新たな走査点を、それに隣接する既に適合化された複数の走査点が有する間隔と同じ間隔や、それに対応する行又は列の行方向又は列方向における平均値に対応した間隔で追加する。湾曲に対する適合化はその後に実行されるステップS4により初めて行われる。
【0047】
図7の中段右には更に任意に選び出された処理段階として7回目の反復後の状態を示している。最後に下段に完全な走査パターンが示されている。これは図2に対応している。
【0048】
適合化された走査パターンの走査点における画像データを用いて、今度はステップS7でコード12の読み取りを試みる。成功なら目的が達成されたことになる。そうでなければ他のデコーダを試すことができる。複数のファインダーパターンを持つQRコードの場合、別のファインダーパターンを用いて全体の処理を繰り返すことができる。このような追加の試みは、特に変形が大きい場合に、再度読み取り率を上げる上で有用である。
【0049】
2次元コードの種類が変われば使用するファインダーパターンも変わる。DataMatrixコードの場合、L字パターンを一方又は両方の辺から開始して拡大することができる。マキシコードやAztecコードはそれぞれ中央にファインダーパターンがあるから、それを出発点として利用できる。これらの例のようにファインダーパターンが1つしかない場合でも走査パターンを形成する複数の試みを行うことが考えられる。それにはファインダーパターンではない別の領域、特にコードモジュールが既に確実に認識されているような領域を出発領域として利用する。それは、それ以前の試行的な読み取りに基づくものでもよいし、その箇所でコード12が広く平坦になっているからでもよい。
【0050】
なお、走査パターンの適合化より前にもう始めから最初の試行的な読み取りを行ってもよいことに注意されたい。場合によると、特に具体的な処理対象のコード12がほとんど又は全く歪んでいなければ、それでもうコード12の読み取りに成功するかもしれない。
図1
図2
図3
図4
図5
図6
図7