本発明は、文字や図表とともに複数のコードが配置された電子画像データや複数のコードが印刷された文書をデジタルカメラやスキャナなどの画像読取装置で読み取った画像データから、複数のコードを認識し、それらをまとめて処理するコード画像処理方法に関する。
近年、一次元バーコード(特に断らない限り、以下、“一次元コード”と称する)よりも多くの情報を埋め込むことができる二次元バーコード(特に断らない限り、以下、“二次元コード”と称する)の普及が進んでいる。二次元コードでは、コード全体の二次元配列データが分らなければ認識できないため、読取装置にはデジタルカメラやイメージスキャナのような画像読取装置が用いられている。
二次元コードの普及に伴い、これまでの専用のラベルに印刷されたコードを読み取るだけでなく、文字や図表とともに任意に位置に任意の大きさのコードが印刷される用途も増大している。また、1枚の文書上に複数の二次元コードを配置して使用する用途も増えつつある。
図1は、コード領域の右上、左上、および左下にコードの位置決め用シンボルが配置されるクイックレスポンス(QR)コード(非特許文献1参照)と呼ばれる二次元コードが有る画像データから、コード画像処理して二次元コードを認識する従来のコード画像処理方法を説明するための概略図である。図1において従来は、画像データを小ブロック領域30毎に左上隅から横方向に順次走査し、走査で小ブロック領域30が第1の二次元コード40の内部に入って、第1の二次元コード40内の位置31で領域内の画像の特徴が二次元コードと合致する場合には、そのブロック領域にコードが存在すると特定してその近傍に対して認識処理を行っていた。この場合、図1(a)に示すように、一度認識を終了すると、そこで処理を終了するため、コードが複数含まれている場合でも最初に特定した1つしか認識できないという問題が有った。また、図1(b)に示すように、認識後に走査を継続した場合、第1の二次元コード40中に複数の小ブロック領域30が含まれるような時には、第1の二次元コード40内の位置32でも領域内の画像の特徴が二次元コードと合致するということで再び認識処理を行ってしまうため、同一のコードを複数回認識してしまうという問題が有った。(特許文献1参照)
図2は、QRコードが有る画像データとは別に画像データに含まれるコードの位置情報を記録したレイアウトのテンプレートの情報を使用して二次元コードを認識する従来のコード画像処理方法を説明するための概略図である。この従来例は図2に示すように、画像データ(図2(a))とは別に、画像データに含まれるコード60、70の位置情報を記録したレイアウトのテンプレート80、90(図2(b))を別途作製しておき、認識処理時にテンプレートの情報を参照するようにしている(図2(c))。この場合、レイアウトのテンプレートを別途作製しておき、読み取る文書に応じてレイアウトのテンプレートをいちいち選択する手間がかかるという問題があった。さらに、読み取った画像データとテンプレートの位置合わせを正確に行うようにし、画像データに回転や歪みが発生しない方法で画像を読み取らなければならないという課題もあった。(特許文献2参照)
特願2003-408104
特開2000-339407号公報(第2欄50行〜第3欄20行、図5)
JIS X0510 2次元コードシンボル−QRコード−基本仕様 解説
文字や図表とともに任意の位置に任意の数の二次元コードが配置された文書の場合、デジタルカメラやイメージスキャナを用いて読み取りを行うと二次元コードに加えて文字や図表の一部も画像データとして取り込まれてしまう。このため、画像データに複数含まれる二次元コードを認識するには、まずコードが存在するそれぞれの位置を特定し、特定した位置の近傍に対して順次コード認識処理を行う必要がある。
本発明のコード画像処理方法は、画像データを矩形ブロック単位で選択するブロック選択過程と、選択されたブロックが所定の条件を満たすかを判別するブロック判別過程と、所定の条件を満たすブロック内に含まれるコードの種類及び特性を判定するコード判定過程と、種類及び特性が判定されたコードに対し認識を行うコード認識過程と、コード認識結果に基づいてブロック走査の手順を制御するブロック走査制御過程を含んでなることを特徴とする。
本発明によれば、画像データにコードが複数含まれている場合でも、一つのコード認識で止まることなく、認識したコード領域におけるコード判別処理及びコード認識処理をスキップするので、コード全体の探索と認識を高速かつ確実に行うことが可能である。また、テンプレートを別途用意しなくとも、コードの位置を検出して認識を行えるため、コードがどのように配置されていても、また読み取った画像データが傾いていたり位置がずれていた場合でも間違いなく認識を行うことが可能である。
従来のコード画像処理方法を説明するための概略図である。
コードの位置情報を記録したレイアウトのテンプレートの情報を使用して二次元コードを認識する従来のコード画像処理方法を説明するための概略図である。
本発明の第1の実施形態に係るコード画像処理方法の原理説明図である。
一次元コードと二次元コードの典型例を示す図である。
エッジ数によるコード判定方法の説明図である。
ライン間相関によるコードの判定方法の説明図である。
一次元コードの回転の有無の判定方法の説明図である。
コード種類及び特性の判別処理の全体フローチャートである。
一次元コード判定処理の詳細フローチャートである。
一次元コード回転判定処理の詳細フローチャートである。
二次元コード判定処理の詳細フローチャートである。
本発明の第1の実施形態に係るコード画像処理方法を説明するための概略図である。
二次元コードの境界検出方法の原理的な説明図である。
セル幅の検出方法の説明図である。
第1の白連続長検出方法の説明図である。
第2の白連続長検出方法の説明図である。
コード内部における第2の白連続長検出動作の説明図である。
コード境界における第2の白連続長検出動作の説明図である。
コード境界検出処理の開始点の位置の説明図である。
上下左右4方向のコード境界検出の説明図である。
閾値の設定方法の説明図である。
領域ごとの閾値決定方法の説明図である。
コード境界検出処理の全体フローチャートである。
第1の白連続長検出処理の詳細フローチャートである。
第2の白連続長検出処理の詳細フローチャートである。
図3に示すブロック走査制御過程の処理を説明するためのフローチャートである。
本発明の第2の実施形態に係るコード画像処理方法を説明するための概略図である。
本発明の第2の実施形態に係る基準座標の設定を説明するための図である。
本発明の第2の実施形態に係るコード画像処理方法を説明するためのフローチャートである。
本発明の第3の実施形態に係るコード画像処理方法を説明するための概略図である。
本発明の第3の実施形態に係るコード画像処理方法を説明するフローチャートである。
本発明におけるプログラムのコンピュータへのローディングを説明する図である。
以下、本発明の実施形態を、図面を参照しながら詳細に説明する。
[実施例1]
図3は、本発明の第1の実施形態に係るコード画像処理方法の原理説明図である。同図において本発明の基本処理ブロックは、画像データを矩形ブロック単位で選択するブロック選択過程1と、選択されたブロックが所定の条件を満たすかを判別するブロック判別過程2と、所定の条件を満たすブロック内に含まれるコードの種類及び特性を判定するコード判定過程3と、種類及び特性が判定されたコードに対し認識を行うコード認識過程4と、コード認識結果に基づいてブロック走査の手順を制御するブロック走査制御過程5を備えている。そして、ブロック走査制御過程5により手順制御されたブロック走査を経て全てのコードの認識処理が終了した後に結果出力過程6から結果が出力される。
本実施形態に係るブロック選択過程1においては、画像データを小ブロック領域(矩形ブロック単位)に区切って走査し、ブロックを選択してコードを探索する。次に、ブロック判別過程2においては、ブロック選択過程1で選択したブロックのうち所定の条件として、ブロック内の画素の階調値の分散が所定の範囲内にあることを判別するか、または、ブロック内の黒画素と白画素の比率が所定の範囲内にあるかを判別する。
またコード判定過程3においては、一次元コードか二次元コードかのコード種類を判定し、また一次元コードと判定された時には、その一次元コードの特性、たとえば回転した状態にあるか否かを判定する。そしてコード認識過程4においては、コード判定過程3でブロックの領域内にコードが含まれていると判定された場合にコードの認識を行う。また本実施形態に係るブロック走査制御過程5は、コード認識過程4でのコード認識結果に基づいて、ブロック走査の手順を制御する。これについては、図26に示すフローチャートを用いて詳しく説明する。
図4は、一次元コードと二次元コードの典型例を示す図である。一次元コードは、異なる太さや間隔をもつ平行な直線の組合せによるコードであり、二次元コードは、データがセル化されて二次元状に配置されたコードであり、1つのセルは一般に複数の画素に対応する。図4の二次元コードは、クイックレスポンス(QR:Quick Response)コードと呼ばれる二次元コードであり、コード領域の右上、左上、および左下にコードの位置決め用シンボルを設けている。
図4に示すように一次元コード、および二次元コードは、共に白、黒のようにコントラストの差が大きい2つの色を用いて印刷されている。またコード内の領域では2つの色の占める面積の比率が1対1に近くなるように配列がなされている。そのため画素の階調値のばらつき(分散)、または標準偏差が大きくなるという特徴がある。
これに対して文字が印刷されている領域では、文字の色が下地に対して占める面積の比率が小さくなり、画素の階調値のばらつきも小さくなる。また写真などが印刷されている領域では、画素の階調値が任意の値をとり、階調値のばらつきは小さくなる。この特徴を利用して、ブロック内の画素の階調値のばらつきが所定の範囲内となるブロックを検出することによって一次元コード、および二次元コードが含まれる領域を検出することが可能となる。
特に二次元コードの領域内では、白と黒の色の面積の比率が所定の範囲、例えば50%±10%以内となるようにコードが作成されている。そこでブロック内の白黒画素の比率が所定の範囲内になるブロックを検出することによって、二次元コードが含まれる領域のみを検出することが可能となる。
図5は、エッジ数によるコード判定方法の説明図である。一次元コードでは、平行な直線の組合せによってデータが表現されるために、この直線、すなわちバーに垂直なライン上で画素を取り出した場合には、そのラインがコード内部のどこにあっても、ライン上の画素の階調値が急変する点(エッジ)がラインに直交するバーの数に対応して存在することになるが、バーに平行なライン上の画素を取り出す場合にはエッジが存在しないという特徴がある。
一方、二次元コードでは、二次元に配置された明暗ドット(セル)の組合せによってデータが表現され、コード内部ではできるだけ明暗が一様になるようになっているため、水平方向のライン上の画素を取り出した場合にも、また垂直方向のライン上の画素を取り出した場合にも、画素の階調値が急変する点としてのエッジの数があまり変わらないという特徴がある。また文字が印刷されている領域においてライン上の画素を取り出した場合には、文字間/行間など、エッジが存在しない場所があり、コード領域とはその特徴が明らかに異なってくる。
そこで本実施形態では、ブロック内の水平/垂直ライン上のエッジ数が所定の範囲内となるブロックを検出することによって、精度よく一次元/二次元コードが含まれる領域のみを検出することが可能となり、また一次元コードと二次元コードとを容易に区別することができる。
図6は、ライン間相関によるコードの判定方法の説明図である。一次元コードでは、コード領域内でバーに垂直な直線とその近傍の平行な直線との間での相互相関の値が大きくなるが、バーに平行な直線とその近傍の平行直線との間での相互相関の値が小さくなるという特徴がある。図6では、垂直な2つのラインとして、黒のバーの内部、あるいは白のバーの内部に2つのラインを考えているが、黒のバーの内部を通るラインと、白のバーの内部を通るラインとの間で、相互相関をとった場合も同様である。
これに対して二次元コードでは、水平な2本のラインの間でも、あるいは垂直な2本のラインの間でも、相互相関の値はともに小さくなるという特徴がある。また文字や写真が印刷されている領域においても、一次元コードの場合ほど強い相関を示すことはほとんどない。
そこでブロック内の水平ライン間、あるいは垂直ライン間の相関の値が所定の範囲内となるブロックを検出することによって、一次元/二次元コードが含まれる領域を精度よく検出することが可能となると共に、一次元コードと二次元コードとを容易に区別することが可能となる。
図7は、一次元コードにおける回転の有無の判定方法の説明図である。前述のように一次元コードに対しては、本来コードを形成するバーに対して直交する方向の1ライン分のデータを使用してバーコード認識を行うことになるが、一次元コードが90°回転した状態となっていると、ラインの方向がバーの方向と平行になり、正しいコード認識ができない。そこでコードの回転の有無を検出する必要がある。
図7において、一次元コードが本来の方向、すなわち水平方向に存在する場合には、水平方向エッジ数は白バーと黒バーの数に対応する数だけ存在するのに対して、垂直方向エッジ数は0となる。また水平ライン間の相関は大きくなるが、垂直ライン間の相関は小さくなるという特徴がある。
これに対して一次元コードが90°回転している場合には、水平方向エッジ数は0であるのに対して、垂直方向エッジ数は白バーと黒バーの数に対応した数だけ存在し、水平ライン間相関は小さいのに対して、垂直ライン間相関は大きくなるという特徴がある。
この性質を利用して、画像データ内で一次元コードが水平方向を向いているか、あるいは90°回転した状態となっているかを精度よく判別することが可能となる。
実際のコードの判別においては、上記に説明した判定条件を複数個適宜組み合わせることによって、精度よく一次元コードや二次元コードが含まれる領域のみを検出することが可能となる。また特に白黒画素数、エッジ数、相関などは、それらのとり得る値の範囲が一次元コードと二次元コードとの間である程度異なってくる場合もあるが、本実施形態ではそれぞれの所定の範囲を一次元コードと二次元コードとの間で区別することなく処理を行うものとして説明する。これによってそれぞれの判別のための処理を分けたりする必要が無くなり、結果として簡単な処理シーケンスで高速にコード判別を行うことが可能となる。
図8は、コード種類及び特性の判別処理の全体フローチャートである。同図において処理が開始されると、まず入力画像データの中から注目するブロックが選択される(S11)。ブロックは画像の任意の位置から順番に選択していくものとする。通常は左上の隅から順次走査して選択したり、画像中央から周辺部に向かって走査したりする場合が多い。処理対象の特性上、コードが存在する可能性がより高い位置からブロックを選択する方がコードをすぐに検出でき、処理時間を短くすることができる。
ブロック内の画素の階調値に対する標準偏差(SD:Standard Deviation)が算出され(S12)、その値があらかじめ定められた値SDcodeを超えているかが判定され(S13)、超えている場合には水平方向エッジ数HEdgeが算出され(S14)、垂直方向エッジ数VEdgeが算出され(S15)、これらの値があらかじめ定められた所定の値EDGEminを超えているかが判定される(S16)。
水平方向エッジ数、垂直方向エッジ数のいずれか1つ以上が所定の値を超えている場合には、黒画素率BPRatioが算出され(S17)、水平ライン間相関HSoukanが算出され(S18)、垂直ライン間相関VSoukanが算出され(S19)、黒画素率が所定の最小値BPRATIOminを超えており、かつ所定の最大値BPRATIOmax未満であるか否かが判定される(S20)。
この判定条件が成立している場合には、そのブロックがコード領域と判定され(S22)、その後そのコード領域が一次元コードであるか否かが判定される(S23)。この一次元コードの判定については図9でさらに詳細に説明する。
黒画素率に関する判定条件が成立しない場合には、水平ライン間相関、または垂直ライン間相関がそれぞれ所定の最小値SOUKANminを超えているか否かが判定され(S21)、いずれかのライン間相関が所定の最小値を超えている場合にはステップS22以降の処理が行われる。
コード領域が一次元コードであると判定された場合にはその一次元コードが回転した状態であるか否かが判定される(S24)。その判定の詳細については後述する。回転ありと判定された場合には、一次元コードが回転しているものとしてのデコード処理が行われて(S25)、処理を終了し、また、回転がない(水平)と判定された場合には一次元コードが通常状態、すなわち水平方向にあるものとしてのデコード処理が行われて(S26)、処理を終了する。
コード領域が一次元コードでないと判定されると、その領域が二次元コードであるか否かが判定され(S27)、二次元コードである場合には二次元コードに対するデコード処理が行われ(S28)、処理を終了する。
ステップS13で標準偏差が所定の値以下である場合、ステップS16で水平方向エッジ数、垂直方向エッジ数のいずれもが所定の最小値以下である場合、ステップS21で水平ライン間相関、または垂直ライン間相関のいずれもがその最小値以下である場合、およびステップS27で二次元コードでないと判定された場合には、ステップS11に戻り、次のブロックを選択してステップS12以降の処理が繰り返される。なおステップS27で二次元コードでないと判定されることは基本的にはありえないが、このような場合にはなんらかのエラーがあったものとして、ステップS11以降の処理が繰り返される。またステップS24において、コードが無いと判定された場合にも、エラーと見なしてステップS11以降の処理が繰り返される。
図9は、図8のステップS23における一次元コード判定処理の詳細フローチャートである。同図において処理が開始されると、まず画素の階調値の標準偏差SD(Standard Deviation)が所定の値を超えているか否かが判定される(S31)。この所定の値は例えば図8のステップS13におけると同じとする。所定の値を超えている場合には水平方向エッジ数、または垂直方向エッジ数の少なくともいずれか1つが所定の最小値を超えているか否かが判定される(S32)。この所定の最小値もステップS16におけると同じとする。
いずれか1つのエッジ数が所定の最小値を超えている場合には、水平ライン間相関、または垂直ライン間相関が所定の最小値(ステップS21と同じ)を超えているか否かが判定され(S33)、超えている場合には一次元コード領域と判定されて(S34)、処理を終了し、図8のステップS24の処理に移行する。
ステップS31で標準偏差、ステップS32で水平方向エッジ数と垂直方向エッジ数の両者、ステップS33で水平ライン間相関と垂直ライン間相関の両者がそれぞれ対応する所定の値以下であると判定された場合には、一次元コードでないと判定され(S35)、処理を終了し、図8のステップS27の処理に移行する。
図10は、図8のステップS24における回転有無の判定処理の詳細フローチャートである。同図において処理が開始されると、まず水平方向エッジ数が所定の最小値を超えており、かつ水平ライン間相関が所定の最小値を超えているか否かが判定される(S37)。この判定は、図7の左側で説明したように一次元コードが水平方向となっている条件であり、この条件が成立すると、垂直方向エッジ数が所定の最小値を超えており、かつ垂直ライン間相関が所定の最小値を超えているか否かが判定される(S38)。この条件は図7の右側にある一次元コードの回転状態に対応する。この条件が成立しない場合には一次元コードは水平方向と判定され(S41)、図8のステップS26の処理に移行する。
ステップS38の判定条件が成立する場合は、一次元コードは水平方向でもなく、90°回転した方向でもなく、例えば斜めの方向になっている場合に相当する。この場合には水平ライン間相関HSoukanが垂直ライン間相関VSoukan超えているか否かが判定され(S39)、超えている場合には一次元コードが水平方向と判定され(S41)、図8のステップS26の処理に移行する。
ステップS37で判定条件が成立しない場合には、ステップS38におけると同じ判定条件が成立するか否かが判定され(S40)、成立する場合、およびステップS39で水平ライン間相関が垂直ライン間相関以下であると判定された場合には、一次元コードが回転していると判定され(S42)、図8のステップS25の処理に移行する。またステップS40で判定条件が成立しない場合には、コードなしと判定され(S43)、何らかのエラーが発生したものとして図8のステップS11以降の処理が繰り返される。
図11は、図8のステップS27における二次元コード判定処理の詳細フローチャートである。同図において処理が開始されると、画素の階調値の標準偏差が所定の値を超えているか否かが判定され(S45)、超えている場合には水平方向エッジ数と垂直方向エッジ数のいずれもが所定の最小値を超えているか否かが判定される(S46)。超えている場合には黒画素率が所定の最小値を超えており、かつ所定の最大値未満であるか否かが判定される(S47)。この条件が成立する場合には二次元コードと判定され(S48)、図8のステップS28の処理に移行する。これに対してステップS45で標準偏差が、ステップS46で水平方向エッジ数、または垂直方向エッジ数の少なくともいずれか1つがそれぞれ所定の値以下の場合、またはステップS47で黒画素率が所定の最小値と所定の最大値の間に入っていない場合には、二次元コードでないと判定され(S49)、図8のステップS11以降の処理が繰り返される。
以上のフローチャートにおいては、前述のように例えば水平方向エッジ数や、垂直方向エッジ数などの所定の最小値として一次元コードと二次元コードに対して共通の値を用いて判定を行うものとしたが、これらの所定の値として一次元コードに対する値と二次元コードに対する値を区別して処理を実行することも当然可能である。また、例えば図9の一次元コード判定処理における判定条件は図8のステップS13、S16、およびS21に含まれており、例えばステップS21の判定条件が成立した時点で処理対象ブロックは一次元コード領域であると判定して、ステップS24の一次元コードの回転有無の判定処理を行うことも可能である。
図12は、本発明の第1の実施形態に係るコード画像処理方法を説明するための概略図である。同図において、画像データの左上隅から横方向に小ブロック領域300毎に順次走査しながら二次元コードを探索する。走査で小ブロック領域300が第1の二次元コード100の内部に入って、第1の二次元コード100内の位置310で領域内の画像の特徴が二次元コードと合致する場合には、そのブロック領域中にコードが存在すると特定してその近傍に対して認識処理を続行し、二次元コードの認識に成功したら、さらに第1の二次元コード100の領域を抽出する(図12(a)参照)。これについては後述する。第1の二次元コード100の領域抽出に成功したら、図12(b)に示すように、引き続き、小ブロック領域300毎の走査を続け、第2の二次元コード200を探索する。その際、認識済みコードである第1の二次元コード100の領域にさしかかった時には、その領域をスキップして探索を続ける。これについても後述する。この操作を繰り返して、第2の二次元コード200を高速に見つけることができる。
これにより、スキップした小ブロック領域でのブロック判別処理及びコード認識処理を削減することができ、画像データ上の全二次元コードの探索処理を高速化することが可能となる。
ここで二次元コードの認識処理について概説すると、二次元コードの認識は、コード領域抽出処理、解像度変換処理、デコード処理の順に実行される。まずコード領域抽出処理では、コード内部座標検出が行われ、次にセル幅の検出が行われ、最後にコード境界の検出処理が行われる。解像度変換処理は、コード画像の1セルのデータを1画素のデータに変換する処理である。
図13は、二次元コードの境界検出方法の原理的な説明図である。画像データを得る際に光学歪みやピントのボケが発生するとQRコードの位置決め用シンボルが正しく検出できなくなることがあったが、本実施形態においてはコードの回りに存在する白領域、すなわちクワイエットゾーン102を検出することによって、二次元コードの境界を検出することが可能となる。例えば、QRコードではコードの周囲に5セルの幅を持つ白領域(クワイエットゾーン)(図28に関連記載あり)が存在し、そのクワイエットゾーンは光学歪みやピントのボケにほとんど影響されないため、二次元コードの境界を正しく検出することが可能となる。
図12において走査で小ブロック領域300が第1の二次元コード100の内部に入って、第1の二次元コード100内の位置310で領域内の画像についてその特徴を調べる。まず、二次元コード100内の位置310を基点に上下左右の方向に白領域、および黒領域の連続長の長さを検出し、その長さの頻度によって分布を求め、頻度がある一定値以上になる範囲内で最小の連続長の長さをセル幅として求める。これを図14を用いて説明する。
図14は、セル幅の検出方法の説明図である。同図において二次元コード内部の適当な点から上下左右の方向に白領域、および黒領域の連続長の長さを検出し、その長さの頻度によって分布を求め、頻度がある一定値以上になる範囲内で最小の連続長の長さをセル幅として求めている。画像内部ではピンボケやノイズなどの影響によって、セル幅とは関係のない連続長が検出されることがあるために、値の小さな連続長は無視し、ある特定の値以上の頻度を持つ範囲で最小の連続長をセル幅として求めることになる。なお二次元コードにおいて白と黒のセル幅は同じであるとする。
図15は、コード境界を検出するための第1の白連続長の検出方法の説明図である。同図において二次元コードの内部の適当な点から上下左右のいずれか1つの方向に画像を走査し、白セルが連続する白連続長の検出を行う。図15では左側への走査を行い、第1の白連続長として5セル幅長を検出することとなる。
図16は、コード境界を検出するための第2の白連続長検出方法の説明図である。ここでは図15で検出された第1の白連続長と交差する方向に第2の白連続長の検出を行う。第1の白連続長上の1つの点を中心としてあらかじめ定められた直径の円を描き、その円周上の1つの点と、その点と中心に関して対称な点とを結ぶ線分上の点が全て白であれば、その線分を第2の白連続長の一部として検出する。
第1の白連続長上の1つの点を中心として、あらかじめ定められた直径の円周上の各点に対応してそのような第2の白連続長が検出されない場合には、図15の第1の白連続長の線分の上で円の中心となる点を移動させて、その点を中心とするあらかじめ定められた直径の円周上の点に対応して第2の白連続長を検出する処理を繰り返す。その処理を二次元コードを含む画像の例えば左端の位置まで繰り返す。
図17および図18は第2の白連続長としてのコード境界の検出方法の説明図である。図17は、コード内部の第1の白連続長上の点を中心とした或る定められた円周上の点を対象とする第2の白連続長検出動作の説明図である。第2の白連続長を検出するための円の直径をある程度以上大きくすることによって、コードの内部ではそのような長い白連続長を第2の白連続長として検出することはできない。
図18は、コード境界における第2の白連続長の検出動作の説明図である。前述のようにコード境界においてクワイエットゾーンが存在するため、第2の白連続長を検出するための円の直径以上の長さの白連続長が検出可能である。実際には後述するようにこのような円の直径と同じ長さの白連続長が検出された時点で、さらにその線分を両側に伸ばし、延長された線分上の点が全て白であるか否かが検出され、全て白である場合に、その線分を二次元コードのクワイエットゾーンにおける第2の白連続長として検出する。
図19は、境界検出処理の開始点の位置の説明図である。コード境界を検出するための第1の白連続長検出処理は、コード内部の適当な点を開始点として開始される。コード外部の点を開始点とすれば、二次元コード以外の図表や文字の領域において境界検出処理が行われてしまうことになる。この開始点は、二次元コードと判定されたブロックに対応してその位置が特定される。
図20は、上下左右4方向の二次元コード境界検出の説明図である。前述のように境界検出処理の開始点から上下左右の各方向に対して画像を走査し、第1の白連続長、および第2の白連続長を検出することによって、二次元コードのクワイエットゾーンに相当する上下左右4方向における境界が検出される。
このように上下左右の境界が検出されると二次元コードの画像内における傾き角度を求めることもできる。例えばその簡略的な方法として、境界を直線と見なして、その傾きからコードの傾き角度を求めることもでき、より精密な方法として境界の検出結果を用いて位置決め用シンボルの位置を特定し、その位置から二次元コードの傾き角度を計算することもできる。
図21は、白セルと黒セルとを区別するための閾値の決定方法の説明図である。二次元コードに対する光の照射量が少ない場合や、センサの感度が低い場合などにおいては、閾値を、例えば256諧調の中間の128のように固定した場合にセルの黒、白を正確に判定することができないことがある。例えば、光の照射量が少ない場合には階調値のレンジが全体的に低いレベルに下がり、かすれやつぶれが発生する。そのようなかすれやつぶれの影響を排除するために、図21に示す閾値の決定方法を用いる。
一般的に二次元コードは白と黒の2値で表現されたものが多く、入力画像の各セルに対する階調値のヒストグラムでは図21に示されるように明るい領域と暗い領域で2つのピークが生ずる。頻度がそれぞれある一定値以上であり、最も左側にある階調値のピークと、右側にある階調値のピークとに対応する階調値の中間(平均値)を閾値の値として決定することによって、かすれやつぶれの影響を排除して、白セルと黒セルとの判定を正確に行うことが可能となる。
黒セルと白セルの判定方法として、このような閾値を用いる代わりに、注目セルとその周囲のセルの階調値とを比較し、その差がある一定値以上である場合には階調値の大きなセルを白セル、小さなセルを黒セルと判定する方法を用いることもできる。
図22は、領域ごとの閾値決定方法の説明図である。二次元コードの画像領域の大きさや、光の照射方向などによって生じる影の影響などによって、黒セルと白セルを判別するために二次元コードの画像領域全体に一定の閾値を用いた場合には、正確な判別ができない場合がある。すなわち光源の位置などの影響によって、影の濃い部分と薄い部分とができるような場合には、影の濃い部分と薄い部分とで閾値を変更して黒セルと白セルとの判別を行う必要がある。
例えば図22において右方向に画像を走査していく場合に、例えばある一定距離毎に閾値を修正して第1の白連続長、および第2の白連続長の検出処理を行う。この閾値修正を行う走査距離については、例えば光源の位置やその強度などを変更して実験を繰り返し、適切な距離を決定することができる。
以上で概略を説明した、二次元コード境界検出方法について図23〜図25のフローチャートを用いてさらに詳細に説明する。図23は、コード境界検出処理の全体フローチャートである。ここで検出対象となる二次元コードは、例えば前述のQRコードであるものとするが、他の二次元コードに対する処理も実行することができる。
図23において処理が開始されると、まずステップS71で閾値を更新する距離に対応する閾値エリアのカウンタが0に初期化され、現在の処理対象の点の座標nXPos、およびnYPosにコード内部の走査開始点、すなわち上述の説明において検出された二次元コード領域の内部の点の座標r−nx−ct、およびr−ny−ctが代入され、ステップS72で現在の点のX座標nXPosが、画像の左端の点のX座標nXEd(=0)以上であるか否かが判定される。なおここでは図20で説明したように開始点から左方向に画像を走査するものとして、処理のフローチャートを説明する。
ステップS72で現在の点が画像の左端に達していないと判定されると、ステップS73で閾値エリアのカウンタの値が閾値の更新が必要となる値nThAreaを超えたか否かが判定され、超えている場合にはステップS74で閾値nThreshを更新するために閾値の検出処理が行われる。閾値の検出処理は図21で説明した方法によって行われる。
ステップS74の処理に続いて、ステップS75で閾値エリアのカウンタの値が0に初期化された後に、またステップS73でカウンタの値が閾値更新を行うべき値を超えていない場合には、ステップS76の第1の白連続長検出処理に移行する。この処理については図24で詳細に説明するが、この検出処理に対応して第1の白連続長を示すnWRange、閾値エリアのカウンタの値、現在の点の座標値、および閾値nThreshの変数の値が引き渡される。なおこれらの値のうち、現在の点のY座標nYPos、および閾値nThresh以外の値は第1の白連続長検出処理において更新される。なお第1の白連続長検出処理の処理中に閾値エリアのカウンタ値がnThAreaの値を超える可能性もあるが、ここでは第1の白連続長は比較的短く、この処理中には閾値は更新されないものとする。
第1の白連続長検出処理が終了すると、ステップS77で第1の白連続長検出処理において白連続長が検出されず、エラーとなったか否かが判定され、エラーとなった場合には処理を終了する。第1の白連続長の検出に成功した場合には、ステップS78で第2の白連続長検出の終了判定処理に用いられるカウント値nWCountの値が0に初期化され、ステップS79でそのカウント値が第1の白連続長を表すnWRange未満であるか否かが判定され、未満であるときにはステップS80で第2の白連続長の検出が行われる。この処理については図25で詳細に説明するが、この処理に対して現在の点のX座標とY座標、および閾値の値が引き渡される。
続いてステップS81で第2の白連続長の検出に成功したか否かが判定され、成功した場合には処理を終了し、成功しない場合にはステップS82でnWCountと閾値エリアのカウンタの値がインクリメントされ、現在の点のX座標がデクリメントされた後にステップS79以降の処理が繰り返される。
すなわち図15および図16で説明したように、第1の白連続長に対応する線分上で左方向に現在の点を移動させながら、第2の白連続長を検出する処理を繰り返すことになる。この処理の繰り返しはステップS79でnWCountの値がこの第1の白連続長の長さ、すなわちnWRangeに達した時点で終了し、再びステップS72以降の処理が繰り返されることになる。
図24は、第1の白連続長検出処理の詳細フローチャートである。同図において処理が開始されると、ステップS86で現在の点のX座標、Y座標が変数x、yに代入され、ステップS87でxが画像データの左端に達していないかが判定され、達していない場合にはステップS88で座標x、yの点の階調値のデータが閾値未満であるか否かが判定される。本実施形態では、明るいセル、すなわち白いセルに対する階調値が、黒いセルに対する階調値より大きくなっているため、階調値が閾値未満であることは、現在処理対象となっているセルが黒であることになり、白セルを見つけるまで次のステップS89からS91の処理が繰り返される。
ステップS89では、閾値エリアのカウンタがインクリメントされ、処理対象セルの座標xがデクリメントされ、ステップS90でステップS87と同様に画像の左端に達していないか否かが判定され、達していない場合にはステップS91でS88と同様に階調値が閾値未満であるか否かが判定される。閾値未満である場合にはステップS89以降の処理が繰り返される。
ステップS91で階調値が閾値以上である場合、およびステップS88で同様に階調値が閾値以上である場合には、ステップS92で処理中のセルの座標xが第1の白連続長の開始点のX座標を示すnXstに代入され、ステップS93の処理に移行する。
ステップS93からS95において閾値エリアのカウンタの値がインクリメントされ、処理中のセルのX座標xがデクリメントされた後に、処理中のセルが画像の左端に達していないか、またセルが白であるかの判定が行われ、これらの判定が共に成立する場合には、これらの処理が繰り返され、ステップS95でセルの階調値が閾値以下であり、セルが黒と判定されると、ステップS96でセルのX座標xが第1の白連続長の終りの点のX座標を示すnXedに代入され、ステップS97で第1の白連続長の長さを示すnWRangeが求められ、図23の全体処理において処理中のセルのX座標を示すnXPosの値が第1の白連続長の開始点の座標nXstの値とされ、第1の白連続長の検出の成功を示すフラグnErrFlag1の値が1とされて処理を終了し、リターンが行われる。
ステップS87、ステップS90、およびステップS94のいずれかにおいて処理中のセルのX座標を示すxが画像データの左端nXEdに達したと判定されると、ステップS98で第1の白連続長の検出の成功を示すフラグが−1、すなわち失敗を示す値に設定された後に処理を終了してリターンが行われる。
図25は、図23のステップS80における第2の白連続長検出処理の詳細フローチャートである。同図において処理が開始されると、まずステップS101で図24のステップS86と同様に現在の処理対象のセルの座標x、yの設定が行われる。ステップS102でこれらの座標によって決まる点を中心とした円が描かれ、その円周上の点が求められる。ここでこの円は前述のように第2の白連続長を検出するためのものであり、コード内部で第2の白連続長が検出されることがないように、ある程度大きな直径を持つ円が使用される。
続いてステップS103で円周上の点のインデックスとしてのjが0に初期化され、ステップS104でjの値がステップS102で求められた円周上の点の数Circu Point Num未満であるか否かが判定され、未満である場合にはステップS105で、インデックスjで示される円周上の点における階調値Cdata[j]の値が閾値以上であるか否かが判定され、閾値以上、すなわち白である場合にはステップS106で、インデックスjによって示される円周上の点と円の中心に関して対称な位置にある点の階調値CdataRev[j]が閾値以上であるか否かが判定される。閾値以上である場合にはステップS107でこれらの2つの点を結ぶ線分上の点の色が全て調べられ、全て白であるか否かがステップS108で判定され、全て白である場合には前述のようにステップS109で、その線分の外側にさらに延長線が引かれ、延長線上の点が全て白であるかが調べられ、ステップS110でそれらの点が全て白であるか否かが判定され、全て白である場合にはステップS112で第2の白連続長の検出成功を示すフラグnErrFlag2の値が1に設定された後に処理を終了し、リターンが行われる。なおステップS109で引かれる延長線の長さは、例えば延長線の長さを含む全体の線分の長さが、円の直径の2倍となるような長さとされる。
ステップS105で、円周上のインデックスjで示される点、またはステップS106でその点と円の中心に関して対称な点の階調値が閾値未満である時、ステップS108、またはS110で線分上の点、または延長線上の点の一部が白でない時には、ステップS111でjの値がインクリメントされた後にステップS104以降の処理が繰り返される。すなわちステップS102で求められた円周上の点を移動させながら、第2の白連続長の検出処理が続けられる。そしてステップS104で円周上の点に対する処理が全て終了したと判定されると、第2の白連続長の検出に失敗したことになるため、ステップS113でフラグの値が−1とされて処理を終了し、リターンが行われる。
図26は、図3に示すブロック走査制御過程5の処理を詳しく説明するためのフローチャートである。図26においてブロック走査制御過程では、まず対象ブロックにおいてコード認識が行われたか否かを判別する(S121)。コード認識が行われていない場合には、次のブロックに移動する(S124)。コード認識が行われている場合、認識に成功(S122)していれば、認識済みのコード領域を設定する(S123)。認識に失敗(S122)した場合は、次のブロックに移動する(S124)。移動した次のブロックが、画像データの内部からはみ出した(S125)場合には、対象画像データの全領域を探索し終えたものとして処理を終了する。次のブロックが、設定されている認識済みのコード領域内である(S126)場合には、更に次のブロックへ移動して処理を続ける(S124)。このように、認識済みのコード領域をスキップして、処理を行うことで、コード探索に係る処理時間を短縮することが可能となる。
[実施例2]
図27は、本発明の第2の実施形態に係るコード画像処理方法を説明するための概略図である。本実施形態では、画像データに複数、例えば2つの二次元コードが配置される例について説明する。複数の二次元コード、例えば第1の二次元コード400と第2の二次元コード500には、それぞれコードデータの外に、関連情報として互いの処理方法(例えば、互いの二次元コードをどのように「連結」するか)および相対位置情報が格納される。
図27の読取り画像において、(1)読み取った画像データに対して小ブロック領域300を画像データの左上隅から横方向に走査しながら二次元コードを探索し、走査で小ブロック領域300が画像データ右上の第1のコード400の内部に入った場合には、ここに二次元コードが有ると判定され、第1の二次元コード400の認識が行われる。第1の二次元コード400の認識結果に基づいて第1の二次元コード400からコードデータとして、例えば「○×中央病院」を得る。(2)次いで関連するコードの位置情報の検出を行い、第1の二次元コード400からコードデータとして、例えば位置情報「-400、-600」を得る。(3)この位置情報に基づいて、第2の二次元コード500のコード認識を行う。第2の二次元コード500からコードデータとして、例えば「2004年○月×日受信分」を得る。(4)ここで、第1の二次元コード400の関連情報には、指定処理として「連結」と連結の仕方が指示されているから、読取った順に第2の二次元コード500のコードデータを「連結」して処理する。(5)その結果、出力するコードデータは、例えば「○×中央病院 2004年○月×日受信分」を得ることになる。こうすることで、複数の二次元コードに分けて格納した関連情報に基づいて、その指定処理にしたがってコードデータを「連結」処理することにより、コードデータを一つにまとめ、一つの二次元コードでは格納しきれない大きなデータでも格納可能となり二次元コードの利用を拡大させることが可能となる。
図28は、本発明の第2の実施形態に係るコード画像処理方法における基準座標の設定を説明するための図である。二次元コードの認識が成功した場合、まず二次元コードに格納されている位置情報を取り出す。位置情報には、二次元コードの1つの特徴点(ここでは左下の頂点)を基準座標、すなわち座標原点に、二次元コードの向き(ここでは、左辺と下辺)を軸(左辺上向きをY軸、下辺走査方向をX軸)にした座標に対して、二次元コードの大きさに関する特徴量(ここでは二次元コードの1つのセル105の大きさ)を基準に位置(相対位置)情報が記述される。図27において第1の二次元コード400から見た第2の二次元コード500の相対位置情報は、セルの大きさを単位にかつ座標の向きを考慮して、「(-400、-600)」と記述される。このようにすることで、画像データの大きさや傾きなどの要因に影響されること無く位置(相対位置)情報を記述することが可能である。もちろん、画像データの上の二次元コード以外の特徴点を基準座標として記述することも可能であるが、この場合は、基準座標を認識する処理が別途必要となる。
次に、位置(相対位置)情報にしたがい、関連した第2の二次元コード500の位置を求める。すなわち、図27に示した第2の二次元コード500は第1の二次元コード400に格納された位置情報によって座標上でその位置が画像データ左下に有ることが分るので、直ちに第2の二次元コード500のコード認識を行うことができる。これにより、2つの二次元コードの間に存在するブロック領域では小ブロックによる探索、ブロック判別処理及びコード認識処理を削減することができ、処理を高速化することが可能となる。また、位置(相対位置)情報によって関連する二次元コードの位置を正確に知ることができるため、認識精度も向上する。
なお、第2の二次元コード500にも位置情報として、第2の二次元コード500から見た第1の二次元コード400の位置(相対位置)情報を格納しておくことによって、小ブロック領域単位の走査を左下から開始した場合でも同様の手順にて2つの二次元コードの認識を高速に行うことが可能である。
第1の二次元コード400および第2の二次元コード500の認識に成功したら、両方の二次元コードに格納されている処理方法に基づいて情報を処理する。ここでは、コードデータ1をコードデータ2に「連結」して出力するという処理方法が指示されているので、二次元コード400から取り出したコードデータに二次元コード500から取り出したコードデータを結合して1つのコードデータとして出力する。これにより、処理方法について別途指示しなくても、コードデータを適切に処理することが可能となる。また、一つの二次元コードでは表現しきれないコードデータでも、複数の二次元コードに分割して格納して処理することで二次元コードの活用をさらに拡大させることが可能となる。
図29は本発明の第2の実施形態に係るコード画像処理方法を説明するためのフローチャートである。同図において、ブロック走査を開始しブロック位置でのコード認識が実行(S132)されるまでブロック走査を続ける(S131)。ブロック位置でのコード認識に成功(S133)したら、その中に格納されているコードデータを解析し、関連する他のコードの位置情報が含まれているかどうかを判別する(S134)。他のコードの位置情報が含まれている場合は、その位置に移動(S135)して、コード認識を行う(S136)。他のコードの位置情報が含まれていない場合は、これまで通りブロック走査を繰り返す(S138)。対象画像データの全領域を探索し終えたら(S137)、認識したコードに処理情報が含まれているかどうかを判別する(S139)。処理情報が含まれている場合には、その情報に従った処理を行う(S140)。
[実施例3]
図30は、本発明の第3の実施形態に係るコード画像処理方法を説明するための概略図である。図30に示す第3の実施形態に係るコード画像処理方法が図27に示す第2の実施形態に係るコード画像処理方法との違いは、マウスなどのポインティングデバイス操作で画像データ内の1つの二次元コード領域を指定できるよう構成した点である。その以外の構成は、図27で説明したのと同様なのでここでの説明を省略する。
図31は本発明の第3の実施形態に係るコード画像処理方法を説明するフローチャートである。同図において、まず画像データに対して、任意の方法で、例えば、マウスなどのポインティングデバイス操作で画像データ内の1つの二次元コード、例えば第1の二次元コード400の位置を指定する(S151)。次いで第1の二次元コード400の認識に成功(S152)したら、その中に格納されているコードデータを解析し、他の関連する二次元コード、例えば第2の二次元コード500の位置情報が含まれているかどうかを判別する(S153)。二次元コードの位置情報が含まれている場合は、その位置に移動(S154)して、二次元コードの認識を行う(S155)。二次元コードの位置情報が含まれていない場合は、他の二次元コードの位置の指定を行う(S157)。対象画像データ中に含まれている全ての二次元コードの認識を終えたら(S156)、認識した二次元コードに処理情報が含まれているかどうかを判別する(S158)。二次元コードに処理情報が含まれている場合には、その情報に従った処理を行う(S159)。
以上において本発明のコード画像処理方法についてその詳細を説明したが、この方法を実行するコード読取装置は当然一般的なコンピュータシステムをその主要構成部として構成することが可能である。
図32は、本発明におけるプログラムのコンピュータへのローディングを説明する図である。同図においてコンピュータシステムは中央処理装置(CPU)10、リードオンリメモリ(ROM)11、ランダムアクセスメモリ(RAM)12、通信インタフェース13、記憶装置14、入出力装置15、記録媒体の読取り装置16、およびこれらの全てが接続されたバス17によって構成される。
記憶装置14としてはハードディスク、磁気ディスクなど様々な形式の記憶装置を使用することができ、このような記憶装置14、またはROM11に図8〜図11、図23〜26、図29、図31のフローチャートに示された媒体に格納されたプログラムがCPU10によって実行されることにより、本実施形態における一次元/二次元コードを含むコードが存在するブロックの検出、コードの種類の判別、コードの認識などが可能となる。
このようなプログラムは、情報提供者18側からネットワーク19、および通信インタフェース13を介して、例えば記憶装置14に格納されることも、また市販され、流通している記録媒体20に格納され、読み取り装置16にセットされて、CPU10によって実行されることも可能である。
本発明のコード画像処理方法によれば、画像データにコードが複数含まれている場合でも、一つのコード認識で止まることなく、認識したコード領域におけるコード判別処理及びコード認識処理をスキップするので、コード全体の探索と認識を高速かつ確実に行うことが可能であるので、任意の数、位置および大きさの二次元コードが一つの文書に複数配置されて利用されるようになり、コード利用形態を拡大させることが可能となる。
本発明は、文字や図表とともに複数のコードが配置された電子画像データや複数のコードが印刷された文書をデジタルカメラやスキャナなどの画像読取装置で読み取った画像データから、複数のコードを認識し、それらをまとめて処理するコード画像処理方法に関する。
近年、一次元バーコード(特に断らない限り、以下、“一次元コード”と称する)よりも多くの情報を埋め込むことができる二次元バーコード(特に断らない限り、以下、“二次元コード”と称する)の普及が進んでいる。二次元コードでは、コード全体の二次元配列データが分らなければ認識できないため、読取装置にはデジタルカメラやイメージスキャナのような画像読取装置が用いられている。
二次元コードの普及に伴い、これまでの専用のラベルに印刷されたコードを読み取るだけでなく、文字や図表とともに任意に位置に任意の大きさのコードが印刷される用途も増大している。また、1枚の文書上に複数の二次元コードを配置して使用する用途も増えつつある。
図1は、コード領域の右上、左上、および左下にコードの位置決め用シンボルが配置されるクイックレスポンス(QR)コード(非特許文献1参照)と呼ばれる二次元コードが有る画像データから、コード画像処理して二次元コードを認識する従来のコード画像処理方法を説明するための概略図である。図1において従来は、画像データを小ブロック領域30毎に左上隅から横方向に順次走査し、走査で小ブロック領域30が第1の二次元コード40の内部に入って、第1の二次元コード40内の位置31で領域内の画像の特徴が二次元コードと合致する場合には、そのブロック領域にコードが存在すると特定してその近傍に対して認識処理を行っていた。この場合、図1(a)に示すように、一度認識を終了すると、そこで処理を終了するため、コードが複数含まれている場合でも最初に特定した1つしか認識できないという問題が有った。また、図1(b)に示すように、認識後に走査を継続した場合、第1の二次元コード40中に複数の小ブロック領域30が含まれるような時には、第1の二次元コード40内の位置32でも領域内の画像の特徴が二次元コードと合致するということで再び認識処理を行ってしまうため、同一のコードを複数回認識してしまうという問題が有った。(特許文献1参照)
図2は、QRコードが有る画像データとは別に画像データに含まれるコードの位置情報を記録したレイアウトのテンプレートの情報を使用して二次元コードを認識する従来のコード画像処理方法を説明するための概略図である。この従来例は図2に示すように、画像データ(図2(a))とは別に、画像データに含まれるコード60、70の位置情報を記録したレイアウトのテンプレート80、90(図2(b))を別途作製しておき、認識処理時にテンプレートの情報を参照するようにしている(図2(c))。この場合、レイアウトのテンプレートを別途作製しておき、読み取る文書に応じてレイアウトのテンプレートをいちいち選択する手間がかかるという問題があった。さらに、読み取った画像データとテンプレートの位置合わせを正確に行うようにし、画像データに回転や歪みが発生しない方法で画像を読み取らなければならないという課題もあった。(特許文献2参照)
特願2003-408104
特開2000-339407号公報(第2欄50行〜第3欄20行、図5)
JIS X0510 2次元コードシンボル−QRコード−基本仕様 解説
文字や図表とともに任意の位置に任意の数の二次元コードが配置された文書の場合、デジタルカメラやイメージスキャナを用いて読み取りを行うと二次元コードに加えて文字や図表の一部も画像データとして取り込まれてしまう。このため、画像データに複数含まれる二次元コードを認識するには、まずコードが存在するそれぞれの位置を特定し、特定した位置の近傍に対して順次コード認識処理を行う必要がある。
本発明のコード画像処理方法は、画像データを矩形ブロック単位で選択するブロック選択過程と、選択されたブロックが所定の条件を満たすかを判別するブロック判別過程と、所定の条件を満たすブロック内に含まれるコードの種類及び特性を判定するコード判定過程と、種類及び特性が判定されたコードに対し認識を行うコード認識過程と、コード認識結果に基づいてブロック走査の手順を制御するブロック走査制御過程を含んでなることを特徴とする。
本発明によれば、画像データにコードが複数含まれている場合でも、一つのコード認識で止まることなく、認識したコード領域におけるコード判別処理及びコード認識処理をスキップするので、コード全体の探索と認識を高速かつ確実に行うことが可能である。また、テンプレートを別途用意しなくとも、コードの位置を検出して認識を行えるため、コードがどのように配置されていても、また読み取った画像データが傾いていたり位置がずれていた場合でも間違いなく認識を行うことが可能である。
以下、本発明の実施形態を、図面を参照しながら詳細に説明する。
[実施形態1]
図3は、本発明の第1の実施形態に係るコード画像処理方法の原理説明図である。同図において本発明の基本処理ブロックは、画像データを矩形ブロック単位で選択するブロック選択過程1と、選択されたブロックが所定の条件を満たすかを判別するブロック判別過程2と、所定の条件を満たすブロック内に含まれるコードの種類及び特性を判定するコード判定過程3と、種類及び特性が判定されたコードに対し認識を行うコード認識過程4と、コード認識結果に基づいてブロック走査の手順を制御するブロック走査制御過程5を備えている。そして、ブロック走査制御過程5により手順制御されたブロック走査を経て全てのコードの認識処理が終了した後に結果出力過程6から結果が出力される。
本実施形態に係るブロック選択過程1においては、画像データを小ブロック領域(矩形ブロック単位)に区切って走査し、ブロックを選択してコードを探索する。次に、ブロック判別過程2においては、ブロック選択過程1で選択したブロックのうち所定の条件として、ブロック内の画素の階調値の分散が所定の範囲内にあることを判別するか、または、ブロック内の黒画素と白画素の比率が所定の範囲内にあるかを判別する。
またコード判定過程3においては、一次元コードか二次元コードかのコード種類を判定し、また一次元コードと判定された時には、その一次元コードの特性、たとえば回転した状態にあるか否かを判定する。そしてコード認識過程4においては、コード判定過程3でブロックの領域内にコードが含まれていると判定された場合にコードの認識を行う。また本実施形態に係るブロック走査制御過程5は、コード認識過程4でのコード認識結果に基づいて、ブロック走査の手順を制御する。これについては、図26に示すフローチャートを用いて詳しく説明する。
図4は、一次元コードと二次元コードの典型例を示す図である。一次元コードは、異なる太さや間隔をもつ平行な直線の組合せによるコードであり、二次元コードは、データがセル化されて二次元状に配置されたコードであり、1つのセルは一般に複数の画素に対応する。図4の二次元コードは、クイックレスポンス(QR:Quick Response)コードと呼ばれる二次元コードであり、コード領域の右上、左上、および左下にコードの位置決め用シンボルを設けている。
図4に示すように一次元コード、および二次元コードは、共に白、黒のようにコントラストの差が大きい2つの色を用いて印刷されている。またコード内の領域では2つの色の占める面積の比率が1対1に近くなるように配列がなされている。そのため画素の階調値のばらつき(分散)、または標準偏差が大きくなるという特徴がある。
これに対して文字が印刷されている領域では、文字の色が下地に対して占める面積の比率が小さくなり、画素の階調値のばらつきも小さくなる。また写真などが印刷されている領域では、画素の階調値が任意の値をとり、階調値のばらつきは小さくなる。この特徴を利用して、ブロック内の画素の階調値のばらつきが所定の範囲内となるブロックを検出することによって一次元コード、および二次元コードが含まれる領域を検出することが可能となる。
特に二次元コードの領域内では、白と黒の色の面積の比率が所定の範囲、例えば50%±10%以内となるようにコードが作成されている。そこでブロック内の白黒画素の比率が所定の範囲内になるブロックを検出することによって、二次元コードが含まれる領域のみを検出することが可能となる。
図5は、エッジ数によるコード判定方法の説明図である。一次元コードでは、平行な直線の組合せによってデータが表現されるために、この直線、すなわちバーに垂直なライン上で画素を取り出した場合には、そのラインがコード内部のどこにあっても、ライン上の画素の階調値が急変する点(エッジ)がラインに直交するバーの数に対応して存在することになるが、バーに平行なライン上の画素を取り出す場合にはエッジが存在しないという特徴がある。
一方、二次元コードでは、二次元に配置された明暗ドット(セル)の組合せによってデータが表現され、コード内部ではできるだけ明暗が一様になるようになっているため、水平方向のライン上の画素を取り出した場合にも、また垂直方向のライン上の画素を取り出した場合にも、画素の階調値が急変する点としてのエッジの数があまり変わらないという特徴がある。また文字が印刷されている領域においてライン上の画素を取り出した場合には、文字間/行間など、エッジが存在しない場所があり、コード領域とはその特徴が明らかに異なってくる。
そこで本実施形態では、ブロック内の水平/垂直ライン上のエッジ数が所定の範囲内となるブロックを検出することによって、精度よく一次元/二次元コードが含まれる領域のみを検出することが可能となり、また一次元コードと二次元コードとを容易に区別することができる。
図6は、ライン間相関によるコードの判定方法の説明図である。一次元コードでは、コード領域内でバーに垂直な直線とその近傍の平行な直線との間での相互相関の値が大きくなるが、バーに平行な直線とその近傍の平行直線との間での相互相関の値が小さくなるという特徴がある。図6では、垂直な2つのラインとして、黒のバーの内部、あるいは白のバーの内部に2つのラインを考えているが、黒のバーの内部を通るラインと、白のバーの内部を通るラインとの間で、相互相関をとった場合も同様である。
これに対して二次元コードでは、水平な2本のラインの間でも、あるいは垂直な2本のラインの間でも、相互相関の値はともに小さくなるという特徴がある。また文字や写真が印刷されている領域においても、一次元コードの場合ほど強い相関を示すことはほとんどない。
そこでブロック内の水平ライン間、あるいは垂直ライン間の相関の値が所定の範囲内となるブロックを検出することによって、一次元/二次元コードが含まれる領域を精度よく検出することが可能となると共に、一次元コードと二次元コードとを容易に区別することが可能となる。
図7は、一次元コードにおける回転の有無の判定方法の説明図である。前述のように一次元コードに対しては、本来コードを形成するバーに対して直交する方向の1ライン分のデータを使用してバーコード認識を行うことになるが、一次元コードが90°回転した状態となっていると、ラインの方向がバーの方向と平行になり、正しいコード認識ができない。そこでコードの回転の有無を検出する必要がある。
図7において、一次元コードが本来の方向、すなわち水平方向に存在する場合には、水平方向エッジ数は白バーと黒バーの数に対応する数だけ存在するのに対して、垂直方向エッジ数は0となる。また水平ライン間の相関は大きくなるが、垂直ライン間の相関は小さくなるという特徴がある。
これに対して一次元コードが90°回転している場合には、水平方向エッジ数は0であるのに対して、垂直方向エッジ数は白バーと黒バーの数に対応した数だけ存在し、水平ライン間相関は小さいのに対して、垂直ライン間相関は大きくなるという特徴がある。
この性質を利用して、画像データ内で一次元コードが水平方向を向いているか、あるいは90°回転した状態となっているかを精度よく判別することが可能となる。
実際のコードの判別においては、上記に説明した判定条件を複数個適宜組み合わせることによって、精度よく一次元コードや二次元コードが含まれる領域のみを検出することが可能となる。また特に白黒画素数、エッジ数、相関などは、それらのとり得る値の範囲が一次元コードと二次元コードとの間である程度異なってくる場合もあるが、本実施形態ではそれぞれの所定の範囲を一次元コードと二次元コードとの間で区別することなく処理を行うものとして説明する。これによってそれぞれの判別のための処理を分けたりする必要が無くなり、結果として簡単な処理シーケンスで高速にコード判別を行うことが可能となる。
図8は、コード種類及び特性の判別処理の全体フローチャートである。同図において処理が開始されると、まず入力画像データの中から注目するブロックが選択される(S11)。ブロックは画像の任意の位置から順番に選択していくものとする。通常は左上の隅から順次走査して選択したり、画像中央から周辺部に向かって走査したりする場合が多い。処理対象の特性上、コードが存在する可能性がより高い位置からブロックを選択する方がコードをすぐに検出でき、処理時間を短くすることができる。
ブロック内の画素の階調値に対する標準偏差(SD:Standard Deviation)が算出され(S12)、その値があらかじめ定められた値SDcodeを超えているかが判定され(S13)、超えている場合には水平方向エッジ数HEdgeが算出され(S14)、垂直方向エッジ数VEdgeが算出され(S15)、これらの値があらかじめ定められた所定の値EDGEminを超えているかが判定される(S16)。
水平方向エッジ数、垂直方向エッジ数のいずれか1つ以上が所定の値を超えている場合には、黒画素率BPRatioが算出され(S17)、水平ライン間相関HSoukanが算出され(S18)、垂直ライン間相関VSoukanが算出され(S19)、黒画素率が所定の最小値BPRATIOminを超えており、かつ所定の最大値BPRATIOmax未満であるか否かが判定される(S20)。
この判定条件が成立している場合には、そのブロックがコード領域と判定され(S22)、その後そのコード領域が一次元コードであるか否かが判定される(S23)。この一次元コードの判定については図9でさらに詳細に説明する。
黒画素率に関する判定条件が成立しない場合には、水平ライン間相関、または垂直ライン間相関がそれぞれ所定の最小値SOUKANminを超えているか否かが判定され(S21)、いずれかのライン間相関が所定の最小値を超えている場合にはステップS22以降の処理が行われる。
コード領域が一次元コードであると判定された場合にはその一次元コードが回転した状態であるか否かが判定される(S24)。その判定の詳細については後述する。回転ありと判定された場合には、一次元コードが回転しているものとしてのデコード処理が行われて(S25)、処理を終了し、また、回転がない(水平)と判定された場合には一次元コードが通常状態、すなわち水平方向にあるものとしてのデコード処理が行われて(S26)、処理を終了する。
コード領域が一次元コードでないと判定されると、その領域が二次元コードであるか否かが判定され(S27)、二次元コードである場合には二次元コードに対するデコード処理が行われ(S28)、処理を終了する。
ステップS13で標準偏差が所定の値以下である場合、ステップS16で水平方向エッジ数、垂直方向エッジ数のいずれもが所定の最小値以下である場合、ステップS21で水平ライン間相関、または垂直ライン間相関のいずれもがその最小値以下である場合、およびステップS27で二次元コードでないと判定された場合には、ステップS11に戻り、次のブロックを選択してステップS12以降の処理が繰り返される。なおステップS27で二次元コードでないと判定されることは基本的にはありえないが、このような場合にはなんらかのエラーがあったものとして、ステップS11以降の処理が繰り返される。またステップS24において、コードが無いと判定された場合にも、エラーと見なしてステップS11以降の処理が繰り返される。
図9は、図8のステップS23における一次元コード判定処理の詳細フローチャートである。同図において処理が開始されると、まず画素の階調値の標準偏差SD(Standard Deviation)が所定の値を超えているか否かが判定される(S31)。この所定の値は例えば図8のステップS13におけると同じとする。所定の値を超えている場合には水平方向エッジ数、または垂直方向エッジ数の少なくともいずれか1つが所定の最小値を超えているか否かが判定される(S32)。この所定の最小値もステップS16におけると同じとする。
いずれか1つのエッジ数が所定の最小値を超えている場合には、水平ライン間相関、または垂直ライン間相関が所定の最小値(ステップS21と同じ)を超えているか否かが判定され(S33)、超えている場合には一次元コード領域と判定されて(S34)、処理を終了し、図8のステップS24の処理に移行する。
ステップS31で標準偏差、ステップS32で水平方向エッジ数と垂直方向エッジ数の両者、ステップS33で水平ライン間相関と垂直ライン間相関の両者がそれぞれ対応する所定の値以下であると判定された場合には、一次元コードでないと判定され(S35)、処理を終了し、図8のステップS27の処理に移行する。
図10は、図8のステップS24における回転有無の判定処理の詳細フローチャートである。同図において処理が開始されると、まず水平方向エッジ数が所定の最小値を超えており、かつ水平ライン間相関が所定の最小値を超えているか否かが判定される(S37)。この判定は、図7の左側で説明したように一次元コードが水平方向となっている条件であり、この条件が成立すると、垂直方向エッジ数が所定の最小値を超えており、かつ垂直ライン間相関が所定の最小値を超えているか否かが判定される(S38)。この条件は図7の右側にある一次元コードの回転状態に対応する。この条件が成立しない場合には一次元コードは水平方向と判定され(S41)、図8のステップS26の処理に移行する。
ステップS38の判定条件が成立する場合は、一次元コードは水平方向でもなく、90°回転した方向でもなく、例えば斜めの方向になっている場合に相当する。この場合には水平ライン間相関HSoukanが垂直ライン間相関VSoukan超えているか否かが判定され(S39)、超えている場合には一次元コードが水平方向と判定され(S41)、図8のステップS26の処理に移行する。
ステップS37で判定条件が成立しない場合には、ステップS38におけると同じ判定条件が成立するか否かが判定され(S40)、成立する場合、およびステップS39で水平ライン間相関が垂直ライン間相関以下であると判定された場合には、一次元コードが回転していると判定され(S42)、図8のステップS25の処理に移行する。またステップS40で判定条件が成立しない場合には、コードなしと判定され(S43)、何らかのエラーが発生したものとして図8のステップS11以降の処理が繰り返される。
図11は、図8のステップS27における二次元コード判定処理の詳細フローチャートである。同図において処理が開始されると、画素の階調値の標準偏差が所定の値を超えているか否かが判定され(S45)、超えている場合には水平方向エッジ数と垂直方向エッジ数のいずれもが所定の最小値を超えているか否かが判定される(S46)。超えている場合には黒画素率が所定の最小値を超えており、かつ所定の最大値未満であるか否かが判定される(S47)。この条件が成立する場合には二次元コードと判定され(S48)、図8のステップS28の処理に移行する。これに対してステップS45で標準偏差が、ステップS46で水平方向エッジ数、または垂直方向エッジ数の少なくともいずれか1つがそれぞれ所定の値以下の場合、またはステップS47で黒画素率が所定の最小値と所定の最大値の間に入っていない場合には、二次元コードでないと判定され(S49)、図8のステップS11以降の処理が繰り返される。
以上のフローチャートにおいては、前述のように例えば水平方向エッジ数や、垂直方向エッジ数などの所定の最小値として一次元コードと二次元コードに対して共通の値を用いて判定を行うものとしたが、これらの所定の値として一次元コードに対する値と二次元コードに対する値を区別して処理を実行することも当然可能である。また、例えば図9の一次元コード判定処理における判定条件は図8のステップS13、S16、およびS21に含まれており、例えばステップS21の判定条件が成立した時点で処理対象ブロックは一次元コード領域であると判定して、ステップS24の一次元コードの回転有無の判定処理を行うことも可能である。
図12は、本発明の第1の実施形態に係るコード画像処理方法を説明するための概略図である。同図において、画像データの左上隅から横方向に小ブロック領域300毎に順次走査しながら二次元コードを探索する。走査で小ブロック領域300が第1の二次元コード100の内部に入って、第1の二次元コード100内の位置310で領域内の画像の特徴が二次元コードと合致する場合には、そのブロック領域中にコードが存在すると特定してその近傍に対して認識処理を続行し、二次元コードの認識に成功したら、さらに第1の二次元コード100の領域を抽出する(図12(a)参照)。これについては後述する。第1の二次元コード100の領域抽出に成功したら、図12(b)に示すように、引き続き、小ブロック領域300毎の走査を続け、第2の二次元コード200を探索する。その際、認識済みコードである第1の二次元コード100の領域にさしかかった時には、その領域をスキップして探索を続ける。これについても後述する。この操作を繰り返して、第2の二次元コード200を高速に見つけることができる。
これにより、スキップした小ブロック領域でのブロック判別処理及びコード認識処理を削減することができ、画像データ上の全二次元コードの探索処理を高速化することが可能となる。
ここで二次元コードの認識処理について概説すると、二次元コードの認識は、コード領域抽出処理、解像度変換処理、デコード処理の順に実行される。まずコード領域抽出処理では、コード内部座標検出が行われ、次にセル幅の検出が行われ、最後にコード境界の検出処理が行われる。解像度変換処理は、コード画像の1セルのデータを1画素のデータに変換する処理である。
図13は、二次元コードの境界検出方法の原理的な説明図である。画像データを得る際に光学歪みやピントのボケが発生するとQRコードの位置決め用シンボルが正しく検出できなくなることがあったが、本実施形態においてはコードの回りに存在する白領域、すなわちクワイエットゾーン102を検出することによって、二次元コードの境界を検出することが可能となる。例えば、QRコードではコードの周囲に5セルの幅を持つ白領域(クワイエットゾーン)(図28に関連記載あり)が存在し、そのクワイエットゾーンは光学歪みやピントのボケにほとんど影響されないため、二次元コードの境界を正しく検出することが可能となる。
図12において走査で小ブロック領域300が第1の二次元コード100の内部に入って、第1の二次元コード100内の位置310で領域内の画像についてその特徴を調べる。まず、二次元コード100内の位置310を基点に上下左右の方向に白領域、および黒領域の連続長の長さを検出し、その長さの頻度によって分布を求め、頻度がある一定値以上になる範囲内で最小の連続長の長さをセル幅として求める。これを図14を用いて説明する。
図14は、セル幅の検出方法の説明図である。同図において二次元コード内部の適当な点から上下左右の方向に白領域、および黒領域の連続長の長さを検出し、その長さの頻度によって分布を求め、頻度がある一定値以上になる範囲内で最小の連続長の長さをセル幅として求めている。画像内部ではピンボケやノイズなどの影響によって、セル幅とは関係のない連続長が検出されることがあるために、値の小さな連続長は無視し、ある特定の値以上の頻度を持つ範囲で最小の連続長をセル幅として求めることになる。なお二次元コードにおいて白と黒のセル幅は同じであるとする。
図15は、コード境界を検出するための第1の白連続長の検出方法の説明図である。同図において二次元コードの内部の適当な点から上下左右のいずれか1つの方向に画像を走査し、白セルが連続する白連続長の検出を行う。図15では左側への走査を行い、第1の白連続長として5セル幅長を検出することとなる。
図16は、コード境界を検出するための第2の白連続長検出方法の説明図である。ここでは図15で検出された第1の白連続長と交差する方向に第2の白連続長の検出を行う。第1の白連続長上の1つの点を中心としてあらかじめ定められた直径の円を描き、その円周上の1つの点と、その点と中心に関して対称な点とを結ぶ線分上の点が全て白であれば、その線分を第2の白連続長の一部として検出する。
第1の白連続長上の1つの点を中心として、あらかじめ定められた直径の円周上の各点に対応してそのような第2の白連続長が検出されない場合には、図15の第1の白連続長の線分の上で円の中心となる点を移動させて、その点を中心とするあらかじめ定められた直径の円周上の点に対応して第2の白連続長を検出する処理を繰り返す。その処理を二次元コードを含む画像の例えば左端の位置まで繰り返す。
図17および図18は第2の白連続長としてのコード境界の検出方法の説明図である。図17は、コード内部の第1の白連続長上の点を中心とした或る定められた円周上の点を対象とする第2の白連続長検出動作の説明図である。第2の白連続長を検出するための円の直径をある程度以上大きくすることによって、コードの内部ではそのような長い白連続長を第2の白連続長として検出することはできない。
図18は、コード境界における第2の白連続長の検出動作の説明図である。前述のようにコード境界においてクワイエットゾーンが存在するため、第2の白連続長を検出するための円の直径以上の長さの白連続長が検出可能である。実際には後述するようにこのような円の直径と同じ長さの白連続長が検出された時点で、さらにその線分を両側に伸ばし、延長された線分上の点が全て白であるか否かが検出され、全て白である場合に、その線分を二次元コードのクワイエットゾーンにおける第2の白連続長として検出する。
図19は、境界検出処理の開始点の位置の説明図である。コード境界を検出するための第1の白連続長検出処理は、コード内部の適当な点を開始点として開始される。コード外部の点を開始点とすれば、二次元コード以外の図表や文字の領域において境界検出処理が行われてしまうことになる。この開始点は、二次元コードと判定されたブロックに対応してその位置が特定される。
図20は、上下左右4方向の二次元コード境界検出の説明図である。前述のように境界検出処理の開始点から上下左右の各方向に対して画像を走査し、第1の白連続長、および第2の白連続長を検出することによって、二次元コードのクワイエットゾーンに相当する上下左右4方向における境界が検出される。
このように上下左右の境界が検出されると二次元コードの画像内における傾き角度を求めることもできる。例えばその簡略的な方法として、境界を直線と見なして、その傾きからコードの傾き角度を求めることもでき、より精密な方法として境界の検出結果を用いて位置決め用シンボルの位置を特定し、その位置から二次元コードの傾き角度を計算することもできる。
図21は、白セルと黒セルとを区別するための閾値の決定方法の説明図である。二次元コードに対する光の照射量が少ない場合や、センサの感度が低い場合などにおいては、閾値を、例えば256諧調の中間の128のように固定した場合にセルの黒、白を正確に判定することができないことがある。例えば、光の照射量が少ない場合には階調値のレンジが全体的に低いレベルに下がり、かすれやつぶれが発生する。そのようなかすれやつぶれの影響を排除するために、図21に示す閾値の決定方法を用いる。
一般的に二次元コードは白と黒の2値で表現されたものが多く、入力画像の各セルに対する階調値のヒストグラムでは図21に示されるように明るい領域と暗い領域で2つのピークが生ずる。頻度がそれぞれある一定値以上であり、最も左側にある階調値のピークと、右側にある階調値のピークとに対応する階調値の中間(平均値)を閾値の値として決定することによって、かすれやつぶれの影響を排除して、白セルと黒セルとの判定を正確に行うことが可能となる。
黒セルと白セルの判定方法として、このような閾値を用いる代わりに、注目セルとその周囲のセルの階調値とを比較し、その差がある一定値以上である場合には階調値の大きなセルを白セル、小さなセルを黒セルと判定する方法を用いることもできる。
図22は、領域ごとの閾値決定方法の説明図である。二次元コードの画像領域の大きさや、光の照射方向などによって生じる影の影響などによって、黒セルと白セルを判別するために二次元コードの画像領域全体に一定の閾値を用いた場合には、正確な判別ができない場合がある。すなわち光源の位置などの影響によって、影の濃い部分と薄い部分とができるような場合には、影の濃い部分と薄い部分とで閾値を変更して黒セルと白セルとの判別を行う必要がある。
例えば図22において右方向に画像を走査していく場合に、例えばある一定距離毎に閾値を修正して第1の白連続長、および第2の白連続長の検出処理を行う。この閾値修正を行う走査距離については、例えば光源の位置やその強度などを変更して実験を繰り返し、適切な距離を決定することができる。
以上で概略を説明した、二次元コード境界検出方法について図23〜図25のフローチャートを用いてさらに詳細に説明する。図23は、コード境界検出処理の全体フローチャートである。ここで検出対象となる二次元コードは、例えば前述のQRコードであるものとするが、他の二次元コードに対する処理も実行することができる。
図23において処理が開始されると、まずステップS71で閾値を更新する距離に対応する閾値エリアのカウンタが0に初期化され、現在の処理対象の点の座標nXPos、およびnYPosにコード内部の走査開始点、すなわち上述の説明において検出された二次元コード領域の内部の点の座標r−nx−ct、およびr−ny−ctが代入され、ステップS72で現在の点のX座標nXPosが、画像の左端の点のX座標nXEd(=0)以上であるか否かが判定される。なおここでは図20で説明したように開始点から左方向に画像を走査するものとして、処理のフローチャートを説明する。
ステップS72で現在の点が画像の左端に達していないと判定されると、ステップS73で閾値エリアのカウンタの値が閾値の更新が必要となる値nThAreaを超えたか否かが判定され、超えている場合にはステップS74で閾値nThreshを更新するために閾値の検出処理が行われる。閾値の検出処理は図21で説明した方法によって行われる。
ステップS74の処理に続いて、ステップS75で閾値エリアのカウンタの値が0に初期化された後に、またステップS73でカウンタの値が閾値更新を行うべき値を超えていない場合には、ステップS76の第1の白連続長検出処理に移行する。この処理については図24で詳細に説明するが、この検出処理に対応して第1の白連続長を示すnWRange、閾値エリアのカウンタの値、現在の点の座標値、および閾値nThreshの変数の値が引き渡される。なおこれらの値のうち、現在の点のY座標nYPos、および閾値nThresh以外の値は第1の白連続長検出処理において更新される。なお第1の白連続長検出処理の処理中に閾値エリアのカウンタ値がnThAreaの値を超える可能性もあるが、ここでは第1の白連続長は比較的短く、この処理中には閾値は更新されないものとする。
第1の白連続長検出処理が終了すると、ステップS77で第1の白連続長検出処理において白連続長が検出されず、エラーとなったか否かが判定され、エラーとなった場合には処理を終了する。第1の白連続長の検出に成功した場合には、ステップS78で第2の白連続長検出の終了判定処理に用いられるカウント値nWCountの値が0に初期化され、ステップS79でそのカウント値が第1の白連続長を表すnWRange未満であるか否かが判定され、未満であるときにはステップS80で第2の白連続長の検出が行われる。この処理については図25で詳細に説明するが、この処理に対して現在の点のX座標とY座標、および閾値の値が引き渡される。
続いてステップS81で第2の白連続長の検出に成功したか否かが判定され、成功した場合には処理を終了し、成功しない場合にはステップS82でnWCountと閾値エリアのカウンタの値がインクリメントされ、現在の点のX座標がデクリメントされた後にステップS79以降の処理が繰り返される。
すなわち図15および図16で説明したように、第1の白連続長に対応する線分上で左方向に現在の点を移動させながら、第2の白連続長を検出する処理を繰り返すことになる。この処理の繰り返しはステップS79でnWCountの値がこの第1の白連続長の長さ、すなわちnWRangeに達した時点で終了し、再びステップS72以降の処理が繰り返されることになる。
図24は、第1の白連続長検出処理の詳細フローチャートである。同図において処理が開始されると、ステップS86で現在の点のX座標、Y座標が変数x、yに代入され、ステップS87でxが画像データの左端に達していないかが判定され、達していない場合にはステップS88で座標x、yの点の階調値のデータが閾値未満であるか否かが判定される。本実施形態では、明るいセル、すなわち白いセルに対する階調値が、黒いセルに対する階調値より大きくなっているため、階調値が閾値未満であることは、現在処理対象となっているセルが黒であることになり、白セルを見つけるまで次のステップS89からS91の処理が繰り返される。
ステップS89では、閾値エリアのカウンタがインクリメントされ、処理対象セルの座標xがデクリメントされ、ステップS90でステップS87と同様に画像の左端に達していないか否かが判定され、達していない場合にはステップS91でS88と同様に階調値が閾値未満であるか否かが判定される。閾値未満である場合にはステップS89以降の処理が繰り返される。
ステップS91で階調値が閾値以上である場合、およびステップS88で同様に階調値が閾値以上である場合には、ステップS92で処理中のセルの座標xが第1の白連続長の開始点のX座標を示すnXstに代入され、ステップS93の処理に移行する。
ステップS93からS95において閾値エリアのカウンタの値がインクリメントされ、処理中のセルのX座標xがデクリメントされた後に、処理中のセルが画像の左端に達していないか、またセルが白であるかの判定が行われ、これらの判定が共に成立する場合には、これらの処理が繰り返され、ステップS95でセルの階調値が閾値以下であり、セルが黒と判定されると、ステップS96でセルのX座標xが第1の白連続長の終りの点のX座標を示すnXedに代入され、ステップS97で第1の白連続長の長さを示すnWRangeが求められ、図23の全体処理において処理中のセルのX座標を示すnXPosの値が第1の白連続長の開始点の座標nXstの値とされ、第1の白連続長の検出の成功を示すフラグnErrFlag1の値が1とされて処理を終了し、リターンが行われる。
ステップS87、ステップS90、およびステップS94のいずれかにおいて処理中のセルのX座標を示すxが画像データの左端nXEdに達したと判定されると、ステップS98で第1の白連続長の検出の成功を示すフラグが−1、すなわち失敗を示す値に設定された後に処理を終了してリターンが行われる。
図25は、図23のステップS80における第2の白連続長検出処理の詳細フローチャートである。同図において処理が開始されると、まずステップS101で図24のステップS86と同様に現在の処理対象のセルの座標x、yの設定が行われる。ステップS102でこれらの座標によって決まる点を中心とした円が描かれ、その円周上の点が求められる。ここでこの円は前述のように第2の白連続長を検出するためのものであり、コード内部で第2の白連続長が検出されることがないように、ある程度大きな直径を持つ円が使用される。
続いてステップS103で円周上の点のインデックスとしてのjが0に初期化され、ステップS104でjの値がステップS102で求められた円周上の点の数Circu Point Num未満であるか否かが判定され、未満である場合にはステップS105で、インデックスjで示される円周上の点における階調値Cdata[j]の値が閾値以上であるか否かが判定され、閾値以上、すなわち白である場合にはステップS106で、インデックスjによって示される円周上の点と円の中心に関して対称な位置にある点の階調値CdataRev[j]が閾値以上であるか否かが判定される。閾値以上である場合にはステップS107でこれらの2つの点を結ぶ線分上の点の色が全て調べられ、全て白であるか否かがステップS108で判定され、全て白である場合には前述のようにステップS109で、その線分の外側にさらに延長線が引かれ、延長線上の点が全て白であるかが調べられ、ステップS110でそれらの点が全て白であるか否かが判定され、全て白である場合にはステップS112で第2の白連続長の検出成功を示すフラグnErrFlag2の値が1に設定された後に処理を終了し、リターンが行われる。なおステップS109で引かれる延長線の長さは、例えば延長線の長さを含む全体の線分の長さが、円の直径の2倍となるような長さとされる。
ステップS105で、円周上のインデックスjで示される点、またはステップS106でその点と円の中心に関して対称な点の階調値が閾値未満である時、ステップS108、またはS110で線分上の点、または延長線上の点の一部が白でない時には、ステップS111でjの値がインクリメントされた後にステップS104以降の処理が繰り返される。すなわちステップS102で求められた円周上の点を移動させながら、第2の白連続長の検出処理が続けられる。そしてステップS104で円周上の点に対する処理が全て終了したと判定されると、第2の白連続長の検出に失敗したことになるため、ステップS113でフラグの値が−1とされて処理を終了し、リターンが行われる。
図26は、図3に示すブロック走査制御過程5の処理を詳しく説明するためのフローチャートである。図26においてブロック走査制御過程では、まず対象ブロックにおいてコード認識が行われたか否かを判別する(S121)。コード認識が行われていない場合には、次のブロックに移動する(S124)。コード認識が行われている場合、認識に成功(S122)していれば、認識済みのコード領域を設定する(S123)。認識に失敗(S122)した場合は、次のブロックに移動する(S124)。移動した次のブロックが、画像データの内部からはみ出した(S125)場合には、対象画像データの全領域を探索し終えたものとして処理を終了する。次のブロックが、設定されている認識済みのコード領域内である(S126)場合には、更に次のブロックへ移動して処理を続ける(S124)。このように、認識済みのコード領域をスキップして、処理を行うことで、コード探索に係る処理時間を短縮することが可能となる。
[実施形態2]
図27は、本発明の第2の実施形態に係るコード画像処理方法を説明するための概略図である。本実施形態では、画像データに複数、例えば2つの二次元コードが配置される例について説明する。複数の二次元コード、例えば第1の二次元コード400と第2の二次元コード500には、それぞれコードデータの外に、関連情報として互いの処理方法(例えば、互いの二次元コードをどのように「連結」するか)および相対位置情報が格納される。
図27の読取り画像において、(1)読み取った画像データに対して小ブロック領域300を画像データの左上隅から横方向に走査しながら二次元コードを探索し、走査で小ブロック領域300が画像データ右上の第1のコード400の内部に入った場合には、ここに二次元コードが有ると判定され、第1の二次元コード400の認識が行われる。第1の二次元コード400の認識結果に基づいて第1の二次元コード400からコードデータとして、例えば「○×中央病院」を得る。(2)次いで関連するコードの位置情報の検出を行い、第1の二次元コード400からコードデータとして、例えば位置情報「-400、-600」を得る。(3)この位置情報に基づいて、第2の二次元コード500のコード認識を行う。第2の二次元コード500からコードデータとして、例えば「2004年○月×日受信分」を得る。(4)ここで、第1の二次元コード400の関連情報には、指定処理として「連結」と連結の仕方が指示されているから、読取った順に第2の二次元コード500のコードデータを「連結」して処理する。(5)その結果、出力するコードデータは、例えば「○×中央病院 2004年○月×日受信分」を得ることになる。こうすることで、複数の二次元コードに分けて格納した関連情報に基づいて、その指定処理にしたがってコードデータを「連結」処理することにより、コードデータを一つにまとめ、一つの二次元コードでは格納しきれない大きなデータでも格納可能となり二次元コードの利用を拡大させることが可能となる。
図28は、本発明の第2の実施形態に係るコード画像処理方法における基準座標の設定を説明するための図である。二次元コードの認識が成功した場合、まず二次元コードに格納されている位置情報を取り出す。位置情報には、二次元コードの1つの特徴点(ここでは左下の頂点)を基準座標、すなわち座標原点に、二次元コードの向き(ここでは、左辺と下辺)を軸(左辺上向きをY軸、下辺走査方向をX軸)にした座標に対して、二次元コードの大きさに関する特徴量(ここでは二次元コードの1つのセル105の大きさ)を基準に位置(相対位置)情報が記述される。図27において第1の二次元コード400から見た第2の二次元コード500の相対位置情報は、セルの大きさを単位にかつ座標の向きを考慮して、「(-400、-600)」と記述される。このようにすることで、画像データの大きさや傾きなどの要因に影響されること無く位置(相対位置)情報を記述することが可能である。もちろん、画像データの上の二次元コード以外の特徴点を基準座標として記述することも可能であるが、この場合は、基準座標を認識する処理が別途必要となる。
次に、位置(相対位置)情報にしたがい、関連した第2の二次元コード500の位置を求める。すなわち、図27に示した第2の二次元コード500は第1の二次元コード400に格納された位置情報によって座標上でその位置が画像データ左下に有ることが分るので、直ちに第2の二次元コード500のコード認識を行うことができる。これにより、2つの二次元コードの間に存在するブロック領域では小ブロックによる探索、ブロック判別処理及びコード認識処理を削減することができ、処理を高速化することが可能となる。また、位置(相対位置)情報によって関連する二次元コードの位置を正確に知ることができるため、認識精度も向上する。
なお、第2の二次元コード500にも位置情報として、第2の二次元コード500から見た第1の二次元コード400の位置(相対位置)情報を格納しておくことによって、小ブロック領域単位の走査を左下から開始した場合でも同様の手順にて2つの二次元コードの認識を高速に行うことが可能である。
第1の二次元コード400および第2の二次元コード500の認識に成功したら、両方の二次元コードに格納されている処理方法に基づいて情報を処理する。ここでは、コードデータ1をコードデータ2に「連結」して出力するという処理方法が指示されているので、二次元コード400から取り出したコードデータに二次元コード500から取り出したコードデータを結合して1つのコードデータとして出力する。これにより、処理方法について別途指示しなくても、コードデータを適切に処理することが可能となる。また、一つの二次元コードでは表現しきれないコードデータでも、複数の二次元コードに分割して格納して処理することで二次元コードの活用をさらに拡大させることが可能となる。
図29は本発明の第2の実施形態に係るコード画像処理方法を説明するためのフローチャートである。同図において、ブロック走査を開始しブロック位置でのコード認識が実行(S132)されるまでブロック走査を続ける(S131)。ブロック位置でのコード認識に成功(S133)したら、その中に格納されているコードデータを解析し、関連する他のコードの位置情報が含まれているかどうかを判別する(S134)。他のコードの位置情報が含まれている場合は、その位置に移動(S135)して、コード認識を行う(S136)。他のコードの位置情報が含まれていない場合は、これまで通りブロック走査を繰り返す(S138)。対象画像データの全領域を探索し終えたら(S137)、認識したコードに処理情報が含まれているかどうかを判別する(S139)。処理情報が含まれている場合には、その情報に従った処理を行う(S140)。
[実施形態3]
図30は、本発明の第3の実施形態に係るコード画像処理方法を説明するための概略図である。図30に示す第3の実施形態に係るコード画像処理方法が図27に示す第2の実施形態に係るコード画像処理方法との違いは、マウスなどのポインティングデバイス操作で画像データ内の1つの二次元コード領域を指定できるよう構成した点である。その以外の構成は、図27で説明したのと同様なのでここでの説明を省略する。
図31は本発明の第3の実施形態に係るコード画像処理方法を説明するフローチャートである。同図において、まず画像データに対して、任意の方法で、例えば、マウスなどのポインティングデバイス操作で画像データ内の1つの二次元コード、例えば第1の二次元コード400の位置を指定する(S151)。次いで第1の二次元コード400の認識に成功(S152)したら、その中に格納されているコードデータを解析し、他の関連する二次元コード、例えば第2の二次元コード500の位置情報が含まれているかどうかを判別する(S153)。二次元コードの位置情報が含まれている場合は、その位置に移動(S154)して、二次元コードの認識を行う(S155)。二次元コードの位置情報が含まれていない場合は、他の二次元コードの位置の指定を行う(S157)。対象画像データ中に含まれている全ての二次元コードの認識を終えたら(S156)、認識した二次元コードに処理情報が含まれているかどうかを判別する(S158)。二次元コードに処理情報が含まれている場合には、その情報に従った処理を行う(S159)。
以上において本発明のコード画像処理方法についてその詳細を説明したが、この方法を実行するコード読取装置は当然一般的なコンピュータシステムをその主要構成部として構成することが可能である。
図32は、本発明におけるプログラムのコンピュータへのローディングを説明する図である。同図においてコンピュータシステムは中央処理装置(CPU)10、リードオンリメモリ(ROM)11、ランダムアクセスメモリ(RAM)12、通信インタフェース13、記憶装置14、入出力装置15、記録媒体の読取り装置16、およびこれらの全てが接続されたバス17によって構成される。
記憶装置14としてはハードディスク、磁気ディスクなど様々な形式の記憶装置を使用することができ、このような記憶装置14、またはROM11に図8〜図11、図23〜26、図29、図31のフローチャートに示された媒体に格納されたプログラムがCPU10によって実行されることにより、本実施形態における一次元/二次元コードを含むコードが存在するブロックの検出、コードの種類の判別、コードの認識などが可能となる。
このようなプログラムは、情報提供者18側からネットワーク19、および通信インタフェース13を介して、例えば記憶装置14に格納されることも、また市販され、流通している記録媒体20に格納され、読み取り装置16にセットされて、CPU10によって実行されることも可能である。
本発明のコード画像処理方法によれば、画像データにコードが複数含まれている場合でも、一つのコード認識で止まることなく、認識したコード領域におけるコード判別処理及びコード認識処理をスキップするので、コード全体の探索と認識を高速かつ確実に行うことが可能であるので、任意の数、位置および大きさの二次元コードが一つの文書に複数配置されて利用されるようになり、コード利用形態を拡大させることが可能となる。
従来のコード画像処理方法を説明するための概略図である。
コードの位置情報を記録したレイアウトのテンプレートの情報を使用して二次元コードを認識する従来のコード画像処理方法を説明するための概略図である。
本発明の第1の実施形態に係るコード画像処理方法の原理説明図である。
一次元コードと二次元コードの典型例を示す図である。
エッジ数によるコード判定方法の説明図である。
ライン間相関によるコードの判定方法の説明図である。
一次元コードの回転の有無の判定方法の説明図である。
コード種類及び特性の判別処理の全体フローチャートである。
一次元コード判定処理の詳細フローチャートである。
一次元コード回転判定処理の詳細フローチャートである。
二次元コード判定処理の詳細フローチャートである。
本発明の第1の実施形態に係るコード画像処理方法を説明するための概略図である。
二次元コードの境界検出方法の原理的な説明図である。
セル幅の検出方法の説明図である。
第1の白連続長検出方法の説明図である。
第2の白連続長検出方法の説明図である。
コード内部における第2の白連続長検出動作の説明図である。
コード境界における第2の白連続長検出動作の説明図である。
コード境界検出処理の開始点の位置の説明図である。
上下左右4方向のコード境界検出の説明図である。
閾値の設定方法の説明図である。
領域ごとの閾値決定方法の説明図である。
コード境界検出処理の全体フローチャートである。
第1の白連続長検出処理の詳細フローチャートである。
第2の白連続長検出処理の詳細フローチャートである。
図3に示すブロック走査制御過程の処理を説明するためのフローチャートである。
本発明の第2の実施形態に係るコード画像処理方法を説明するための概略図である。
本発明の第2の実施形態に係る基準座標の設定を説明するための図である。
本発明の第2の実施形態に係るコード画像処理方法を説明するためのフローチャートである。
本発明の第3の実施形態に係るコード画像処理方法を説明するための概略図である。
本発明の第3の実施形態に係るコード画像処理方法を説明するフローチャートである。
本発明におけるプログラムのコンピュータへのローディングを説明する図である。