(57)【特許請求の範囲】
【請求項１】
バーとスペースとからなり任意の情報をパターンとして表すバーコードを２次元像として撮像する撮像手段と、
前記撮像手段により順次得られた２次元像を一時的に記憶する記憶手段と、
前記撮像手段から前記記憶手段に２次元像を転送する転送手段と、
前記記憶手段に記憶された２次元像を順次読出し、撮像範囲内でのバーコードシンボルの有無を認識する認識手段と、
前記認識手段により認識されたバーコードの前記撮像範囲内での存在位置及び傾きを検出し、バーコードのスキャン方向を検出する位置検出手段と、
前記位置検出手段により検出されたスキャン方向によりバーコードの２次元像から該バーコードの情報を順次読み取る読取手段と、
前記読取手段からのバーコードの情報から、前記任意の情報に復号する復号手段と、
を具備し、
前記転送手段は、前記撮像手段により撮像された２次元像を圧縮し、該撮像手段により撮像された２次元像のフィールド成分の１スキャンラインを転送した後、該記憶手段の１ラインを空けてまたスキャンラインを転送し、１フィールド分の画像情報を転送するまでそれを繰り返し、終了後に空いているラインにそのラインの１ライン上または下のラインの画像情報を複写する処理操作を含み、転送することを特徴とするシンボル情報読取装置。
【請求項２】
バーとスペースとからなり任意の情報をパターンとして表すバーコードを２次元像として撮像する撮像手段と、
前記撮像手段により順次得られた２次元像を一時的に記憶する記憶手段と、
前記撮像手段から前記記憶手段に２次元像を転送する転送手段と、
前記記憶手段に記憶された２次元像を順次読出し、撮像範囲内でのバーコードシンボルの有無を認識する認識手段と、
前記認識手段により認識されたバーコードの前記撮像範囲内での存在位置及び傾きを検出し、バーコードのスキャン方向を検出する位置検出手段と、
前記位置検出手段により検出されたスキャン方向によりバーコードの２次元像から該バーコードの情報を順次読み取る読取手段と、
前記読取手段からのバーコードの情報から、前記任意の情報に復号する復号手段と、
を具備し、
前記転送手段は、前記撮像手段により撮像された２次元像を圧縮し、撮像した２次元像の１つのフィールド成分のみを記憶手段に転送することを特徴とする請求項１記載のシンボル情報読取装置。
【請求項３】
前記転送手段は、撮像した２次元像の２つのフィールド成分を別々に前記記憶手段に転送することを特徴とする請求項２記載のシンボル情報読取装置。
【請求項４】
バーとスペースとからなり任意の情報をパターンとして表すバーコードを２次元像として撮像する撮像手段と、
前記撮像手段により順次得られた２次元像を一時的に記憶する記憶手段と、
前記撮像手段から前記記憶手段に２次元像を転送する転送手段と、
前記記憶手段に記憶された２次元像を順次読出し、撮像範囲内でのバーコードシンボルの有無を認識する認識手段と、
前記認識手段により認識されたバーコードの前記撮像範囲内での存在位置及び傾きを検出し、バーコードのスキャン方向を検出する位置検出手段と、
前記位置検出手段により検出されたスキャン方向によりバーコードの２次元像から該バーコードの情報を順次読み取る読取手段と、
前記読取手段からのバーコードの情報から、前記任意の情報に復号する復号手段と、
を具備し、
前記転送手段は、撮像手段により撮像した２次元像の任意数の画素情報を加算し、１つの画素にして転送することを特徴とするシンボル情報読取装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、バーコード等のシンボル情報を読み取るシンボル情報読取装置に関する。
【０００２】
【従来の技術】
従来、物品等に印刷された、若しくは、貼付けられたタグ等に印刷された、その物品に関する情報を示すバーコード記号と呼ばれる記号がある。このバーコード記号は、普及しつつある販売時点情報管理（ポイント・オブ・セールス：ＰＯＳ）システムに使用され、広く一般に知られるようになった。
【０００３】
このバーコード記号とは、幅の異なるバーとスペースが平行に組合せられ、１つのパターンからなるバーコードキャラクタを形成する。必要であれば、チェックデジットを含む必要なキャラクタ群を平行に配列し、例えば前後にスタート／ストップキャラクタのような特徴的な所定パターンを配して構成したシンボルもある。
【０００４】
一般消費財に使用されているバーコードは、ＪＡＮ（Ｊａｐａｎ  Ａｒｔｉｃｌｅ  Ｎｕｍｂｅｒ）として標準化されている。また、バーコードの他の応用としては、物流シンボルがある。この物流シンボルは、前記ＪＡＮコードの前に、１桁又は２桁の物流識別コードが追加されたものである。
【０００５】
前述した、いずれのバーコードシンボルも、１次元バーコードと呼ばれるものであり、これらのコード体系が持つことができる情報量は、数十バイト程度であり、実際に使用する場合に不十分なものであった。
【０００６】
このようなバーコードの情報量に対する要求に従い、構造が異なる２次元バーコードと呼ばれるシンボル体系が提案されている。
それらのシンボル体系によれば、いずれも１次元バーコードに比べ格段に多い情報をコード化できる特徴を持っている。これらの体系は、スタックドバーコードと称され、１次元のバーコードをバーの方向に積み重ねることによって、情報量を増加させる方式である。このスタックドバーコードの代表として、ＰＤＦ−４１７と呼ばれるコード体系がある。
【０００７】
従来、前記スタックドバーコードを読み取るシンボル情報読取り装置としては、例えば、特開平２−２６８３８２号公報に開示されているようなレーザー走査型の読取り装置が知られている。この読取り装置においては、レーザー光を２次元に投射し、スキャンすることで、所定のバーコードを読み取り、シンボル情報を復号している。
【０００８】
また、特開平２−２６８３８３号公報には、２次元撮像装置でバーコードを撮像し、バーコードの画像をメモリに取り込んで、このデータを元にバーコードシンボル情報を復号する装置が開示されている。
【０００９】
さらに、このようなバーコードをＦＡ（Ｆａｃｔｏｒｙ  Ａｕｔｏｍａｔｉｏｎ）に於けるデータキャリアとして使用したいという要求が高まっている。これは、流通物がベルトコンベアなどの上を移動している最中に、流通物の品名、行き先等を認識するためのものである。
【００１０】
従来では、一般にデータキャリアとしてＲＦタグ等が用いられていたが、タグとしては比較的高価であり、これがバーコードで代用できれば、低コストのデータキャリアが実現される。
【００１１】
また従来の移動する物品の情報読取装置としては、特開昭５６−１１８１７７号公報には、移動する物体の像を走査して得られるビデオ信号に基づいて所定の検査を行なう光学検査装置が記載され、物体が検査視野内を通過したことをビデオ信号から検出する回路が開示されている。
【００１２】
【発明が解決しようとする課題】
しかし、前述した特開昭５６−１１８１７７号公報の問題点として、ビデオ信号の幅データからその物体の存在を認識しているため、前記ＪＡＮ等の１次元バーコードの認識は可能なものの、前記ＰＤＦ４１７等の２次元スタックドバーコードにおいて、バーコードラベルが完全に検査視野内に入っていない場合であっても、不完全なバーコードラベルを認識し、読取り処理に行く恐れがある。このような場合には、バーコード情報を読取ることができず、読取りの信頼性及び読取り速度の低下を招く結果になる。
【００１３】
さらに、移動している物品に貼付けられた２次元スタックドバーコードの情報を読取るには、インタレース型撮像素子を用いてフレーム画像により撮像すると、最初に読み取った位置から次に読み取る位置まで移動してしまっているため、２つのフィールド画像を組み合わせた時にフィールド成分のずれが生じるという問題が生じる。
そこで本発明は、移動している２次元バーコードのバーコードシンボル情報を高速に確実に読取るシンボル情報読り取装置を提供することを目的とする。
【００１４】
【課題を解決するための手段】
本発明は上記目的を達成するために、バーとスペースとからなり任意の情報をパターンとして表すバーコードを２次元像として撮像する撮像手段と、前記撮像手段により順次得られた２次元像を一時的に記憶する記憶手段と、前記撮像手段から前記記憶手段に２次元像を転送する転送手段と、前記記憶手段に記憶された２次元像を順次読出し、撮像範囲内でのバーコードシンボルの有無を認識する認識手段と、前記認識手段により認識されたバーコードの前記撮像範囲内での存在位置及び傾きを検出し、バーコードのスキャン方向を検出する位置検出手段と、前記位置検出手段により検出されたスキャン方向によりバーコードの２次元像から該バーコードの情報を順次読み取る読取手段と、前記読取手段からのバーコードの情報から、前記任意の情報に復号する復号手段とで構成され、前記転送手段は、前記撮像手段により撮像された２次元像を圧縮し、該撮像手段により撮像された２次元像のフィールド成分の１スキャンラインを転送した後、該記憶手段の１ラインを空けてまたスキャンラインを転送し、１フィールド分の画像情報を転送するまでそれを繰り返し、終了後に空いているラインにそのラインの１ライン上または下のラインの画像情報を複写する処理操作を含み、転送するシンボル情報読取装置を提供する。
【００１５】
前記転送手段は、前記撮像手段により撮像された２次元像を圧縮し、撮像した２次元像の１つのフィールド成分のみを記憶手段に転送するシンボル情報読取装置を提供する。または、前記転送手段は、撮像した２次元像の２つのフィールド成分を別々に前記記憶手段に転送する。または、前記転送手段は、前記撮像手段により撮像された２次元像を圧縮し、該撮像手段により撮像された２次元像のフィールド成分の１スキャンラインを転送した後、該記憶手段の１ラインを空けてまたスキャンラインを転送し、１フィールド分の画像情報を転送するまでそれを繰り返し、終了後に空いているラインにそのラインの１ライン上または下のラインの画像情報を複写する処理操作を含み、転送する。
【００１６】
【作用】
以上のような構成のシンボル情報読り取装置は、移動している２次元バーコードを２次元像として撮像し、得られた２次元像に所定の圧縮等の処理を適宜施し一時的に記憶させ、撮像画像を記憶手段に転送して、バーコードシンボルの有無を自動認識した後、バーコードシンボルの位置を認識し、バーコードの情報を順次読み取り、バーコードの情報から元の情報に復号する。
【００１７】
【実施例】
以下、図面を参照して本発明の実施例を詳細に説明する。
図１には、第１実施例としてのシンボル情報読取り装置の概略的な構成を示し、説明する。このシンボル情報読取り装置は、移動する物品等に貼付されたバーコードシンボルのシンボル情報を読取るための構成例である。ここで、本実施例においては、シンボル情報は物品に関する情報を例とし、例えば、物品名、送付先等であるものとする。勿論、シンボル情報は、使用するものによって異なっている。
【００１８】
このシンボル情報読取り装置は、ベルトコンベアー等の搬送系３により移動する物品１等に貼付された、例えばＰＤＦ−４１７フォーマットのスタックドバーコードラベル（以下、バーコードラベルと称する）２と、該バーコードラベル２を光学的に結像する撮像光学系４と、結像されたバーコードラベル２を光電変換面で読み取る２次元撮像部５と、読み取ったラベル画像データ（映像信号）を一時的に記憶するフレームメモリ６と、ラベル画像データを元のシンボル情報に復号するデータ処理装置７とで構成される。また、外部には、シンボル情報を処理するためのマイクロコンピュータ等のホスト装置１６が設けられている。また、前記２次元撮像部５で読み取ったラベル画像データ（フレーム画像）に、画像圧縮等の画像処理を施し、フレームメモリ６に処理画像データを記憶させる画像転送部１７を設けても良い。
【００１９】
前記データ処理装置７は、前記フレームメモリ６に記憶されたラベル画像データが撮像光学系４の撮影範囲にバーコードラベル２が読取り可能に入っているかを検出するラベル検出部８と、バーコードラベル２（ラベル画像データ）をスキャンしてラベル情報として読取る読取り部９と、読取ったラベル情報がデコードできるものかを判定するデコード判定部１０と、デコードできると判定されたラベル情報を元のシンボル情報に復元する復号部１１と、メモリ（各種定数及び変数を格納するための種々のレジスタを含む）１２と、これらの各部位を制御する制御部１３とで構成される。
【００２０】
前記撮像光学系４と２次元撮像部５は、例えば、ＣＣＤカメラからなる。
また前記ラベル検出部８は、前記フレームメモリ６に記憶されたラベル画像データが撮像光学系４の撮影範囲に収まっているか、すなわち撮影範囲内で撮像されるバーコードラベル２に欠けがない位置を検出する位置検出部１４と、そのバーコードラベル２の傾き具合を検出する傾き検出部１５とで構成される。
【００２１】
このデータ処理部７は、例えば、ＣＰＵとメモリで構成されるパーソナルコンピュータでも代用することができる。
次に、前述したスタックドバーコードについて説明する。
【００２２】
図２には、スタックドバーコードの例として、ＰＤＦ−４１７のラベル構造を示している。このバーコードラベル２は、バーとスペースの組合せでなるバーコードキャラクタ群で構成された復号されるべき情報成分の領域であるラベル部２１と、その前後に配されたスタート／ストップキャラクタであるスタートコード２２及びストップコード２３とを有している。そして、１コードは、ストップコード２３を除いて４つのバーとスペースとからなっている。また、スタート及びストップコード２２，２３は、“ビッグバー”と呼ばれる大きなバー２２Ａ，２３Ａから始まっている。
【００２３】
このラベル部２１は、スタートコード２２及びストップコード２３の隣に存在するロウインディケータ２１Ａと呼ばれるコードと、それらの間に挟まれた実際のデータが記述されている複数のデータカラム２１Ｂでなるラベルマトリックス２１Ｃとにより構成される。ロウインディケータ２１Ａには、ラベルのロウ方向，カラム方向のサイズやセキュリティレベル等が記述されている。従って、このロウインディケータの情報を解読すれば、ラベルの情報サイズや修復可能なコード数等が決定できる。
【００２４】
なお、この図２は、４×２のラベルマトリックス有するバーコードラベルを示している。
図４に示すフローチャートを参照して、データ処理装置７におけるラベル検出、ラベル情報読出し及び復号についてを説明する。図３には、仮想的にフレームメモリ６の画素配列に前述したようなＰＤＦ−４１７のラベル画像を投影した模式図を示す。
【００２５】
まず、フレームメモリ、しきい値、各種グローバル変数等の種々のパラメータを初期設定する（ステップＳ１）。次に、後述する画像取り込みルーチンをコールしてラベル画像データ（映像信号）をフレームメモリ６に取り込む（ステップＳ２）。次に、後述するラベル検出ルーチンをコールし、この取り込まれたラベル画像データを用いてバーコードラベルが存在するかをチェックし、さらにはバーコードラベルが存在するならばラベル画像データを検出する（ステップＳ３）。
【００２６】
そして、前記ステップＳ３に於けるラベル検出処理の結果を判断し（ステップＳ４）、ラベルが存在しない場合には（ＮＯ）、再度、前記ステップＳ１に移行して、再度、画像取り込み処理を行う。
【００２７】
次に、ラベルが存在したならば（ＹＥＳ）、後述する閾値決定ルーチンをコールし、後述するステップＳ１１の埋め込チェック及びステップＳ１２の最適スキャンルーチン及び、ステップＳ１５のインテリジェントスキャンルーチンに於いて、処理対象となるラインデータからエッジ間の幅情報を抽出するための処理に利用される閾値（変数ＴＨＲＥＳＨＯＬＤ）を求める（ステップＳ５）。
【００２８】
次に、インディケータ情報決定ルーチンをコールし、ラベル２のロウインディケータ２１Ａを読み取り、ラベルサイズ等を決定する（ステップＳ６）。
そして、前記ステップＳ６の決定ルーチンに於いてラベルサイズ等が決定されたか否かを判断し（ステップＳ７）、決定されていない場合は（ＮＯ）、再度ステップＳ１に移行して、再度、画像取り込み処理を行う。一方、ラベルサイズ等が決定された場合には（ＹＥＳ）、後述する傾き再定義ルーチンをコールし、より正確なラベルの傾きを求める（ステップＳ８）。
【００２９】
次に、後述するスキャン方程式決定ルーチンをコールし、ラベル２を全面走査するための各種変数を定義する（ステップＳ９）。次に、後述する埋め込チェックルーチンをコールし、各コードワードの位置の推定を行い、更に各コードワードの位置が画面内か否かをチェックしている（ステップＳ１０）。
【００３０】
そして、前記ステップＳ１０にて、読取り不能と推定されたコードの数が、修復可能な数を上回ったか否かを判断し（ステップＳ１１）、上回った場合にはデコード不能とし（ＮＯ）、再度ステップＳ１に移行して、再度、画像取り込み処理を行う。一方、下回った場合には、デコード可能とし（ＹＥＳ）、後述するような最適スキャンルーチンをコールし、前記ステップＳ９で定義された各種変数を用いてラベルを最適な間隔で全面走査し、ラベル情報を読み取る（ステップＳ１２）。なおここで、最適スキャンとは、最も計算量が少なくてラベル情報を全て確定できるような最適な間隔でのスキャンのことをいうものとする。
【００３１】
そして、前記ステップＳ１２の最適スキャンで読み取った情報でデコード可能か否かを判断し（ステップＳ１３）、デコード可能の場合は（ＹＥＳ）、ステップＳ１６に移行してデコード処理を行う。しかし、デコード不能の場合は（ＮＯ）、後述するインテリジェントスキャンルーチンをコールし、前記ステップＳ１０で定義された各種変数とを用いて、前記ステップＳ１２で読取れなかったコード位置を走査し、ラベル情報を読取る（ステップＳ１４）。
【００３２】
次に、ステップＳ１４で読取った情報がデコード可能か否かを判断し（ステップＳ１５）、デコード可能の場合（ＹＥＳ）、及びステップＳ１２で読取った情報がデコード可能の場合に、デコード処理を行う（ステップＳ１６）。このデコード処理の終了の後、ステップＳ１に戻り、新たなバーコードラベルを読取りにいく。
【００３３】
しかし、ステップＳ１６の判断でデコード不能の場合は（ＮＯ）、再度、前記ステップＳ１に移行して、画像取り込みを行う。
前記ステップＳ１６のデーコード処理では、前記最適スキャンルーチンと前記インテリジェントスキャンルーチンにより、読取った情報を復号し、復号したシンボル情報をホスト装置１４に出力する。
【００３４】
次に図４のフローチャートにおける各種処理ルーチンを、以下に詳しく説明する。
まず、図５に示すフィールド画面のみを取り込む図及び、図６に示すフローチャートとを参照して、図４に示した前記ステップＳ２でコールされる画像取り込みルーチンについて説明する。
【００３５】
この画像取り込みルーチンは、２次元撮像部５に撮像されたラベル画像データ（映像信号）を転送し、フレームメモリ６に一時的に記憶させる処理を含んでいる。
【００３６】
移動する物品に貼付されるバーコードラベルの読取りに際して、インターレース方式の２次元撮像部５を使用した場合、通常、そのフレーム画面からはバーコード情報を読取ることは出来ない。すなわち、従来技術の課題において説明したように、インターレース方式の２次元撮像装置５では、１行ずつとばしながら画像を走査するフィールド画面を２つ（奇数成分と偶数成分）合成して１つのフレーム画面を構成するが、撮像対象となるバーコードラベルが常に移動しているため、１回目のフィールド画像の走査と、２回目のフィールド画像の走査との間に位置的なずれが生じており、２つのフィールド画像を合成すると、バーコードラベル像にズレが生じてしまうからである。
【００３７】
そこで本実施例では、インターレース方式の２次元撮像装置５を用いて、移動するバーコードラベルを読取るときには、フィールド画面のみの画像情報を転送して取り込むようにする。
【００３８】
画像取り込みルーチンでは、どちらか（偶数成分または奇数成分）のフィールド画面を転送し取り込む（ステップＳ２１）。この場合、フィールド画像を行を空けずにフレームメモリ６に取り込むので、そのときのフレームメモリ６の内容は、図５に示す様になっている。図５に於いて、フィールド画像は奇数成分と偶数成分のどちらでも構わない。この処理終了の後、メインフローチャート（図４）にリターンする。
【００３９】
しかしこの場合、図５に示すように１つのフィールド画像は、縦方向に圧縮された形になるので、バーコードラベルの１行当たりの高さが減ってしまい、読取り条件はフレーム画像よりも厳しくなる。そこで、この方法を用いることが出来るのは、対象画像に対しバーコードラベル像が占める割合が大きくて、バーコードラベルの１行の高さが十分な場合である。
【００４０】
また、対象画像に対し、バーコードラベル像が占める割合が小さくバーコードラベルの１行の高さが十分でない場合には、種々の方法が考えられる。
その１つとして、まず、２つのフィールド画面（偶数成分と奇数成分）を両方別々に転送し取り込む。この場合、奇数成分だけを行を空けずにフレームメモリ６に取り込み、次に偶数成分だけを行を空けずに取り込む。そのときのフレームメモリ６の内容は図７の様になっている。但し、図７において、奇数成分と偶数成分はどちらが上になっても構わない。
【００４１】
ここで奇数成分と偶数成分の両方を転送する理由は、元は同じ対象を撮像した２つのフィールド画像を別の画像と考え、図７の上の画像が読めなければ、下の画像を読みに行くことで読取の信頼性を上げることが出来るからである。
【００４２】
この場合、図４のフローチャートはステップＳ１５の１回目の判断が（ＮＯ）であれば、図７の下の画面に対し、再度ステップＳ１２の最適スキャンをトライすることになる。ここで、移動するバーコードラベルの速度が既知であれば、ステップＳ３で求めた図７の上の画面のバーコードラベルの位置情報Ａ、Ｂ、Ｃ、Ｄに、バーコードラベルの移動速度、走査速度を考慮することにより図７の下の画面のバーコードラベルの位置Ａ′、Ｂ′、Ｃ′、Ｄ′を算出することが出来るので、再度バーコードラベル検出ルーチンをコールする必要はない。
【００４３】
また、バーコードラベルの移動速度が走査速度に対し十分無視できる速度であれば、図７の上の画面のバーコードラベルの位置情報をそのまま使用することも出来る。
【００４４】
また、１つのフィールド画像を１行ずつ間隔を置いてフレームメモリ６に取り込み、空いている行にその１行上の行のフレームメモリの内容を複写して、読取の信頼性を上げる方法もある。この方法において、複写はハードウエアにより簡単に実現できるので、何等バーコードラベル読取の高速性を失うものではない。
【００４５】
また、バーコードラベルの１行の高さが十分な場合には図８に示すように、全ての画素情報に対し、任意数の画素を加算し１つの画素にして、フレームメモリ６に格納する方法がある。これもハードウエアで簡単に実現可能であり、しかもノイズを抑制する効果も持っている。図８は、縦２行横２列の計４画素を加算し１つの画素にする例を示している。
【００４６】
なお、ノンインターレース方式の２次元撮像装置５を使用した場合には、ステップＳ２１はフレーム画像取り込みとなる。
次に、図９に示すフローチャート及び図１０に示すバーコードラベル投影像の図を参照して、前記ステップＳ３でコールされるバーコードラベル検出ルーチンを説明する。このバーコードラベル検出ルーチンは、バーコードラベルの有無を検出することと、バーコードラベルの位置情報を検出すること即ちバーコードラベルに平行に画像データをフレームメモリ６から抽出するための抽出範囲（変数ＳＴＡＲＴＴＯＰ及びＳＴＯＰＢＯＴＴＯＭ）とバーコードラベルの傾き（変数ＳＬＯＰＥ）を求めることとの２種類のバーコードラベル検出処理を含む。ここで、変数ＳＴＡＲＴＴＯＰの値は、バーコードラベルのトップ座標を示し、また変数ＳＴＯＰＢＯＴＴＯＭの内容はバーコードラベルのボトム座標を示す。また変数ＳＬＯＰＥの内容はバーコードラベルの傾きを示す。
【００４７】
このバーコードラベル検出ルーチンにおいては、まず、後述するバーコードラベル画面内検出ルーチンをコールし、フレームメモリ６に記憶される画面（ラベル画像データ）内からバーコードラベルを検出する（ステップＳ３１）。検出されたバーコードラベルが完全に画面内にあるか否かの判断を行ない（ステップＳ３２）、画面内にない場合には（ＮＯ）、バーコードラベル無しの情報を持ってリターンする。しかし画面内にある場合には（ＹＥＳ）、後述するスキャン及び検出ルーチンをコールし、フレームメモリ６のラベル画像データに、スタートコードが存在するか否かを検出する（ステップＳ３３）。つまり、図１０に示す座標ｅ、ｇを検出する。このルーチンにより、スタートコードが検出されて確定されれば、図１１に示すフレームメモリ６上の座標変数ｅ、ｇが定義される。ここで、座標変数ｅはスタートコード２２を検出したいくつかの座標の中で最もＹ座標が小さいものの座標、ｇはスタートコード２２を検出したいくつかの座標の中で最もＹ座標が大きいものの座標をそれぞれ示している。
【００４８】
次に座標変数ｅ、ｇの両方が定義されているか否かを判断し（ステップＳ３４）、定義されていない場合は（ＮＯ）、バーコードラベル無しとして、メインフローチャートにリターンする。即ち、バーコードラベル無しの情報を持って、リターンする。以上のようにして、バーコードラベルの有無の検出が行われる。
【００４９】
次に、バーコードラベルの位置情報の検出、即ちバーコードラベルに平行に画像データをフレームメモリ６から抽出するための抽出範囲（変数ＳＴＡＲＴＴＯＰ及びＳＴＡＲＴＢＯＴＴＯＭ）とバーコードラベルの傾き（変数ＳＬＯＰＥ）の算出が行われる。
【００５０】
即ち、前記ステップＳ３４に於いて、座標変数ｅ、ｇの両方が定義されていると判断された場合は（ＹＥＳ）、バーコードラベルの位置情報の検出、即ちバーコードラベルに平行に画像データをフレームメモリ６から抽出するための抽出範囲（変数ＳＴＡＲＴＴＯＰ及びＳＴＡＲＴＢＯＴＴＯＭ）の算出（ステップＳ３５）とバーコードラベルの傾き（変数ＳＬＯＰＥ）の算出（ステップＳ３６）が行われる。そして、バーコードラベルありの情報を持ってリターンする。
【００５１】
次に、前述したバーコードラベル検出ルーチン中のステップＳ３１でコールされるバーコードラベル画面内検出ルーチンとステップＳ３２の画面内のバーコードラベルが完全に入っているか否かの判断について、図１２に示すフローチャートと図１３に示すバーコードラベル画面内検出を説明する。
【００５２】
このバーコードラベル画面内検出ルーチンは、前述したように、移動しているバーコードラベルが完全にフレームメモリ６の中に入っているか否かを確認するものである。仮に、バーコードラベルがフレームメモリ６の中に完全に入っていなくても、後述するインテリジェントスキャンを用いれば、画面外のコード数によっては、その位置を推定してバーコードシンボル情報を読取ることは可能であるが、その分読取速度が遅くなってしまうので、このようなルーチンを設け移動するバーコードラベルに対応させる。ここで、バーコードラベルは画像に対し上下方向に移動しているものとする。
【００５３】
まず、画像の上端行でスタートコード２２若しくはストップコード２３を検出する（ステップＳ４１）。この検出法の詳細は後述する。次に検出したか否かを判断する（ステップＳ４２）。ここで、どちらかが検出されたと判断した場合（ＹＥＳ）、図１３に示すようにバーコードラベルの上部が画像内に入っていないことを意味している。従って、そのような場合には、バーコードラベルが画面内にないという情報をもってリターンする。また、検出されなかった場合は（ＮＯ）、画像の下端行でスタートコード２２若しくはストップコード２３を検出する（ステップＳ４３）。
【００５４】
次に検出したか否かを判断する（ステップＳ４４）。前述したように、ここでもどちらかが検出されたと判断した場合は（ＹＥＳ）、バーコードラベルの下部が画像内に入っていないことを意味しており、バーコードラベルが画面内にないという情報をもってリターンする。
【００５５】
また、検出されなかった場合は（ＮＯ）、画像の中心行でスタートコード２２若しくはストップコード２３を検出する（ステップＳ４５）。次に検出したか否かを判断し（ステップＳ４６）、ここでは検出しなかった場合に（ＮＯ）、バーコードラベルが画面内にないという情報をもってリターンする。しかし検出した場合は（ＹＥＳ）、バーコードラベルが画面内にあるという情報を持ってリターンする。
【００５６】
次に、前述したバーコードラベル検出ルーチン中のステップＳ３３でコールされるスキャン及び検出ルーチンを、図１４に示すフローチャートと図１５に示すスキャン方法を説明する図を参照して説明する。
【００５７】
このスキャン及び検出ルーチンは、前述したように座標変数ｅ及びｇの両方を検出するものである。
即ち、まずループ回数のカウントに使用される変数ｉと検出したスタートコードの数を格納する変数ｓｔａｒｔ ｎｕｍを初期化する（ステップＳ５１）。次に、スキャンする行番号ｎとスキャン間隔ｎｎを決定する（ステップＳ５２）。ここでｒｏｗ ｎｕｍは対象になる画像の行数である。このサブルーチンでスキャンする行番号は図１５に示すように、検索幅を徐々に狭めていく方式をとっている。これは、反復的に方程式の解を求めるＮＥＷＴＯＮ法に類似している。
【００５８】
このような方法を用いることにより、バーコードラベル像がフレームメモリ内のどの位置に存在しても、スタートコード２２を高速に検出することが可能になる。次に、１つのループｉにつき、２のｉ乗回のスキャンを行なうため、ｊを初期化する（ステップＳ５３）。そしてｊが“０”か否かを判断する（ステップＳ５４）。ここでｊが０でない、即ちステップＳ５４の命題が真だった場合には（ＮＯ）、行番号ｎにステップＳ５２で求めたスキャン間隔ｎｎを２倍したものを加える（ステップＳ５５）。ｊが“０”である、即ちステップＳ５４の命題が偽だった場合には（ＹＥＡ）、ステップＳ５５をスキップして、ステップＳ５６に移行し、ｎ行目の画像データを取り込む（ステップＳ５６）。
【００５９】
次に、前記取り込んだ画像データに対しスタートコード２２の検出を行なう（ステップＳ５７）。次に、スタートコード２２を検出したか否かを判断し（ステップＳ５８）、存在しなければ（ＮＯ）、ステップＳ６２に移行する。またスタートコード２２が存在する場合には（ＹＥＳ）、その検出座標を座標配列ｓｔａｒｔ ｐｏｓに格納する（ステップＳ５９）。そして、前記変数ｓｔａｒｔ ｎｕｍに１を加える（ステップＳ６０）。
【００６０】
次に、前記変数ｓｔａｒｔ ｎｕｍが予め定められている規定個数を越えたか否かを判断する（ステップＳ６１）。ここで、越えていた場合は（ＹＥＳ）、ステップＳ６６に移行する。しかし、越えていなかった場合には（ＮＯ）、前記変数ｊをインクリメントし（ステップＳ６２）、ｊが２のｉ乗より小さいか否かの判断を行なう（ステップＳ６３）。ｊの方が小さい場合には（ＹＥＳ）、前記ステップＳ５４に戻る。しかしｊが２のｉ乗より小さくない場合には（ＮＯ）、前記変数ｉをインクリメントし（ステップＳ６４）、ｉが規定定数Ｌｏｏｐより小さいか否かの判断を行なう（ステップＳ６５）。ここで、ｉが小さかった場合には（ＹＥＳ）、前記ステップＳ５２まで戻る。しかしｉが規定定数Ｌｏｏｐより小さくない場合には（ＮＯ）、バーコードラベル非検出の情報を持って、リターンする。従って、このサブルーチンでは最大（２のＬｏｏｐ乗）−１回のスキャンが行なわれることになる。
【００６１】
また前記ステップＳ６１において、ｓｔａｒｔ ｎｕｍが規定個数を越えていた場合は、後述するＹ座標の最大値最小値を求めるルーチンをコールする（ステップＳ６６）。そして、バーコードラベル検出の情報を持って、リターンする。このようにスタートコードが規定個数以上検出できた場合に、ループ処理の途中であっても上位ルーチンに制御を戻すことにより、処理の高速化を図ることができる。
【００６２】
次に、図１４におけるスキャン及び検出ルーチン中のステップＳ５７でコールされるスタートコード検出ルーチンについて、図１６に示すフローチャートを参照して説明する。
【００６３】
まず、前記取り込んだ画像データを幅情報に変換する（ステップＳ７１）。次に、変換した幅情報を正規化し（ステップＳ７２）、マッチングを行なう（ステップＳ７３）。そして、前記幅情報がスタートコードにマッチしたか否かを判断し（ステップＳ７４）、スタートコードであると判断した場合には（ＹＥＳ）、スタートコード有りの情報を持って、リターンする。スタートコードでない場合は（ＮＯ）、スタートコード無しの情報を持って、リターンする。
【００６４】
次に、前記ステップＳ７１でコールされる幅情報に変換ルーチンを、図１７、図１８に示す一連のフローチャートを参照して説明する。本ルーチンは、バーコードラベルのバーとスペースとの幅を求めるものであり、微分信号によりバーとスペースとの境界を求め、このとき２次曲線に近似することによりデータのピークを求めているものである。そして、順次ピークを求めて、その位置の差を求めることにより、幅が求められている。
【００６５】
まず、上位のルーチンで取り込んだ取り込みバッファ配列ｓｃａｎ ｌｉｎｅをラインデータの配列とし、この取り込まれて変数ｎｕｍにストアされている値をデータ個数と定義する（ステップＳ８１）。次に、この変数ｎｕｍの値をデクリメントした結果を位置標識カウンタｉに格納し、また変数ｊを“０”に初期設定する（ステップＳ８２）。
【００６６】
そして、取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ番目（位置標識カウンタｉにより示される）の位置の値から取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ−１番目の位置の値を引き、その解を取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ番目の位置に再設定する（ステップＳ８３）。この後、位置標識カウンタｉをデクリメントし（ステップＳ８４）、その結果ｉが“０”よりも大きいか否かを判断する（ステップＳ８５）。ｉが０より大きくなければ（ＮＯ）、前記ステップＳ８３に戻り、即ち、このステップＳ８１からステップＳ８５で、ラインデータを一次微分する。また結果ｉが“０”よりも大きいければ（ＹＥＳ）、位置標識カウンタｉを２に初期化する（ステップＳ８６）。
【００６７】
そして、取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ番目の位置の値が、閾値変数ＴＨＲＥＳＨＯＬＤの値よりも大きく、且つ取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ−１番目の位置の値よりも大きく、且つ取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ＋１番目の位置の値以上か否かを判断し（ステップＳ８７）、そうであれば（ＹＥＳ）、符号指標ｆｌａｇをＵＰとする（ステップＳ８８）。しかし、そうでなければ（ＮＯ）、次のステップＳ８９に移行する。
【００６８】
ここで、取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ番目の位置の値が、符号を負とした閾値変数ＴＨＲＥＳＨＯＬＤの値（−ＴＨＲＥＳＨＯＬＤ）よりも小さく、且つ取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ−１番目の位置の値よりも小さく、且つ取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ＋１番目の位置の値以下か否かを判断し（ステップＳ８９）、そうであれば（ＹＥＳ）、符号指標ｆｌａｇをＤＯＷＮとする（ステップＳ９０）。そうでなければ（ＮＯ）、次のステップＳ９１に移行する。
【００６９】
ここで、位置標識カウンタｉをインクリメントする（ステップＳ９１）。ｉが変数ｎｕｍの値から１引いた数よりも小さいか判断する（ステップＳ９２）。小さければ（ＹＥＳ）、前記ステップＳ８７へ戻り、小さくなければ（ＮＯ）、ステップ７２のルーチンへ戻る。
【００７０】
即ち、このステップＳ８７からステップＳ９２で、閾値変数ＴＨＲＥＳＨＯＬＤの値を越える最初のピーク、つまり図１９の１番目のピークを検出する。そして、検出されたピークの符号が正の場合は、符号指標ｆｌａｇをＵＰとして、次のステップＳ９３に移行し、検出されたピークの符号が負の場合は、符号指標ｆｌａｇをＤＯＷＮとし、ステップＳ９４に移行する。また、ラインデータを走査してもピークが検出されない場合には、上位のルーチンに制御を戻す。
【００７１】
このようにして、符号指標ｆｌａｇが設定されたならば、次に、位置標識カウンタｉの値をｘ１とし、また取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ−１番目の位置の値をｙ１、取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ番目の位置の値をｙ２、取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ＋１番目の位置の値をｙ３とすることにより、検出されたピーク位置とその両隣データを２次曲線でフィッティングを行う（ステップＳ９３）。そして、−０．５（−ｙ１−２ｘ１ｙ１＋４ｘ１ｙ２＋ｙ３−２ｘ１ｙ３）／ｙ１−２ｙ２＋ｙ３なる計算を行って、前記２次曲線のピーク位置を求め、それを変数ｌａｓｔｐｏｓに格納する（ステップＳ９４）。
【００７２】
その後、位置標識カウンタｉの値が変数ｎｕｍの値から２引いた数よりも小さく、且つ前記変数ｊがＷＩＤＴＨ ＮＵＭより小さいか否か判断する（ステップＳ９５）、前記変数ｊが小さくなければ（ＮＯ）、上位のルーチンへ戻る。
【００７３】
ここで変数ｊがＷＩＤＴＨ ＮＵＭより小さいという命題について説明する。ＷＩＤＴＨ ＮＵＭは求めるべき幅数が格納されている定数であり、ｊは求めたピークの数が格納されている変数である。ここで、スタートコード２２の位置を検出するために、スタートコード２２が必ず、フレームメモリ６の向かって左側に位置するという条件と、フレームメモリ６の中にバーコードラベル以外の情報がないという条件があれば、前記配列ｓｃａｎ ｌｉｎｅに格納されている微分情報を全て幅情報に変換する必要はない。
【００７４】
即ち、８個の幅情報を検出する為に最低限必要なピークの数は９個であるから、定数ＷＩＤＴＨ ＮＵＭは、それ以上の数ならばよいということになる。通常、ＷＩＤＴＨ ＮＵＭは画像のＳＮ比により決定される。即ち、フレームメモリ６内にバーコードラベル以外の情報が全くなければ、ＷＩＤＴＨ ＮＵＭは“９”に設定できる。そうでなければ、ＷＩＤＴＨ ＮＵＭは“９以上”の数にしなければならない。
【００７５】
以上のような理由により、前記の命題がステップＳ９５の判断に入っている。この命題が判断に入ることにより、全ての幅情報を求めることなくルーチンを終了させられるので、処理の高速化が図れる。後述するが、微分情報から全ての幅情報を求めたいときは、もちろんこの命題を外せばよい。
【００７６】
また、前記ステップＳ９５の命題が成り立てば（ＹＥＳ）、位置標識カウンタｉをインクリメントする（ステップＳ９６）。そして、符号指標ｆｌａｇがＤＯＷＮであり、且つまた取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ番目の位置の値が、閾値変数ＴＨＲＥＳＨＯＬＤの値よりも大きく且つ取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ−１番目の位置の値よりも大きく且つ取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ＋１番目の位置の値以上であるか否かを判断する（ステップＳ９７）。全ての項が成り立てば（ＹＥＳ）、符号指標ｆｌａｇをＵＰとする（ステップＳ９８）。
【００７７】
しかし、前記ステップＳ９８で全ての項が成り立たなければ（ＮＯ）、次に、符号指標ｆｌａｇがＵＰであり、且つまた取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ番目の位置の値が、符号を負とした閾値変数ＴＨＲＥＳＨＯＬＤの値よりも小さく且つ取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ−１番目の位置の値よりも小さく且つ取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ＋１番目の位置の値以下であるか否かを判断する（ステップＳ９９）。全ての項が成り立たなければ（ＮＯ）、前記ステップＳ９５に戻り、全ての項が成り立てば（ＹＥＳ）、符号指標ｆｌａｇをＤＯＷＮとする（ステップＳ１００）。
【００７８】
こうして、符号指標ｆｌａｇが再設定されたならば、次に、位置標識カウンタｉの値をｘ１とし、また取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ−１番目の位置の値をｙ１、取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ番目の位置の値をｙ２、取り込みバッファ配列ｓｃａｎ ｌｉｎｅのｉ＋１番目の位置の値をｙ３とすることにより、検出されたピーク位置とその両隣データを２次曲線でフィッティングを行う（ステップＳ１０１）。
【００７９】
そして、−０．５（−ｙ１−２ｘ１ｙ１＋４ｘ１ｙ２＋ｙ３−２ｘ１ｙ３）／ｙ１−２ｙ２＋ｙ３なる計算を行って、前記２次曲線のピーク位置を求め、それを変数ｎｏｗｐｏｓに格納する（ステップＳ１０２）。
【００８０】
これにより、図２０に示すように、１回前のピーク位置ｌａｓｔｐｏｓと今回求めたピーク位置ｎｏｗｐｏｓが得られる。そして、こうして得られた両ピーク位置の差を取ることによりピーク間距離を求め、それを幅情報格納配列変数ｗｉｄｔｈの変数ｊで示される位置に格納する（ステップＳ１０３）。
【００８１】
その後、ピーク位置変数ｌａｓｔｐｏｓをピーク位置変数ｎｏｗｐｏｓの値に更新し（ステップＳ１０４）、また変数ｊをインクリメントしてから（ステップＳ１０５）、前記ステップＳ９５に移行する。
【００８２】
このように、ステップＳ９５からステップＳ１０５で、順次ピークを検出し、ピーク間距離を幅情報格納配列変数ｗｉｄｔｈに格納していく。ここで、前記ステップＳ８７からステップＳ９２に於ける最初のピーク検出と異なる点は、例えば現在の符号指標ｆｌａｇがＤＯＷＮの場合、次に見つけなくては行けないピークは正符号のピークとしている点である。
【００８３】
次に、前述したようなスタートコード検出ルーチン中のステップＳ８２でコールされる正規化ルーチンを、図２１に示すフローチャートを参照して説明する。まず、ループカウント変数ｉと変数ｓｕｍに“０”を代入し、初期化する（ステップＳ１１１）。次に、変数ｓｕｍに前記幅情報に変換ルーチンで求めた幅情報を格納した配列ｗｉｄｔｈ［ｉ］を加算し、再びｓｕｍに格納する（ステップＳ１１２）。
【００８４】
次に、前記変数ｉをインクリメントする（ステップＳ１１３）。次に、この変数ｉが“８”より小さいか否かを判断し（ステップＳ１１４）、この変数ｉが“８”より小さければ（ＹＥＳ）、前記ステップＳ１１２に戻る。変数ｉが“８”より大きければ（ＮＯ）、次のステップＳ１１５に移行する。なお、ここで変数ｉが“０”から“７”まで変化しているのは、ＰＤＦ４１７のコードワードがバー４本、スペース４本の計８個の幅情報から構成されており、８個の幅情報全てを用いてスタートコードの正規化を行なうためである。
【００８５】
次に、再度、前記変数ｉに“０”を代入して初期化する（ステップＳ１１５）。次に、“１７”を前記変数ｓｕｍで除算し、前記幅情報配列のｉ番目ｗｉｄｔｈ［ｉ］に格納されている値を乗じたものをその値に一番近い整数に丸める（ステップＳ１１６）。ここで図２１中のｒｏｕｎｄは、丸めを意味している。そして前記変数ｉをインクリメントし（ステップＳ１１７）、変数ｉが“８”より小さいか否かを判断する（ステップＳ１１８）。この変数ｉが“８”より小さければ（ＹＥＳ）、前記ステップＳ１１６まで戻り、変数ｉが“８”より大きければ（ＮＯ）、上位のルーチンにリターンする。
【００８６】
次に、前述したような図１６に示したスタートコード検出ルーチン中のステップＳ７３のスタートコードマッチングについて説明する。
これは、どのようなマッチング方法を用いてもよいが、バーコードラベルを印刷する際にバー部分が意図した太さよりも太くなってしまうことがよくある。バー部分が太過ぎると、デコード性能は著しく低下する。しかし、このような場合には、バーが太くなった分スペース部分が細くなるので、バーの太さとスペースの太さを加算した幅情報をマッチングの対象にする方式を採用した方がよい。
【００８７】
次に、前述した図１４の検出ルーチン中のステップＳ６６でコールされるＹ座標の最大値最小値検出ルーチンについて、図２２に示すフローチャートを参照して説明する。このＹ座標の最大値最小値検出ルーチンは、規定個数検出したスタートコードの座標の中で、そのＹ座標が最大のものと最小のものを求めるルーチンである。
【００８８】
まず、座標変数ＭＡＸとＭＩＮのＹ座標の値（ＭＡＸｙとＭＩＮｙ）に、前記ステップＳ５７（図１４）で検出したスタートコードの検出座標の配列の０番目に格納されているＳｔａｒｔ ｐｏｓ［０］のＹ座標の値（ｓｔａｒｔ ｐｏｓ［０］ｙ）を代入する（ステップＳ１２１）。次に、データの数だけループするのに必要な変数ｉに１を代入する（ステップＳ１２２）。
【００８９】
次に、前記配列のｉ番目に格納されているｓｔａｒｔ ｐｏｓ［ｉ］のＹ座標の値（ｓｔａｒｔ ｐｏｓ［ｉ］ｙ）がＭＡＸｙより大きいか否かを判断する（ステップＳ１２３）。ここでＭＡＸｙより大きい場合（ＹＥＳ）、即ちステップＳ１２３の命題が真の場合には、前記座標配列のｉ番目のｓｔａｒｔ ｐｏｓ［ｉ］を前記座標変数ＭＡＸに代入し（ステップＳ１２４）、ステップＳ１２７に移行する。しかし、ＭＡＸｙより小さい場合（ＮＯ）、即ちステップＳ１２３の命題が偽の場合には、ステップＳ１２５に移行する。
【００９０】
次に、前記配列のｉ番目に格納されているｓｔａｒｔ ｐｏｓ［ｉ］のＹ座標の値（ｓｔａｒｔ ｐｏｓ［ｉ］ｙ）がＭＩＮｙより小さいか否かを判断する（ステップＳ１２５）。ここでＭＩＮｙより小さい場合（ＹＥＳ）、即ちステップＳ１２５の命題が真の場合には、前記座標配列のｉ番目のｓｔａｒｔ ｐｏｓ［ｉ］を前記座標変数ＭＩＮに代入し（ステップＳ１２６）、ステップＳ１２７に移行する。しかしＭＩＮｙより大きい場合（ＮＯ）、即ちステップＳ１２５の命題が偽の場合には、ステップＳ１２７に移行する。
【００９１】
次に、前記変数ｉをインクリメントする（ステップＳ１２７）。次に、変数ｉが前記ステップＳ５７で求めたｓｔａｒｔ ｎｕｍよりも大きいか否かを判断し（ステップＳ１２８）、変数ｉの方が小さければ（ＮＯ）、即ちステップＳ１２８の命題が偽の場合には、ステップＳ１２３に移行する。しかし変数ｉの方が大きい場合には（ＹＥＳ）、即ちステップＳ１２８の命題が真の場合には、座標変数ＭＡＸを図１０に於ける座標ｇに、座標変数ＭＩＮを座標ｅに格納した後（ステップＳ１２９）、図１４の上位のルーチンにリターンする。
【００９２】
次に、前述したような図９のラベル検出ルーチン中のステップＳ３５でコールされるラベルの範囲を求めるルーチンについて、図２３に示すフローチャートを参照して説明する。
【００９３】
まず、線分ｅ−ｇに平行な直線の方程式を定義、例えば線分ｅ−ｇの方程式ｙ＝ａｘ＋ｂを求める（ステップＳ１３１）。次に、この直線がスタートビックバー２２Ａをクロスするように、切片ｂを定義する（ステップＳ１３２）。スタートコード２２の構造は、例えば、８個のバーでなるスタートビックバー２２Ａと、３対の白バーと黒バーと、３個の白バーの合計１７個のバーで構成されており、これを撮像した結果がＮ画素であったとする。また、方程式ｙ＝ａｘ＋ｂで表わされる直線は、切片ｂを変化させることにより並行移動することが知られている。従って、ビックバー２２Ａをクロスする直線を得るためには、前記線分ｅ−ｇを｛（１７−８／２）／１７｝×Ｎ画素分左に移動させるような切片ｂとすれば良いことになる。
【００９４】
このようにして、スタートビッグバー２２Ａをクロスする直線が得られたならば、次に、その直線と画面を定義する方程式との交点をそれぞれＡ，Ａ′（図１０参照）とする（ステップＳ１３３）。
【００９５】
そして、このラインＡ−Ａ′の中点から点Ａに向けてデータを順に見ていき（ステップＳ１３４）、エッジが存在するか否かをチェックする（ステップＳ１３５）。このチェックは、例えば、輝度変化を見る強度比較、微分法、２次微分法、等により行なうことができる。こうして、エッジが検出されたならば、その検出座標を座標変数ｉに格納する（ステップＳ１３６）。即ち、検出座標を点ｉとする。
【００９６】
次に、前記ラインＡ−Ａ′の中点から今度はＡ′に向けてデータを準に見ていき（ステップＳ１３７）、エッジが存在するか否かをチェックする（ステップＳ１３８）。こうして、エッジが検出されたならば、その検出座標を座標変数ｍに格納する（ステップＳ１３９）。即ち、検出座標を点ｍとする。
【００９７】
そして、座標変数ｅ、ｇで示される点ｅ、ｇを通る直線に座標変数ｉで示される点ｉから垂線を下ろし、その交点の座標を座標変数ａに格納する（ステップＳ１４０）。即ち、点ｉを通るラインＡ−Ａ′と直交する直線の方程式を求めて、それと点ｅ、ｇを通る直線の交点を求め、その交点を点ａとする。
【００９８】
同様に、座標変数ｅ、ｇで示される点ｅ、ｇを通る直線に座標変数ｍで示される点ｍから垂線を下ろし、その交点の座標を座標変数ｄに格納する（ステップＳ１４１）。即ち、点ｍを通るラインＡ−Ａ′と直交する直線の方程式を求めて、それと点ｅ，ｇを通る直線の交点を求め、その交点を点ｄとする。
【００９９】
このようにして求めた座標変数ａの値を座標変数ＳＴＡＲＴＴＯＰに、また座標変数ｄの値を座標変数ＳＴＡＲＴＢＯＴＴＯＭにそれぞれ格納した後（ステップＳ１４２）、上位のルーチンへ制御を戻す。
【０１００】
次に、前述したようなラベル検出ルーチン中のステップＳ３６でコールされるラベルの傾きを求めるルーチンを、図２４に示すフローチャート及び図１１に示すラベルの傾きを求めるための説明図を参照して説明する。
【０１０１】
まず、座標変数ＳＴＡＲＴＢＯＴＴＯＭのｘ座標の値を、座標変数ＳＴＡＲＴＢＯＴＴＯＭのｙ座標の値から座標変数ＳＴＡＲＴＴＯＰのｙ座標の値を差し引いた結果の値で割り、また座標変数ＳＴＡＲＴＴＯＰのｘ座標の値を、座標変数ＳＴＡＲＴＢＯＴＴＯＭのｙ座標の値から座標変数ＳＴＡＲＴＴＯＰのｙ座標の値を差し引いた結果の値で割り、これら２つの商の差を傾き変数Ｓｌｏｐｅに格納する（ステップＳ１５１）。
【０１０２】
次に、座標変数ＳＴＡＲＴＢＯＴＴＯＭのｙ座標と座標変数ＳＴＡＲＴＴＯＰのｘ座標とを乗じた結果を、座標変数ＳＴＡＲＴＢＯＴＴＯＭのｙ座標の値から座標変数ＳＴＡＲＴＴＯＰのｙ座標の値を差し引いた結果の値で割り、また座標変数ＳＴＡＲＴＢＯＴＴＯＭのｘ座標と座標変数ＳＴＡＲＴＴＯＰのｙ座標とを乗じた結果を、座標変数ＳＴＡＲＴＢＯＴＴＯＭのｙ座標の値から座標変数ＳＴＡＲＴＴＯＰのｙ座標の値を差し引いた結果の値で割り、これら２つの商の差を切片変数ｉｎｔｅｒｓｅｃｔに格納する（ステップＳ１５２）。なお、図中のアスタリスク＊の上付き文字は、乗算記号×を意味する。
【０１０３】
次に、図４の前記ステップＳ５でコールされる閾値決定ルーチンについて、図２５に示すフローチャートと図２６に示す閾値算出のための説明図を参照して説明する。
【０１０４】
まず、図１０に示す点ｅに相当する値を点ｐに代入する（ステップＳ１６１）。次に、座標変数ｐのｙ座標の値で示されるライン、つまり図２６（ａ）に示すようなデータ取り込みラインのデータをフレームメモリ６から取り込み（ステップＳ１６２）、スタートコード２２の終わりｘ座標を点ｑのｘ座標とする（ステップＳ１６３）。
【０１０５】
そして、点ｐから点ｑまでのデータを微分する（ステップＳ１６４）。これにより、例えば、図２６（ａ）に示すデータ取り込みラインの場合には、図２６（ｂ）に示すようなスタートコード２２の微分波形が求まる。そして、この微分データの３番目のピークの絶対値を変数ＭＡＸとする（ステップＳ１６５）。
【０１０６】
ここで、微分データの３番目を見る理由は、概念的に、バーコード領域内で最もコントラストが低くなる（即ち、エッジの微分ピークが最も低い）ところで閾値を決定したいということから、ラベルのバーとスペースの間隔が最も狭いところであるスタート若しくは、ストップコードの第３エッジを選択するようにしているということによる。これにより、ラベルサイズやラベルの照明条件によらず安定的なデコードが可能となる。
【０１０７】
そして、こうして求めた変数ＭＡＸの値をピークに対する比率の定数ＴＨＲＥＳＨＯＬＤ ＲＡＴＩＯで割り、その結果を閾値変数ＴＨＲＥＳＨＯＬＤに代入する（ステップＳ１６６）。即ち、求められたデータから閾値を仮に求める。なお、変数ＴＨＲＥＳＨＯＬＤ ＲＡＴＩＯとは、ピークの何分の一を閾値に選ぶかを示す値であり、通常は、“２”あるいは“３”に設定される。
【０１０８】
次に、仮に求めた閾値ＴＨＲＥＳＨＯＬＤの値が、最小閾値定数ＴＨＲＥＳＨＯＬＤ ＳＭＡＬＬよりも大きく（ステップＳ１６７）、且つ、最大閾値定数ＴＨＲＥＳＨＯＬＤ ＢＩＧよりも小さいか否かを判断する（ステップＳ１６８）。つまり、仮に求めた閾値が、閾値の取り得る範囲内に存在するか否かを判断する。定数ＴＨＥＲＥＳＨＯＬＤ ＳＭＡＬＬで示される最大値を越える場合には（ＹＥＳ）、定数ＴＨＲＥＳＨＯＬＤ ＳＭＡＬＬで示される最大値を閾値変数ＴＨＥＲＥＳＨＯＬＤに代入、つまり閾値を最小値に設定する（ステップＳ１６９）。
【０１０９】
また、変数ＴＨＲＥＳＨＯＬＤ ＢＩＧで示される最小値未満の場合は（ＹＥＳ）、ＴＨＥＲＥＳＨＯＬＤ ＢＩＧで示される最小値を閾値変数ＴＨＲＥＳＨＯＬＤに代入、つまり閾値を最大値に設定する（ステップＳ１７０）。
【０１１０】
次に、図４の前記ステップＳ６でコールされるインディケータ情報決定ルーチンについて、図２７に示すローチャート及び図２８に示すフレームメモリへの投影像の図を参照して説明する。
【０１１１】
まず、ロウインディケータ情報を読取るための基準座標の始点として、ラベルのトップ座標ＴＯＰの値を座標変数ＷＯＲＫに格納する（ステップＳ１７１）。次に、この座標変数ＷＯＲＫを通り、ラベルの傾き変数Ｓｌｏｐｅで示される傾きを持つ直線Ｉを定義し（ステップＳ１７２）、この直線Ｉが画面枠とクロスする点Ｗ１，Ｗ２を定義する（ステップＳ１７３）。
【０１１２】
そして、線分Ｗ１−Ｗ２上の画像データを取り込み（ステップＳ１７４）、その中に含まれるロウインディケータ情報を読取る（ステップＳ１７５）。
ここで、ロウインディケータ情報の読取りは、例えば次のようにして行う。即ち、前記ステップＳ１７４で取り込まれた対象ライン上の画像データつまり白黒の画素値からエッジを検出し、幅情報に変換する。そして、この幅情報からスタートコード２２を検出し、そのスタートコード２２の次のコードがロウインディケータ２１Ａであることがわかっているので、それを読み込む。
【０１１３】
同様に、ストップコード２３を検出し、そのストップコード２３の直前のコードがロウインディケータ２１Ａであることもわかっているため、それを読み込む。こうして、ロウインディケータ２１Ａが読取れたならば、それを不図示のバーコード表と比較し、一致する部分をコードに、つまり行数，列数，セキュリティレベル等の情報に変換する。なお、幅情報への変換は、種々の手法があるが、例えば後述するような幅情報への変換ルーチンをコールすることにより行うことができる。
【０１１４】
次に、ロウインディケータ情報が確立したか否かをチェックし（ステップＳ１７６）、確定したならば（ＹＥＳ）、ステップＳ１８０に移行する。確定しないならば（ＮＯ）、ステップＳ１７７に移行する。ここで、確定とは、何回かロウインディケータ２１Ａを読み込み、情報の信頼度が十分上がった場合のことを意味する。例えば、ロウインディケータ２１Ａに書かれている情報（行数，列数，セキュリティレベル）が１０回読んだならば、その１０回とも同じ情報が得られた場合、確定されたとする。
【０１１５】
前記ステップＳ１７６の判断で、ロウインディケータ情報が確定しない場合は（ＮＯ）、座標変数ＷＯＲＫのｙ座標の値に所定の増分Ｌ ＩＮＣを加えて、その結果を新たな座標変数ＷＯＲＫのｙ座標値として代入する（ステップＳ１７７）。また、ラベルの傾き変数Ｓｌｏｐｅの値に座標変数ＷＯＲＫのｙ座標の値を乗じ、その結果にラベルの切片変数ｉｎｔｅｒｓｅｃｔを加えて、その結果を新たな座標変数ＷＯＲＫのｘ座標値として代入する（ステップＳ１７８）。こうして新たにスキャンするための基準座標を座標変数ＷＯＲＫに再設定する。
【０１１６】
そして、この再設定された座標変数ＷＯＲＫのｙ座標値がラベルのボトム座標変数ＢＯＴＴＯＭのｙ座標値を越えているか否か、つまりラベル領域内か否かを判断し（ステップＳ１７９）、ラベル領域内であれば前記ステップＳ１７２から繰り返し、ラベル領域外の場合はマトリックスの未定義の情報を持って上位のルーチンへリターンする。
【０１１７】
一方、前記ステップＳ１７６で、ロウインディケータ２１Ａが確定したと判断した場合には（ＹＥＳ）、ロウインディケータ情報から得られたセキュリティレベルから修復可能なデータ数を算出し、ＲＥＳＴ ＮＵＭに格納される（ステップＳ１８０）。さらに、ロウインディケータ情報から得られたラベルの行数が、ラベルのロウ数変数ＲＯＷ ＮＵＭＢＥＲに格納される（ステップＳ１８１）。また、ロウインディケータ情報からラベルの列数が抽出され、ラベルのカラム数変数ＣＯＬＵＭＮ ＮＵＭＢＥＲに格納される（ステップＳ１８２）。その後、マトリックスが定義されたという情報を持って上位のルーチンへ制御を戻す。
【０１１８】
次に、図４の前記ステップＳ８でコールされる傾き再定義ルーチンについて、図２９に示すフローチャート及び図３０に示す傾きを再定義するための説明図を参照して説明する。ここで、傾きを再定義する理由を以下に述べる。
【０１１９】
図１０中のｅ、ｇから求めた傾き、即ちスタートコード２２の情報のみから求めた傾きは印字品質、ＣＣＤの精度等の問題により、正確な値ではない。そこで、前記ステップＳ８によりインディケータ情報が決定した後で、ストップコード２３に近い位置からストップコード２３に検出し、スタートコード２２とストップコード２３の両方の情報から傾きを求めれば、より正確な傾きの値が求まる。前記ステップＳＣの最適スキャンの前に、より正確な傾きの値を求めることはスキャンの高速化につながる。
【０１２０】
まず、検出開始点ｐを決定する（ステップＳ１９１）。ｐは、前記インディケータ情報決定ルーチンで求まった、右行インディケータの列の左端の上端の点ｕと下端の点ｖを結ぶ直線Ｉを４等分し、ｕからＩに沿って４等分した距離を進んだ点である。次に、ｐ、ｐ′間のデータを取り込む（ステップＳ１９２）。ｐ′は前記点ｐからｘ軸に平行に進みｙ＝列数の直線と交わった点である。
【０１２１】
次に後述するストップコード検出ルーチンをコールする（ステップＳ１９３）。そして、ストップコードを検出したか否かを判断し（ステップＳ１９４）、検出しなかった場合には（ＮＯ）、傾きの再定義無しの情報を持って、リターンする。検出した場合は（ＹＥＳ）、検出点の座標を図１０に示すｆに格納し、ｆを定義する（ステップＳ１９５）。
【０１２２】
次に、検出開始点ｑを決定する（ステップＳ１９６）。この点ｑは前記インディケータ情報決定ルーチンで求められた右行インディケータの列の左端の上端の点ｕと下端の点ｖを結ぶ直線Ｉを４等分し、ｖからＩに沿って４等分した距離を進んだ点である。次に、点ｑ，ｑ′間のデータを取り込む（ステップＳ１９７）。点ｑ′は、前記点ｑからｘ軸に平行に進みｙ＝列数の直線と交わった点である。  次に前記ステップＳ１９３に於けるストップコード検出ルーチンをコールし、ストップコードの検出を行う（ステップＳ１９８）する。そして、ストップコードを検出したか否かを判断し（ステップＳ１９９）、検出しなかった場合には（ＮＯ）、傾きの再定義無しの情報を持って、リターンする。検出した場合は（ＹＥＳ）、検出点の座標を図１０に示すｈに格納し、ｈを定義する（ステップＳ２００）。
【０１２３】
次に、詳細は後述するラベルの範囲検出のルーチンをコールし（ステップＳ２０１）、傾きの計算を行なう（ステップＳ２０２）。そして、傾き再定義の情報を持って、リターンする。
【０１２４】
前記ステップＳ１９３，Ｓ１９８でコールされるストップコード検出ルーチンを、図３１に示すフローチャートを参照して説明する。
このルーチンは基本的に図１６に示したスタートコード検出と同じであるが、図１６とは、マッチングの部分が異なっている。これは、ＰＤＦ４１７のスタートコード２２とステップコード２３それぞれの持つ幅情報が異なるためである。マッチング法に関しては、前述したようにバーコードラベルの印刷精度に影響されないマッチング方法が望ましい。
【０１２５】
次に、図２９の前記ステップＳ２０１でコールされるラベルの範囲検出ルーチンについて、図３２に示すフローチャートを参照して説明する。
まず、線分ｆ−ｈに平行な直線の方程式を定義、例えば、線分ｆ−ｈの方程式ｙ＝ａｘ＋ｂを求める（ステップＳ２２１）。
【０１２６】
次に、この直線がストップビックバー２３Ａをクロスするように、切片ｂを定義する（ステップＳ２２２）。ストップコード２３の構造は、例えば、８個のバーでなるストップビックバー２３Ａと、３対の白バーと黒バーと、３個の白バーの合計１７個のバーで構成されており、これを撮像した結果がＮ画素であったとする。また、方程式ｙ＝ａｘ＋ｂで表わされる直線は、切片ｂを変化させることにより並行移動することが知られている。
【０１２７】
従って、ビックバー２３Ａをクロスする直線を得るためには、前記線分ｆ−ｈを｛（１７−８／２）／１７｝×Ｎ画素分左に移動させるような切片ｂとすれば良いことになる。
【０１２８】
こうしてストップビックバー２３Ａをクロスする直線が得られたならば、次に、その直線と画面を定義する方程式との交点をそれぞれＢ，Ｂ′（図１０参照）とする（ステップＳ２２３）。
【０１２９】
そして、このラインＢ−Ｂ′の中点から点Ｂに向けてデータを順に見ていき（ステップＳ２２４）、エッジが存在するか否かをチェックする（ステップＳ２２５）。このチェックは、例えば、輝度変化を見る強度比較、微分法、２次微分法、等により行なうことができる。こうして、エッジが検出されたならば、その検出座標を座標変数ｊに格納する（ステップＳ２２６）。即ち、検出座標を点ｊとする。
【０１３０】
次に、前記ラインＢ−Ｂ′の中点から今度は点Ｂ′に向けてデータを順に見ていき（ステップＳ２２７）、エッジが存在するか否かをチェックする（ステップＳ２２８）。こうして、エッジが検出されたならば、その検出座標を座標変数ｋに格納する（ステップＳ２２９）。即ち、検出座標を点ｋとする。
【０１３１】
そして、座標変数ｆ、ｈで示される点ｆ、ｈを通る直線に座標変数ｊで示される点ｊから垂線を下ろし、その交点の座標を座標変数ｂに格納する（ステップＳ２３０）。即ち、点ｊを通るラインＢ−Ｂ′と直交する直線の方程式を求めて、それと点ｆ，ｈを通る直線の交点を求め、その交点を点ｂとする。
【０１３２】
同様に、座標変数ｆ，ｈで示される点ｆ，ｈを通る直線に座標変数ｋで示される点ｋから垂線を下ろし、その交点の座標を座標変数ｃに格納する（ステップＳ２３１）。即ち、点ｋを通るラインＢ−Ｂ′と直交する直線の方程式を求めて、それと点ｆ，ｈを通る直線の交点を求め、その交点を点ｃとする。
【０１３３】
そして、こうして求めた座標変数ｂの値を座標変数ＳＴＯＰＴＯＰに、また座標変数ｃの値を座標変数ＳＴＯＰＢＯＴＴＯＭにそれぞれ格納した後（ステップＳ２３２）、図２９の上位のルーチンへ戻る。
【０１３４】
次に、図２９の前記ステップＳ２０２でコールされるラベルの傾き再計算ルーチンについて、図３３に示すフローチャートを参照して説明する。
まず、座標変数ＳＴＯＰＴＯＰのｙ座標の値を、座標変数ＳＴＯＰＴＯＰのｘ座標の値から座標変数ＳＴＡＲＴＴＯＰのｘ座標の値を差し引いた結果の値で割り、また座標変数ＳＴＡＲＴＴＯＰのｙ座標の値を、座標変数ＳＴＯＰＴＯＰのｘ座標の値から座標変数ＳＴＡＲＴＴＯＰのｘ座標の値を差し引いた結果の値で割り、これら２つの商の差を傾き変数Ｓｌｏｐｅ１に格納する（ステップＳ２４１）。
【０１３５】
次に、座標変数ＳＴＯＰＢＯＴＴＯＭのｙ座標の値を、座標変数ＳＴＯＰＢＯＴＴＯＭのｘ座標の値から座標変数ＳＴＡＲＴＢＯＴＴＯＭのｘ座標の値を差し引いた結果の値で割り、また座標変数ＳＴＡＲＴＢＯＴＴＯＭのｙ座標の値を、座標変数ＳＴＯＰＢＯＴＴＯＭのｘ座標の値から座標変数ＳＴＡＲＴＢＯＴＴＯＭのｘ座標の値を差し引いた結果の値で割り、これら２つの商の差を傾き変数Ｓｌｏｐｅ２に格納する（ステップＳ２４２）。
【０１３６】
次に、傾き変数Ｓｌｏｐｅ１と前記ステップＳ３６で求めた傾き変数Ｓｌｏｐｅの差の絶対値が閾値定数ＳＬＯＰＥＴＨＲＥＳＨ１より小さく、且つ傾き変数Ｓｌｏｐｅ２とＳｌｏｐｅの差の絶対値が閾値定数ＳＬＯＰＥＴＨＲＥＳＨ１より小さいか否かを判断する（ステップＳ２４３）。ここで、図中のａｂｓは絶対値を意味する。前記ステップＳ２４３の命題が偽だった場合には（ＮＯ）、再計算なしの情報をもってリターンする。そうでない場合は（ＹＥＳ）、前記変数Ｓｌｏｐｅ１とＳｌｏｐｅ２の差の絶対値をとり、それが閾値定数ＳＬＯＰＥＴＨＲＥＳＨ２よりも大きいか否かを判断する（ステップＳ２４４）。
【０１３７】
このステップＳ２４４で絶対値の方が小さい場合には（ＮＯ）、ステップＳ２５０に移行し、大きい場合には、次のステップＳ２４５に移行する。
次に、前記ステップＳ３６で求めた傾き変数Ｓｌｏｐｅと前記変数Ｓｌｏｐｅ１の差の絶対値を変数ａに格納する（ステップＳ２４５）。次に、前記ステップＳ３６で求めた傾き変数Ｓｌｏｐｅと前記変数Ｓｌｏｐｅ２の差の絶対値を変数ｂに格納する（ステップＳ２４６）。
【０１３８】
そして前記変数ｂが前記変数ａより大きいか否かを判断する（ステップＳ２４７）。前記変数ｂが大きい場合には（ＹＥＳ）、前記傾き変数ＳｌｏｐｅにＳｌｏｐｅ１を代入する（ステップＳ２４８）。前記変数ｂが小さい場合は（ＮＯ）、前記傾き変数ＳｌｏｐｅにＳｌｏｐｅ２を代入する（ステップＳ２４９）。また、前記ステップＳ２４４で傾き変数ＳｌｏｐｅとＳｌｏｐｅ２の差の絶対値が閾値定数よりも小さかった場合には（ＮＯ）、傾き変数Ｓｌｏｐｅに傾き変数Ｓｌｏｐｅ１とＳｌｏｐｅ２の和を２で割ったもの、即ちＳｌｏｐｅ１とＳｌｏｐｅ２の平均を代入する（ステップＳ２５０）。そして、再計算ありの情報を持ってリターンする。
【０１３９】
以上Ｓ２４４〜Ｓ２４９の一連のステップでは、図３４に示すように、ＰＤＦ４１７バーコードラベルのスタートコード２２もしくはストップコード２３のどちらか一方に欠損が存在し、ラベルの範囲が正しく求まっていない場合を考慮している。図３４の場合、直線ｎの傾きＳｌｏｐｅ１とｎ′の傾きＳｌｏｐｅ２の値は大きく違う。それを、このルーチンで検出し、図１０中の点ｅ、ｇから計算したラベルの傾きＳｌｏｐｅに近い値を新しい傾きとして採用している。このような方法を用いることにより、スタートコード２２もしくはストップコード２３のどちらか一方に欠損が存在した場合でも、より正確なラベルの傾きを求めることができる。
【０１４０】
なお、前記ステップＳ２４３の判断が偽の場合というのは、スタートコード２２もしくはストップコード２３のどちらか一方の上下に欠損がある場合であり、この場合には傾きの再計算は行なわない。
【０１４１】
次に、図４の前記ステップＳ９でコールされるスキャン方程式決定ルーチンについて、図３６に示すフローチャート及び図３５に示すフレームメモリへの投影像の図を参照して説明する。なお、図３５は行スキャンでスタートコード２２が基準に選択された場合の例を示している。
【０１４２】
即ち、まず変数ｃｏｕｎｔｅｒを“０”に初期化し（ステップＳ２５１）、また基準座標変数ＷＯＲＫをラベルのトップ座標変数ＴＯＰの値に初期化する（ステップＳ２５２）。
【０１４３】
次に、ラベルのボトム座標変数ＢＯＴＴＯＭのｙ座標値とラベルのトップ座標変数ＴＯＰのｙ座標値との差を、変数ｃｏｕｎｔ ｅｎｄに代入する（ステップＳ２５３）。即ち、決定しなければならないパターン数（図３６の場合ではラベルの列方向の画素数）を求め、変数ｃｏｕｎｔ ｅｎｄに格納する。つまり、パターン数とは、ラベル全面を走査するための数である。
【０１４４】
次に、ラベルのトップ座標変数ＴＯＰのｙ座標値に変数ｃｏｕｎｔｅｒの値を加算し、その結果を基準座標変数ＷＯＲＫのｙ座標値として代入する（ステップＳ２５４）。また、ラベルの傾き変数Ｓｌｏｐｅの値に基準座標変数ＷＯＲＫのｙ座標の値を乗じ、その結果にラベルの切片変数ｉｎｔｅｒｓｅｃｔを加えて、その結果を新たな基準座標変数ＷＯＲＫのｘ座標値として代入する（ステップＳ２５５）。このように、変数ｃｏｕｎｔｅｒ値の増加にともない基準座標変数ＷＯＲＫを再設定している。
【０１４５】
次に、この再設定された座標変数ＷＯＲＫを通り、ラベルの傾き変数Ｓｌｏｐｅで示される傾きを持つ直線Ｉを定義し（ステップＳ２５６）、この直線Ｉが画面枠交差する２点を求め、それぞれを座標変数の配列ＤＩＭ ＰＯＩＮＴ Ｐ及びＤＩＭ ＰＯＩＮＴ Ｑのｃｏｕｎｔｅｒ番目（変数ｃｏｕｎｔｅｒの値が示す配列の番号）に格納する（ステップＳ２５７）。
【０１４６】
その後、変数ｃｏｕｎｔｅｒ値をインクリメントし（ステップＳ２５８）、その結果の再設定された変数ｃｏｕｎｔｅｒ値が必要数、即ち変数ｃｏｕｎｔｅｒ ｅｎｄに達したか否かをチェックする（ステップＳ２５９）。必要数に達しない場合は（ＹＥＳ）、前記ステップＳ２５４に戻り、必要数に達した場合は（ＮＯ）、ステップＳ２６０に移行する。以上の動作によって、ラベルを順次走査する場合の始点と終点の組み合わせが定義される。
【０１４７】
次に、再度変数ｃｏｕｎｔｅｒを“０”に初期化する（ステップＳ２６０）、そして、ラベルの傾き変数Ｓｌｏｐｅの値に変数ｃｏｕｎｔｅｒ値を乗じることにより、計算されているラベルの傾きＳｌｏｐｅの位置による増加分が計算され、この計算結果を変数の配列ＬＩＮＥ ＩＮＣの所定の位置（変数ｃｏｕｎｔｅｒで示される位置）に格納する（ステップＳ２６１）。
【０１４８】
その後、変数ｃｏｕｎｔｅｒをインクリメントした後（ステップＳ２６２）、この再設定された変数ｃｏｕｎｔｅｒが配列の最大サイズ定数ＭＡＸ ＮＵＭに達したか否かをチェックする（ステップＳ２６３）。達していない場合は（ＹＥＳ）、前記ステップＳ２６１に戻り、達した場合には（ＮＯ）、図４のルーチンにリターンする。
【０１４９】
前述したステップＳ２６０からステップＳ２６３のループによって、ラベル情報を１ライン取り込む場合の傾きパターンが得られる。なお、前記配列の最大サイズ定数ＭＡＸ ＮＵＭは、プログラム作成時に定める変数のサイズを示すもので、例えば、フレームメモリ６のサイズが“６４０×４８０画素”であると仮定すれば、“１０００程”とっておけば良い。
【０１５０】
次に、図４の前記ステップＳ１０でコールされる埋め込チェックルーチンについて、図３７に示すフローチャート及び図３８に示すフレームメモリへの投影像の図を参照して説明する。なお、図３８は、行スキャンでスタートコード２２が基準に選択された場合の例を示している。またラベルサイズは、“４×３”であるものとする。
【０１５１】
まず、後述するＲＯＷ検出ルーチンをコールし、ラベルをスキャンした場合、最初と最後に見つかるロウの各種情報（検出ライン番号、コードの長さ、ロウ番号、検出位置等）を検出し（ステップＳ２７１）、それぞれ変数ＲＯＷ ＦＩＲＳＴ，ＲＯＷ ＬＡＳＴに格納する。
【０１５２】
次に、変数ＲＯＷ ＦＩＲＳＴとＲＯＷ ＬＡＳＴとも確定したか否かを判断し（ステップＳ２７２）、確定したならば（ＹＥＳ）、ステップＳ２７３に移行する。しかし確定しないならば（ＮＯ）、デコード不可能として、図４の上位ルーチンにリターンする。
【０１５３】
こうして、前記ステップＳ２７２で変数ＲＯＷ ＦＩＲＳＴとＲＯＷ ＬＡＳＴとも確定しているならば（ＹＥＳ）、コードワードマトリックスの各コードの先頭位置座標を推定し、２次元配列変数ＣＯＤＥ ＰＯＳのそれぞれのコードのロウ番号，カラム番号番目に格納する（ステップＳ２７３）。ここで、各コードワード先頭座標位置の推定は、図３８に示すように、ラベルの傾きと、最初と最後に見つかるロウの検出ライン番号，コードの長さ，ロウ番号，検出位置、更にマトリックスサイズ（ＲＯＷ ＮＵＭＢＥＲ×ＣＯＬＵＭＮ ＮＵＭＢＥＲ）などから決めることができる。
【０１５４】
次に、前記ステップで推定された座標のうち画面外にコードがはみ出してしまう恐れのあるものの個数を集計し、変数ｅｒｒｏｒ ｎｕｍに格納する（ステップＳ２７４）。図３８に示す例では、（ロウ番号，カラム番号）＝（０，２）、（１，２）、（２，２）、（３，１）、（３，２）の５個のコードが読取不能と判断され、ｅｒｒｏｒ ｎｕｍに５が格納される。
【０１５５】
更に、前記ｅｒｒｏｒ ｎｕｍが図２７の前記ステップＳ１８０で求めた修復可能コード数の変数ＲＥＳＴ ＮＵＭと比較し（ステップＳ２７５）、ｅｒｒｏｒ ｎｕｍがＲＥＳＴ ＮＵＭ以下であれば（ＹＥＳ）、デコード可能として図４の上位ルーチンにリターンする。一方、ｅｒｒｏｒ ｎｕｍがＲＥＳＴ ＮＵＭを越えている場合は（ＮＯ）、デコード不可能として図４の上位ルーチンにリターンする。
【０１５６】
このようなルーチンにより、各コードの位置を推定することができ、また画面外と推定されるコード数をカウントできるため、デコード可能か否かをこの段階で判断することが出来る。これにより、長い時間処理を行ったにも係わらず、デコードされないという最悪のパターンは激減する。
【０１５７】
次に、図３７の前記ステップＳ２７１でコールされるＲＯＷ検出ルーチンについて、図３９に示すフローチャート及び図３６に示すフレームメモリへの投影像の図を参照して説明する。
【０１５８】
まず、ラベルのボトム座標変数ＢＯＴＴＯＭのｙ座標値とラベルのトップ座標変数ＴＯＰのｙ座標値との差、つまりラベルのｙ方向の画素数を計算し、その計算結果を変数ｐｏｓ ｎｕｍに格納する（ステップＳ２８１）。
【０１５９】
次に、変数ｉｎｃの値を“１”に（ステップＳ２８２）、変数ｃｏｕｎｔｅｒの値を“０”に（ステップＳ２８３）、変数ｅｎｄの値を前記ステップＳ２８２もしくはＳ２８３で求めたｐｏｓ ｎｕｍとする（ステップＳ２８４）。
【０１６０】
そして、前記ステップＳ２８２からＳ２８４で求めた各変数（初期値ｃｏｕｎｔｅｒ，増分ｉｎｃ，終了位置ｅｎｄ）を用いて、後述するＲＯＷ番号検出ルーチンをコールする（ステップＳ２８５）。正しくインディケータ情報からロウ番号を検出できた場合は、変数ＲＯＷ ＰＯＳに検出ライン番号，コード長さ，ロウ番号，検出位置などの情報が格納される。
【０１６１】
即ち、前記ルーチンで正しくインディケータ情報からロウ番号を検出できたか否かを判断し（ステップＳ２８６）、検出された場合は（ＹＥＳ）、ステップＳ２８７へ移行し、検出できなかった場合は（ＮＯ）、デコード不可能として上位ルーチンに戻る。
【０１６２】
次に、前記ステップＳ２８５で求められたデータＲＯＷ ＰＯＳをＲＯＷ ＦＩＲＳＴに格納する（ステップＳ２８７）。即ち、前記ステップＳ２８２からＳ２８７でラベルのＴＯＰからＢＯＴＴＯＭに向かってスキャンラインを次々設定し、最初に検出されたインディケータ位置がＲＯＷ ＦＩＲＳＴに格納される。
【０１６３】
更に、前記Ｓ２８８からＳ２９３までは、ラベルをＢＯＴＴＯＭからＴＯＰに向かって、スキャンラインを次々設定し、最初に検出されたインディケータ位置がＲＯＷ ＬＡＳＴに格納される。
【０１６４】
このようなルーチンにより、ロウの一部が処理不能（例えば画面外にとび出しているとか）になっているか否かが分かるわけである。なぜなら、ロウ数４のラベルで、ＲＯＷ ＦＩＲＳＴでロウ番号０が検出され、ＲＯＷ ＬＡＳＴでロウ番号２が検出された場合、ロウ番号３は検出不能であるので、処理できないのが分かる。
【０１６５】
次に、図３９の前記ステップＳ２８５でコールされるＲＯＷ番号検出ルーチンについて、図４０に示すフローチャートを参照して説明する。
まず、現在の変数ｃｏｕｎｔｅｒ値に於ける走査始点及び終点を前記座標変数の配列ＤＩＭ ＰＯＩＮＴ Ｐ，ＤＩＭ ＰＯＩＮＴ Ｑから求め、ｘ方向増分を“１”且つｙ方向増分を前記傾き増分配列ＬＩＮＥ ＩＮＣで、フレームメモリ６から画像データを１ライン取出して、取り込みバッファ配列ｓｃａｎ ｌｉｎｅに格納し、そのデータの個数を変数ｎｕｍに格納する（ステップＳ３０１）。
【０１６６】
そして、後述する幅情報に変換ルーチンをコールして（ステップＳ３０２）、この取り出したデータを幅情報に変換する。次に、この幅情報を元に、不図示バーコード表と一致する部分をコードに変換し、その情報の中からインディケータ情報を抽出し保存する（ステップＳ３０３）。ここで、インディケータ情報が読めたか否かを判断し（ステップＳ３０４）、読めなかった場合は（ＮＯ）、その後、変数ｃｏｕｎｔｅｒを増分、即ち前記間隔変数ｉｎｃの値で再設定し（ステップＳ３０５）、この再設定された変数ｃｏｕｎｔｅｒ値が、前記変数ｅｎｄ、つまり、ラベル範囲を越えるか否かを判断する（ステップＳ３０６）。ここで越えない場合は（ＮＯ）、前記ステップＳ３０１に戻り、越える場合は（ＹＥＳ）、デコード不能と判断し、図３９の上位ルーチンにリターンする。
【０１６７】
一方、前記ステップＳ３０４の判断で、読めたと判断した場合は（ＹＥＳ）、その時の検出ライン番号とコード長さとロウ番号と検出位置を変数ＲＯＷ ＰＯＳに格納し（ステップＳ３０７）、デコード可能として、図３９の上位ルーチンにレターンする。従って、このルーチンに入ってから最初に検出されたインディケータの各種情報をＲＯＷ ＰＯＳに格納することになる。
【０１６８】
次に、図４の前記ステップＳ１３でコールされる最適スキャンルーチンについて、図４１に示すフローチャート及び図４２に示すフレームメモリへの投影像の図を参照して説明する。
【０１６９】
まず、ラベルのインディケータ情報変数ＲＯＷ ＬＡＳＴの検出位置ｙ座標値とＲＯＷ ＦＩＲＳＴの検出位置ｙ座標値との差、つまりラベルのｙ方向の画素数を計算し、その計算結果を変数ｅｎｄに格納する（ステップＳ３１１）。
【０１７０】
次に、この変数ｅｎｄの値をラベルの行数（変数ＲＯＷ ＬＡＳＴのロウ番号−変数ＲＯＷ ＦＩＲＳＴのロウ番号の絶対値）で割ることにより、図４２に示すように各行の中心を一度だけ走査するための間隔を計算し、それを変数ｉｎｃに格納する（ステップＳ３１２）。そして、変数ＲＯＷ ＦＩＲＳＴの検出ライン番号を変数ｃｏｕｎｔｅｒの初期値とする（ステップＳ３１３）。
【０１７１】
次に、現在の変数ｃｏｕｎｔｅｒ値に於ける走査始点及び終点を前記座標変数の配列ＤＩＭ ＰＯＩＮＴ Ｐ，ＤＩＭ ＰＯＩＮＴ Ｑから求め、ｘ方向増分を“１”且つｙ方向増分を前記傾き増分配列ＬＩＮＥ ＩＮＣで、フレームメモリ６から画像データを１ライン取出して、それを取り込みバッファ配列ｓｃａｎ ｌｉｎｅに格納し、またそのデータの個数を変数ｎｕｍに格納する（ステップＳ３１４）。
【０１７２】
そして、後述する前記ステップＳ３０２と同じ、幅情報に変換ルーチンをコールして（ステップＳ３１５）、この取り出したデータを幅情報に変換する。次に、この幅情報を元に、不図示バーコード表と一致する部分をコードに変換し、その情報を保存する（ステップＳ３１６）。
【０１７３】
その後、変数ｃｏｕｎｔｅｒを増分、即ち前記間隔変数ｉｎｃの値で再設定し（ステップＳ３１７）、この再設定された変数ｃｏｕｎｔｅｒ値が、前記変数ｅｎｄつまりラベル範囲を越えるか否かを判断する（ステップＳ３１８）。この判断で越えない場合は（ＹＥＳ）、前記ステップＳ３１４に戻り、越える場合は（ＮＯ）、格納されたコード情報がラベルに記述されている情報が完全に復号可能か否かを判断する（ステップＳ３１８）。復号可能の場合は（ＹＥＳ）、デコード可能の情報を持って図４の上位ルーチンへリターンする。しかし復号不可能の場合は（ＮＯ）、デコード不可能の情報を持って図４の上位ルーチンへリターンする。
【０１７４】
次に、図４の前記ステップＳ１４でコールされるインテリジェントスキャンルーチンについて、図４３に示すフローチャートを参照して、説明する。このスキップスキャンルーチンは、前記最適スキャンで取りこぼしたコード位置のみをスキャンするルーチンである。
【０１７５】
まず、最適スキャンで埋め込むことの出来なかったコードワードのうち、画面内と思われるコード数をｉと定義する（ステップＳ３２１）。さらに、その各コードのロウ番号とカラム番号をそれぞれ配列ＲとＣに格納する（ステップＳ３２２）。以上より、最適スキャンで埋め込むことの出来なかったコードワードの個数とその位置が求められる。この位置は、後述するように、カラム番号とロウ番号が分かれば、前記ステップＳ１０で求めたＣＯＤＥ ＰＯＳよりその座標が分かる。
【０１７６】
次に、変数ｃｏｕｎｔｅｒと傾きパターンカウンターｎを“０”に初期化する（ステップＳ３２３）。そして、ｃｏｕｎｔｅｒ番目の未検出場所の座標ＣＯＤＥ ＰＯＳ［［Ｒ［ｃｏｕｎｔｅｒ］］［Ｃ［ｃｏｕｎｔｅｒ］］を通り、Ｓｌｏｐｅ＋ｄｔ［ｎ］の傾きを持つ直線Ｉを定義する（ステップＳ３２４）。この直線Ｉが画面枠とクロスする点Ｗ３，Ｗ４を定義し、線分Ｗ３−Ｗ４上の画像データを取り込む（ステップＳ３２５）。
【０１７７】
そして、後述する前記ステップＳ３０２と同じ、幅情報に変換ルーチンをコールして（ステップＳ３２６）、この取り出したデータを幅情報に変換する。次に、この幅情報を元に、当該バーコードの用途に応じて予め決められた不図示バーコード表と一致する部分をコードに変換し、その情報を保存する（ステップＳ３２７）。
【０１７８】
さらに前記ステップＳ３２４からステップＳ３２６で狙った場所のコードが埋めこめたか否かを判断する（ステップＳ３２８）。この判断で埋めこめなかった場合には（ＮＯ）、傾きパターンカウンターｎをインクリメントし（ステップＳ３２９）、それが傾きパターン数Ｎ ＰＡＴ（例えば傾きの種類を１０種類予め配列ｄｔに用意しておく場合は“１０”に設定）未満か否かをチェックし（ステップＳ３３０）、未満の場合は前記ステップＳ３２４へ戻り、以上の場合はスップＳ３３１へ移行する。
【０１７９】
前記ステップＳ３２８で埋めこめたと判断した場合（ＹＥＳ）、あるいは傾きパターンカウンターｎが傾きパターン数Ｎ ＰＡＴ以上の場合は、変数ｃｏｕｎｔｅｒをインクリメントし、傾きパターンカウンタｎを“０”に再設定する（ステップＳ３３１）。この再設定された変数ｃｏｕｎｔｅｒ値が、前記変数ｉつまり最適スキャンで埋め込むことの出来なかったコードワードのうち、画面内と思われるコード数を越えるか否かをチェックする（ステップＳ３３２）。越えない場合は（ＹＥＳ）、前記ステップＳ３２４に戻り、越える場合は（ＹＥＳ）、格納されたコード情報がラベルに記述されている情報を、完全に復号可能か否かを判断する（ステップＳ３３３）。
【０１８０】
この判断で、復号可能の場合は（ＹＥＳ）、デコード可能の情報を持って図４の上位のルーチンへリターンする。しかし復号不可能の場合は（ＮＯ）、デコード不可能の情報を持って図４の上位ルーチンへリターンする。
【０１８１】
従って、ステップＳ３２４からステップＳ３３２において、最適スキャンで埋め込むことの出来なかったコードワードのうち、画面内と思われるコード毎に、複数種類の傾きで画像データを取り込み、そのコードを確定しようとしている。これにより、必要な部分のみを取り込む操作となるため、最小のトライ数でコードワードマトリクッスが確定される。
【０１８２】
次に、前記ステップＳ３０２若しくはステップＳ３２６で、コールされる幅情報に変換ルーチンについて、図４４及び図４５に一連のフローチャートを参照して説明する。
【０１８３】
このルーチンは、基本的に図１７及び図１８で説明したルーチンと同一のものであるが、ステップＳ９５とステップＳ３５５の部分だけが異なる。即ち、図１７及び図１８のルーチンでは、スタートコード２２で検出するのみの目的であったため、幅情報は、ＷＩＤＴＨ ＮＵＭ個求めれば良かったが、図４４及び図４５のルーチンでは、ラベルの全ての情報が必要であるから、幅は全て求めなければいけない。そこで、ステップＳ３５５では、前記ステップＳ９５に見られたｊに関する判断は取り除くようにする。
【０１８４】
なお、本発明の前記実施例に限定されるものではなく、種々の変形実施が可能なことは勿論である。
例えば、２次元撮像装置５は、２次元ＣＣＤや撮像管に代表されるエリアセンサを用いたものに限定されるものでなく、１次元撮像素子と１次元スキャン機構の組み合せや、光電検出器と２次元スキャン機構の組み合せでも良い。
【０１８５】
また、前記説明に於いては、バーコードラベルにＰＤＦ−４１７フォーマットのラベルを用いたが、これに限定されるものでなく、Ｃｏｄｅ４９等、他のスタックドバーコードや、ＪＡＮ等の１次元バーコードでも良い。
【０１８６】
以上の実施例に基づいて説明したが、本明細書には、以下のような発明も含まれる。
（１）  バーとスペースとからなるバーコードを２次元像として撮像する撮像手段と、
前記撮像手段により得られた２次元像を一時的に記憶する記憶手段と、
前記撮像手段から該記憶手段に撮像画像を転送する転送手段と、
前記撮像手段により得られたバーコードの２次元像から、バーコードシンボルの有無を自動認識する認識手段と、
前記撮像手段により得られたバーコードの２次元像から、バーコードシンボルの位置を認識する位置認識手段と、
前記撮像手段により得られたバーコードの２次元像から前記バーコードの情報を順次読み取る読取手段と、
前記読取手段からのバーコードの情報から、元の情報に復号する復号手段と、を具備してなることを特徴とするシンボル情報読取装置。
【０１８７】
従って、バーとスペースとからなるバーコードを２次元像として撮像し、得られた２次元像を一時的に記憶し、撮像画像を記憶手段に転送し、バーコードシンボルの有無を自動認識し、バーコードシンボルの位置を認識し、バーコードの情報を順次読み取り、バーコードの情報から、元の情報に復号する。
【０１８８】
（２）  前記第１項において、認識手段は、移動しているバーコードの２次元像を、撮像手段により得られる撮像画面のバーコード情報読み取り可能な位置で認識するシンボル情報読取装置。
【０１８９】
従って、移動しているバーコードの２次元像を、撮像手段により得られる撮像画面のバーコード情報読み取り可能な位置で認識する。
よって効果は、移動しているバーコードラベルを読み取る際に、バーコードラベルが完全に画像内に入っている場合にのみ読取処理に進ようにしたので、画像からはみ出しているバーコードを読みに行くようなことはなく、高速に読取が行なえて、尚且つ信頼性を上げることができることである。
【０１９０】
（３）  前記第１項において、転送手段は、撮像手段により撮像された２次元像を圧縮して転送するシンボル情報読取装置。
従って、撮像手段により撮像された２次元像を圧縮して転送する。
【０１９１】
よって、効果は、対象画像を圧縮してフレームメモリ６に転送するので、処理する画素数が少なくなり、バーコードシンボル情報を高速に読み取ることが可能となることである。
【０１９２】
（４）  前記第３項において、転送手段は、撮像した２次元像の１つのフィールド成分のみを記憶手段に転送するシンボル情報読取装置。
従って、従って撮像した２次元像の１つのフィールド成分のみを記憶手段に転送する。
【０１９３】
よって、効果は対象画像に対しバーコードラベル像が占める割合が大きくて、バーコードラベルの１行の高さが十分な場合には、フレームメモリにフィールド画像のみを転送し、読取処理を行なうため安価なインタレース型撮像素子でバーコード情報を読み取ることができることである。フィールド画像は偶数成分奇数成分のどちらでもかまわない。
【０１９４】
（５）  前記第２項において、転送手段は、撮像した２次元像の２つのフィールド成分を別々に記憶手段に転送するシンボル情報読取装置。
従って、撮像した２次元像の２つのフィールド成分を別々に記憶手段に転送する。
【０１９５】
よって、効果は、対象画像に対しバーコードラベル像が占める割合が小さくて、バーコードラベルの１行の高さが十分でない場合には、２つのフィールド画像（偶数成分と奇数成分）を１つのフレームメモリに別々に取り込み、１つのフィールド画像に対し読取処理を行ない、それが失敗した場合にはもう１つのフィールド画像に対し読取処理を行ない、読取の信頼性を上げることができることである。
【０１９６】
（６）  前記第２項において、読み取り手段は、記憶手段により記憶された１つのフィールド成分に対し読み取り処理を行ない、処理が失敗したときは記憶手段により記憶された別のフィールド成分に対し再度読み取り処理に行く処理操作を含み、バーコード情報を読み取るシンボル情報読取装置。
【０１９７】
従って、記憶手段により記憶された１つのフィールド成分に対し読み取り処理を行ない、処理が失敗したときは記憶手段により記憶された別のフィールド成分に対し再度読み取り処理に行く処理操作を含み、バーコード情報を読み取る。
【０１９８】
よって、（５）項と同様の効果が得られる
（７）  前記第２項において、転送手段は、撮像手段により撮像された２次元像のフィールド成分の１スキャンラインを転送した後、記憶手段の１ラインを空けてまたスキャンラインを転送し、１フィールド分の画像情報を転送するまでそれを繰り返し、終了後に空いているラインにそのラインの１ライン上または下のラインの画像情報を複写をする処理操作を含み、転送するシンボル情報読取装置。
【０１９９】
従って、撮像手段により撮像された２次元像のフィールド成分の１スキャンラインを転送した後、記憶手段の１ラインを空けてまたスキャンラインを転送し、１フィールド分の画像情報を転送するまでそれを繰り返し、終了後に空いているラインにそのラインの１ライン上または下のラインの画像情報を複写をする処理操作を含み、転送する。
【０２００】
よって、効果は、１つのフィールド画像を１行ずつ間隔を置いてフレームメモリ６に取り込み、空いている行にその１行のフレームメモリの内容を複写して、読取処理を行なうことにより、読取の信頼性を上げることができることである。複写はハードウエアにより簡単に実現できる。
【０２０１】
（８）  前記第３項において、転送手段は、撮像手段により撮像した２次元像の任意数の画素情報を加算し１つの画素にして、転送するシンボル情報読取装置。
【０２０２】
従って、前記３項において、転送手段は、撮像手段により撮像した２次元像の任意数の画素情報を加算し１つの画素にして、転送する。
よって、効果は、バーコードラベルの１行の高さが十分な場合には、全ての画素情報に対し、任意の画素数を加算し１の画素にしてフレームメモリに格納することにより、バーコードシンボル情報を高速に読み取ることが可能となることである。これもハードウエアで簡単に実現可能であり、しかもノイズを抑制する効果も持っている。
【０２０３】
（９）  前記第１項において、位置認識手段は、記憶装置の１行の画素情報を任意数だけ幅情報に変換して、当該バーコードの種類によって定められる所定パターンの位置を認識するシンボル情報読取装置。
【０２０４】
従って、記憶装置の１行の画素情報を任意数だけ幅情報に変換して、当該バーコードの種類によって定められる所定パターンの位置を認識する。
よって、効果は、対象となる画像内にバーコードラベル以外の情報が存在せず、尚且つＰＤＦ４１７バーコードラベルのスタートコードが画像の向かって左側に位置した場合、フレームメモリから行単位で取り込んだ画素情報を全て幅情報に変換せずに、スタートコードを検出するのに十分なだけの幅情報だけ求めるので、高速にスタートコードを検出することができることである。
【０２０５】
（１０）  前記第１項において、位置認識手段は、記憶手段から選択的に行を選ぶ処理操作を含み、当該バーコードの種類によって定められる所定パターンの位置を認識するシンボル情報読取装置。
【０２０６】
従って、記憶手段から選択的に行を選ぶ処理操作を含み、当該バーコードの種類によって定められる所定パターンの位置を認識する。
よって、効果は、画素を取り込む行の決定法において、方程式の解を反復的に求めるＮＥＷＴＯＮ法に類似した方法で、行間を徐々に狭めていく方法を採用しているので、スタートコードを大域的にしかも高速に検出することができることである。
【０２０７】
（１１）  前記第１項において、読み取り手段は、当該バーコードの種類によって定められる所定パターンを少なくとも２箇所検出し、バーコードラベルの傾きを求め、既に検出されているパターンとは異なる当該バーコードの種類によって定められる所定パターンを検出し、両方のパターンからバーコードラベルの傾きを再定義する処理操作を含み、バーコード情報を読み取るシンボル情報読取装置。
【０２０８】
従って、当該バーコードの種類によって定められる所定パターンを少なくとも２箇所検出し、バーコードラベルの傾きを求め、既に検出されているパターンとは異なる当該バーコードの種類によって定められる所定パターンを検出し、両方のパターンからバーコードラベルの傾きを再定義する処理操作を含み、バーコード情報を読み取る。
【０２０９】
よって、効果は、スタートコードを検出した後にバーコードラベルのインディケータ情報から各コード位置を推定し、ストップコードに近い位置からストップコードを検出して、スタートコードとストップコード両方からバーコードラベルの傾きを再定義しているので、より正確な傾きを求めることができ、読み取りの信頼性を上げることができる。
【０２１０】
（１２）  前記第１項において、読み取り手段は、バーコードラベルの１隅が欠損していた場合に、当該バーコードの種類によって定められる所定パターンの１つのみの情報から求めたバーコードラベルの傾きを参考に傾きを再定義する処理操作を含み、バーコード情報を読み取るシンボル情報読取装置。
【０２１１】
従って、バーコードラベルの１隅が欠損していた場合に、当該バーコードの種類によって定められる所定パターンの１つのみの情報から求めたバーコードラベルの傾きを参考に傾きを再定義する処理操作を含み、バーコード情報を読み取る。
【０２１２】
前記（１２）項と同様の効果が得られる。
（１３）  前記第２項において、認識手段は、記憶手段の２次元像を縦に３等分し、バーコードラベルの大きさにより決まる一番上のエリアの任意の行と一番下のエリアの任意の行で当該バーコードの種類によって定められる所定パターンを検出できず、なおかつ中心のエリアの任意の行で当該バーコードの種類によって定められる所定パターンを検出した場合にバーコードラベルが読み取り可能な位置に存在すると判断する処理操作を含み、バーコードラベルの存在の有無を認識するシンボル情報読取装置。
【０２１３】
従って、記憶手段の２次元像を縦に３等分し、バーコードラベルの大きさにより決まる一番上のエリアの任意の行と一番下のエリアの任意の行で当該バーコードの種類によって定められる所定パターンを検出できず、なおかつ中心のエリアの任意の行で当該バーコードの種類によって定められる所定パターンを検出した場合にバーコードラベルが読み取り可能な位置に存在すると判断する処理操作を含み、バーコードラベルの存在の有無を認識する。
【０２１４】
よって効果は、移動しているバーコードラベルを読み取る際に、バーコードラベルが完全に画像内に入っている場合にのみ読取処理に進ようにしたので、画像からはみ出しているバーコードを読みに行くようなことはなく、高速に読取が行なえて、尚且つ信頼性を上げることができることである。
【０２１５】
（１４）  前記第１０項において、位置認識手段は、最初に記憶手段の２次元像の中心の行を選択し、その次には２次元像の上半分の中心と下半分の中心の行を選択し、以下同様に分割された画像の中心の行を順次選択する処理操作を含み、当該バーコードの種類によって定められる所定パターンの位置を認識するシンボル情報読取装置。
【０２１６】
従って、最初に記憶手段の２次元像の中心の行を選択し、その次には２次元像の上半分の中心と下半分の中心の行を選択し、以下同様に分割された画像の中心の行を順次選択する処理操作を含み、当該バーコードの種類によって定められる所定パターンの位置を認識する。
【０２１７】
前記（１０）項と同様の効果が得られる。
（１５）  前記第１２項において、読み取り手段は、記憶手段の２次元バーコードラベル像の４隅の内の上の２隅からバーコードラベルの傾きを求め、次に４隅の内の下の２隅からバーコードラベルの傾きを求め、２つの傾きからバーコードラベルの傾きを求める処理操作を含み、バーコード情報を読み取るシンボル情報読取装置。
【０２１８】
従って、前記第１２項において、読み取り手段は、記憶手段の２次元バーコードラベル像の４隅の内の上の２隅からバーコードラベルの傾きを求め、次に４隅の内の下の２隅からバーコードラベルの傾きを求め、２つの傾きからバーコードラベルの傾きを求める処理操作を含み、バーコード情報を読み取る。
【０２１９】
（１６）  前記第１２項において、読み取り手段は、記憶手段の２次元バーコードラベル像の４隅の内の上の２隅からバーコードラベルの傾きを求め、次に４隅の内の下の２隅からバーコードラベルの傾きを求め、２つの傾きの差が予め定められているしきい値以上であれば、当該バーコードの種類によって定められる所定パターンを少なくとも２箇所検出して求めた傾きに近い値をバーコードラベルの傾きとする処理操作を含み、バーコード情報を読み取るシンボル情報読取装置。
【０２２０】
従って、記憶手段の２次元バーコードラベル像の４隅の内の上の２隅からバーコードラベルの傾きを求め、次に４隅の内の下の２隅からバーコードラベルの傾きを求め、２つの傾きの差が予め定められているしきい値以上であれば、当該バーコードの種類によって定められる所定パターンを少なくとも２箇所検出して求めた傾きに近い値をバーコードの傾きとする処理操作を含み、バーコード情報を読み取る。
【０２２１】
前記（１０）項と同様の効果が得られる。
（１７）  前記第１２項において、読み取り手段は、記憶手段の２次元バーコードラベル像の４隅の内の上の２隅からバーコードラベルの傾きを求め、次に４隅の内の下の２隅からバーコードラベルの傾きを求め、２つの傾きの差が予め定められているしきい値未満であれば、２つの傾きの平均値をバーコードラベルの傾きとする処理操作を含み、バーコード情報を読み取るシンボル情報読取装置。
【０２２２】
従って、記憶手段の２次元バーコードラベル像の４隅の内の上の２隅からバーコードラベルの傾きを求め、次に４隅の内の下の２隅からバーコードラベルの傾きを求め、２つの傾きの差が予め定められているしきい値未満であれば、２つの傾きの平均値をバーコードラベルの傾きとする処理操作を含み、バーコード情報を読み取る。
【０２２３】
（１８）  前記第６項において、読み取り手段は、再度読取処理に行くときに前フィールド画面のバーコードラベルの位置情報を用いる処理操作を含み、バーコード情報を読み取るシンボル情報読取装置。
【０２２４】
従って、再度読取処理に行くときに前フィールド画面のバーコードラベルの位置情報を用いる処理操作を含み、バーコード情報を読み取る。
よって、効果は、再度読取処理に行くときに前フィールド画面のバーコードラベルの位置情報を用いることが出来るので、再度ラベル検出をする必要はなく、バーコード情報の高速な読み取りが実現できることである。新たなバーコードラベル位置はラベルの速度と撮像装置の走査速度から計算することが出来る。また、バーコードラベルの速度が撮像装置の走査速度に比べ、十分無視できる場合にはそのまま前フィールド画面のバーコードラベルの位置情報を用いることができる。
【０２２５】
【発明の効果】
以上詳述したように本発明によれば、移動している２次元バーコードのバーコードシンボル情報を高速に確実に読取るシンボル情報読り取装置を提供することができる。
【図面の簡単な説明】
【図１】第１実施例としてのシンボル情報読取り装置の概略的な構成を示す図である。
【図２】スタックドバーコードの一例として、ＰＤＦ−４１７のラベル構造を示す図である。
【図３】仮想的にフレームメモリの画素配列にＰＤＦ−４１７のラベル画像を投影した模式図を示す図である。
【図４】データ処理装置におけるラベル検出、ラベル情報読出し及び復号について説明するためのフローチャートである。
【図５】フィールド画面のみを取り込むことを説明するための図である。
【図６】画像取り込みルーチンについて説明するためのフローチャートである。
【図７】２つのフィールド画面（偶数成分と奇数成分）を取り込むことを説明するための図である。
【図８】４画素を加算し１つの画素にすることを説明するための図である。
【図９】バーコードラベル検出を説明するためのフローチャートである。
【図１０】バーコードラベル検出を説明するための投影像を示す図である。
【図１１】フレームメモリ上に定義されるバーコードラベルの傾きを説明するための図である。
【図１２】バーコードラベル画面内検出を説明するためのフローチャートである。
【図１３】バーコードラベル画面内検出を説明するためのバーコードラベル投影像を示す図である。
【図１４】スキャン方法を説明するためのフローチャートである。
【図１５】スキャン方法を説明するためのバーコードラベル投影像を示す図である。
【図１６】スタートコード検出を説明するためのフローチャートである。
【図１７】幅情報への変換方法を説明するためのフローチャートの前半部である。
【図１８】幅情報への変換方法を説明するためのフローチャートの後半部である。
【図１９】ピーク値の選択について説明するための図である。
【図２０】ピーク間距離の算出方法について説明するための図である。
【図２１】正規化について説明するためのフローチャートである。
【図２２】Ｙ座標の最大値最小値の検出について説明するためのフローチャートである。
【図２３】ラベルの範囲の検出について説明するためのフローチャートである。
【図２４】ラベルの傾きの検出について説明するためのフローチャートである。
【図２５】閾値決定について説明するためのフローチャートである。
【図２６】図２６（ａ）は、閾値算出ラインについて説明するための図、図２６（ｂ）はスタートコードの微分波形を示す図である。
【図２７】インディケータ情報決定について説明するためのフローチャートである。
【図２８】インディケータ情報決定についてフレームメモリへのバーコードラベル投影像を示す図である。
【図２９】バーコードラベルの傾きの再定義について説明するためのフローチャートである。
【図３０】バーコードラベルの傾きの再定義について説明するためのバーコードラベル投影像を示す図である。
【図３１】ストップコード検出について説明するためのフローチャートである。
【図３２】バーコードラベルの範囲検出について説明するためのフローチャートである。
【図３３】バーコードラベルの傾き再計算について説明するためのフローチャートである。
【図３４】バーコードラベルの欠損について説明するための図である。
【図３５】バーコードラベルの始点、終点列の算出について説明するためのバーコードラベル投影像を示す図である。
【図３６】スキャン方程式決定について説明するためのフローチャートである。
【図３７】埋め込チェックについて説明するためのフローチャートである。
【図３８】埋め込チェックについて説明するためのバーコードラベル投影像を示す図である。
【図３９】ＲＯＷ検出について説明するためのフローチャートである。
【図４０】ＲＯＷ番号検出について説明するためのフローチャートである。
【図４１】最適スキャンについて説明するためのフローチャートである。
【図４２】最適スキャンについて説明するためのフレームメモリへのバーコードラベル投影像を示す図である。
【図４３】インテリジェントスキャンについて説明するためのフローチャートである。
【図４４】幅情報への変換方法を説明するためのフローチャートの前半部である。
【図４５】幅情報への変換方法を説明するためのフローチャートの後半部である。
【符号の説明】
１…物品、２…バーコードラベル、３…搬送系、４…撮像光学系、５…２次元撮像部、６…フレームメモリ、７…データ処理装置、８…ラベル検出部、９…読取り部、１０…デコード判定部、１１…復号部、１２…メモリ、１３…制御部、１４…位置検出部、１５…傾き検出部、１６…ホスト装置。
【図１】
0003580901.tif 000002
【図２】
0003580901.tif 000003
【図３】
0003580901.tif 000004
【図４】
0003580901.tif 000005
【図５】
0003580901.tif 000006
【図６】
0003580901.tif 000007
【図７】
0003580901.tif 000008
【図８】
0003580901.tif 000009
【図９】
0003580901.tif 000010
【図１０】
0003580901.tif 000011
【図１１】
0003580901.tif 000012
【図１２】
0003580901.tif 000013
【図１３】
0003580901.tif 000014
【図１４】
0003580901.tif 000015
【図１５】
0003580901.tif 000016
【図１６】
0003580901.tif 000017
【図１７】
0003580901.tif 000018
【図１８】
0003580901.tif 000019
【図１９】
0003580901.tif 000020
【図２０】
0003580901.tif 000021
【図２１】
0003580901.tif 000022
【図２２】
0003580901.tif 000023
【図２３】
0003580901.tif 000024
【図２４】
0003580901.tif 000025
【図２５】
0003580901.tif 000026
【図２６】
0003580901.tif 000027
【図２７】
0003580901.tif 000028
【図２８】
0003580901.tif 000029
【図２９】
0003580901.tif 000030
【図３０】
0003580901.tif 000031
【図３１】
0003580901.tif 000032
【図３２】
0003580901.tif 000033
【図３３】
0003580901.tif 000034
【図３４】
0003580901.tif 000035
【図３５】
0003580901.tif 000036
【図３６】
0003580901.tif 000037
【図３７】
0003580901.tif 000038
【図３８】
0003580901.tif 000039
【図３９】
0003580901.tif 000040
【図４０】
0003580901.tif 000041
【図４１】
0003580901.tif 000042
【図４２】
0003580901.tif 000043
【図４３】
0003580901.tif 000044
【図４４】
0003580901.tif 000045
【図４５】
0003580901.tif 000046