以下、本発明の実施の形態について説明する。
[発明の実施の形態1]
図1乃至図17には、本発明の実施の形態1を示す。
(スタック型バーコード読取装置)
図1は、本発明の実施の形態1に係るスタック型バーコード読取装置1の電気的構成を示すブロック図である。図2は、同実施の形態1に係るスタック型バーコード読取装置の低レベル復号部のブロック図である。
図1において、スタック型バーコード読取装置1は、密着型のイメージスキャナ11aおよびカード搬送機構11bを有する撮像装置11と、画像メモリ12と、データ処理装置13とを備えている。データ処理装置13は、位置検出部13aと、傾き補正部13bと、構造解析部13cと、復号部13dとを備えている。また、カード等の記録担体2には、二次元バーコードの一種であるスタック型バーコード21が印刷されている。また、復号部13dは、低レベル復号部13d1および高レベル復号部13d2を有している。
撮像装置11のイメージスキャナ11aは、記録担体2に印刷されたスタック型バーコード21を照射した光の反射光を光電変換によって電気信号に変換して画像データを得る。得られたスタック型バーコード21の画像データは画像メモリ12に記憶される。データ処理装置13は、スタック型バーコード21の画像データを画像メモリ12から取り込み、取り込んだ画像データに対して様々な処理を施す。
低レベル復号部13d1は、図2に示すように、Xシーケンス計測部14と、Tシーケンス計測部15と、コードワード変換部16とを備えている。
Xシーケンス計測部14は、閾値算出手段14aおよび線幅計測手段14bを有している。閾値算出手段14aは、固定閾値算出手段14a1と、局所閾値算出手段14a2と、n次微分算出手段14a3とから構成されている。
Tシーケンス計測部15は、シーケンス変換手段15a、線幅正規化手段15bおよび判定手段15cを有している。シーケンス変換手段15aは、Xシーケンスで算出した線幅配列をTシーケンス用の線幅配列に変換する機能を有している。また、判定手段15cは、後述するクラスタ番号と理論値とを比較する機能を有している。
コードワード変換部16は、テーブルメモリ16aを有しており、テーブルメモリ16aには、Tシーケンスとコードワードとの対応関係を示すコードワード変換テーブルが格納されている。
(スタック型バーコード PDF417の構造)
図3は、スタック型バーコード21の一例(PDF417のラベル構造によるスタック型バーコード)を示す図である。
図3において、スタック型バーコード21は、図中の垂直方向(Y方向)をロウ方向(複数のロウが配列されている方向)、水平方向(X方向)をカラム方向(複数のカラムが配列されている方向)とし、カラム方向において、5つに大きく分かれている。すなわち、図3に示すように、5カラムに分かれており、中央にデータカラムが配置され、また、データカラムの左右にはレフトロウインジケータ、ライトロウインジケータ、さらに、その左右にはスタートパターン、ストップパターンが配置されている。また、各カラムを構成するバーコードの構成は、黒い部分のバーと白い部分のスペースとで構成されており、スタートパターン、ストップパターンには、ビッグバーと呼ばれる幅の広いバーがそれぞれ形成されている。ビッグバーは、図3において、スタートパターンおよびストップパターンともに、左側の黒い部分で幅の一番広いバーである。
さらに、図3に示すように、データカラム、レフトロウインジケータ、ライトロウインジケータは各々、ロウ方向に、6行(ロウ1〜ロウ6)から構成されている。各行(ロウ)を構成する3つのカラム(データカラム、レフトロウインジケータ、ライトロウインジケータ)にはそれぞれコードワードが1個ずつ含まれている。例えば、スタック型バーコード21のデータカラムには、1個(データカラム1カラム分)×6行より6個のコードワードが構成されている。なお、コードワードとは、ある数字、文字またはその他のシンボルを表す値、またはこれらに関連づけられた値を符号化するための基本となる単位である。
また、ストップパターンを除く各カラムは、バー及びスペースが4個ずつ存在し、各線幅は、モジュール(単位)と称される最小幅の整数倍になっている。また、1コードワードの線幅は17モジュールであり、各々のバー、スペースの最大単位は6となっている。なお、ストップパターンは、バーが5個、スペースが4個ずつ存在し、1コードワードの線幅は18モジュールとなっている。
なお、図3に示すスタック型バーコード21では、1個のデータカラムであるが、これに限定されるものではなく、複数個のデータカラムであってもよい。
以下、本発明の実施の形態1に係るスタック型バーコード読取方法について説明する。
(スタック型バーコード読取方法)
図5は、この実施の形態1に係るスタック型バーコード読取方法の流れを示すフローチャートである。図5に基づき、この実施の形態1に係るスタック型バーコード読取方法の流れを概説する。
まず、スタック型バーコード21の位置検出が行われる(ステップS31)。具体的には、図1に示すように、スタック型バーコード読取装置1のイメージスキャナ11aは、カード搬送機構11bに沿って所定位置まで移動した記録担体2のスタック型バーコード21を照射した光の反射光を光電変換によって電気信号に変換して画像データを得る。そして、得られたスタック型バーコード21の画像データは、画像メモリ12に記憶される。画像用メモリ12は2次元的に配列された有限個の画素で構成されている。
この実施の形態1では、撮像されたスタック型バーコード21の画像データは、各画素の(画素値である)輝度値を数値で表したものである。この輝度値は、例えば0から255までの整数値として表される。なお、この画像メモリ12は、RAM、SDRAM、DDRSDRAM、RDRAMなど、画像データを記憶しうるものであれば如何なるものであってもよい。
その後、データ処理装置13の位置検出部13aは、画像メモリ12に記憶された画像データを読み込み、その画像データ中のスタック型バーコード21の位置を検出する。
このようにして位置検出されたスタック型バーコード21は、データ処理装置13において切り出され(ステップS32)、切り出された画像データが画像メモリ12に記憶される。
次に、データ処理装置13において、スタック型バーコード21の傾き補正が行われる(ステップS33)。より具体的には、データ処理装置13の傾き補正部13bは、ステップS32において切り出された画像データ、すなわち、図4に示すように傾いた状態で撮像されたスタック型バーコード21の画像データを読み込み、その画像データを、図3に示すような傾斜角度ゼロの補正画像データに変換する。
図4は、スタック型バーコード21のうち、スタートパターンにおけるビッグバーの部分およびその周辺を拡大した拡大図である。また、この図4は、撮像装置11のイメージスキャナ11aによって、スタック型バーコード21が傾いた状態で撮像された様子を示す図である。スタック型バーコード21を撮像装置11でスキャンしたときには、スタック型バーコード21のロウ方向が必ずしもカード搬送機構11bに対して垂直の関係に位置するとは限らない。イメージスキャナ11aによって読み取られた画像データは、例えば図4に示すように、傾く場合がある。換言すれば、ロウ方向と、画像メモリ12に格納された画像データの垂直方向が一致していない。このような場合に、座標変換に伴い、画素間での画像データの変換となるために発生する量子化誤差に起因するノイズによって、復号の信頼性が損なわれていた。そこで、この実施の形態1では、座標変換後の画像に対して、平滑化を目的とした補間処理や平均処理を行い、かかるノイズの影響を低減している。
次いで、データ処理装置13において、構造解析(カラム解析およびロウ解析)が行われる(ステップS34、S35)。より具体的には、データ処理装置13の構造解析部13cは、ステップS33において変換された補正画像データに基づき、スタック型バーコード21の構造を解析する。構造解析部13cにおいては、カラム解析(ステップS34)およびロウ解析(ステップS35)が行われる。
最後に、データ処理装置13の復号部13dにおいて、復号の処理が行われる(ステップS36、S37)。より具体的には、データ処理装置13の復号部13dは、ステップS34、S35において解析されたスタック型バーコード21の構造に基づき、スタック型バーコード21の復号処理を行う。このとき、スタック型バーコード21の一種であるPDF417では、低レベル復号処理および高レベル復号処理の2つの復号処理が行なわれ、復号部13dの低レベル復号部13d1においては低レベル復号処理を行い(ステップS36)、高レベル復号部13d2においては高レベル復号処理を行う(ステップS37)。低レベル復号処理は、データカラムを構成するバーの線幅とスペースの線幅とからなるコードワードが0〜928の番号が付けられた、929個のコードで示される中間情報に一度変換される処理である。次に、高レベル復号処理は、929個のコードで示される中間情報に一度変換された後、所定ルールに基づいて最終言語にデコード(復号)されるようになっている。この最終言語としては、PDF417では、ASCII文字やバイナリ表現、その他のキャラクタ等がある。
以下、図5に示すフローチャートの各処理(ステップS31〜ステップS37)について、それぞれ詳述する。
(スタック型バーコード位置検出)
図6は、図5に示すフローチャートにおけるスタック型バーコード位置検出(ステップS31)の流れを示すフローチャートである。また、図4は、スタック型バーコード21のうち、スタートパターンにおけるビッグバーの部分およびその周辺を拡大した拡大図である。
図6において、まず、変数i(iは整数)に0を代入して初期化され、所定の原点に復帰する(ステップS61)。具体的には、図4は画像メモリ12に格納された画像データの中で、スタック型バーコード21の一部を囲む領域で、左上を画素Sが所定の原点位置となっている。そこで、ステップS61により、水平方向(X方向)に1画素分の行を水平ラインHL(0)とし、最初の画素Sの画像データを読み込むようになっている。
次いで、水平ラインHL(0)から垂直方向(Y方向)にi番目の画素の列について、Y=iにおける水平ラインHL(i)上で、X方向に画素ごとに画像データを読み込み、最初に画像が「明」から「暗」に変化する点(点P(i)とする。)を検索する。具体的には、各画素の画像データ、すなわち、各画素の輝度値が所定の閾値により高い「明」(白い部分)を示す画素(以下、「スペース」という)と、所定の閾値より低い「暗」(黒い部分)を示す画素(以下、「バー」という)とに分けて、最初にスペースからバーに変化した画素の位置を検出する。この変化した画素の位置がスペースとバーとの境界となる。
また、同じ水平ラインHL(i)上で、引き続き、画像が最初に「暗」から「明」に変化する点(点Q(i)とする。)を検索する。具体的には、バー(「暗」を示す画素)からスペース(「明」を示す画素)に変化した画素の位置を検出する(ステップS62)。
次に、i=r−1(r:図4におけるY方向の行数(画素数))が満たされたか否かが判断され(ステップS63)、満たされていないと判定された場合には、iを1、インクリメントして(ステップS64)、再びステップS62の処理が行われる。一方、図4に示す画素Sから検索が始まり、X方向に各画素の輝度値を検索し、最終行の最後の画素まで検索が終了した場合には、i=r−1が満たされたと判定する。このように、満たされたと判定された場合には、処理を次のステップS65に移す。なお、この段階で、r個の点の組(P(i),Q(i))(i=0,1,・・・,r−2,r−1)を得る。
次いで、図4中の点Aと点Cの座標を求める(ステップS65)。より具体的には、点A、点Cに該当する画素の位置を検出する。X方向において、d(i)=|P(i)−Q(i)|を計算し、d(i)のうちの最小値min(d(i))を求める。このmin(d(i))が、PQ間の距離の最も短くなるビッグバーの点Aおよび点Cの2点に対応する(図4参照)。これにより、点Aおよび点CのY座標(該当する画素のY方向の位置)は、それぞれAy=max(i)およびCy=min(i)となる。また、点Aおよび点CのX座標(該当する画素のX方向の位置)は、それぞれのiに対する点PのX座標になるので、それぞれAx=P(i=Ay)のX座標およびCx=P(i=Cy)のX座標となる。
次に、図4中の点Bと点Dの座標を求める(ステップS66)。より具体的には、d(i)が一定となるiの範囲を特定する。そして、ビッグバーの点Bおよび点DのY座標は、その範囲におけるmin(i)およびmax(i)となる。また、点Bおよび点DのX座標は、それぞれのiに対する点Pおよび点QのX座標となるので、それぞれBx=P(i=By)のX座標およびDx=Q(i=Dy)のX座標となる。
このようにして、ステップS61〜ステップS66の処理を経て、ビッグバーの4隅、すなわち、点A、点B、点C、点Dの座標(該当する画素の位置)が確定したので、傾き角度は、atan((Ay−Dy)/(Ax−Dx))で計算することができる。
なお、傾き検出の精度を上げるため、図4において、XとYの役割を交換して同様の操作を行い、ビッグバーの4隅、すなわち、点A’、点B’、点C’、点D’の座標を求め、上記点A、B、C、Dの座標値との平均をとって最終的な座標値としてもよい。
また、図6では、点Aおよび点Cの座標を求めるとともに(ステップS65)、点Bおよび点Dの座標も求めることとしたが(ステップS66)、本発明はこれに限定されず、例えば、点Aおよび点Cの座標のみを求めることで、傾き検出を行うようにしてもよい。
(スタック型バーコード切出し)
ステップS61〜ステップS66の処理を経て、ビッグバーの4隅の座標が確定すると、スタック型バーコード21の切出しを行う(ステップS32)。なお、スタック型バーコード21全体よりも少し大きな矩形状に切出しが行われる。
(スタック型バーコード傾き補正)
次に、スタック型バーコード21の傾き補正を行う(ステップS33)。
図3は、上述した角度(=atan((Ay−Dy)/(Ax−Dx)))で傾いたスタック型バーコード21の画像データを傾斜角度ゼロの補正画像データに変換したときの様子を示す図である。換言すれば、図3に示すスタック型バーコード21の画像データは、そのカラム方向およびロウ方向が図4に示す画像メモリ12領域の水平方向(X方向)および垂直方向(Y方向)に一致するように補正される。
図3において、傾斜角度ゼロの補正画像データへの変換は、スタック型バーコード21の傾斜角度を用いて行う。例えば、アフィン変換などの周知の方法によって行うことができるので、ここでの詳細な説明は省略する。
そして、この実施の形態1に係るスタック型バーコード読取方法では、座標変換に伴う量子化誤差の影響を緩和するため、座標変換後の画像に対して、平滑化を目的として補間処理または平均化処理を行う。具体的には、各画素の輝度値は、図9(b)や図12に示すように、スペースを示す輝度値(例えば、100)、バーを示す輝度値(例えば、0)としている。なお、補正画像データは、例えば、メディアンフィルタ、エッジ保存フィルタ、適応ウィナーフィルタ、移動平均フィルタなど各種のフィルタにかけることによって平滑化されている。
(構造解析)
図7は、図5に示すフローチャートにおける構造解析(ステップS34、S35)の流れを示すフローチャートである。
図7において、まず、水平射影の処理が行われる(ステップS91)。具体的には、図3に示すスタック型バーコード21の補正画像データに基づいて、水平方向に配列された画素ごとに、各垂直方向に配列された全画素の輝度値の総和を演算し、画像メモリ12に格納する処理である。
その後、求めた輝度値の総和について、水平方向に隣接する画素間で差分をとり、その差分値を用いてスタートパターンおよびストップパターンの解析が行われる(ステップS92)。
図3等に示すように、スタートパターンとストップパターンは、他のデータカラム、レフトロウインジケータ、ライトロウインジケータのコードワードと異なり、すべてのロウ(この実施の形態1では、6行)に共通不変のパターンであることから、水平射影をとることでスタートパターンまたはストップパターンが平均化され、輝度むらや汚れ等の影響を受けにくく、安定した検出が可能となる。
図8は、補正画像データ(図3参照)に所定の処理を施して得られた図である。より具体的には、図8(a)は、補正画像データ(図3参照)について、垂直方向における画素ごとに射影を計算したものであり、図3で言えば、スタック型バーコード21のロウ方向に、全画素の輝度値の総和を示す分布である。また、図8(b)は、図8(a)のグラフについて差分を計算したものである。具体的には、画像メモリ12に格納された画像データの水平方向において隣接する画素間で、求めた輝度値の総和の差分をとり、その差分値の分布を表したものである。これにより、水平ラインL(i)上で、バー(またはスペース)からスペース(またはバー)に変化した画素の位置を検出することができる。
スタートパターンの検出は、図8(a)または図8(b)に示されるグラフを用いて、バーとスペースが変化する点の間隔(ランレングス)(以下、「線幅」という)を計測する。本実施の形態では、水平方向における画素数で計数(カウント)することによって行われる。例えば、スタートパターンの各バーの線幅、各スペースの線幅を計測すると、StartWork=[47,6,5,6,7,6,6,18]に示すような線幅配列が求められる。一方で、スタートパターンのバーとスペースの長さの比は、PDF417の規格より、StartMark=[8,1,1,1,1,1,1,3]に示すような線幅配列となっている。ここで、両者の類似性を調べる指標として、例えば、正規化相関Rを用いることができる。図8(b)について、正規化相関Rを考えると、R=corrcoef(StartWork,StartMark)=0.9993となり、Rは十分1に近い。したがって、この場合には、適切にスタートパターンが検出されたと判定される。なお、ストップパターンの正規化相関Rについての説明は、スタートパターンと同様であるので、ここでの説明は省略する。
なお、この実施の形態1では、類似性の尺度として、正規化相関Rを用いることとしたが、本発明はこれに限られず、例えば差分絶対値和、積和などを適宜用いてもよい。
このようにして、スタート/ストップパターンが適切に検出されたか否かが判断された後(ステップS93)、スタート/ストップパターンが適切に検出されたと判定された場合には、処理をステップS95に移す。一方で、スタート/ストップパターンが適切に検出されていないと判定された場合には、デコード不可、すなわち、復号できないとして処理を終了する(ステップS94)。
次いで、図8(b)のグラフに関して、ピーク検出が行われる(ステップS95)。より具体的には、図3に示すように、スタートパターン、レフトロウインジケータ、データカラム、ライトロウインジケータ、ストップパターンは、各カラムの境界では、すべてのロウにおいてスペースからバーへの遷移が行われるため、水平射影の差分値の分布上、この部分で大きな差分値が現れる(図8(b)の上向き矢印)。そして、図8(b)の上向き矢印で示した差分値(ピーク値)を求めるには、適当な閾値を用意して、その閾値を超えたか超えないかでピークの有無を判定することができる。ピークと判断された場合には、ピーク値をもつ画素の位置を画像メモリ12に記憶させる。
次いで、カラムの境界の検出が行われる(ステップS96)。より具体的には、ステップS95において記憶されたピーク値をもつ画素の位置に基づき、スタートパターン、レフトロウインジケータ、データカラム、ライトロウインジケータストップパターンの5つのカラムの境界を検出する。また、隣接するピーク値をもつ画素の間隔はカラムの幅を表すものであり、同様に画像メモリ12に記憶しておく。ここで、ある特定のロウにおいてこの境界近傍に汚れがあった場合、各ロウの走査中に各カラムの境界を示す変化点を正しく検出できない場合があるが、この実施の形態1のように、水平射影を用いることで、この汚れの影響が平均化作用によって小さくなり、各カラムの境界の検出への悪影響を抑えることができる。
次いで、ロウの境界の検出が行われる(ステップS97)。より具体的には、図9および図10を用いて説明する。図9は、平均化された補正画像データの水平方向において、各ラインLの輝度値を示す波形図である。図10は、スタック型バーコード21の各ロウの区切りを特定する様子を説明するための説明図である。なお、この実施の形態1では、1ラインLは、1行×n列の行列である。ここで、nは評価範囲の幅である。
図9(a)において、ロウの境界の検出は、まず、補正画像データ上に、連続する複数のラインLからなる組を設定する。例えば、連続する3個のラインL(1)、L(2)およびL(3)(以下、「L1、L2およびL3と略す」)からなる組(ライン組S1)を設定する(図10参照)。なお、この実施の形態1では、連続する3個のラインLを設定しているが、3個に限定されるものではない。
そして、これらの3本のラインLについて任意の2本を選び、それらの正規化相関を求めると、全部で3個(L1とL2、L1とL3、L2とL3)の相関値が得られる。これら3個の相関値のうちの最も小さい値が、予め決められた閾値r0よりも大きければ、L1、L2、L3の(ラインLの各画素の輝度値を示す)波形はお互いに相関していると判断し、このライン組S1に1が与えられる(図10参照)。これに対し、予め決められた閾値r0よりも小さければ、最も小さい値が得られた2つのラインLの波形は、少なくとも相関していないと判断し、このライン組S1に0が与えられる。
例えば、水平方向に形成されたラインL1、L2およびL3からなる組については、図9(b)に示すように、ラインL1、L2およびL3がすべて同じロウ1(最も上のロウ)に含まれていることから、3個の相関値のうちの最も小さい値は閾値r0よりも大きくなり、1が与えられることになる(図10において、ライン組S1の判定値は1となっている)。
次に、補正画像データに対して、上述した組を相対的にロウ方向(垂直方向)に移動させて(例えばL2、L3およびL4からなるライン組S2を考えて)、相関値列を算出し、算出された相関値列の最小値が閾値r0よりも大きいか否かを判断することによって、そのライン組に0または1の判定値が与えられる。
以下同様に、ラインLn−2、Ln−1、Ln(ライン組Sn−2)まで上述した処理(判定値を与える処理)を繰り返し行うと、全部でn−2個の1と0とからなる系列が得られる(図10の右欄)。
ここで、3個のラインLが同一のロウから選ばれている場合は、それら3個のラインLよりなるライン組は1に近い値となり、3個のラインLが隣接するロウをまたいで選ばれている場合は、それら3個のラインLよりなるライン組は比較的小さい値となる。より具体的には、図9(b)において、ラインL18より上のラインLはロウ1に属し、ラインL18より下のラインLはロウ2に属し、このラインL18は、ロウ1とロウ2の境界に位置するラインLとなっている。
したがって、このラインL18を含むライン組S16〜S18では、判定値がほぼ0となり、それ以外のライン組では、判定値は1となる(図10参照)。判定値が0に近いライン組は、ロウの切り替わり位置を表しているので、判定値の系列を走査して、その判定値が0に近い場所を特定することにより、ロウの切り替わり位置を知ることができる。なお、この実施の形態1では、相関関数によってラインL相互の類似性を評価しているので、図9(a)に示すように、スタートパターンやストップパターンのような各ロウにおいて共通パターン(バーおよびスペースの線幅が同じ)を除いた範囲を評価範囲とすることで、無駄な演算(計算コスト)を省くことができる。
以上説明したように、ライン組の設定→相関値列の算出→相関値列の最小値と閾値との比較→0または1の判定値付与→判定値の系列の走査、という流れによって、ステップS97のロウの境界の検出が行われる。この実施の形態1では、ロウ1からロウ6の最終ラインLまで行なわれる。
ロウの境界の検出によって、補正画像データの各ラインLがどのロウに属するかを判定し、デコード(復号)可能として処理を終了する(ステップS98)。
また、この実施の形態1では、ロウごとに、それに含まれる複数のラインLの各点の輝度値の平均を計算することによって、ラインLの局所ノイズを低減することができる。さらに、平均した画素の輝度値を用いて、そのロウの特性を代表するものとして、後述する復号処理に用いることができる。これにより、デコード(復号)精度を向上させることができる。
(低レベル復号)
図11は、図5に示すフローチャートにおける低レベル復号(ステップS36)の流れを示すフローチャートである。
この低レベル復号は、図11に示すように、スタック型バーコード21の各ロウの走査反射特性について、カラム解析で決定されたカラムの境界を両端とするセグメント(すなわち、走査反射率波形)を取り出し、1つのカラムを構成するバーの線幅とスペースの線幅との配列によって形成されるXシーケンスと呼ばれる数値列を求めるXシーケンス計測と、Xシーケンスの隣接する2つのバー及びスペースを1つずつシフトさせながら足し合わせてTシーケンスと呼ばれる数値列を求めるTシーケンス計測と、予め用意しておいたコードワード変換テーブルを参照して各Tシーケンスに対応するコードワードを決定するコードワード変換とからなる。
(低レベル復号におけるXシーケンス計測)
スタック型バーコード21の一種であるPDF417では、低レベル復号処理および高レベル復号処理の2つの復号処理が行なわれ、低レベル復号処理は、1つのカラムを構成するバーの線幅とスペースの線幅とからなるデータカラムを構成するバーの線幅とスペースの線幅とからなるコードワードが0〜928の番号が付けられた、929個のコードで示される中間情報に一度変換される処理である。次に、高レベル復号処理は、929個のコードで示される中間情報に一度変換された後、所定ルールに基づいて最終言語にデコード(復号)されるようになっている。この最終言語としては、PDF417では、ASCII文字やバイナリ表現、その他のキャラクタ等がある。
図11において、まず、低レベル復号部13d1のXシーケンス計測部14は、Xシーケンス計測処理を行う(ステップS131)。一般的なXシーケンス計測処理においては、Xシーケンス計測部14の線幅計測手段14bは、各ロウにおいて、ロウに含まれる複数のラインLを平均化したライン波形を走査して、バーの線幅およびスペースの線幅を求める線幅計測を行った後に、画素数によって表現されている線幅をモジュール数表現に変換して、Xシーケンスを得る。なお、走査線は、例えば、各ロウにおいて、ロウ方向のほぼ真中に形成された複数のラインLであり、すなわち、複数行で構成された画素の行例である。さらに、複数のラインLを構成する画素の輝度値の平均を計算し、平均した画素の輝度値を用いて、そのロウにおける画素の輝度値を示す走査反射率波形として復号処理に用いる。
図12は、あるロウにおいて、ロウに含まれる複数のラインLを平均化したライン波形を走査して得られた、画素の輝度値を示す走査反射率波形の一部を示す波形図である。なお、バーの線幅およびスペースの線幅は、画素の輝度値を示す走査反射率波形の変化点と変化点の間の画素数をカウントしたものである。ここで、変化点は、画素の輝度値を示す走査反射率波形上で、図示しない所定の閾値と交差する点を示している。スタック型バーコード21の符合体系の一種であるPDF417において、図3等に示すように、スタートパターン、レフトロウインジケータ、データカラム、ライトロウインジケータ、ストップパターンの5つのカラムから構成されている。さらに、ストップパターンを除く各カラムは、4個のバーと4個のスペースで構成されるため、画素の輝度値を示す走査反射率波形に損傷がない場合には、合計8個の線幅が得られる。
一方で、画素の輝度値を示す走査反射率波形に異常がある場合には、合計8個以上(9個)の線幅が得られる。かかる場合には、カラムに損傷があることが分かり、このカラムの信頼性が低いことを示すフラグをセットする。かかる操作をあるロウに含まれるカラムすべてについて実行したら、次のロウにおいても同様の処理を実行する。すべてのロウについて、線幅が得られたら、ステップS131(図11参照)のXシーケンス計測処理を終了する。
(低レベル復号におけるTシーケンス計測)
次に、低レベル復号部13d1のTシーケンス計測部15は、Tシーケンス計測処理を行う(ステップS132)。
具体的には、Tシーケンス計測部15のシーケンス変換手段15aは、XシーケンスをTシーケンスに変換する。これは、隣接する2個のXiとXi+1を加算したものであり、図12に示す左側のカラム(データカラム)のXシーケンスをTシーケンスに変換すると、[6(5+1),2(1+1),2(1+1),2(1+1),2(1+1),6(1+5),7(5+2)]に示すような線幅配列となる。
次いで、Tシーケンス計測部15の線幅正規化手段15bは、線幅正規化処理を行う。この線幅正規化処理は、計測されたバーの線幅とスペースの線幅とを表す画素数によって表現されている線幅をモジュール数表現に変換する処理をいう。1モジュールは、バーまたはスペースの最小幅に対応する。具体的には、スタック型バーコード21の一種であるPDF417において、データカラムを含む1カラムは17モジュールによって構成されている。1カラム内の線幅をW1,W2,W3,W4,W5,W6,W7,W8とし、Wc=W1+W2+W3+W4+W5+W6+W7+W8とすれば、正規化線幅は、Xi=Wi*17/Wc(i=1,2,…,7,8)で表されるXシーケンスとなる。例えば、図12に示す左側のカラム(データカラム)のXシーケンスは、[5,1,1,1,1,1,5,2](これらの総和は17、すなわち、上記した17モジュールを示す)に示すような線幅配列である。
次に、Tシーケンス計測部15の判定手段15cは、線幅正規化されたTシーケンスより計算したクラスタ番号が理論値に一致するか否かを判定する。
(低レベル復号におけるコードワード変換)
最後に、低レベル復号部13d1のコードワード変換部16は、コードワード変換を行う(ステップS133)。より具体的には、コードワード変換テーブルが格納されているテーブルメモリ16aから読み出し、このテーブルメモリ16aを参照することにより、ステップS132において求められたTシーケンスに対応するコードワードを取得する。すなわち、低レベル復号処理が行なわれ、1つのカラムを構成する4個のバーの線幅と4個のスペースの線幅でなるコードワードが0〜928の番号が付けられた、929個のコードで示される中間情報に一度変換される。
ここで、この実施の形態1においては、Xシーケンス計測処理(ステップS131)において、閾値方式および2次微分方式から得られる複数のXシーケンスから最適なものを選択できるようにしている。
(閾値方式について)
図14は、あるロウにおいて、ロウに含まれる複数のラインLを平均化したライン波形を走査して得られた、各画素の輝度値を示す走査反射率波形の一部を取り出した図であり、スタック型バーコード21のあるロウとあるカラムに対応している。各画素の輝度値が第1の(固定)閾値AVより高い値か低い値かでバーかスペースかを判定し、具体的には、あるカラムの始点XSから終点XEまでの間に、バーとスペースの合計個数が8個になればXシーケンスは有効である。図14の例では、第1の(固定)閾値AVに基づいてXシーケンス(バーの線幅とスペースの線幅)を計測し、Xシーケンス[12,6,3,18,3,4,12,11]に示すような線幅配列が得られた。ここで、第1の(固定)閾値AVは、あるロウにおけるあるカラムにおいて、平均化したライン波形を走査して得られたバーおよびスペースの線幅からなる全画像データの平均値である。具体的には、図14に示すロウとカラムにおいて、計測された全画素の輝度値を加算し、その加算値を全画素数で除算した値、すなわち、1画素あたりの平均輝度値を(固定)閾値AVとしている。そのため、第1の(固定)閾値AVは、図14に示すように、一定の値となっている。このように、第1の(固定)閾値AVは、一度の処理で求めることができるので、処理時間を短縮することが可能となる。
(n次微分方式について)
図15は、n次微分方式を説明するための図である。図15(a)は、あるロウにおいて、ロウに含まれる複数のラインLを平均化したライン波形を走査して得られた、各画素の輝度値を示す走査反射波形の一部を取り出した図である。図15(b)は、(a)に示す走査反射波形を1次微分した輝度値の差分を示す波形図であり、図15(c)は、(b)の波形をさらに微分(2次微分)した輝度値の差分を示す波形図である。
2次微分方式とは、各画素の輝度値を示す走査反射率波形を2次微分して2次微分値を求め、この2次微分値のゼロクロス点(つまり、元の波形の変曲点)をバーとスペースとの境界とする方式である。この2次微分方式は、閾値方式のように、分解能の影響を受けやすい波形のピークを検出する方法に比べて、波形の変化点を求めることでバーとスペースとの境界を求めるようにしているので、処理が簡単になるという利点がある。なお、図15(a)に示す走査反射率波形の分解能が、図14に示す走査反射率波形の分解能に比べて低い場合となっている。
(Xシーケンス計測処理について)
図13は、Xシーケンス計測処理(ステップS131)の流れを示すフローチャートである。このXシーケンス計測処理においては、上述したように、あるロウにおいて、ロウに含まれる複数のラインLを平均化したライン波形を走査して、計測された各画素の輝度値が、所定の閾値Thより高い値であれば、スペースと判定するとともに、各画素の輝度値が、閾値Thより低い値であれば、バーと判定することにより、バーかスペースかの判定を行う。さらに、このような判定に基づいて、バーの線幅と、スペースの線幅とを計測し、線幅を作成する。スタック型バーコード21におけるデータカラムは4個のバーと4個のスペースと、バー及びスペースの合計個数は8個であるから、走査反射率波形と固定閾値AVとの隣接する交点間で形成される線幅の合計個数が8個になるまで処理を繰り返し、閾値Thを変動させていく。
この実施の形態1では、図13に示すように、まず、固定閾値算出手段14a1が、(固定)閾値方式によってXシーケンスを求める(ステップS151〜ステップS158)。
すなわち、I=1のときに、閾値Thとして第1の固定閾値AVを設定する(ステップS151)。なお、固定閾値AVの説明は後述する。
次いで、第1の(固定)閾値Th=AVのときのXシーケンスを計測し(ステップS152)、そのときのバー及びスペースの合計個数が8個か否かを判断する(ステップS153)。ステップS153において、合計個数が8個と判断した場合は、Xシーケンス計測は成功したものとして、このときのXシーケンスを有効化し(ステップS154)、これをXシーケンス1として保存する(ステップS158)。一方、ステップS153において、合計個数が8個でないと判断した場合は、規定回数I(Iは2以上の整数)の処理を繰り返したか否か、例えば、I=3に到達したか否かを判断する(ステップS155)。
ステップS155においてI=3でないと判断した場合は、規定回数Iに1をインクリメントし、この実施の形態1では、第1の(固定)閾値ThからAV/4を減じた第2の(固定)閾値Thを設定して(ステップS156)、ステップS152およびステップS153の処理を繰り返す。なお、図14において、符号L1は第n−1の(固定)閾値ThからAV/4を引いた第nの(固定)閾値Thを示している。また、AV/4は経験則から決めた値であり、これに限定されるものではない。
新たに求めた第2の(固定)閾値Thに基づいて、Xシーケンスを再度計測し(ステップS152)、合計個数が8個と判断されればXシーケンスは有効とし(ステップS154)、合計個数が8個と判断されなければ、規定回数I=3でないので(ステップS155)、Iに1をインクリメントし、第2の(固定)閾値Thから、さらにAV/4を減じた新たな第3の(固定)閾値Thを設定して(ステップS156)、第3の(固定)閾値Thに基づいてXシーケンスの再度計測を行う(ステップS152)。この実施の形態1では、規定回数I=3の処理を繰り返しても合計個数が8個と判断されなければ、Xシーケンスは無効とし(ステップS157)、これをXシーケンス1として保存する(ステップS158)。
こうして(固定)閾値方式によるXシーケンス計測処理が終わったところで、今度は、n次微分算出手段14a3が、2次微分方式によってXシーケンスを求める(ステップS159〜ステップS166)。
すなわち、I=1のときに、ゼロクロス点SLを設定する(ステップS159)。
次いで、このときのXシーケンスを計測し(ステップS160)、そのときの合計個数が8個か否かを判断する(ステップS161)。ステップS161において、合計個数が8個と判断した場合は、Xシーケンス計測は成功したものとして、このときのXシーケンスを有効化し(ステップS162)、これをXシーケンス2として保存する(ステップS166)。一方、ステップS161において、合計個数が8個でないと判断した場合は、規定回数I(Iは2以上の整数)の処理を繰り返したか否か、例えば、I=3に到達したか否かを判断する(ステップS163)。
ステップS163においてI=3でないと判断した場合は、規定回数Iに1をインクリメントするとともに、ゼロクロス点SLに1をインクリメントして(ステップS164)、ステップS160およびステップS161の処理を繰り返す。
新たに求めたゼロクロス点SLに基づいて、Xシーケンスを再度計測し(ステップS160)、合計個数が8個と判断されればXシーケンスは有効とし(ステップS162)、合計個数が8個と判断されなければ、規定回数I=3でないので(ステップS163)、Iに1をインクリメントするとともに、ゼロクロス点(を示すライン)SLに1をインクリメントして(ステップS164)第2のゼロクロス(を示すライン)SL2を算出し、この第2のゼロクロス点(を示すライン)SL2に基づいてXシーケンスの再度計測を行う(ステップS160)。この実施の形態1では、規定回数I=3の処理を繰り返しても合計個数が8個と判断されなければ、Xシーケンスは無効とし(ステップS165)、これをXシーケンス2として保存する(ステップS166)。なお、インクリメントする数は、1としているがこれに限定されるものではない。
図16は、この実施の形態1におけるTシーケンス計測処理(ステップS132)の流れを示すフローチャートである。このTシーケンス計測処理においては、Tシーケンス計測部15のシーケンス変換手段15aが、Xシーケンス1(固定閾値方式から得られたXシーケンス)およびXシーケンス2(2次微分方式から得られたXシーケンス)をそれぞれTシーケンスに変換し、Tシーケンス計測部15の線幅正規化手段15bが、これらのTシーケンスの線幅を正規化し、Tシーケンス計測部15の判定手段15cが、それぞれのTシーケンスより計算したクラスタ番号とクラスタの理論値とを比較する。そして、両者が等しければ、そのTシーケンスを有効とし、両者が等しくなければ、そのTシーケンスを無効とする。
ここで、クラスタ番号とは、図3に示すスタック型バーコード21において、誤り発生の確率を最小にするために用意されているもので、スタートパターンおよびストップパターン以外のすべてのコードワードに存在している。具体的には、PDF417の規格により、クラスタ番号は3行目ごとに順次繰り返し現れ、ロウ1にはクラスタ番号「0」、ロウ2にはクラスタ番号「3」、ロウ3にはクラスタ番号「6」が使われている。換言すれば、このクラスタ番号「0」、「3」、「6」は、クラスタ番号の理論値となっている。
次に、具体的な数値で説明する。
まず、2次微分方式によって得たXシーケンス2を取り出し(ステップS171)、Tシーケンスに変換する(ステップS172)。これは、X=[Xi,Xi+1,Xi+2,・・・]において、隣接する2個のXiとXi+1を加算したものであり、2次微分方式によって得たXシーケンス2、例えば、図15(c)に示す走査反射率波形より、X=[12,5,5,16,4,4,12,10]を計測し、このXをTシーケンスに変換すると、T=[17,10,21,20,8,16,22]に示すような線幅配列となる。
次いで、Tシーケンスより、クラスタ番号を計算する(ステップS173)。クラスタの計算は、まず、TシーケンスをTN(i)=T(i)*17/Wc(i=0,1,・・・,7)で正規化する。上の例では、TN=[4,3,5,5,2、4]に示すような線幅配列となる。次に、クラスタ番号K=(TN(0)−TN(1)+TN(4)−TN(5)+9)mod9(ただし、「mod9」は9で除した後の剰余を意味する。)で表される式により、クラスタ番号Kを計算する。上の例では、K=(4−3+2−4+9)mod9=8となる。
次いで、ステップS173において計算されたクラスタ番号は処理中のロウに対応するクラスタ番号の理論値に等しいか否かを判断する(ステップS174)。処理中のロウがスタック型バーコード21の第1行目であるとすると、クラスタの理論値は「0」である。したがって、クラスタ番号「8」は、クラスタ番号の理論値「0」と一致しないため、Tシーケンスを無効として処理をステップS176に進める。一方、クラスタ番号が理論値と一致していれば、Tシーケンスを有効とする(ステップS175)。
ステップS174においてクラスタ番号が理論値と一致しないときは、固定閾値方式によって得たXシーケンス1を取り出し(ステップS176)、Tシーケンスに変換する(ステップS177)。(固定)閾値方式によって得たXシーケンス1、例えば、図14に示す走査反射率波形より、X=[12,6,3,18,3,4,12,11]を計測し、そのXを、Tシーケンスに変換すると、T=[18,9,21,21,7,16,23]となる。
次いで、Tシーケンスより、クラスタ番号を計算する(ステップS178)。上の例では、TN=[4,2,5,5,2,4]と正規化され、K=(4−2+2−4+9)mod9=0となる。
次いで、ステップS173において計算されたクラスタは処理中のロウに対応するクラスタの理論値に等しいか否かを判断する(ステップS179)。上の例では、クラスタ番号「0」とクラスタ番号の理論値「0」が一致しているため、Tシーケンスを有効とする(ステップS175)。一方、クラスタ番号と理論値が一致していない場合は、Tシーケンスを無効とする(ステップS180)。
このように、この実施の形態1においては、固定閾値方式および2次微分方式の2種類の低レベル復号方式を備え、撮像光学系の分解能の高低に応じて、これらを使い分けることにより、たとえスタック型バーコード21の走査反射率波形が変動しても、最適なXシーケンス(Xシーケンス1またはXシーケンス2)を得ることができる。
最適なXシーケンスが得られると、低レベル復号処理が行なわれ、コードワード変換処理(ステップS133)が行われる。具体的には、有効とされたTシーケンスに対応するコードワードを所定の変換テーブルから取得する。すなわち、低レベル復号処理が行なわれ、1つのカラムを構成する4個のバーの線幅と4個のスペースの線幅でなるコードワードは0〜928の番号が付けられた、929個のコードで示される中間情報に一度変換される。
(高レベル復号)
コードワード変換が完了すると、一般的な高レベル復号が行われ(ステップS37)、復号処理が完了する。また、復号処理が完了したデータについては、スタック型バーコード情報などとともに上位制御装置に出力されることになる。具体的には、高レベル復号処理は、0〜928の番号が付けられた、929個のコードで示される中間情報に一度変換された後、所定ルールに基づいて最終言語にデコード(復号)されるようになっている。この最終言語としては、PDF417では、ASCII文字やバイナリ表現、その他のキャラクタ等がある。
(実施の形態の主な効果)
以上説明したように、この実施の形態においては、スタック型バーコード21の走査反射率波形が変動する場合であっても、このスタック型バーコード21を精度よく読み取ることが可能となる。具体的には、撮像光学系の分解能が一定の水準に達している場合には、スタック型バーコード21の走査反射率波形のピーク値を検出することで閾値を決定する(固定)閾値方式による低レベル復号を採択することができる。一方、撮像光学系の分解能が一定の水準に達していない場合には、スタック型バーコード21の走査反射率波形が変動してしまうため、または、正確なピーク値を検出することが難しくなるが、輝度値の差分をとることで、バーとスペースとのエッジ(境界)部分の出力変化を高精度に抽出可能な2次微分方式による低レベル復号を採択することができる。
その結果、スタック型バーコード21の走査反射率波形の変動の影響を受けにくく、スタック型バーコード21を精度よく読み取ることが可能となる。
また、媒体搬送速度が撮像中に増減する場合でも、両方式((固定)閾値方式および2次微分方式)の低レベル復号を併用することにより、速度変動に対処しやすくなる利点がある。
[発明のその他の実施の形態]
なお、上述した実施の形態1では、スタック型バーコード読取方法の低レベル復号に際して、図16に示すように、2次微分方式によるXシーケンス計測処理に基づく低レベル復号(ステップS171〜ステップS174)を実施した後、(固定)閾値方式によるXシーケンス計測処理に基づく低レベル復号(ステップS176〜ステップS179)を実施する場合について説明した。しかし、必要に応じて、これらの順序を入れ替えて、(固定)閾値方式によるXシーケンス計測処理に基づく低レベル復号を実施した後、2次微分方式によるXシーケンス計測処理に基づく低レベル復号を実施するようにしてもよい。
また、上述した実施の形態1では、スタック型バーコード読取方法のXシーケンス計測処理を実行する際に、閾値方式として、走査反射波形を構成する各画素の輝度値の平均を求める固定閾値方式を採用する場合について説明したが、固定閾値方式以外の閾値方式(例えば、局所閾値方式など)を代用または併用することもできる。局所閾値方式を採用する場合は、Xシーケンス計測部14の局所閾値算出手段14a2が局所閾値を算出する。この局所閾値方式は、図17に示すように、画像データにおいて互いに隣接するバーおよびスペースの最大ピーク値と最小ピーク値との平均値に基づく局所閾値をバーとスペースとの境界とする方式である。この局所閾値方式は、補正画像データの輝度むらや汚れなどで、ピーク値のばらつきが生じた場合でも、固定閾値方式に比べて、バーとスペースとの線幅を精度よく検出することができるという利点がある。
また、上述した実施の形態1では、スタック型バーコード読取方法のXシーケンス計測処理を実行する際に、n次微分方式として2次微分方式(つまり、n=2)を採用する場合について説明したが、2次微分方式に代えて1次微分方式(つまり、n=1)を代用または併用することもできる。
また、上述した実施の形態1では、スタック型バーコード読取方法のスタック型バーコード傾き補正(ステップS33)において、スタック型バーコード21の画像データを傾斜角度ゼロの補正画像データに変換する場合について説明した。しかし、スタック型バーコード21の画像データが傾いていないことが保証されている場合や、スタック型バーコード21の画像データが傾いていても別の角度補正手段によって対処できる場合には、このスタック型バーコード傾き補正を省くことも可能である。
また、上述した実施の形態1では、スタック型バーコード21、つまり二次元バーコードの一種について説明したが、一次元バーコードに本発明を同様に適用することもできる。
さらに、上述した実施の形態1では、一次元撮像素子やリニア搬送機構との組み合わせに対して本発明を適用することとしたが、本発明はこれに限られることなく、例えば、二次元CCDやCMOSイメージャなどのエリアセンサと被写体支持機構との組み合わせに対して本発明を適用することとしても構わない。