(57)【特許請求の範囲】
【請求項１】
１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算して２〜ｎ本加算エレメント幅を各々求め、１キャラクタ幅に対する前記２〜ｎ本加算エレメント幅の各々の比率を算出する演算手段と、
前記演算手段によって算出された前記比率から、前記２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出する抽出手段と、
前記抽出手段によって抽出された各々の前記２〜ｎ本加算エレメント幅のモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較する比較手段と、
前記候補キャラクタと最も相関が強い期待値キャラクタを検索する検索手段とを備え、
前記演算手段は、
当該対象キャラクタの端の前記２〜ｎ本加算エレメント幅を各々求める際に、
前記対象キャラクタの前後のキャラクタのバー及びスペースを含むエレメントの幅を１本以上ｎ−１本以下加算範囲を拡張することを特徴とする光学情報読取装置。
【請求項２】
前記抽出手段は、
当該対象キャラクタの端の前記２〜ｎ本加算エレメント幅を各々求める際に、
前記１キャラクタ分のｎ本の幅データと、当該対象キャラクタの前後の１本以上ｎ−１本以下の幅データとを抽出することを特徴とする請求項１に記載の光学情報読取装置。
【請求項３】
前記検索手段は、
前記抽出手段から得られた複数の前記対象キャラクタの各々の前記２〜ｎ本加算エレメント幅に対して２種類の前記対象キャラクタの何れかと一致する対象キャラクタを検索し、前記候補キャラクタの数を絞り込むことを特徴とする請求項１に記載の光学情報読取装置。
【請求項４】
前記検索手段は、
前記候補キャラクタのモジュール数の実測値と、前記期待値キャラクタのモジュール数の理想値との間の誤差を算出し、前記誤差を合計して得られる誤差値が最小となる前記候補キャラクタと最も相関が強い期待値キャラクタを検索することを特徴とする請求項１に記載の光学情報読取装置。
【請求項５】
前記検索手段は、
前記誤差値が最小となる前記候補キャラクタと一致する前記期待値キャラクタを検出することを特徴とする請求項４に記載の光学情報読取装置。
【請求項６】
前記１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算した合計値と、前記１キャラクタの全幅を示す全幅値とを比較し、比較結果に基づいて当該１キャラクタ分の幅データが適切か否かを判別する比較手段を備えることを特徴とする請求項１に記載の光学情報読取装置。
【請求項７】
光学情報読取装置が、
１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算して２〜ｎ本加算エレメント幅を各々求めるステップと、
求めた前記２〜ｎ本加算エレメント幅の各々の、１キャラクタ幅に対する比率を算出するステップと、
算出した前記比率から、前記２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出するステップと、
抽出された各々の前記２〜ｎ本加算エレメント幅のモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較し、当該候補キャラクタと最も相関が強い期待値キャラクタを検索するステップとを実行し、
当該対象キャラクタの端の前記２〜ｎ本加算エレメント幅を各々求める際に、
前記対象キャラクタの前後のキャラクタのバー及びスペースを含むエレメントの幅を１本以上〜ｎ−１本以下加算範囲を拡張することを特徴とする光学情報読取方法。
【請求項８】
当該対象キャラクタの前記２〜ｎ本加算エレメント幅を各々求める際に、
前記１キャラクタ分のｎ本の幅データと、当該対象キャラクタの前後の１本以上ｎ−１本以下の幅データとを抽出することを特徴とする請求項７に記載の光学情報読取方法。
【請求項９】
抽出された複数の前記対象キャラクタの各々の前記２〜ｎ本加算エレメント幅に対して２種類の前記対象キャラクタの何れかと一致する対象キャラクタを検索し、前記候補キャラクタの数を絞り込むことを特徴とする請求項８に記載の光学情報読取方法。
【請求項１０】
前記候補キャラクタのモジュール数の実測値と、前記期待値キャラクタのモジュール数の理想値との間の誤差を算出し、前記誤差を合計して得られる誤差値が最小となる前記候補キャラクタと最も相関が強い期待値キャラクタを抽出することを特徴とする請求項７に記載の光学情報読取方法。
【請求項１１】
前記誤差値が最小となる前記候補キャラクタと一致する前記期待値キャラクタを検出することを特徴とする請求項１０に記載の光学情報読取方法。
【請求項１２】
前記１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算した合計値と、前記１キャラクタの全幅を示す全幅値とを比較し、比較結果に基づいて当該１キャラクタ分の幅データが適切か否かを判別することを特徴とする請求項７に記載の光学情報読取方法。
【請求項１３】
請求項７乃至１２に記載の光学情報読取方法を実行するための指令を組み合わせたことを特徴とするコンピュータが読み取り可能なプログラム。
【請求項１４】
請求項７乃至１２に記載の光学情報読取方法を実行するためのプログラムが記述されていることを特徴とするコンピュータが読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バーコード記号を読み取ってバーコードデータを出力するバーコード記号読取装置に適用可能な光学情報読取装置、光学情報読取方法、コンピュータが読み取り可能なプログラム及び記録媒体に関するものである。
【背景技術】
【０００２】
従来から、物品流通システムにおいて、流通物品にバーコード記号を貼付又は印刷し、この種のバーコード記号をバーコードリーダー（以下光学情報読取装置という）等により読み取って情報処理するシステムが利用されている。光学情報読取装置によれば、バーコード記号１を読み取って、そのスタートマージンを検索し、更に、スタートマージンに続くキャラクタをデコード処理してバーコードデータを出力するようになされる。
【０００３】
ところで、バーコード記号の規格には、ＣＯＤＥ１２８や、ＣＯＤＥ３９、ＥＡＮ／ＵＰＣ（ＥＡＮ／Universal  Product  Code）、インターリーブド２オブ５、コーダバー、ＲＳＳ、ＲＳＳリミテッド、ＲＳＳエクスパンデド等の各々の方式が有る。一方、バーコード記号は流通物品に対して、バーコード記号標を貼付し、又は、パッケージに直接印刷して使用される場合が多い。しかし、これらの印刷技術や、貼付技術等のバラツキや、流通物品の取り扱い方法によって流通物品に貼付又は印刷されたバーコード記号を正しく読み取れない場合が想定される。バーコード記号を正しく読み取れない原因として、バーコード記号を構成するバーやスペースの欠落や、傷等が挙げられる。
【０００４】
この種の光学情報読取装置に関連して、特許文献１にはバーコード記号読取装置、それによるスタートマージン候補検出方法並びにバーコード記号読取方法が開示されている。このバーコード記号読取装置を応用して、バーコード記号を構成するバーやスペースに不本意に生じた、欠落や傷等を含む難読キャラクタをデコード処理する場合について、図１４〜図１７を参照してその説明をする。
【０００５】
図１４は、従来例に係る光学情報読取装置２０の構成例を示すブロック図である。図１４に示す光学情報読取装置２０は、光学読取部２、クロック発生部３、ｍ段データバッファ５、ｘ倍器７、セレクタ部６、比較器８、スタートマージン格納部９、インターフェース部１１、デコードバッファ２５、カウントデータ値格納部３０、ＣＰＵ３３及び、バーコードデータ値用のカウンタ部４０を有して構成される。
【０００６】
光学読取部２は、読み取り対象であるバーコード記号１を読み取って、コード読取データＤ２を発生する。例えば、光学読取部２からバーコード記号１に対して、発光ダイオード（ＬＥＤ）やレーザダイオード（ＬＤ）等の光源による光を照射し、その反射光をフォトダイオードやフォトトランジスタ等の受光素子で受光して電気信号に変換し、その電気信号を２値化してバーコード記号１の濃淡、すなわち、黒部分のバー又は白部分のスペースを示すデジタルのコード読取データＤ２に変換する。
【０００７】
光学読取部２はカウンタ部４０に接続される。カウンタ部４０にはクロック発生部３が接続される。クロック発生部３は、所定周波数のサンプリングクロック信号（以下単にＣＬＫ信号という）を発生して、ＣＬＫ信号をカウンタ部４０に出力する。クロック発生部３には発振器が使用される。
【０００８】
バーコードデータ値用のカウンタ部４０は、光学読取部２から出力されるコード読取データＤ２を入力して、クロック発生部３から出力されるＣＬＫ信号を入力し、当該ＣＬＫ信号に基づいてコード読取データＤ２をカウントし、コード読取データＤ２を白部分のスペースおよび黒部分のバーを含むエレメントの幅を示すカウントデータＤ４（バーコードデータ値：数値）に変換する。
【０００９】
カウンタ部４０にはｍ段データバッファ５、ｘ倍器７及びカウントデータ値格納部３０が接続される。ｍ段データバッファ５はカウンタ部４０から出力されるカウントデータＤ４を、ｍ段分（ｍは任意の整数）だけ一時格納する。ｍ段は、バーコード記号１の印刷状態により任意に設定される。ｍ段データバッファ５はフリップフロップ回路やメモリ等の記憶回路から構成される。
【００１０】
ｘ倍器７は、カウントデータＤ４からスタートマージンを検索するに当たり、カウントデータＤ４を何倍かを示す「ｘ」が予め設定され、そのｘ倍の演算を行って、ｘ倍データＤ７を出力する。ｘ倍器７はカウントデータＤ４をｘ倍する演算回路によって構成される。ＣＰＵ３３は、バーコード記号１の印刷状態に対応して、カウントデータＤ４を何倍にするかをｘ倍器７に設定する。
【００１１】
ｍ段データバッファ５にはセレクタ部６が接続される。セレクタ部６は、ｍ段データバッファ５に一時格納されたｍ段分のカウントデータＤ４のうち、比較対象とするデータを選択する。セレクタ部６はＣＰＵ３３等の制御を受けて、ｍ段分のカウントデータＤ４のうち、どのカウントデータＤ４を比較するかを選択するようになされる。
【００１２】
ＣＰＵ３３は、ｍ段データバッファ５中の何段（ｋ段）前までのカウントデータＤ４を比較対象として選択するかを、バーコード記号１の印刷状態、印刷汚れ、外的要因による汚れ等の状態に準じてセレクタ部６に設定される。この例では、ｍ段データバッファ５から出力されるカウントデータＤ４が、今、カウンタ部４０から出力されたカウントデータＤ４の値の何倍より大きいことをもってスタートマージン候補とするかが予め設定されている。
【００１３】
上述のセレクタ部６及びｘ倍器７には比較器８が接続される。比較器８はセレクタ部６が選択した、ｍ段データバッファ５中のｋ段前までの各カウントデータＤ４と、ｘ倍器７から出力されるｘ倍データＤ７とを比較する。比較結果によってｘ倍器７からのｘ倍データＤ７の方が小さいときは、スタートマージン候補があったと判定し、スタートマージン候補検索フラグ（以下でＳＭＦデータＤ９という）を発生する。ＳＭＦデータＤ９はスタートマージン格納部９に出力される。
【００１４】
比較器８にはスタートマージン格納部９が接続される。スタートマージン格納部９にはフリップフロップ回路のような記憶機能を有して構成される。スタートマージン格納部９には比較器８から出力されるＳＭＦデータＤ９、そのとき比較対象としたカウントデータ値＝バーコードデータ値Ｄ３０とが対応させて格納される。どのカウントデータＤ４によってスタートマージン候補となったかが判るようにするためである。スタートマージン候補は、バーコード記号１におけるバーの手前に、ある一定以上の幅の白バーが存在しているときに発生される。
【００１５】
カウントデータ値格納部３０は、カウンタ部４０から順次出力されるカウントデータＤ４を、時系列的にすべて格納して保存する。カウントデータ値格納部３０は、フリップフロップ回路や、ＤＲＡＭ等のような記憶回路から構成される。スタートマージン格納部９及びカウントデータ値格納部３０にはインターフェース部１１が接続される。
【００１６】
インターフェース部１１は、スタートマージン格納部９から読み出されるＳＭＦデータＤ９や、カウントデータ値格納部３０から読み出した各キャラクタのバーコードデータ値Ｄ３０をＣＰＵ３３に入力する。インターフェース部１１にはデコードバッファ２５が接続され、ＣＰＵ３３から出力されるバーコードデータＤ１２が格納される。
【００１７】
デコードバッファ２５はカウントデータ値格納部３０から出力された各キャラクタのバーコードデータ値Ｄ３０の演算途中のデータを格納もなされる。また、インターフェース部１１には出力端子OUTが接続され、出力端子OUTにはデコード処理後のバーコードデータＤ１２が出力される。バーコードデータＤ１２は、例えば、デコードバッファ２５からインターフェース部１１を介して出力端子OUTへ読み出される。
【００１８】
図１５Ａ〜Ｅは、従来例に係る２本加算データの算出例を示す説明図である。図１５Ａに示すＣＬＫ信号は図１４に示したクロック発生部３からカウンタ部４０へ出力される。図１５Ｂに示すバーコード記号１は、例えば、ＣＯＤＥ１２８規格のものである。ＣＯＤＥ１２８規格によれば、図１５Ｂに示す１キャラクタについて、３本の黒部分のバー（１），（３），（５）及び３本の白部分のスペース（２），（４），（６）から構成される。１キャラクタの全幅は１１モジュールから構成される。当該キャラクタＣ１の黒部分のバー（１）は４モジュールから成り、バー（３）及びバー（５）は各々１モジュールから成る。白部分のスペース（２）は１モジュールから成り、スペース（４）及び（６）は各々２モジュールから成る。
【００１９】
図１５Ｃに示すバーコードデータ値Ｄ３０は、図１４に示した光学読取部２から出力されるコード読取データＤ２を、クロック発生部３から出力されるＣＬＫ信号に基づいてサンプリングし、当該ＣＬＫ信号に基づいてコード読取データＤ２をカウントし、コード読取データＤ２を白部分のスペースおよび黒部分のバーを含むエレメントの幅を示すカウントデータＤ４に変換することで得られる。
【００２０】
図１５Ｄに示すＷ１１はキャラクタＣ１の黒部分のバー（１）の幅である。Ｗ１２はバー（１）に続くスペース（２）の幅である。Ｗ１３はキャラクタＣ１のスペース（２）に続くバー（３）の幅である。Ｗ１４はキャラクタＣ１のバー（３）に続くスペース（４）の幅である。Ｗ１５はスペース（４）に続くバー（５）の幅である。Ｗ１６はキャラクタＣ１のバー（５）に続くスペース（６）の幅である。上述の６種類の幅を示すデータは１キャラクタのバーコードデータ値Ｄ３０を構成する。
【００２１】
図１５Ｅに示すＷ２１はキャラクタＣ１のバー（１）とスペース（２）の各々がＣＰＵ３３によって加算された幅（以下バー（１）＋スペース（２）と記す）である。バー（１）＋スペース（２）の加算幅を示すカウントデータ値は幅Ｗ２１データを成す。Ｗ２２はキャラクタＣ１のバー（１）に続くスペース（２）及びバー（３）の各々がＣＰＵ３３によって加算された幅である。スペース（２）＋バー（３）の加算幅を示すカウントデータ値は幅Ｗ２２データを成す。
【００２２】
Ｗ２３はキャラクタＣ１のスペース（２）に続くバー（３）及びスペース（４）の各々がＣＰＵ３３によって加算された幅である。バー（３）＋スペース（４）の加算幅を示すカウントデータ値は幅Ｗ２３データを成す。Ｗ２４はキャラクタＣ１のバー（３）に続くスペース（４）及びバー（５）の各々がＣＰＵ３３によって加算された幅である。スペース（４）＋バー（５）の加算幅を示すカウントデータ値は幅Ｗ２４データを成す。Ｗ２５はキャラクタＣ１のスペース（４）に続くバー（５）及びスペース（６）の各々がＣＰＵ３３によって加算された幅である。バー（５）＋スペース（６）の加算幅を示すカウントデータ値は幅Ｗ２５データを成す。上述の５種類の幅Ｗ２１データ〜幅Ｗ２５データは１キャラクタの２本加算方式のデータであり、バーコードデータ値Ｄ３０を構成する。
【００２３】
図１６及び図１７は、従来例に係る難読キャラクタのデコード例（その１，２）を示すフローチャートである。光学情報読取装置２０では、ＣＯＤＥ１２８規格に基づくバーコード記号１を読み取って、そのスタートマージンを検索し、更に、スタートマージンに続くキャラクタを２本加算方式によりデコード処理してバーコードデータＤ１２を出力する場合を例に挙げる。その場合のバーコード記号１のバー及びスペースの各エレメントの誤差許容度（最大誤差範囲）が、例えば、±０．５モジュールに設定される。
【００２４】
これらをデコード条件にして、図１６に示すフローチャートのステップＳＴ81でＣＰＵ３３はスタートマージンを検索する。このとき、光学読取部２は、バーコード記号１を読み取って、コード読取データＤ２を発生する。コード読取データＤ２は、光学読取部２からカウンタ部４０へ出力される。クロック発生部３は、所定周波数のサンプリングク用のＣＬＫ信号をカウンタ部４０に出力する。
【００２５】
カウンタ部４０は光学読取部２から出力されるコード読取データＤ２を入力すると共に、クロック発生部３から出力されるＣＬＫ信号を入力し、ＣＬＫ信号に基づいてコード読取データＤ２をカウントし、コード読取データＤ２を白部分のスペースおよび黒部分のバーを含むエレメントの２本加算幅を示すカウントデータＤ４に変換する。カウントデータＤ４は、バーコード記号１における各バー（黒部分）の幅およびスペース（白部分）の幅を示す数値データ列となる。カウントデータＤ４は、カウントデータ値格納部３０に保存される。
【００２６】
ｍ段データバッファ５はカウンタ部４０から出力されるカウントデータＤ４を、ｍ段分（ｍは任意の整数）だけ一時格納する。ｍ段は、バーコード記号１の印刷状態により任意に設定されている。ｘ倍器７は、カウントデータＤ４からスタートマージンを検索するに当たり、カウントデータＤ４を何倍かを示す「ｘ」が予め設定され、そのｘ倍の演算を行って、ｘ倍データＤ７を出力する。
【００２７】
セレクタ部６は、ＣＰＵ３３の選択制御を受けて、ｍ段データバッファ５に一時格納されたｍ段分のカウントデータＤ４のうち、比較対象とするデータを選択する。比較器８はセレクタ部６が選択した、ｍ段データバッファ５中のｋ段前までの各カウントデータＤ４と、ｘ倍器７から出力されるｘ倍データＤ７とを比較する。
【００２８】
比較結果によってｘ倍器７からのｘ倍データＤ７の方が小さいときは、スタートマージン候補があったと判定し、スタートマージン候補検索フラグ（以下でＳＭＦデータＤ９という）を発生する。ＳＭＦデータＤ９はスタートマージン格納部９に出力される。スタートマージン格納部９には比較器８から出力されるＳＭＦデータＤ９、そのとき比較対象としたカウントデータ値＝Ｄ１０とが対応させて格納される。
【００２９】
ステップＳＴ82でＣＰＵ３３は１キャラクタ分の幅データ（６本）を抽出する。図１５に示したキャラクタＣ１によれば、黒部分のバー（１）の幅Ｗ１１がカウンタ部４０により計数され、そのカウントデータ値が幅Ｗ１１データとなる。バー（１）に続く白部分のスペース（２）の幅Ｗ１２もカウンタ部４０により計数され、そのカウントデータ値が幅Ｗ１２データとなる。スペース（２）に続くバー（３）の幅Ｗ１３はカウンタ部４０により計数され、そのカウントデータ値が幅Ｗ１３データとなる。
【００３０】
このバー（３）に続くスペース（４）の幅Ｗ１４もカウンタ部４０により計数され、そのカウントデータ値は幅Ｗ１４データとなる。スペース（４）に続くバー（５）の幅Ｗ１５はカウンタ部４０により計数され、そのカウントデータ値が幅Ｗ１５データとなる。バー（５）に続くスペース（６）の幅Ｗ１６もカウンタ部４０により計数され、そのカウントデータ値が幅Ｗ１６データとなる。上述の６種類の幅Ｗ１１データ〜幅Ｗ１６データはバーコードデータ値Ｄ３０を構成する。バーコードデータ値Ｄ３０はインターフェース部１１を介してＣＰＵ２３に出力される。
【００３１】
ステップＳＴ83でＣＰＵ３３はキャラクタＣ１の１モジュール幅を算出する。この例では、ＣＰＵ３３は、１キャラクタ分の６本の幅Ｗ１１データ〜幅Ｗ１６データのバーコードデータ値Ｄ３０をキャラクタのモジュール数に換算して２本加算パターンのモジュール数を求めている。図１５Ｅに示したように、カウンタ部４０のカウントデータ値から、５種類の幅Ｗ２１データ〜幅Ｗ２５データがＣＰＵ３３に順次出力される。
【００３２】
例えば、ＣＰＵ３３は幅Ｗ２１データを入力し、キャラクタＣ１のバー（１）とスペース（２）とを加算した加算幅Ｗ２１のモジュール数を求める。モジュール数は全キャラクタ幅＝１１モジュールに対する加算幅Ｗ２１の比率、例えば、２．４を算出する。この場合、加算幅Ｗ２１のモジュール数は、バーやスペース等の各エレメントの最大誤差が０．５以内となるように、当該モジュール数を四捨五入して最も近い整数になされる。例えば、Ｗ２１のモジュール数が２．４の場合、Ｗ２１のモジュール数は「２」である。モジュール数が２．６の場合、Ｗ２１のモジュール数は「３」である。
【００３３】
ステップＳＴ84でＣＰＵ３３は１キャラクタ分のバーコードデータ値Ｄ３０を２本加算パターンに変換する。例えば、図１５Ｅに示したキャラクタＣ１のバー（１）とスペース（２）の各々がＣＰＵ３３によって加算された加算幅Ｗ２１を示すカウントデータ値が幅Ｗ２１データとなる。キャラクタＣ１のバー（１）に続くスペース（２）及びバー（３）の各々がＣＰＵ３３によって加算された加算幅Ｗ２２を示すカウントデータ値が幅Ｗ２２データとなる。
【００３４】
キャラクタＣ１のスペース（２）に続くバー（３）及びスペース（４）の各々がＣＰＵ３３によって加算された加算幅Ｗ２３を示すカウントデータ値が幅Ｗ２３データとなる。キャラクタＣ１のバー（３）に続くスペース（４）及びバー（５）の各々がＣＰＵ３３によって加算された加算幅Ｗ２４を示すカウントデータ値が幅Ｗ２４データとなる。キャラクタＣ１のスペース（４）に続くバー（５）及びスペース（６）の各々がＣＰＵ３３によって加算された加算幅Ｗ２５を示すカウントデータ値が幅Ｗ２５データとなる。
【００３５】
その後、ステップＳＴ85でＣＰＵ３３は、先に変換した２本加算パターンが一致するキャラクタを検索する。この例では、図１４に示したカウンタ部４０から出力されるバーコードデータ値Ｄ３０に基づいて、ＣＰＵ３３が５種類の幅Ｗ２１データ〜幅Ｗ２５データ（２本加算データ）に関して、先に変換されたモジュール値と、期待値キャラクタの理論値とが一致するキャラクタを検索する。従来方式では、この段階でキャラクタが決定する。
【００３６】
ステップＳＴ86でＣＰＵ３３は一致するキャラクタの存在有無に基づいて制御を分岐する。一致するキャラクタが存在する場合は、ステップＳＴ87で２本加算パターンが一致したキャラクタをデコード結果とする。その後、図１７に示すステップＳＴ88に移行する。
【００３７】
上述のステップＳＴ87でデコード結果となされたキャラクタについては、ステップＳＴ88で、ＣＰＵ３３はマージン直後のキャラクタか否かに基づいて制御を分岐する。デコード結果となされたキャラクタが、マージン直後のキャラクタではない場合は、ステップＳＴ89に移行してＣＰＵ３３はデコード結果がストップキャラクタか否かに基づいて制御を分岐する。
【００３８】
デコード結果がストップキャラクタではない場合は、ステップＳＴ90に移行してＣＰＵ３３は、誤り検知（パリティチェック）を実行して、チェックデジットが正しいか否かに基づいて制御を分岐する。チェックデジットが正しい場合は、ステップＳＴ91でＣＰＵ３３は読み取りを完了し、デコードバッファ２５のバーコードデータＤ１２を出力し、デコードバッファ２５をクリアする（正常終了）。その後、ステップＳＴ95に移行する。
【００３９】
なお、ステップＳＴ88でマージン直後のキャラクタである場合は、ステップＳＴ92に移行してＣＰＵ３３は、デコード結果がスタートキャラクタか否かに基づいて制御を分岐する。上述のステップＳＴ89でデコード結果がストップキャラクタである場合及び、ステップＳＴ92でデコード結果がスタートキャラクタである場合は、図１６に示すステップＳＴ83に移行する。ステップＳＴ83でＣＰＵ３３は、次キャラクタ（６本後ろのバーコードデータ値Ｄ３０）のデコード処理を実行する。その後、ステップＳＴ81に戻る。
【００４０】
また、図１６に示したステップＳＴ86で一致するキャラクタが存在しない場合、図１７に示したステップＳＴ92でデコード結果がスタートキャラクタではない場合及び、ステップＳＴ90でチェックデジットが誤っている場合は、ステップＳＴ94に移行してＣＰＵ３３は、読み取りエラー処理を実行する。読み取りエラー処理では次のマージンを検索する等が行われる。
【００４１】
その後、ステップＳＴ95に移行して、ＣＰＵ３３は終了を判別する。例えば、当該光学情報読取装置２０に対して読取終了指令が検出され、読取終了指令が検出された場合は、バーコード記号１の読み取り制御を終了する。読取終了指令が検出されていない場合は、バーコード記号１の読み取り制御を継続するべく、ステップＳＴ81に戻って、上述した内容を繰り返すようになされる。
【先行技術文献】
【特許文献】
【００４２】
【特許文献１】特許４５５５９５２号公報（第４頁  図１）
【発明の概要】
【発明が解決しようとする課題】
【００４３】
ところで、従来例に係る光学情報読取装置２０によれば、特許文献１に見られるようなバーコード記号読取装置の構成に、１キャラクタに関して、２本幅加算方式を導入して難読キャラクタをデコード可能な光学情報読取装置を作成しようとした場合、次のような問題がある。  
ｉ．従来方式の光学情報読取装置２０では、キャラクタパターン算出時、バー及びスペースを含む各エレメントの誤差許容度が±０．５モジュール以内に設定され、１キャラクタ分の６本の幅Ｗ１１データ〜幅Ｗ１６データのバーコードデータ値Ｄ３０がキャラクタのモジュール数に換算されて、２本加算パターンのモジュール数が求められている。しかも、バーやスペース等の各エレメントの最大誤差が０．５以内となるように、２本加算パターンのモジュール数が四捨五入して最も近い整数になされている。
【００４４】
従って、加算幅Ｗ２１のキャラクタのモジュール数の計数値が２．４の場合、本来、整数の候補として「２」と「３」となるにも関わらず、モジュール数が四捨五入されて最も近い整数として、モジュール数が「２」となされてしまう（ステップＳＴ83参照）。
【００４５】
因みに、期待値キャラクタとして、モジュール数が「３」であったような場合であって、印刷技術や貼付技術等によって、バーコード記号を構成するバーやスペースに、欠落や傷等が介在して、モジュール数の計数値が２．４となった場合に、±１．０の誤差が介入する結果となって、バーコード記号を正確に読み取れないという問題がある。誤差が±０．５モジュールを越えるエレメントが存在した場合は、読み取りエラーとなっていた（ステップＳＴ94参照）。
【００４６】
ii．また、キャラクタパターン検索時、５種類の幅Ｗ２１データ〜幅Ｗ２５データ（２本加算データ）に対して一致するキャラクタを検索しているが、誤差が±０．５モジュールを越えるエレメントを含むキャラクタは検索対象から除外されてしまう。従って、ステップＳＴ83で四捨五入によって誤差を含んだキャラクタを含むキャラクタがデコード結果と決定される場合が想定される。この結果、従来方式のバーコード読み取り方法によると、バーやスペース等のエレメントが傷やかすれた場合に、バーコードを誤読してしまい、バーコードデータを正確に出力することが困難となるという問題がある。
【００４７】
そこで、本発明は上述した課題を解決したものであって、従来方式のバーコード読み取り方法に比べてバーコードの誤読取を防止できるようにすると共に、エレメントが傷やかすれた場合であっても、正確なバーコードデータを出力できるようにした光学情報読取装置、光学情報読取方法、コンピュータが読み取り可能なプログラム及び記録媒体を提供することを目的とする。
【課題を解決するための手段】
【００４８】
上述の課題を解決するために、請求項１に記載の光学情報読取装置は、１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算して２〜ｎ本加算エレメント幅を各々求め、１キャラクタ幅に対する前記２〜ｎ本加算エレメント幅の各々の比率を算出する演算手段と、前記演算手段によって算出された前記比率から、前記２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出する抽出手段と、前記抽出手段によって抽出された各々の前記２〜ｎ本加算エレメント幅のモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較する比較手段と、前記候補キャラクタと最も相関が強い期待値キャラクタを検索する検索手段とを備え、前記演算手段は、当該対象キャラクタの端の前記２〜ｎ本加算エレメント幅を各々求める際に、前記対象キャラクタの前後のキャラクタのバー及びスペースを含むエレメントの幅を１本以上ｎ−１本以下加算範囲を拡張することを特徴とするものである。
【００４９】
請求項１に係る光学情報読取装置によれば、バーコード記号を読み取ってそのデコード結果を出力する場合に、演算手段は、１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算して２〜ｎ本加算エレメント幅を各々求め、この２〜ｎ本加算エレメント幅の各々を１キャラクタのモジュール数に換算して当該２〜ｎ本加算エレメント幅のモジュール数を求める。抽出手段は、演算手段によって求められた２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となるキャラクタを候補キャラクタとして抽出する。これらを前提にして、検索手段が抽出手段によって抽出された各々の２〜ｎ本加算エレメント幅のモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較し、当該候補キャラクタと最も相関が強い期待値キャラクタを検索するようになる。
【００５０】
この検索によって、複数の候補キャラクタから抽出された候補キャラクタと最も相関が強い期待値キャラクタのバーコードデータを当該バーコード記号の読取時のデコード結果として出力できるようになるので、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【００５２】
請求項２に記載の光学情報読取装置は、請求項１において、前記抽出手段は、当該対象キャラクタの端の前記２〜ｎ本加算エレメント幅を各々求める際に、前記１キャラクタ分のｎ本の幅データと、当該対象キャラクタの前後の１本以上ｎ−１本以下の幅データとを抽出することを特徴とするものである。
【００５３】
請求項３に記載の光学情報読取装置は、請求項１において、前記検索手段は、前記抽出手段から得られた複数の前記対象キャラクタの各々の前記２〜ｎ本加算エレメント幅に対して２種類の前記対象キャラクタの何れかと一致する対象キャラクタを検索し、前記候補キャラクタの数を絞り込むことを特徴とするものである。
【００５４】
請求項４に記載の光学情報読取装置は、請求項１において、前記検索手段は、前記候補キャラクタのモジュール数の実測値と、前記期待値キャラクタのモジュール数の理想値との間の誤差を算出し、前記誤差を合計して得られる誤差値が最小となる前記候補キャラクタと最も相関が強い期待値キャラクタを検索することを特徴とするものである。
【００５５】
請求項５に記載の光学情報読取装置は、請求項４において、前記検索手段は、前記誤差値が最小となる前記候補キャラクタと一致する前記期待値キャラクタを検出することを特徴とするものである。
【００５６】
請求項６に記載の光学情報読取装置は、請求項１において、前記１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算した合計値と、前記１キャラクタの全幅を示す全幅値とを比較し、比較結果に基づいて当該１キャラクタ分の幅データが適切か否かを判別する比較手段を備えることを特徴とするものである。
【００５７】
請求項７に記載の光学情報読取方法は、光学情報読取装置が、１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算して２〜ｎ本加算エレメント幅を各々求めるステップと、求めた前記２〜ｎ本加算エレメント幅の各々の、１キャラクタ幅に対する比率を算出するステップと、算出した前記比率から、前記２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出するステップと、抽出された各々の前記２〜ｎ本加算エレメント幅のモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較し、当該候補キャラクタと最も相関が強い期待値キャラクタを検索するステップとを実行し、当該対象キャラクタの端の前記２〜ｎ本加算エレメント幅を各々求める際に、前記対象キャラクタの前後のキャラクタのバー及びスペースを含むエレメントの幅を１本以上ｎ−１本以下加算することを特徴とするものである。
【００５９】
請求項８に記載の光学情報読取方法は、請求項７において、前記２〜ｎ本加算エレメント幅を各々求める際に、前記１キャラクタ分のｎ本の幅データと、当該キャラクタの前後の１本以上ｎ−１本以下の幅データとを抽出することを特徴とするものである。
【００６０】
請求項９に記載の光学情報読取方法は、請求項８において、抽出された複数の前記対象キャラクタの各々の前記２〜ｎ本加算エレメント幅に対して２種類の前記対象キャラクタの何れかと一致する対象キャラクタを検索し、前記候補キャラクタの数を絞り込むことを特徴とするものである。
【００６１】
請求項１０に記載の光学情報読取方法は、請求項７において、前記候補キャラクタのモジュール数の実測値と、前記期待値キャラクタのモジュール数の理想値との間の誤差を算出し、前記誤差を合計して得られる誤差値が最小となる前記候補キャラクタと最も相関が強い期待値キャラクタを抽出することを特徴とするものである。
【００６２】
請求項１１に記載の光学情報読取方法は、請求項１０において、前記誤差値が最小となる前記候補キャラクタと一致する前記期待値キャラクタを検出することを特徴とするものである。
【００６３】
請求項１２に記載の光学情報読取方法は、請求項７において、前記１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算した合計値と、前記１キャラクタの全幅を示す全幅値とを比較し、比較結果に基づいて当該１キャラクタ分の幅データが適切か否かを判別することを特徴とするものである。
【００６４】
請求項１３に記載のコンピュータが読み取り可能なプログラムは、請求項７乃至１２に記載の光学情報読取方法を実行するための指令を組み合わせたことを特徴とするものである。
【００６５】
請求項１４に記載のコンピュータが読み取り可能な記録媒体は、請求項７乃至１２に記載の光学情報読取方法を実行するためのプログラムが記述されていることを特徴とするものである。
【発明の効果】
【００６６】
請求項１に係る光学情報読取装置及び、請求項７に係る光学情報読取方法によれば、２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタが抽出され、ここに抽出された各々の２〜ｎ本加算エレメント幅のモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較し、当該候補キャラクタと最も相関が強い期待値キャラクタを検索する検索手段を備えるものである。
【００６７】
この構成によって、複数の候補キャラクタから抽出された候補キャラクタと最も相関が強い期待値キャラクタのバーコードデータを当該バーコード記号の読取時のデコード結果として出力できるようになるので、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【００６８】
更に、当該対象キャラクタの２〜ｎ本加算エレメント幅を各々求める際に、対象キャラクタの前後のキャラクタのバー及びスペースを含むエレメントの幅を加算するので、複数の候補キャラクタから抽出された候補キャラクタと最も相関が強い期待値キャラクタのバーコードデータを当該バーコード記号の読取時のデコード結果として出力できるようになる。
【００６９】
請求項２に記載の光学情報読取装置及び、請求項８に記載の光学情報読取方法によれば、当該対象キャラクタの前記２〜ｎ本加算エレメント幅を各々求める際に、前記１キャラクタ分のｎ本の幅データと、当該対象キャラクタの前後の１本以上ｎ−１本以下の幅データとを抽出するので、複数の候補キャラクタから抽出された候補キャラクタと最も相関が強い期待値キャラクタのバーコードデータを当該バーコード記号の読取時のデコード結果として出力できるようになる。
【００７０】
また、請求項２に係る光学情報読取装置及び請求項８に係る光学情報読取方法によれば、１キャラクタ分のｎ本の幅データと、当該キャラクタの前後の１本以上ｎ−１本以下の幅データとを抽出するので、２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となる候補キャラクタを従来方法に比べてより多く抽出できるようになり、第１番目に相関が強いものをデコード結果とするだけでなく、第２番目、第３番目・・・に相関が強いものがデコード結果となる確率が高くなるというようにデコード結果の候補キャラクタを複数出力できるようになる。
【００７１】
請求項３に記載の光学情報読取装置及び、請求項９に記載の光学情報読取方法によれば、抽出された複数の前記対象キャラクタの各々の前記２〜ｎ本加算エレメント幅に対して２種類の前記対象キャラクタの何れかと一致する対象キャラクタを検索し、候補キャラクタの数を絞り込むので、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【００７２】
請求項４に記載の光学情報読取装置及び、請求項１０に記載の光学情報読取方法によれば、誤差値が最小となる候補キャラクタと最も相関が強い期待値キャラクタを検索するので、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【００７３】
請求項５に記載の光学情報読取装置及び、請求項１１に記載の光学情報読取方法によれば、誤差値が最小となる候補キャラクタと一致する期待値キャラクタを検出するので、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【００７４】
請求項６に記載の光学情報読取装置及び、請求項１２に記載の光学情報読取方法によれば、当該１キャラクタ分の幅データが適切か否かの判別結果に基づいてキャラクタのバーの消失や分割等を判断できるようになる。複数のスキャンのデコード結果を組み合わせることが可能となり、汚れや、かすれがひどいバーコードにおいても読み取りが可能となる。
【００７５】
請求項１３に係るコンピュータが読み取り可能なプログラム及び請求項１４に係る記録媒体によれば、本発明に係る光学情報読取方法を実行するための指令を組み合わせたので、複数の候補キャラクタから抽出された候補キャラクタと最も相関が強い期待値キャラクタのバーコードデータを当該バーコード記号の読取時のデコード結果として出力できるようになる。従って、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【図面の簡単な説明】
【００７６】
【図１】本発明に係る実施形態としてのバーコード記号読取装置１００の構成例を示すブロック図である。
【図２】（Ａ）〜（Ｇ）は第１の実施例に係る１本データ、２〜６本加算データの算出例を示す説明図である。
【図３】第１の実施例に係る難読キャラクタのデコード例（その１）を示すフローチャートである。
【図４】難読キャラクタのデコード例（その２）を示すフローチャートである。
【図５】（Ａ）〜（Ｇ）は、第１の実施例に係る１本データ、２本〜６本加算データの他の算出例（その１）を示す説明図である。
【図６】（Ａ）〜（Ｇ）は、第１の実施例に係る１本データ、２本〜６本加算データの他の算出例（その２）を示す説明図である。
【図７】（Ａ）〜（Ｃ）は、ＣＯＤＥ１２８のバーコード記号例、その欠損例及びその再構成例を示す説明図である。
【図８】第２の実施例に係る難読キャラクタのデコード例（その１）を示すフローチャートである。
【図９】難読キャラクタのデコード例（その２）を示すフローチャートである。
【図１０】難読キャラクタのデコード例（その３）を示すフローチャートである。
【図１１】第３の実施例に係る難読キャラクタのデコード例（その１）を示すフローチャートである。
【図１２】難読キャラクタのデコード例（その２）を示すフローチャートである。
【図１３】難読キャラクタのデコード例（その３）を示すフローチャートである。
【図１４】従来例に係る光学情報読取装置２０の構成例を示すブロック図である。
【図１５】（Ａ）〜（Ｄ）は、２本加算データの算出例を示す説明図である。
【図１６】難読キャラクタのデコード例（その１）を示すフローチャートである。
【図１７】難読キャラクタのデコード例（その２）を示すフローチャートである。
【発明を実施するための形態】
【００７７】
以下、図面を参照しながら、本発明に係る光学情報読取装置、光学情報読取方法、コンピュータが読み取り可能なプログラム及び記録媒体について説明する。図１に示すバーコード記号読取装置１００は光学情報読取装置の一例を構成し、バーコード記号１を読み取って、そのスタートマージンを検索し、更に、スタートマージンに続くキャラクタをデコード処理してバーコードデータＤ１２を出力するものである。
【００７８】
バーコード記号読取装置１００は、光学読取部２、クロック発生部３、カウンタ部４、ｍ段データバッファ５、ｘ倍器７、セレクタ部６、比較器８、スタートマージン格納部９、幅データ格納部１０、インターフェース部１１、マイクロプロセッサ１２及びデコードバッファ２５を有して構成される。なお、従来例と同じ名称及び同じ符号のものは同じ機能を有するのでその説明を省略する。
【００７９】
カウンタ部４は光学読取部２から出力されるコード読取データＤ２を入力すると共に、クロック発生部３から出力されるＣＬＫ信号を入力し、当該ＣＬＫ信号に基づいてコード読取データＤ２をカウントし、コード読取データＤ２を白部分のスペースおよび黒部分のバーを含むエレメントの１本幅や、ｎ本加算幅を示すカウントデータＤ４（バーコードデータ値：数値）に変換する。
【００８０】
カウンタ部４には幅データ格納部１０が接続される。幅データ格納部１０は、カウンタ部４から順次出力される１本幅、ｎ本加算幅の対象キャラクタに係るカウントデータＤ４を、時系列的にすべて格納して保存する。幅データ格納部１０は、フリップフロップ回路や、ＤＲＡＭ等のような記憶回路から構成される。幅データ格納部１０は、１本幅、ｎ本加算幅の対象キャラクタに係るカウントデータＤ４を各キャラクタの幅データＤ１０（バーコードデータ値Ｄ３０に対応）として出力する。スタートマージン格納部９及び幅データ格納部１０にはインターフェース部１１が接続される。
【００８１】
マイクロプロセッサ１２は、インターフェース部１１を介して入力されるＳＭＦデータＤ９や、各キャラクタの幅データＤ１０によって、バーコードの認識処理を実行する。マイクロプロセッサ１２は、プログラム格納用の読み出し専用メモリ（Read Only Memory：以下ＲＯＭ２１という）、ワークメモリ用の随時情報の書き込み読出し可能なメモリ（Random Access Memory：以下ＲＡＭ２２という）、及び中央処理ユニット（Central Processing Unit；以下ＣＰＵ２３という）及び期待値格納部２４を含むマイクロコンピュータを構成している。
【００８２】
ＲＯＭ２１は記録媒体の一例を構成する。ＲＯＭ２１にはコンピュータが読み取り可能なプログラムであって、本発明に係る光学情報読取方法を実行するための指令を組み合わせたプログラムデータＤｐが格納される。その内容は、バーコード記号読取装置１００が、１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算して２〜ｎ本加算エレメント幅を各々求めるステップと、求めた２〜ｎ本加算エレメント幅の各々を１キャラクタのモジュール数に換算して当該２〜ｎ本加算エレメント幅のモジュール数を求めるステップと、ここで求めた２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出するステップと、抽出された各々の２〜ｎ本加算エレメント幅のモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較し、当該候補キャラクタと最も相関が強い期待値キャラクタを検索するステップとを実行するプログラムである。ここに候補キャラクタとは対象キャラクタを絞り込んだキャラクタをいう。プログラムデータＤｐには、システム起動用のシステムプログラムデータも含まれる。
【００８３】
ＲＡＭ２２にはバーコード記号読取装置１００を制御するためのシステムプログラムの他に、光学情報読取方法を実行するための演算や、抽出、検索、比較等の制御を実行する際の制御情報が一時格納される。例えば、電源がオンされると、電源オン情報を検出したＣＰＵ２３は、ＲＯＭ２１からシステムプログラムを読み出してＲＡＭ２２に展開し、システムを起動して、当該バーコード記号読取装置１００全体を制御するようになされる。
【００８４】
この例で、ＣＰＵ２３は、少なくとも、演算部２３ａや、抽出部２３ｂ、比較部２３ｃ、検索部２３ｄ等の４つの機能を有している。演算部２３ａは演算手段の一例を構成し、各対象キャラクタの幅データＤ１０を入力し、幅データＤ１０に基づいて１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算して２〜ｎ本加算エレメント幅を各々求める。演算部２３ａは、求めた２〜ｎ本加算エレメント幅の各々を１キャラクタのモジュール数に換算して当該２〜ｎ本加算エレメント幅のモジュール数を求める。
【００８５】
抽出部２３ｂは、演算部２３ａによって求められた２〜ｎ本加算エレメント幅（以下で２〜ｎ本加算パターンともいう）の各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出する。抽出部２３ｂは、２〜ｎ本加算パターンを各々求める際に、１キャラクタ分のｎ本の幅データＤ１０と、対象キャラクタの前後の１本以上の幅データＤ１０とを抽出する。
【００８６】
この例では、対象キャラクタの抽出基準を従来方式の誤差０．５以内の整数から誤差１以内の整数へと範囲を拡大し、１キャラクタ分のｎ本の幅データＤ１０と、対象キャラクタの前後の１本以上の幅データＤ１０とを抽出するようにした。従って、２〜ｎ本加算エレメント幅の各々のモジュール数が誤差１以内の整数となる対象キャラクタを従来方法に比べて、より多く抽出できるようになる。しかも、第１番目に相関が強いものをデコード結果とするだけでなく、第２番目、第３番目・・・に相関が強いものがデコード結果となる確率が高くなるというようにデコード結果の候補キャラクタを複数出力できるようになる。これにより、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【００８７】
比較部２３ｃは、抽出部２３ｂによって抽出された各々の２〜ｎ本加算エレメント幅のモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタ（理論値）とを比較する。比較部２３ｃは判別機能を有しており、１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算した合計値と、１キャラクタの全幅を示す全幅値とを比較し、比較結果に基づいて当該１キャラクタ分の幅データＤ１０が適切か否かを判別する。
【００８８】
この判別によって、キャラクタのバーの消失や分割等を判断できるようになる。また、複数のスキャンのデコード結果を組み合わせることが可能となり、汚れや、かすれがひどいバーコードにおいても読み取りが可能となる。また、バーの消失や分割等の判断結果に基づいて対象キャラクタを絞ることができ、計算量の軽減が図れ、処理時間の高速化につながる。
【００８９】
検索部２３ｄ  検索部２３ｄは、候補キャラクタと最も相関が強い期待値キャラクタを検索する。例えば、上述の演算部２３ａが候補キャラクタのモジュール数の実測値と、期待値キャラクタのモジュール数の理想値との間の誤差を算出すると、検索部２３ｄが、演算部２３ａによって算出された誤差を合計して得られる誤差値が最小となる候補キャラクタと最も相関が強い期待値キャラクタを検索する。この例では、誤差値が最小となる候補キャラクタと最も相関が強い期待値キャラクタを検索するので、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【００９０】
マイクロプロセッサ１２には期待値格納部２４が接続される。期待値格納部２４には期待値キャラクタ（理論値）が格納されている。期待値キャラクタはＣＯＤＥ１２８規格のキャラクタの各エレメントを構成するモジュール数（理論値）である。これらにより、バーコード記号読取装置１００を構成する。ＣＰＵ２３内の演算部２３ａ、抽出部２３ｂ、比較部２３ｃ及び、検索部２３ｄはソフトウエアでも、ハードウェアでもどちらで構築してもよい。
【実施例１】
【００９１】
続いて、図２Ａ〜Ｇを参照して、第１の実施例に係る１本データ、２〜６本加算データの算出例について説明する。この実施例では、ＣＯＤＥ１２８規格のバーコード記号１について説明する。ＣＯＤＥ１２８規格によれば、図２Ａに示す１キャラクタは、３本の黒部分のバー（１），（３），（５）及び３本の白部分のスペース（２），（４），（６）から構成される。図中、Ｃ１は対象キャラクタであり、Ｃ０は対象キャラクタＣ１の１つ前のキャラクタであり、Ｃ２はその１つ後ろのキャラクタである。
【００９２】
１キャラクタの全幅は１１モジュールから構成される。この例で、黒部分のバー（１）は４モジュールから成り、バー（３）及びバー（５）は各々１モジュールから成る。白部分のスペース（２）は１モジュールから成り、スペース（４）及び（６）は各々２モジュールから成る。
【００９３】
スタートコードは３種類あり、それぞれ１０３種類のコードパターンが表される。ＣＯＤＥ１２８規格では、アスキー１２８文字を表現できるようになっている。スタートコードＣを使用すれば、１キャラクタで数字２桁を表現でき、非常に高い印字密度で表現できる。ＣＯＤＥ１２８のバーコード記号１は８キャラクタから構成される（図５Ａ参照）。バーに用いるモジュール数の和は偶数パリティであり、スペースに用いるモジュール数の和は奇数パリティとなっている。偶数パリティ及び奇数パリティを利用した自己機能を持っている。
【００９４】
図２Ｂに示すＷ１１は対象キャラクタＣ１の黒部分のバー（１）の幅である。バー（１）の幅はカウンタ部４により計数され、そのカウントデータ値は幅Ｗ１１データを成す。Ｗ１２はバー（１）に続くスペース（２）の幅である。スペース（２）の幅もカウンタ部４により計数され、そのカウントデータ値は幅Ｗ１２データを成す。Ｗ１３は対象キャラクタＣ１のスペース（２）に続くバー（３）の幅である。バー（３）の幅はカウンタ部４により計数され、そのカウントデータ値は幅Ｗ１３データを成す。
【００９５】
Ｗ１４は対象キャラクタＣ１のバー（３）に続くスペース（４）の幅である。スペース（４）の幅もカウンタ部４により計数され、そのカウントデータ値は幅Ｗ１４データを成す。Ｗ１５はスペース（４）に続くバー（５）の幅である。バー（５）の幅はカウンタ部４により計数され、そのカウントデータ値は幅Ｗ１５データを成す。Ｗ１６は対象キャラクタＣ１のバー（５）に続くスペース（６）の幅である。スペース（６）の幅もカウンタ部４により計数され、そのカウントデータ値は幅Ｗ１６データを成す。上述の６種類の幅Ｗ１１データ〜幅Ｗ１６データは１キャラクタの１本データであり、幅データＤ１０を構成する。
【００９６】
図２Ｃに示すＷ２１は対象キャラクタＣ１のバー（１）とスペース（２）の各々が演算部２３ａによって加算された幅（以下バー（１）＋スペース（２）と記す）である。バー（１）＋スペース（２）の加算幅を示すカウントデータ値は幅Ｗ２１データを成す。Ｗ２２は対象キャラクタＣ１のバー（１）に続くスペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）の加算幅を示すカウントデータ値は幅Ｗ２２データを成す。
【００９７】
Ｗ２３は対象キャラクタＣ１のスペース（２）に続くバー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）の加算幅を示すカウントデータ値は幅Ｗ２３データを成す。Ｗ２４は対象キャラクタＣ１のバー（３）に続くスペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）の加算幅を示すカウントデータ値は幅Ｗ２４データを成す。Ｗ２５は対象キャラクタＣ１のスペース（４）に続くバー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）の加算幅を示すカウントデータ値は幅Ｗ２５データを成す。上述の５種類の幅Ｗ２１データ〜幅Ｗ２５データは１キャラクタの２本加算データであり、幅データＤ１０を構成する。
【００９８】
図２Ｄに示すＷ３１は対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値は幅Ｗ３１データを成す。Ｗ３２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値は幅Ｗ３２データを成す。
【００９９】
Ｗ３３は対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値は幅Ｗ３３データを成す。Ｗ３４は対象キャラクタＣ１のバー（３）に続くスペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値は幅Ｗ３４データを成す。上述の４種類の幅Ｗ３１データ〜幅Ｗ３４データは１キャラクタの３本加算データであり、幅データＤ１０を構成する。
【０１００】
図２Ｅに示すＷ４１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値は幅Ｗ４１データを成す。Ｗ４２の対象キャラクタＣ１はバー（１）に続くスペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値は幅Ｗ４２データを成す。
【０１０１】
Ｗ４３は対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値は幅Ｗ４３データを成す。上述の３種類の幅Ｗ４１データ〜幅Ｗ４３データは１キャラクタの４本加算データであり、幅データＤ１０を構成する。
【０１０２】
図２Ｆに示すＷ５１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値は幅Ｗ５１データを成す。
【０１０３】
Ｗ５２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値は幅Ｗ５２データを成す。上述の２種類の幅Ｗ５１データ及び幅Ｗ５２データは１キャラクタの５本加算データであり、幅データＤ１０を構成する。
【０１０４】
図２Ｇに示すＷ６１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値は幅Ｗ６１データを成す。１種類の幅Ｗ６１データは１キャラクタの６本加算データであり、幅データＤ１０を構成する。
【０１０５】
上述のカウンタ部４から出力されるカウントデータ値から、６種類の幅Ｗ１１データ〜幅Ｗ１６データ（１本データ）、５種類の幅Ｗ２１データ〜幅Ｗ２５データ（２本加算データ）、４種類の幅Ｗ３１データ〜幅Ｗ３４データ（３本加算データ）、３種類の幅Ｗ４１データ〜幅Ｗ４３データ（４本加算データ）、２種類の幅Ｗ５１データ及び幅Ｗ５２データ（５本加算データ）及び、１種類の幅Ｗ６１データ（６本加算データ）の合計で、２１種類の１本データ、２〜６本加算データが得られる。
【０１０６】
続いて、本発明に係る光学情報読取方法について、図３及び図４を参照し、第１の実施例に係る難読キャラクタのデコード例を説明する。この実施例では、ＣＯＤＥ１２８規格に基づくバーコード記号１を読み取って、そのスタートマージンを検索し、更に、スタートマージンに続く対象キャラクタをデコード処理してバーコードデータＤ１２を出力する場合を例に挙げる。その場合のバーコード記号１のバー及びスペースの各エレメントの誤差許容度（最大誤差範囲）が、±１．０モジュールに設定される。バーコード記号１については図２に示した対象キャラクタＣ１について説明する(キャラクタデコードアルゴリズム）。
【０１０７】
これらをデコード条件にして、まず、図３に示すフローチャートのステップＳＴ１でマイクロプロセッサ１２はスタートマージンを検索する。このとき、光学読取部２は、バーコード記号１を読み取って、コード読取データＤ２を発生する。コード読取データＤ２は、光学読取部２からカウンタ部４へ出力される。クロック発生部３は、所定周波数のサンプリングク用のＣＬＫ信号をカウンタ部４に出力する。
【０１０８】
カウンタ部４は光学読取部２から出力されるコード読取データＤ２を入力すると共に、クロック発生部３から出力されるＣＬＫ信号を入力し、ＣＬＫ信号に基づいてコード読取データＤ２をカウントし、コード読取データＤ２を白部分のスペースおよび黒部分のバーを含むエレメントの１本幅及び６本加算幅を示すカウントデータＤ４に変換する。カウントデータＤ４は、バーコード記号１における各バー（黒部分）の幅およびスペース（白部分）の幅を示す数値データ列となる。カウントデータＤ４は、幅データ格納部１０に保存される。
【０１０９】
ｍ段データバッファ５はカウンタ部４から出力されるカウントデータＤ４を、ｍ段分（ｍは任意の整数）だけ一時格納する。ｍ段は、バーコード記号１の印刷状態により任意に設定されている。ｘ倍器７は、カウントデータＤ４からスタートマージンを検索するに当たり、カウントデータＤ４を何倍かを示す「ｘ」が予め設定され、そのｘ倍の演算を行って、ｘ倍データＤ７を出力する。
【０１１０】
セレクタ部６は、マイクロプロセッサ１２の選択制御を受けて、ｍ段データバッファ５に一時格納されたｍ段分のカウントデータＤ４のうち、比較対象とするデータを選択する。比較器８はセレクタ部６が選択した、ｍ段データバッファ５中のｋ段前までの各カウントデータＤ４と、ｘ倍器７から出力されるｘ倍データＤ７とを比較する。
【０１１１】
比較結果によってｘ倍器７からのｘ倍データＤ７の方が小さいときは、スタートマージン候補があったと判定し、スタートマージン候補検索フラグ（以下でＳＭＦデータＤ９という）を発生する。ＳＭＦデータＤ９はスタートマージン格納部９に出力される。スタートマージン格納部９には比較器８から出力されるＳＭＦデータＤ９、そのとき比較対象としたカウントデータ値＝Ｄ１０とが対応させて格納される。
【０１１２】
ステップＳＴ２でＣＰＵ２３は１キャラクタ分の幅データＤ１０（６本）と、その前後の５本ずつ幅データＤ１０を抽出する。図２Ｂに示した対象キャラクタＣ１によれば、黒部分のバー（１）の幅Ｗ１１がカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１１データとなる。バー（１）に続く白部分のスペース（２）の幅Ｗ１２もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１２データとなる。スペース（２）に続くバー（３）の幅Ｗ１３はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１３データとなる。
【０１１３】
このバー（３）に続くスペース（４）の幅Ｗ１４もカウンタ部４により計数され、そのカウントデータ値は幅Ｗ１４データとなる。スペース（４）に続くバー（５）の幅Ｗ１５はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１５データとなる。バー（５）に続くスペース（６）の幅Ｗ１６もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１６データとなる。上述の６種類の幅Ｗ１１データ〜幅Ｗ１６データは幅データＤ１０を構成する。幅データＤ１０はインターフェース部１１を介してＣＰＵ２３に出力される。
【０１１４】
ＣＰＵ２３では、演算部２３ａが各対象キャラクタの幅データＤ１０を入力し、幅データＤ１０に基づいて１キャラクタ内で隣接するバー及びスペースを含むｎ（ｎ≧２）本のエレメントの幅を加算して２〜ｎ本加算パターンを各々求める。この例ではｎ＝６である。２〜ｎ本加算エレメント幅を各々求める際に、１キャラクタ分の６本の幅データＤ１０と、対象キャラクタの前後の５本の幅データＤ１０とを抽出する。
【０１１５】
例えば、図２Ｃに示した対象キャラクタＣ１のバー（１）とスペース（２）の各々が演算部２３ａによって加算され、その加算幅Ｗ２１を示すカウントデータ値が幅Ｗ２１データとなる。対象キャラクタＣ１のバー（１）に続くスペース（２）及びバー（３）の各々が演算部２３ａによって加算され、その加算幅Ｗ２２を示すカウントデータ値が幅Ｗ２２データとなる。対象キャラクタＣ１のスペース（２）に続くバー（３）及びスペース（４）の各々が演算部２３ａによって加算され、その加算幅Ｗ２３を示すカウントデータ値が幅Ｗ２３データとなる。
【０１１６】
対象キャラクタＣ１のバー（３）に続くスペース（４）及びバー（５）の各々が演算部２３ａによって加算され、その加算幅Ｗ２４を示すカウントデータ値が幅Ｗ２４データとなる。対象キャラクタＣ１のスペース（４）に続くバー（５）及びスペース（６）の各々が演算部２３ａによって加算され、その加算幅Ｗ２５を示すカウントデータ値が幅Ｗ２５データとなる。上述の５種類の幅Ｗ２１データ〜幅Ｗ２５データは幅データＤ１０を構成する。
【０１１７】
図２Ｄに示した対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算され、その加算幅Ｗ３１を示すカウントデータ値が幅Ｗ３１データとなる。対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算され、その加算幅Ｗ３２を示すカウントデータ値が幅Ｗ３２データとなる。
【０１１８】
対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算され、その加算幅Ｗ３３を示すカウントデータ値が幅Ｗ３３データとなる。対象キャラクタＣ１のバー（３）に続くスペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算され、その加算幅Ｗ３４を示すカウントデータ値が幅Ｗ３４データとなる。上述の４種類の幅Ｗ３１データ〜幅Ｗ３４データは幅データＤ１０を構成する。
【０１１９】
図２Ｅに示した対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算され、その加算幅Ｗ４１を示すカウントデータ値が幅Ｗ４１データとなる。対象キャラクタＣ１はバー（１）に続くスペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算され、その加算幅Ｗ４２を示すカウントデータ値が幅Ｗ４２データとなる。
【０１２０】
対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算され、その加算幅Ｗ４３を示すカウントデータ値が幅Ｗ４３データとなる。上述の３種類の幅Ｗ４１データ〜幅Ｗ４３データは幅データＤ１０を構成する。
【０１２１】
図２Ｆに示した対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算され、その加算幅Ｗ５１を示すカウントデータ値が幅Ｗ５１データとなる。対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算され、その加算幅Ｗ５２を示すカウントデータ値が幅Ｗ５２データを成す。上述の２種類の幅Ｗ５１データ及び幅Ｗ５２データは幅データＤ１０を構成する。
【０１２２】
図２Ｇに示した対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算され、その加算幅Ｗ６１を示すカウントデータ値が幅Ｗ６１データとなる。１種類の幅Ｗ６１データは幅データＤ１０を構成する。
【０１２３】
上述のカウンタ部４から出力されるカウントデータ値から、６種類の幅Ｗ１１データ〜幅Ｗ１６データ（１本データ）、５種類の幅Ｗ２１データ〜幅Ｗ２５データ（２本加算データ）、４種類の幅Ｗ３１データ〜幅Ｗ３４データ（３本加算データ）、３種類の幅Ｗ４１データ〜幅Ｗ４３データ（４本加算データ）、２種類の幅Ｗ５１データ及び幅Ｗ５２データ（５本加算データ）及び、１種類の幅Ｗ６１データ（６本加算データ）の合計で、２１種類の１本データ、２〜６本加算データが得られる。
【０１２４】
ステップＳＴ３でＣＰＵ２３は対象キャラクタＣ１の１モジュール幅を算出する。この例では、演算部２３ａは、先に求めた２〜６本加算パターン（エレメント幅）の各々を１キャラクタのモジュール数に換算して２〜６本加算パターンのモジュール数を求める。図２Ｂ〜Ｇに示したように、カウンタ部４から出力されるカウントデータ値から、６種類の幅Ｗ１１データ〜幅Ｗ１６データ、５種類の幅Ｗ２１データ〜幅Ｗ２５データ、４種類の幅Ｗ３１データ〜幅Ｗ３４データ、３種類の幅Ｗ４１データ〜幅Ｗ４３データ、２種類の幅Ｗ５１データ及び幅Ｗ５２データ及び、１種類の幅Ｗ６１データがＣＰＵ２３に順次出力される。
【０１２５】
例えば、演算部２３ａは幅Ｗ２１データを入力し、対象キャラクタＣ１のバー（１）とスペース（２）とを加算した加算幅Ｗ２１のモジュール数を求める。モジュール数は全キャラクタ幅＝１１モジュールに対する加算幅Ｗ２１の比率、例えば、２．４を算出する。この場合、加算幅Ｗ２１のモジュール数は、バーやスペース等の各エレメントの最大誤差が１．０以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出するので、加算幅Ｗ２１のモジュール数は「２」又は「３」となる。
【０１２６】
この例では、各エレメントの最大誤差範囲を±１．０モジュール以内に拡張したので、各エレメントの誤差許容度が１．０以内まで許容量を増加できるようになる。許容量を増加したので、対象キャラクタ一致を採る条件を増加できる。これにより、バーコード記号１の誤読取を防止できるようになる。
【０１２７】
ステップＳＴ４でＣＰＵ２３は抽出された２１種類の幅データＤ１０を１〜６本加算パターン（エレメント幅）に変換する。この例では、６種類の幅Ｗ１１データ〜幅Ｗ１６データが１キャラクタの１本データに変換され、１本データに基づく対象キャラクタＣ１の被認識パターンとして、１本パターンが作成される。５種類の幅Ｗ２１データ〜幅Ｗ２５データは１キャラクタの２本加算データに変換され、２本加算データに基づく対象キャラクタＣ１の２本加算パターン（被認識パターン）が作成される。４種類の幅Ｗ３１データ〜幅Ｗ３４データは１キャラクタの３本加算データに変換され、３本加算データに基づく対象キャラクタＣ１の３本加算識パターンが作成される。  
３種類の幅Ｗ４１データ〜幅Ｗ４３データは１キャラクタの４本加算データに変換され、４本加算データに基づく対象キャラクタＣ１の４本加算パターンが作成される。２種類の幅Ｗ５１データ及び幅Ｗ５２データは１キャラクタの５本加算データに変換され、５本加算データに基づく対象キャラクタＣ１の５本加算パターンが作成される。１種類の幅Ｗ６１データは１キャラクタの６本加算データに変換され、６本加算データに基づく対象キャラクタＣ１の６本加算パターンが作成される。
【０１２８】
ステップＳＴ５でＣＰＵ２３は対象キャラクタを絞り込むために、１本パターン、２〜６本加算パターンの全てに対してモジュール数の誤差が１以内の対象キャラクタを検索して候補キャラクタを決定する。このとき、ＣＰＵ２３では抽出部２３ｂが、演算部２３ａによって求められた１本パターン、２〜６本加算パターンの各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出する。その際に、抽出部２３ｂは、演算部２３ａによって求められた１本パターン、２〜６本加算パターンの１キャラクタ分の６本の幅データＤ１０と、対象キャラクタの前後の（６−１）本の幅データＤ１０とを抽出する。
【０１２９】
ステップＳＴ６でＣＰＵ２３は、候補キャラクタが１つ以上存在するか否かに基づいて制御を分岐する。対象キャラクタが１つ以上（複数）存在する場合は、ステップＳＴ７で１〜６本加算パターンの実測値とその理想値との間の誤差を算出し、この誤差の合計が最小となった候補キャラクタをデコード結果とする。この誤差値が最小となる候補キャラクタは、期待値キャラクタと最も相関が強いキャラクタである。この例では、総合的な誤差が最も少ない対象キャラクタを候補キャラクタとして選択できるようになる。
【０１３０】
このとき、ＣＰＵ２３では、期待値キャラクタ（理論値）が期待値格納部２４からＣＰＵ２３の比較部２３ｃへ読み出される。比較部２３ｃは、抽出部２３ｂによって抽出された各々の２〜６本加算パターン（エレメント幅）のモジュール数の候補キャラクタと、候補キャラクタを評価するための期待値キャラクタ（理論値）とを比較する。この比較結果は検索部２３ｄへ出力される。
【０１３１】
検索部２３ｄでは、候補キャラクタと最も相関が強い期待値キャラクタが検索される。例えば、上述の演算部２３ａが候補キャラクタのモジュール数の実測値と、期待値キャラクタのモジュール数の理想値との間の誤差を算出すると、検索部２３ｄが、演算部２３ａによって算出された誤差を合計して得られる誤差値が最小となる候補キャラクタと最も相関が強い期待値キャラクタを検索する。この例では、誤差値が最小となる候補キャラクタと最も相関が強い期待値キャラクタを検索するので、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。
【０１３２】
以後は従来方式と同じ内容となる。例えば、図４に示すステップＳＴ８でＣＰＵ２３は、デコード結果の候補キャラクタがマージン直後の対象キャラクタか否かに基づいて制御を分岐する。デコード結果の候補キャラクタがマージン直後の対象キャラクタである場合は、ステップＳＴ９に移行してＣＰＵ２３はデコード結果の候補キャラクタがストップキャラクタか否かに基づいて制御を分岐する。
【０１３３】
デコード結果の候補キャラクタがストップキャラクタではない場合は、ステップＳＴ10に移行してＣＰＵ２３は誤り検知（パリティチェック）を実行し、チェックデジットが正しいか否かに基づいて制御を分岐する。チェックデジットが正しい場合は、読み取りを完了し、ステップＳＴ11でＣＰＵ２３はデコード結果となされた候補キャラクタのバーコードデータＤ１２を出力する。
【０１３４】
なお、ステップＳＴ８でＣＰＵ２３はデコード結果の候補キャラクタがマージン直後の対象キャラクタでない場合は、ステップＳＴ12に移行して、ＣＰＵ２３はデコード結果の候補キャラクタがスタートキャラクタか否かに基づいて制御を分岐する。
【０１３５】
上述のステップＳＴ９でＣＰＵ２３はデコード結果の候補キャラクタがストップキャラクタである場合及び、ステップＳＴ12でデコード結果の候補キャラクタがスタートキャラクタである場合は、図３に示すステップＳＴ13に移行する。ステップＳＴ13で、ＣＰＵ２３は次キャラクタ（６本後ろのデータ）のデコード処理を実行する。その後、ステップＳＴ２に戻る。
【０１３６】
また、ステップＳＴ12でデコード結果の候補キャラクタがスタートキャラクタでない場合及び、ステップＳＴ10でチェックデジットが誤っている場合は、ステップＳＴ14に移行して、ＣＰＵ２３は読み取りエラー処理を実行する。読み取りエラー処理では次のマージンを検索する等が行われる。キャラクタ認識がエラーとなった場合に、エラーキャラクタを仮に配置してバーコードデータを作成するようにしてもよい。
【０１３７】
その後、ステップＳＴ15に移行して、ＣＰＵ２３は終了を判別する。例えば、当該バーコード記号読取装置１００に対して読取終了指令が検出され、読取終了指令が検出された場合は、バーコード記号１の読み取り制御を終了する。読取終了指令が検出されていない場合は、バーコード記号１の読み取り制御を継続するべく、ステップＳＴ１に戻って、上述した内容を繰り返すようになされる。
【０１３８】
このように第１の実施例に係るバーコード記号読取装置１００によれば、バーコード記号１を読み取ってそのデコード結果を出力する場合に、演算部２３ａは、１キャラクタ内で隣接するバー及びスペースを含むｎ＝６（ｎ≧２）本のエレメントの幅を加算して２〜６本加算パターン（エレメント幅）を各々求める。演算部２３ａは、２〜６本加算パターンの各々を１キャラクタのモジュール数に換算して当該２〜６本加算パターンのモジュール数を求める。
【０１３９】
抽出部２３ｂは、演算部２３ａによって求められた２〜６本加算パターンの各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んで候補キャラクタを抽出する。これらを前提にして、検索部２３ｄが抽出部２３ｂによって抽出された各々の２〜６本加算パターンのモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較し、当該候補キャラクタと最も相関が強い期待値キャラクタを検索するようになる。
【０１４０】
この検索によって、複数の対象キャラクタから抽出された候補キャラクタと最も相関が強い期待値キャラクタのバーコードデータＤ１２を当該バーコード記号１の読取時のデコード結果として出力できるようになるので、従来方式のバーコード読み取り方法に比べて大幅にバーコード記号１の誤読取を防止できるようになる。
【０１４１】
しかも、誤差の範囲を従来方式の±０．５から±１．０に拡大し、候補キャラクタを増加させている。そして、１キャラクタ分の６本の幅データＤ１０と、当該キャラクタＣ１の前後の５本の幅データＤ１０とを抽出するので、２〜６本加算パターンの各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んだ候補キャラクタを従来方法に比べてより多く抽出できるようになる。
【０１４２】
また、第１番目に相関が強い候補キャラクタをデコード結果とするだけでなく、第２番目、第３番目・・・に相関が強い候補キャラクタがデコード結果となる確率が高くなるというようにデコード結果の候補キャラクタを複数出力できるようになる。これにより、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。これにより、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。なお、誤差の範囲を設定する際の閾値を可変することで、幅データＤ１０の信頼性を選択することも可能となる。
【０１４３】
続いて、図５Ａ〜Ｇを参照して、第１の実施例に係る１本データ、２本加算データの他の算出例（その１）について説明する。この例では、対象キャラクタＣ１の両側のキャラクタＣ０，Ｃ２まで加算範囲を拡張したものである。対象キャラクタＣ１と隣接する１つ前のキャラクタＣ０のスペース（６）及びバー（５）の２エレメントまで加算範囲を拡張し、１つ後ろのキャラクタＣ２のバー（１）及びスペース（２）の２エレメントまで加算範囲を拡張する場合を前提とする。
【０１４４】
図５Ａに示す対象キャラクタＣ１の１つ前にはキャラクタＣ０が設けられ、対象キャラクタＣ１の１つ後ろにはキャラクタＣ２が設けられる。各々のキャラクタＣ０〜Ｃ２は、その各々が全幅１１モジュールから構成される。３個のバー（１），（３），（５）及び３個のスペース（２），（４），（６）から構成される。バー（１）のモジュール数は「４」であり、バー（３），（５）のモジュール数は「１」である。また、スペース（２）のモジュール数は「１」であり、スペース（４），（６）のモジュール数は「２」である。これらのキャラクタＣ０〜Ｃ２を有したバーコードの場合を例に挙げて、対象キャラクタの作成する場合を説明する。
【０１４５】
図５Ｂに示す対象キャラクタＣ１のＷ１１は、黒部分のバー（１）の幅である。バー（１）の幅はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１１データを成す。Ｗ１２は対象キャラクタＣ１のバー（１）に続くスペース（２）の幅である。スペース（２）の幅もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１２データを成す。Ｗ１３は対象キャラクタＣ１のスペース（２）に続くバー（３）の幅である。バー（３）の幅はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１３データを成す。
【０１４６】
Ｗ１４は対象キャラクタＣ１のバー（３）に続くスペース（４）の幅である。スペース（４）の幅もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１４データを成す。Ｗ１５は対象キャラクタＣ１のスペース（４）に続くバー（５）の幅である。バー（５）の幅はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１５データを成す。Ｗ１６は対象キャラクタＣ１のバー（５）に続くスペース（６）の幅である。スペース（６）の幅もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１６データを成す。上述の６種類の幅Ｗ１１データ〜幅Ｗ１６データは１キャラクタの１本データであり、幅データＤ１０を構成する。」
図５Ｃに示すＷ2-1は、１つ前の対象キャラクタＣ０のスペース（６）と対象キャラクタＣ１のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ2-1データを成す。Ｗ２１は１つ前のキャラクタＣ０のスペース（６）に続く対象キャラクタＣ１のバー（１）とスペース（２）の各々が演算部２３ａによって加算された幅（以下バー（１）＋スペース（２）と記す）である。バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ２１データを成す。Ｗ２２は対象キャラクタＣ１のバー（１）に続くスペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ２２データを成す。
【０１４７】
Ｗ２３は対象キャラクタＣ１のスペース（２）に続くバー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ２３データを成す。Ｗ２４は対象キャラクタＣ１のバー（３）に続くスペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ２４データを成す。
【０１４８】
Ｗ２５は対象キャラクタＣ１のスペース（４）に続くバー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ２５データを成す。Ｗ２６はバー（５）に続くスペース（６）及び１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ２６データを成す。上述の７種類の幅Ｗ2-1データ〜幅Ｗ２６データは１キャラクタの２本加算データであり、幅データＤ１０を構成する。
【０１４９】
図５Ｄに示すＷ3-2は、１つ前のキャラクタＣ０のバー（５）、スペース（６）及び、対象キャラクタＣ１のバー（１）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ3-2データを成す。Ｗ3-1は、１つ前のキャラクタＣ０のスペース（６）、対象キャラクタＣ１のバー（１）及び、スペース（２）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ3-1データを成す。
【０１５０】
Ｗ３１は対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ３１データを成す。Ｗ３２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ３２データを成す。
【０１５１】
Ｗ３３は対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ３３データを成す。Ｗ３４は対象キャラクタＣ１のバー（３）に続くスペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ３４データを成す。
【０１５２】
Ｗ３５は、対象キャラクタＣ１のスペース（４）に続くバー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ３５データを成す。Ｗ３６は、対象キャラクタＣ１のバー（３）に続くスペース（６）の１つ後ろのキャラクタＣ２のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ３６データを成す。上述の８種類の幅Ｗ3-2データ〜幅Ｗ３６データは１キャラクタの３本加算データであり、幅データＤ１０を構成する。
【０１５３】
図５Ｅに示すＷ4-2は、１つ前のキャラクタＣ０のバー（５）、スペース（６）、対象キャラクタＣ１のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ4-2データを成す。Ｗ4-1は、１つ前のキャラクタＣ０のスペース（６）、対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ4-1データを成す。
【０１５４】
Ｗ４１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ４１データを成す。Ｗ４２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ４２データを成す。
【０１５５】
Ｗ４３は対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ４３データを成す。Ｗ４４は、対象キャラクタＣ１のバー（３）に続くスペース（４）、バー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ４４データを成す。
【０１５６】
Ｗ４５は、対象キャラクタＣ１の白のスペース（４）に続くバー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）及び、スペース（２）の幅である。バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ４５データを成す。上述の７種類の幅Ｗ4-2データ〜幅Ｗ４５データは、１キャラクタの４本加算データであり、幅データＤ１０を構成する。
【０１５７】
図５Ｆに示すＷ5-2は、１つ前のキャラクタＣ０のバー（５）、スペース（６）、対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ5-2データを成す。Ｗ5-1は、１つ前のキャラクタＣ０のスペース（６）＋キャラクタＣ１のバー（１）＋スペース（２）＋バー（３）＋スペース（４）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ5-1データを成す。
【０１５８】
Ｗ５１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ５１データを成す。Ｗ５２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ５２データを成す。
【０１５９】
Ｗ５３は、対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）、バー（５）、スペース（６）及び１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ５３データを成す。Ｗ５４は、対象キャラクタＣ１のバー（３）に続くスペース（４）、バー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ５４データを成す。上述の６種類の幅Ｗ5-2データ及び幅Ｗ５４データは１キャラクタの５本加算データであり、幅データＤ１０を構成する。
【０１６０】
図５Ｇに示すＷ6-2は、１つ前のキャラクタＣ０のバー（５）、スペース（６）、対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋キャラクタＣ１のバー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ6-2データを成す。
【０１６１】
Ｗ6-1は、１つ前のキャラクタＣ０のスペース（６）、対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ6-1データを成す。
【０１６２】
Ｗ６１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ６１データを成す。
【０１６３】
Ｗ６２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）、スペース（４）、バー（５）、スペース（６）及び１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ６２データを成す。
【０１６４】
Ｗ６３は対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）、バー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ６３データを成す。上述の５種類の幅Ｗ6-2データ及び幅Ｗ６３データは１キャラクタの６本加算データであり、幅データＤ１０を構成する。
【０１６５】
上述のカウンタ部４から出力されるカウントデータ値に基づいて、６種類の幅Ｗ１１データ〜幅Ｗ１６データ（１本データ）、７種類の幅Ｗ2-1データ〜幅Ｗ２６データ（２本加算データ）、８種類の幅Ｗ3-2データ〜幅Ｗ３６データ（３本加算データ）、７種類の幅Ｗ4-2データ〜幅Ｗ４５データ（４本加算データ）、６種類の幅Ｗ5-2データ及び幅Ｗ５４データ（５本加算データ）及び、５種類の幅Ｗ6-2データ及び幅Ｗ６３データ（６本加算データ）の合計で、３９種類の１本データ、２〜６本加算データが得られる。
【０１６６】
続いて、図６Ａ〜Ｇを参照して、第１の実施例に係る１本データ、２本〜６本加算データの他の算出例（その２）について説明する。この例では、対象キャラクタＣ１の両側のキャラクタＣ０，Ｃ２まで加算範囲を拡張する場合であって、図６Ａに示す対象キャラクタＣ１と隣接する１つ前のキャラクタＣ０のスペース（６）、バー（５）、スペース（４）、バー（３）及びスペース（２）の５エレメントまで加算範囲を拡張し、かつ、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の５エレメントまで加算範囲を拡張する場合を前提とする。これらのキャラクタＣ０〜Ｃ２を有したバーコード記号１の場合を例に挙げて、対象キャラクタを作成する場合を説明する。
【０１６７】
図６Ｂに示すＷ１１は対象キャラクタＣ１の黒部分のバー（１）の幅である。バー（１）の幅はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１１データを成す。Ｗ１２は対象キャラクタＣ１のバー（１）に続くスペース（２）の幅である。スペース（２）の幅もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１２データを成す。Ｗ１３はスペース（２）に続くバー（３）の幅である。バー（３）の幅はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１３データを成す。
【０１６８】
Ｗ１４は対象キャラクタＣ１のバー（３）に続くスペース（４）の幅である。スペース（４）の幅もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１４データを成す。Ｗ１５は対象キャラクタＣ１のスペース（４）に続くバー（５）の幅である。バー（５）の幅はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１５データを成す。Ｗ１６は対象キャラクタＣ１のバー（５）に続くスペース（６）の幅である。スペース（６）の幅もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１６データを成す。上述の６種類の幅Ｗ１１データ〜幅Ｗ１６データは１キャラクタの１本データであり、幅データＤ１０を構成する。
【０１６９】
図６Ｃに示すＷ2-1は、１つ前のキャラクタＣ０のスペース（６）と対象キャラクタＣ１のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ2-1データを成す。Ｗ２１は１つ前のキャラクタＣ０のスペース（６）に続くバー（１）とスペース（２）の各々が演算部２３ａによって加算された幅（以下バー（１）＋スペース（２）と記す）である。バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ２１データを成す。Ｗ２２は対象キャラクタＣ１のバー（１）に続くスペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ２２データを成す。
【０１７０】
Ｗ２３は対象キャラクタＣ１のスペース（２）に続くバー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ２３データを成す。Ｗ２４は対象キャラクタＣ１のバー（３）に続くスペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ２４データを成す。Ｗ２５は対象キャラクタＣ１のスペース（４）に続くバー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ２５データを成す。Ｗ２６は対象キャラクタＣ１のバー（５）に続くスペース（６）及び１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ２６データを成す。上述の７種類の幅Ｗ2-1データ〜幅Ｗ２６データは１キャラクタの２本加算データであり、幅データＤ１０を構成する。
【０１７１】
図６Ｄに示すＷ3-2は、１つ前のキャラクタＣ０のバー（５）、スペース（６）及び、対象キャラクタＣ１のバー（１）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ3-2データを成す。Ｗ3-1は、１つ前のキャラクタＣ０のスペース（６）対象キャラクタＣ１のバー（１）及び、スペース（２）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ3-1データを成す。
【０１７２】
Ｗ３１は対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ３１データを成す。Ｗ３２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ３２データを成す。
【０１７３】
Ｗ３３は対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ３３データを成す。Ｗ３４はバー（３）に続くスペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ３４データを成す。
【０１７４】
Ｗ３５は、対象キャラクタＣ１のスペース（４）に続くバー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ３５データを成す。Ｗ３６は、対象キャラクタＣ１のバー（３）に続くスペース（６）の１つ後ろのキャラクタＣ２のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ３６データを成す。上述の８種類の幅Ｗ3-2データ〜幅Ｗ３６データは１キャラクタの３本加算データであり、幅データＤ１０を構成する。
【０１７５】
図６Ｅに示すＷ4-３は、１つ前のキャラクタＣ０のスペース（４）、バー（５）、スペース（６）及び、バー（１）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ4-3データを成す。Ｗ4-2は、１つ前のキャラクタＣ０のバー（５）、スペース（６）、対象キャラクタＣ１のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ4-2データを成す。
【０１７６】
Ｗ4-1は、１つ前のキャラクタＣ０のスペース（６）、対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ4-1データを成す。Ｗ４１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ４１データを成す。Ｗ４２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ４２データを成す。
【０１７７】
Ｗ４３は対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ４３データを成す。Ｗ４４は、対象キャラクタＣ１のバー（３）に続くスペース（４）、バー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ４４データを成す。
【０１７８】
Ｗ４５は、対象キャラクタＣ１の白のスペース（４）に続くバー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）及び、スペース（２）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ４５データを成す。Ｗ４６は、対象キャラクタＣ１のバー（５）に続くスペース（６）、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ４６データを成す。上述の９種類の幅Ｗ4-3データ〜幅Ｗ４６データは１キャラクタの４本加算データであり、幅データＤ１０を構成する。
【０１７９】
図６Ｆに示すＷ5-4は、１つ前のキャラクタＣ０のバー（３）、スペース（４）、バー（５）、スペース（６）＋キャラクタＣ１のバー（１）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ5-4データを成す。Ｗ5-3は、１つ前のキャラクタＣ０のスペース（４）、バー（５）、スペース（６）、対象キャラクタＣ１のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ5-3データを成す。
【０１８０】
Ｗ5-2は、１つ前のキャラクタＣ０のバー（５）、スペース（６）、対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ5-2データを成す。Ｗ5-1は、１つ前のキャラクタＣ０のスペース（６）、対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ5-1データを成す。
【０１８１】
Ｗ５１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ５１データを成す。Ｗ５２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ５２データを成す。
【０１８２】
Ｗ５３は、対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）、バー（５）、スペース（６）及び１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ５３データを成す。Ｗ５４は、対象キャラクタＣ１のバー（３）に続くスペース（４）、バー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ５４データを成す。
【０１８３】
Ｗ５５は、対象キャラクタＣ１のスペース（４）に続くバー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）及び、バー（３）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ５５データを成す。Ｗ５６は、対象キャラクタＣ１のバー（５）に続くスペース（６）、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。スペース（６）＋バー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ５６データを成す。上述の１０種類の幅Ｗ5-4データ及び幅Ｗ５６データは１キャラクタの５本加算データであり、幅データＤ１０を構成する。
【０１８４】
図６Ｇに示すＷ6-5は、１つ前のキャラクタＣ０のスペース（２）、バー（３）、スペース（４）、バー（５）、スペース（６）及び、対象キャラクタＣ１のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ6-5データを成す。Ｗ6-4は、１つ前のキャラクタＣ０のバー（３）、スペース（４）、バー（５）、スペース（６）、対象キャラクタＣ１のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ6-4データを成す。
【０１８５】
Ｗ6-3は、１つ前のキャラクタＣ０のスペース（４）、バー（５）、スペース（６）、対象キャラクタＣ１のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）＋バー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ6-3データを成す。Ｗ6-2は、１つ前のキャラクタＣ０のバー（５）＋スペース（６）＋キャラクタＣ１のバー（１）＋スペース（２）＋バー（３）＋スペース（４）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋キャラクタＣ１のバー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ6-2データを成す。
【０１８６】
Ｗ6-1は、１つ前のキャラクタＣ０のスペース（６）＋キャラクタＣ１のバー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）の各々が演算部２３ａによって加算された幅である。スペース（６）＋キャラクタＣ１のバー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ6-1データを成す。
【０１８７】
Ｗ６１は対象キャラクタＣ１のバー（１）、スペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の各々が演算部２３ａによって加算された幅である。バー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）の加算幅を示すカウントデータ値が幅Ｗ６１データを成す。
【０１８８】
Ｗ６２は対象キャラクタＣ１のバー（１）に続くスペース（２）、バー（３）、スペース（４）、バー（５）、スペース（６）及び、１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された幅である。スペース（２）＋バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）の加算幅を示すカウントデータ値が幅Ｗ６２データを成す。
【０１８９】
Ｗ６３は対象キャラクタＣ１のスペース（２）に続くバー（３）、スペース（４）、バー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）及びスペース（２）の各々が演算部２３ａによって加算された幅である。バー（３）＋スペース（４）＋バー（５）＋スペース（６）＋バー（１）＋スペース（２）の加算幅を示すカウントデータ値が幅Ｗ６３データを成す。
【０１９０】
Ｗ６４は、対象キャラクタＣ１のバー（３）に続くスペース（４）、バー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）及びバー（３）の各々が演算部２３ａによって加算された幅である。スペース（４）＋バー（５）＋スペース（６）＋１つ後ろのキャラクタＣ２のバー（１）＋スペース（２）＋バー（３）の加算幅を示すカウントデータ値が幅Ｗ６４データを成す。
【０１９１】
Ｗ６５は、対象キャラクタＣ１のスペース（４）に続くバー（５）、スペース（６）、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）、バー（３）及びスペース（４）の各々が演算部２３ａによって加算された幅である。バー（５）＋スペース（６）＋１つ後ろのキャラクタＣ２のバー（１）＋スペース（２）＋バー（３）＋スペース（４）の加算幅を示すカウントデータ値が幅Ｗ６５データを成す。
【０１９２】
Ｗ６６は、対象キャラクタＣ１のバー（５）に続くスペース（６）、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の各々が演算部２３ａによって加算された幅である。スペース（６）＋１つ後ろのキャラクタＣ２のバー（１）＋スペース（２）＋バー（３）＋スペース（４）＋バー（５）の加算幅を示すカウントデータ値が幅Ｗ６６データを成す。上述の１１種類の幅Ｗ6-5データ及び幅Ｗ６６データは１キャラクタの６本加算データであり、幅データＤ１０を構成する。
【０１９３】
この例では、図１に示したカウンタ部４から出力されるカウントデータ値に基づいて、６種類の幅Ｗ１１データ〜幅Ｗ１６データ（１本データ）、７種類の幅Ｗ2-1データ〜幅Ｗ２６データ（２本加算データ）、８種類の幅Ｗ3-2データ〜幅Ｗ３６データ（３本加算データ）、９種類の幅Ｗ4-3データ〜幅Ｗ４６データ（４本加算データ）、１０種類の幅Ｗ5-4データ及び幅Ｗ５６データ（５本加算データ）及び、１１種類の幅Ｗ6-5データ及び幅Ｗ６６データ（６本加算データ）の合計で、５１種類の１本データ、２〜６本加算データが得られる。
【実施例２】
【０１９４】
続いて、図７〜図１０を参照して、第２の実施例に係るデコード例について説明する。ここで、図７Ａ〜Ｃを参照して、ＣＯＤＥ１２８のバーコード記号例、その欠損例及びその再構成例について説明をする。図７Ａに示すＣＯＤＥ１２８のバーコード記号１は、バーやスペース等の欠落や傷等を生じていないものである。バーコード記号１は８キャラクタから構成され、例えば、バーコードデータＤ１２は、数字の「１２３４５６７８」を表現する。
【０１９５】
図７Ｂに示すＣＯＤＥ１２８のバーコード記号１’は、バーやスペース等に欠落や傷等が生じているものである。バーコード記号１’は図７Ａに示したＣＯＤＥ１２８のバーコード記号１に生じたものと仮定する。図中の３本の横向き破線は、閾値th１〜th３である。各々の閾値th１〜th３は、スキャン方向と直交する上・中・下段に設定されている。
【０１９６】
閾値th１を基準にしてバーコード記号１’をスキャンして、データを読み込むと、傷等によりキャラクタ「３」及び「４」が欠落している。閾値th２を基準にしてバーコード記号１’をスキャンしてデータを読み込むと、傷等によりキャラクタ「３」〜「６」が欠落している。閾値th３を基準にしてバーコード記号１’をスキャンしてデータを読み込むと、傷等によりキャラクタ「７」及び「８」が欠落している。
【０１９７】
図７Ｃに示すように閾値th１を基準にしたデコード結果は、「１２？？５６７８」を示すバーコードデータＤ１２が出力される。「３」及び「４」がデコードされていない。閾値th２を基準にしたデコード結果は、「１２？？？？７８」を示すバーコードデータＤ１２が出力される。「３」〜「６」がデコードされていない。閾値th３を基準にしたデコード結果は、「１２３４５６？？」を示すバーコードデータＤ１２が出力される。「７」及び「８」がデコードされていない。
【０１９８】
第２の実施例では、図７Ｂに示したようにバーやスペース等に欠落や傷等が生じている場合であっても、「１２？？５６７８」や、「１２？？？？７８」、「１２３４５６？？」等を「１２３４５６７８」を表現するバーコードデータＤ１２に再構成するようになされる。
【０１９９】
この例では、スキャン方向と直交する上・中・下段に次々とスキャンを行って、エラーキャラクタを補正し、エラーキャラクタが無くなった時点でＣＤ（チェックデジット）の照合を行って、バーコードデータＤ１２を作成するようにした。これにより、かすれ、汚れ等により、エレメントの一部が欠落しているバーコード記号１であってもその読み取りが可能となる。
【０２００】
また、第１の実施例では１キャラクタ内の幅データＤ１０のみを利用した場合について説明したが、１キャラクタ内の端部の幅データＤ１０が利用される回数が少ない。例えば、対象キャラクタＣ１のバー（１）の幅Ｗ１１データは２本加算パターンの算出時、加算幅Ｗ２１でのみ利用されるが、スペース（２）の幅Ｗ１２データは、２本加算パターンの算出時、加算幅Ｗ２１と加算幅Ｗ２２とで利用されている。そこで、第２の実施例では当該キャラクタＣ１に隣接するキャラクタＣ０，Ｃ２も含めたエレメント部分も含めて計算を行うようにした。
【０２０１】
続いて、図８〜図１０を参照して、第２の実施例に係る難読キャラクタのデコード例（その１〜３）について説明する。この実施例では、パターン認識する加算範囲を両側の２キャラクタのエレメントまで拡張した。加算範囲は、図７Ａに示した対象キャラクタと隣接する１つ前のキャラクタＣ０のスペース（６）、バー（５）、スペース（４）、バー（３）及びスペース（２）の５エレメントまで拡張し、かつ、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の５エレメントまで拡張する場合を前提とする。この加算範囲の拡張によって、５１種類の１本データ、２〜６本加算データからデコード結果を得る場合を前提とする（マルチスキャンリコントラクション）。
【０２０２】
これらをデコード条件にして、図８に示すフローチャートのステップＳＴ21でＣＰＵ２３はスタートマージンを検索する。このとき、光学読取部２は、第１の実施例と同様にして、バーコード記号１を読み取って、コード読取データＤ２を発生する。コード読取データＤ２は、光学読取部２からカウンタ部４へ出力される。クロック発生部３は、所定周波数のサンプリングク用のＣＬＫ信号をカウンタ部４に出力する。
【０２０３】
カウンタ部４は光学読取部２から出力されるコード読取データＤ２を入力すると共に、クロック発生部３から出力されるＣＬＫ信号を入力し、ＣＬＫ信号に基づいてコード読取データＤ２をカウントし、コード読取データＤ２を白部分のスペースおよび黒部分のバーを含むエレメントの１本幅及び２本加算幅を示すカウントデータＤ４に変換する。カウントデータＤ４は、バーコード記号１における各バー（黒部分）の幅およびスペース（白部分）の幅を示す数値データ列となる。カウントデータＤ４は、幅データ格納部１０に保存される。なお、スタートマージンの検索については、その説明を省略する。
【０２０４】
ステップＳＴ22でＣＰＵ２３は、１キャラクタ分の幅データ（６本）を抽出する。図１５に示したキャラクタＣ１によれば、黒部分のバー（１）の幅Ｗ１１がカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１１データとなる。バー（１）に続く白部分のスペース（２）の幅Ｗ１２もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１２データとなる。スペース（２）に続くバー（３）の幅Ｗ１３はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１３データとなる。
【０２０５】
このバー（３）に続くスペース（４）の幅Ｗ１４もカウンタ部４により計数され、そのカウントデータ値は幅Ｗ１４データとなる。スペース（４）に続くバー（５）の幅Ｗ１５はカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１５データとなる。バー（５）に続くスペース（６）の幅Ｗ１６もカウンタ部４により計数され、そのカウントデータ値が幅Ｗ１６データとなる。上述の６種類の幅Ｗ１１データ〜幅Ｗ１６データはバーコードデータ値Ｄ３０を構成する。バーコードデータ値Ｄ３０はインターフェース部１１を介してＣＰＵ２３に出力される。
【０２０６】
ステップＳＴ23でＣＰＵ２３はバーの分割、消失の有無に基づいて制御を分岐する。バーの分割、消失の有無については、６本の幅の合計と１キャラクタ幅とを比較し、１キャラクタ分の幅データＤ10が適切かを判断する。ここでは、１キャラクタ内で隣接するバー及びスペースを含む６本のエレメントの幅を加算した合計値と、１キャラクタの全幅を示す全幅値とを比較し、比較結果に基づいて１キャラクタ分の幅データＤ１０が適切か否かを判別する。
【０２０７】
この例で、ＣＰＵ２３では比較部２３ｃが１キャラクタ内で隣接する６本のバー（１）、スペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の幅Ｗ１〜Ｗ６の合計と、１キャラクタの全幅を示す全幅値とを比較する。比較部２３ｃによる比較結果によって、１キャラクタ分の幅データＤ１０が適切か否かが判別でき、この判別に基づいてキャラクタのバーの消失や分割等を判断できるようになる。また、複数のスキャンのデコード結果を組み合わせることが可能となり、汚れや、かすれがひどいバーコードにおいても読み取りが可能となる。
【０２０８】
また、当該キャラクタＣ１の前後のキャラクタＣ０，Ｃ２の全幅からキャラクタフレームを判定できるので、ボイドやスポット等によるエレメントに過不足が有っても、デコードを継続できるようになる。また、バーの消失や分割等の判断結果に基づいて対象キャラクタを絞ることができ、計算量の軽減が図れ、処理時間の高速化につながる。
【０２０９】
バーの分割、消失が無い場合は、ステップＳＴ24でＣＰＵ２３は１モジュール幅を算出し、１キャラクタ幅を記憶する。このとき、演算部２３ａは、６種類の幅Ｗ１１データ〜幅Ｗ１６データに基づいて当該キャラクタＣ１の１モジュール幅を算出する。１キャラクタ幅は、図７Ｂに示した１キャラクタ内で隣接する６本のバー（１）、スペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の幅Ｗ１〜Ｗ６を合計して求められる。
【０２１０】
ステップＳＴ25でＣＰＵ２３は１キャラクタ分の幅データＤ１０を２本加算パターンに変換する。例えば、図７Ｃに示した１つ前のキャラクタＣ０のスペース（６）と対象キャラクタＣ１のバー（１）の各々が演算部２３ａによって加算された加算幅Ｗ2-1を示すカウントデータ値が幅Ｗ2-1データとなる。
【０２１１】
同様にして、１つ前のキャラクタＣ０のスペース（６）に続くバー（１）とスペース（２）の各々が演算部２３ａによって加算された加算幅Ｗ２１を示すカウントデータ値が幅Ｗ２１データとなる。対象キャラクタＣ１のバー（１）に続くスペース（２）及びバー（３）の各々が演算部２３ａによって加算された加算幅Ｗ２２を示すカウントデータ値が幅Ｗ２２データとなる。
【０２１２】
対象キャラクタＣ１のスペース（２）に続くバー（３）及びスペース（４）の各々が演算部２３ａによって加算された加算幅Ｗ２３を示すカウントデータ値が幅Ｗ２３データとなる。対象キャラクタＣ１のバー（３）に続くスペース（４）及びバー（５）の各々が演算部２３ａによって加算された加算幅Ｗ２４を示すカウントデータ値が幅Ｗ２４データとなる。
【０２１３】
対象キャラクタＣ１のスペース（４）に続くバー（５）及びスペース（６）の各々が演算部２３ａによって加算された加算幅Ｗ２５を示すカウントデータ値が幅Ｗ２５データとなる。対象キャラクタＣ１のバー（３）に続くスペース（４）及び１つ後ろのキャラクタＣ２のバー（１）の各々が演算部２３ａによって加算された加算幅Ｗ２６を示すカウントデータ値が幅Ｗ２６データとなる。上述の７種類の幅Ｗ2-1データ〜幅Ｗ２６データは１キャラクタの２本加算データであり、幅データＤ１０から構成される。
【０２１４】
その後、ステップＳＴ26でＣＰＵ２３は、先に変換した２本加算パターンが一致するキャラクタを検索する。この例では、図１に示したカウンタ部４から出力されるカウントデータ値に基づいて、検索部２３ｄが、６種類の幅Ｗ１１データ〜幅Ｗ１６データ（１本データ）、７種類の幅Ｗ2-1データ〜幅Ｗ２６データ（２本加算データ）、８種類の幅Ｗ3-2データ〜幅Ｗ３６データ（３本加算データ）、９種類の幅Ｗ4-3データ〜幅Ｗ４６データ（４本加算データ）、１０種類の幅Ｗ5-4データ及び幅Ｗ５６データ（５本加算データ）及び、１１種類の幅Ｗ6-5データ及び幅Ｗ６６データ（６本加算データ）の５１種類の１本データ、２〜６本加算データＣ１に対して一致するキャラクタを検索する。その際に各エレメントの幅に対して２種類の対象キャラクタのどちらかと一致する対象キャラクタを検索し、対象キャラクタを絞り込む。この絞り込みにより、おおよそ１〜４程度の候補キャラクタが検索される。
【０２１５】
ステップＳＴ27でＣＰＵ２３は一致するキャラクタの存在有無に基づいて制御を分岐する。一致するキャラクタが存在する場合は、ステップＳＴ28で２本加算パターンが一致した対象キャラクタをデコード結果とする。その後、図９に示すステップＳＴ31に移行する。
【０２１６】
なお、ステップＳＴ23でバーの分割、消失が有る場合、及び、ステップＳＴ27で一致するキャラクタが存在しない場合は、ステップＳＴ29でＣＰＵ２３は現在のキャラクタをエラーキャラクタとする。その後、ステップＳＴ30でＣＰＵ２３は次のキャラクタ（１キャラクタ幅分後ろのデータ）のデコード処理に移行する。その後、ステップＳＴ22に移行して、上述した内容を繰り返す。
【０２１７】
上述のステップＳＴ28でデコード結果となされた候補キャラクタについては、図９に示すステップＳＴ31でＣＰＵ２３はマージン直後のキャラクタか否かに基づいて制御を分岐する。デコード結果となされた候補キャラクタが、マージン直後のキャラクタではない場合は、ステップＳＴ32に移行してＣＰＵ２３はデコード結果がストップキャラクタか否かに基づいて制御を分岐する。デコード結果がストップキャラクタである場合は、ステップＳＴ33に移行してＣＰＵ２３は、デコード結果にエラーキャラクタが存在しないか否かに基づいて制御を分岐する。
【０２１８】
デコード結果にエラーキャラクタが存在しない場合は、ステップＳＴ34に移行して、ＣＰＵ２３はデコードバッファ２５に現在（今）のスキャンのデコード結果を上書きする。その後、ステップＳＴ35に移行してＣＰＵ２３は誤り検知（パリティチェック）を実行して、チェックデジットが正しいか否かに基づいて制御を分岐する。チェックデジットが正しい場合は、ステップＳＴ36でＣＰＵ２３は読み取りを完了し、デコードバッファ２５のバーコードデータＤ１２を出力し、デコードバッファ２５をクリアする（正常終了）。その後、ステップＳＴ45に移行する。
【０２１９】
なお、ステップＳＴ31でマージン直後のキャラクタである場合は、ステップＳＴ37に移行してＣＰＵ２３は、デコード結果がスタートキャラクタか否かに基づいて制御を分岐する。上述のステップＳＴ37でデコード結果がスタートキャラクタでない場合及び、ステップＳＴ32でデコード結果がストップキャラクタでない場合は、ステップＳＴ38に移行する。ステップＳＴ38でＣＰＵ２３は、次キャラクタ（６本後ろの幅データＤ１０）のデコード処理を実行する。その後、ステップＳＴ22に戻る。
【０２２０】
また、ステップＳＴ33でデコード結果にエラーキャラクタが存在している場合は、図１０に示すステップＳＴ39でＣＰＵ２３はデコードバッファ２５の長さとデコードデータ長とが等しいか否かに基づいて制御を分岐する。デコードバッファ２５の長さとデコードデータ長とが等しい場合は、ステップＳＴ41で、デコードバッファ２５のエラーキャラクタ部分のデコードが成功していたらデータを書き換える。その後、ステップＳＴ42に移行して、デコードバッファ２５にエラーキャラクタが存在しない否かに基づいて制御を分岐する。デコードバッファ２５にエラーキャラクタが存在していない場合は、ステップＳＴ35に戻る。
【０２２１】
上述のステップＳＴ35でチェックデジットが誤っている場合は、図１０に示すステップＳＴ43でデコードバッファ２５をクリアした後、図９に示したステップＳＴ37でデコード結果がスタートキャラクタではない場合、図１０に示したステップＳＴ39でデコードバッファ２５の長さとデコードデータ長とが異なる場合は、ステップＳＴ40でデコードバッファ２５をクリアした後、及び、ステップＳＴ42でデコードバッファ２５にエラーキャラクタが存在する場合は、ステップＳＴ44に移行してＣＰＵ２３は、読み取りエラー処理を実行する。読み取りエラー処理では次のマージンを検索する等が行われる。
【０２２２】
また、キャラクタ認識がエラーとなった場合に、エラーキャラクタを仮に配置してバーコードデータを作成するようにしてもよい。その後、図９に示すステップＳＴ45に移行して、ＣＰＵ２３は終了を判別する。例えば、当該バーコード記号読取装置１００に対して読取終了指令が検出され、読取終了指令が検出された場合は、バーコード記号１の読み取り制御を終了する。読取終了指令が検出されていない場合は、バーコード記号１の読み取り制御を継続するべく、ステップＳＴ21に戻って、上述した内容を繰り返すようになされる。
【０２２３】
このように第２の実施例に係るバーコード記号読取装置１００によれば、パターン認識する加算範囲を対象キャラクタの両側の２キャラクタＣ０，Ｃ２のエレメントまで拡張した。すなわち、加算範囲に関して、図７Ａに示した対象キャラクタと隣接する１つ前のキャラクタＣ０のスペース（６）、バー（５）、スペース（４）、バー（３）及びスペース（２）の５エレメントまで拡張し、かつ、１つ後ろのキャラクタＣ２のバー（１）、スペース（２）、バー（３）、スペース（４）及びバー（５）の５エレメントまで拡張したので、５１種類の対象キャラクタの中からデコード結果となる候補キャラクタを決定できるようになる。
【０２２４】
従って、キャラクタ内の幅データだけでパターン認識を行う従来方式に比べて、対象キャラクタの両側の２キャラクタＣ０，Ｃ２のエレメントも含めた部分についても計算に参画されるので、対象キャラクタの端部に、欠落、傷等の誤差が多く含まれるパターンであっても、誤読し難くなった。これにより、バー、スペース等のエレメント（エレメント）の幅の最大誤差が±０．５モジュール以上あっても、キャラクタとして認識できる可能性が高くなった。しかも、対象キャラクタを絞ることによって、計算量の軽減が図れ、パターン認識処理に係る時間が短縮され、データ処理の高速化につながる。
【実施例３】
【０２２５】
続いて、図１１〜図１３を参照して、第３の実施例に係る難読キャラクタのデコード例（その１〜３）について説明する。この実施例では、第１の実施例で説明したキャラクタデコードアルゴリズムと、第２の実施例で説明したマルチスキャンリコントラクションとを併合した処理が行われる。これらをデコード条件にして、図１１に示すフローチャートのステップＳＴ51でスタートマージンを検索する。このとき、光学読取部２は、第１の実施例と同様にして、バーコード記号１を読み取って、コード読取データＤ２を発生する。コード読取データＤ２は、光学読取部２からカウンタ部４へ出力される。クロック発生部３は、所定周波数のサンプリングク用のＣＬＫ信号をカウンタ部４に出力する。
【０２２６】
カウンタ部４は光学読取部２から出力されるコード読取データＤ２を入力すると共に、クロック発生部３から出力されるＣＬＫ信号を入力し、ＣＬＫ信号に基づいてコード読取データＤ２をカウントし、コード読取データＤ２を白部分のスペースおよび黒部分のバーを含むエレメントの１本幅及び２本加算幅を示すカウントデータＤ４に変換する。カウントデータＤ４は、バーコード記号１における各バー（黒部分）の幅およびスペース（白部分）の幅を示す数値データ列となる。カウントデータＤ４は、幅データ格納部１０に保存される。なお、スタートマージンの検索については、その説明を省略する。
【０２２７】
ステップＳＴ52でＣＰＵ２３は６本の幅の合計と１キャラクタ幅とを比較し、１キャラクタ分の幅データＤ10が適切かを判断する。ここでは、１キャラクタ内で隣接するバー及びスペースを含む６本のエレメントの幅を加算した合計値と、１キャラクタの全幅を示す全幅値とを比較し、比較結果に基づいて１キャラクタ分の幅データＤ１０が適切か否かを判別する。
【０２２８】
この例で、ＣＰＵ２３では比較部２３ｃが１キャラクタ内で隣接する６本のバー（１）、スペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の幅Ｗ１〜Ｗ６の合計と、１キャラクタの全幅を示す全幅値とを比較する。比較部２３ｃによる比較結果によって、１キャラクタ分の幅データＤ１０が適切か否かが判別でき、この判別に基づいてキャラクタ候補を絞ることができ、計算量の軽減が図れ、処理時間の高速化につながる。
【０２２９】
ステップＳＴ53でＣＰＵ２３はバーの分割、消失の有無に基づいて制御を分岐する。バーの分割、消失の有無については、比較部２３ｃによる比較結果を利用する。対象キャラクタＣ１の前後のキャラクタＣ０，Ｃ２の全幅からキャラクタフレームを判定できるので、ボイドやスポット等によるエレメントに過不足が有っても、デコードを継続できるようになる。
【０２３０】
バーの分割、消失が無い場合は、ステップＳＴ54でＣＰＵ２３は１モジュール幅を算出し、１キャラクタ幅を記憶する。このとき、演算部２３ａは、６種類の幅Ｗ１１データ〜幅Ｗ１６データに基づいて対象キャラクタＣ１の１モジュール幅を算出する。１キャラクタ幅は、図７Ｂに示した１キャラクタ内で隣接する６本のバー（１）、スペース（２）、バー（３）、スペース（４）、バー（５）及びスペース（６）の幅Ｗ１〜Ｗ６を合計して求められる。
【０２３１】
ステップＳＴ55でＣＰＵ２３は抽出された２１種類の幅データＤ１０を１〜６本加算パターン（エレメント幅）に変換する。この例では、６種類の幅Ｗ１１データ〜幅Ｗ１６データが１キャラクタの１本データに変換され、１本データに基づく対象キャラクタＣ１の被認識パターンとして、１本パターンが作成される。５種類の幅Ｗ２１データ〜幅Ｗ２５データは１キャラクタの２本加算データに変換され、２本加算データに基づく対象キャラクタＣ１の２本加算パターン（被認識パターン）が作成される。４種類の幅Ｗ３１データ〜幅Ｗ３４データは１キャラクタの３本加算データに変換され、３本加算データに基づく対象キャラクタＣ１の３本加算識パターンが作成される。  
３種類の幅Ｗ４１データ〜幅Ｗ４３データは１キャラクタの４本加算データに変換され、４本加算データに基づく対象キャラクタＣ１の４本加算パターンが作成される。２種類の幅Ｗ５１データ及び幅Ｗ５２データは１キャラクタの５本加算データに変換され、５本加算データに基づく対象キャラクタの５本加算パターンが作成される。１種類の幅Ｗ６１データは１キャラクタの６本加算データに変換され、６本加算データに基づく対象キャラクタＣ４の６本加算パターンが作成される。
【０２３２】
ステップＳＴ56でＣＰＵ２３はキャラクタを絞り込むために、１本パターン、２〜６本加算パターンの全てに対してモジュール数の誤差が１以内のキャラクタを検索して候補キャラクタを決定する。このとき、ＣＰＵ２３では抽出部２３ｂが、演算部２３ａによって求められた１本パターン、２〜６本加算パターンの各々のモジュール数が誤差１以内の整数となる対象キャラクタＣ１等を絞り込んで候補キャラクタを抽出する。その際に、抽出部２３ｂは、演算部２３ａによって求められた１本パターン、２〜６本加算パターンの１キャラクタ分の６本の幅データＤ１０と、対象キャラクタの前後の（６−１）本の幅データＤ１０とを抽出する。
【０２３３】
ステップＳＴ57でＣＰＵ２３は、候補キャラクタが１つ以上存在するか否かに基づいて制御を分岐する。候補キャラクタが１つ以上（複数）存在する場合は、ステップＳＴ58で１〜６本加算パターンの実測値とその理想値との間の誤差を算出し、この誤差の合計が最小となった候補キャラクタをデコード結果とする。この誤差値が最小となる候補キャラクタは、期待値キャラクタと最も相関が強いキャラクタである。この例では、総合的な誤差が最も少ない対象キャラクタＣ１等を候補キャラクタとして選択できるようになる。
【０２３４】
このとき、ＣＰＵ２３では、期待値キャラクタ（理論値）が期待値格納部２４からＣＰＵ２３の比較部２３ｃへ読み出される。比較部２３ｃは、抽出部２３ｂによって抽出された各々の２〜６本加算パターン（エレメント幅）のモジュール数の候補キャラクタと、候補キャラクタを評価するための期待値キャラクタ（理論値）とを比較する。この比較結果は検索部２３ｄへ出力される。
【０２３５】
検索部２３ｄでは、候補キャラクタと最も相関が強い期待値キャラクタが検索される。例えば、上述の演算部２３ａが候補キャラクタのモジュール数の実測値と、期待値キャラクタのモジュール数の理想値との間の誤差を算出すると、検索部２３ｄが、演算部２３ａによって算出された誤差を合計して得られる誤差値が最小となる候補キャラクタと最も相関が強い期待値キャラクタを検索する。
【０２３６】
この例では、誤差値が最小となる候補キャラクタと最も相関が強い期待値キャラクタを検索するので、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。なお、ステップＳＴ57で候補キャラクタが存在しない場合は、ステップＳＴ59で現在のキャラクタをエラーキャラクタとする。その後、ステップＳＴ60で次のキャラクタ（キャラクタ幅分後ろのデータ）のデコード処理に移行する。
【０２３７】
上述のステップＳＴ58でデコード結果となされた候補キャラクタについては、図１２に示すステップＳＴ61でＣＰＵ２３はマージン直後の対象キャラクタか否かに基づいて制御を分岐する。デコード結果となされた候補キャラクタが、マージン直後の対象キャラクタではない場合は、ステップＳＴ62に移行してＣＰＵ２３はデコード結果がストップキャラクタか否かに基づいて制御を分岐する。デコード結果がストップキャラクタである場合は、ステップＳＴ63に移行してＣＰＵ２３は、デコード結果にエラーキャラクタが存在しないか否かに基づいて制御を分岐する。
【０２３８】
デコード結果にエラーキャラクタが存在しない場合は、ステップＳＴ64に移行して、ＣＰＵ２３はデコードバッファ２５に現在（今）のスキャンのデコード結果を上書きする。その後、ステップＳＴ65に移行してＣＰＵ２３は誤り検知（パリティチェック）を実行して、チェックデジットが正しいか否かに基づいて制御を分岐する。チェックデジットが正しい場合は、ステップＳＴ66でＣＰＵ２３は読み取りを完了し、デコードバッファ２５のバーコードデータＤ１２を出力し、デコードバッファ２５をクリアする（正常終了）。その後、ステップＳＴ65に移行する。
【０２３９】
なお、ステップＳＴ61でマージン直後の対象キャラクタである場合は、ステップＳＴ67に移行してＣＰＵ２３は、デコード結果がスタートキャラクタか否かに基づいて制御を分岐する。上述のステップＳＴ67でデコード結果がスタートキャラクタである場合及び、ステップＳＴ62でデコード結果がストップキャラクタである場合は、ステップＳＴ６8に移行する。ステップＳＴ68でＣＰＵ２３は、次キャラクタ（６本後ろの幅データＤ１０）のデコード処理を実行する。その後、ステップＳＴ52に戻る。
【０２４０】
また、ステップＳＴ63でデコード結果にエラーキャラクタが存在している場合は、図１３に示すステップＳＴ69でＣＰＵ２３はデコードバッファ２５の長さとデコードデータ長とが等しいか否かに基づいて制御を分岐する。デコードバッファ２５の長さとデコードデータ長とが等しい場合は、ステップＳＴ71で、デコードバッファ２５のエラーキャラクタ部分のデコードが成功していたらデータを書き換える。その後、ステップＳＴ72に移行して、デコードバッファ２５にエラーキャラクタが存在しない否かに基づいて制御を分岐する。デコードバッファ２５にエラーキャラクタが存在していない場合は、ステップＳＴ65に戻る。
【０２４１】
上述のステップＳＴ65でチェックデジットが誤っている場合は、図１３に示すステップＳＴ73でデコードバッファ２５をクリアした後、図１２に示したステップＳＴ67でデコード結果がスタートキャラクタではない場合、図１３に示したステップＳＴ69でデコードバッファ２５の長さとデコードデータ長とが異なる場合は、ステップＳＴ70でデコードバッファ２５をクリアした後、及び、ステップＳＴ72でデコードバッファ２５にエラーキャラクタが存在する場合は、ステップＳＴ74に移行してＣＰＵ２３は、読み取りエラー処理を実行する。読み取りエラー処理では次のマージンを検索する等が行われる。
【０２４２】
また、キャラクタ認識がエラーとなった場合に、エラーキャラクタを仮に配置してバーコードデータを作成するようにしてもよい。その後、図１２に示すステップＳＴ75に移行して、ＣＰＵ２３は終了を判別する。例えば、当該バーコード記号読取装置１００に対して読取終了指令が検出され、読取終了指令が検出された場合は、バーコード記号１の読み取り制御を終了する。読取終了指令が検出されていない場合は、バーコード記号１の読み取り制御を継続するべく、ステップＳＴ51に戻って、上述した内容を繰り返すようになされる。
【０２４３】
このように、第３の実施例に係るバーコード記号読取装置１００によれば、バーコード記号１を読み取ってそのデコード結果を出力する場合に、第１の実施例で説明したキャラクタデコードアルゴリズムと、第２の実施例で説明したマルチスキャンリコントラクションとを併合した処理が行われる。これを前提にして、検索部２３ｄが抽出部２３ｂによって抽出された各々の２〜６本加算パターンのモジュール数の候補キャラクタと、当該候補キャラクタを評価するための期待値キャラクタとを比較し、当該候補キャラクタと最も相関が強い期待値キャラクタを検索するようになる。
【０２４４】
この検索によって、複数の対象キャラクタから抽出された候補キャラクタと最も相関が強い期待値キャラクタのバーコードデータＤ１２を当該バーコード記号１の読取時のデコード結果として出力できるようになるので、従来方式のバーコード読み取り方法に比べて大幅にバーコード記号１の誤読取を防止できるようになる。
【０２４５】
しかも、誤差の範囲を従来方式の±０．５から±１．０に拡大し、対象キャラクタを増加させている。そして、１キャラクタ分の６本の幅データＤ１０と、対象キャラクタの前後の５本の幅データＤ１０とを抽出するので、２〜６本加算パターンの各々のモジュール数が誤差１以内の整数となる対象キャラクタを絞り込んだ候補キャラクタを従来方法に比べてより多く抽出できるようになる。また、候補キャラクタを絞ることによって、計算量の軽減が図れ、パターン認識処理に係る時間が短縮され、データ処理の高速化につながる。これにより、従来方式のバーコード読み取り方法に比べて大幅にバーコードの誤読取を防止できるようになる。なお、誤差の範囲を設定する際の閾値を可変することで、幅データＤ１０の信頼性を選択することも可能となる。
【０２４６】
この例では、バーコード記号の規格に関して、ＣＯＤＥ１２８の場合について説明したが、これに限られることはなく、ＣＯＤＥ３９、ＥＡＮ／ＵＰＣ、インターリーブド２オブ５、コーダバー、ＲＳＳ、ＲＳＳリミテッド、ＲＳＳエクスパンデド等の各々の方式についても、本発明を同様にして適用できるようになる。
【産業上の利用可能性】
【０２４７】
本発明は、バーコード記号を読み取ってバーコードデータを出力するバーコード記号読取装置に適用して極めて好適である。
【符号の説明】
【０２４８】
２・・・光学情報読取部、３・・・クロック発生部、４・・・カウンタ部、５・・・ｍ段データバッファ、６・・・セレクタ部、７・・・ｘ倍器、８・・・比較器、・・・スタートマージン格納部、１０・・・幅データ格納部、１１・・・インターフェース部、
１２・・・マイクロプロセッサ、２１・・・ＲＯＭ、２２・・・ＲＡＭ、２３・・・ＣＰＵ、２３ａ・・・演算部（演算手段）、２３ｂ・・・抽出部（抽出手段）、２３ｃ・・・比較部、２３ｄ・・・検索部、２４・・・期待値格納部、２５・・・デコードバッファ及び、１００・・・バーコード記号読取装置（光学情報読取装置）
【図１】
0005800525.tif 000002
【図２】
0005800525.tif 000003
【図３】
0005800525.tif 000004
【図４】
0005800525.tif 000005
【図５】
0005800525.tif 000006
【図６】
0005800525.tif 000007
【図７】
0005800525.tif 000008
【図８】
0005800525.tif 000009
【図９】
0005800525.tif 000010
【図１０】
0005800525.tif 000011
【図１１】
0005800525.tif 000012
【図１２】
0005800525.tif 000013
【図１３】
0005800525.tif 000014
【図１４】
0005800525.tif 000015
【図１５】
0005800525.tif 000016
【図１６】
0005800525.tif 000017
【図１７】
0005800525.tif 000018