(57)【要約】      （修正有）【課題】１枚の画像から、複数のバーコードを切り出して読み取る。【解決手段】第１のモジュールは、第１の画像から複数の第１の処理ブロックを抽出し、複数の第１の処理ブロックの各々は複数の画素を含む。第２のモジュールは、複数の第１の処理ブロックの各々について、複数の画素の階調を示す値の平均値を算出する。第３のモジュールは、複数の第１の処理ブロックの各々について、当該ブロックの周辺に位置する複数の周辺ブロックについて第２のモジュールによりそれぞれ算出された複数の第１の平均値に基づいて、当該ブロックについて第２のモジュールにより算出された第２の平均値を補正することにより、補正平均値を算出する。第４のモジュールは、第１の画像に含まれる複数の画素の各々の階調を示す値と、複数の第１の処理ブロックのうちの当該画素が含まれる１つのブロックについて算出された補正平均値と、に基づいて、第２の画像を生成する。【選択図】図３
2018036737.tif 000002
【特許請求の範囲】
【請求項１】
第１から第４のモジュールを含む画像処理装置であって、
前記第１のモジュールは、第１の画像から複数の第１の処理ブロックを抽出し、前記複数の第１の処理ブロックの各々は複数の画素を含み、
前記第２のモジュールは、前記複数の第１の処理ブロックの各々について、前記複数の画素の階調を示す値の平均値を算出し、
前記第３のモジュールは、前記複数の第１の処理ブロックの各々について、当該ブロックの周辺に位置する複数の周辺ブロックについて前記第２のモジュールによりそれぞれ算出された複数の第１の平均値に基づいて、当該ブロックについて前記第２のモジュールにより算出された第２の平均値を補正することにより、補正平均値を算出し、
前記第４のモジュールは、前記第１の画像に含まれる複数の画素の各々の階調を示す値と、前記複数の第１の処理ブロックのうちの１つのブロックであって当該画素が含まれる当該１つのブロックについて算出された前記補正平均値と、に基づいて、第２の画像を生成する、
画像処理装置。
【請求項２】
請求項１に記載の画像処理装置であって、
前記第３のモジュールが算出する前記補正平均値は、前記複数の第１の平均値に第１の重みを付与し、前記第２の平均値に前記第１の重みより大きい第２の重みを付与して算出される前記複数の第１の平均値と前記第２の平均値との平均値である、
画像処理装置。
【請求項３】
請求項１に記載の画像処理装置であって、
前記第２の画像は二値画像であり、
前記第４のモジュールは、
前記第１の画像に含まれる複数の画素の各々の階調を示す値が、当該画素が含まれる当該１つのブロックについて算出された前記補正平均値より明るいことを示す場合に、前記第２の画像において当該画素に相当する画素を白点とし、
前記第１の画像に含まれる複数の画素の各々の階調を示す値が、当該画素が含まれる当該１つのブロックについて算出された前記補正平均値より暗いことを示す場合に、前記第２の画像において当該画素に相当する画素を黒点とする、
画像処理装置。
【請求項４】
請求項１に記載の画像処理装置であって、
第５から第７のモジュールを含む画像処理装置をさらに備え、
前記第５のモジュールは、第２の画像から複数の第２の処理ブロックを抽出し、
前記第６のモジュールは、前記複数の第２の処理ブロックの各々について、バーコードの一部が含まれる可能性の高い有効ブロックか否かを判定し、
前記第７のモジュールは、前記複数の第２の処理ブロックのうちの前記有効ブロックと判定された複数のブロックの存在位置に基づいて、前記第２の画像において１つのバーコードが含まれる可能性のあるバーコードエリアを抽出する、
画像処理装置。
【請求項５】
請求項４に記載の画像処理装置であって、
前記第５のモジュールは、前記複数の第２の処理ブロックの各々が、前記複数の第２の処理ブロックのうちの少なくとももう１つの第２の処理ブロックと一部重なるように、前記複数の第２の処理ブロックを抽出する、
画像処理装置。
【請求項６】
請求項４に記載の画像処理装置であって、
前記第５のモジュールは、前記第２の画像に含まれる少なくとも１つの一次元バーコードの明暗パターンの繰り返し方向を示すデータが入力された場合に、前記複数の第２の処理ブロックの各々が、前記繰り返し方向と交差する方向に前記もう１つの第２の処理ブロックと一部重なるように、前記複数の第２の処理ブロックを抽出する、
画像処理装置。
【請求項７】
請求項４に記載の画像処理装置であって、
前記第６のモジュールは、前記複数の第２の処理ブロックの各々について、
当該第２の処理ブロックの画素配列から複数の第１の列又は行を抽出し、前記複数の第１の列又は行の各々は、第１の所定方向を有し、かつ所定幅を有し、
前記複数の第１の列又は行の各々が白線か、黒線か、いずれでもないかを判定し、
前記複数の第１の列又は行のうちの白線の数と、前記複数の第１の列又は行のうちの黒線の数と、に基づいて、当該第２の処理ブロックが前記有効ブロックか否かを判定する、
画像処理装置。
【請求項８】
請求項７に記載の画像処理装置であって、
前記第６のモジュールは、前記第２の画像に含まれる少なくとも１つの一次元バーコードの明暗パターンの繰り返し方向を示すデータが入力された場合に、当該繰り返し方向と前記第１の所定方向とが交差するように前記複数の第１の列又は行を抽出する、
画像処理装置。
【請求項９】
請求項７に記載の画像処理装置であって、
前記第６のモジュールは、前記複数の第２の処理ブロックの各々について、
当該第２の処理ブロックの画素配列から複数の第２の行又は列を抽出し、前記複数の第２の行又は列の各々は、前記第１の所定方向と交差する第２の所定方向を有し、かつ前記所定幅を有し、
前記複数の第２の行又は列の各々が白線か、白線でないかを判定し、
前記複数の第１の列又は行のうちの白線の数と前記複数の第２の行又は列のうちの白線の数とを比較した比較結果に基づいて、当該第２の処理ブロックが前記有効ブロックか否かを判定する、
画像処理装置。
【請求項１０】
請求項７に記載の画像処理装置であって、
前記第６のモジュールは、前記複数の第２の処理ブロックの各々について、
当該第２の処理ブロックの画素配列から複数の第２の行又は列を抽出し、前記複数の第２の行又は列の各々は、前記第１の所定方向と交差する第２の所定方向を有し、かつ前記所定幅を有し、
前記複数の第２の行又は列の各々が黒線か、黒線でないかを判定し、
前記複数の第１の列又は行のうちの黒線の数と前記複数の第２の行又は列のうちの黒線の数とを比較した比較結果に基づいて、当該第２の処理ブロックが前記有効ブロックか否かを判定する、
画像処理装置。
【請求項１１】
請求項４に記載の画像処理装置であって、
前記第７のモジュールは、前記有効ブロックと判定された複数のブロックのうちの隣接又は一部重なるブロックを関連付けることにより、複数のバーコードエリアを抽出し、
前記複数のバーコードエリアの各々について、当該バーコードエリアを、前記複数のバーコードエリアのうちの他のバーコードエリアと重ならないように拡大する、
画像処理装置。
【請求項１２】
第７から第９のモジュールを含む画像処理装置であって、
前記第７のモジュールは、第１の画像から、１つのバーコードが含まれる可能性のあるバーコードエリアを抽出し、
前記第８のモジュールは、前記第１の画像から、前記バーコードエリアを含む第３の画像を生成し、
前記第９のモジュールは、前記第８のモジュールが生成した画像に対してバーコード解析プログラムを実行し、
前記第８のモジュールは、前記第９のモジュールによるバーコードの解析が失敗したときに、前記第１の画像から、前記バーコードエリアを含み且つ前記第３の画像と異なる範囲の第４の画像を生成する、
画像処理装置。
【請求項１３】
請求項１２に記載の画像処理装置であって、
前記第８のモジュールは、前記第３の画像の中心位置と前記第４の画像の中心位置とが互いに異なるように前記第４の画像を生成する、
画像処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、複数のバーコードを含む画像の中からこれらのバーコードを読み取るための画像処理装置に関する。
【背景技術】
【０００２】
複数のバーコードをまとめて撮影した１枚の画像から、上記複数のバーコードを読み取る試みが行われている（例えば、下記の特許文献４の段落００２４、特許文献５の段落００６１等）。１枚の画像のどの部分とどの部分にバーコードが含まれているかが指定されているならば、それぞれ指定された部分を画像から切り出せば、複数のバーコードを読み取ることができる。しかし、そのような指定がない場合には、１枚の画像のどの部分とどの部分を切り出すべきかを決定することが求められる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１１−１７０８８２号公報
【特許文献２】特開２００２−１５０２１３号公報
【特許文献３】特開２００６−０５９０７３号公報
【特許文献４】特開２０１３−１０１４８１号公報
【特許文献５】特開２００９−２６６１９０号公報
【特許文献６】特開平０７−０２８９２４号公報
【特許文献７】特開平０９−３１９８２１号公報
【発明の概要】
【０００４】
本開示の１つの観点に係る画像処理装置は、第１〜第４のモジュールを含む。第１のモジュールは、第１の画像から複数の第１の処理ブロックを抽出し、複数の第１の処理ブロックの各々は複数の画素を含む。第２のモジュールは、複数の第１の処理ブロックの各々について、複数の画素の階調を示す値の平均値を算出する。第３のモジュールは、複数の第１の処理ブロックの各々について、当該ブロックの周辺に位置する複数の周辺ブロックについて第２のモジュールによりそれぞれ算出された複数の第１の平均値に基づいて、当該ブロックについて第２のモジュールにより算出された第２の平均値を補正することにより、補正平均値を算出する。第４のモジュールは、第１の画像に含まれる複数の画素の各々の階調を示す値と、複数の第１の処理ブロックのうちの１つのブロックであって当該画素が含まれる当該１つのブロックについて算出された補正平均値と、に基づいて、第２の画像を生成する。
【図面の簡単な説明】
【０００５】
【図１】本開示の実施形態に係る画像処理装置４０の機能ブロック図である。
【図２】上記画像処理装置４０によって撮影及び処理される画像の例を示す。
【図３】上記画像処理装置４０において第１の画像から第２の画像を生成する処理を示すフローチャートである。
【図４】第１の画像の一部を示す。
【図５】図３のＳ１０００において第１の画像から抽出された複数の第１の処理ブロックを示す。
【図６】図３のＳ２０００において算出された平均値の例を示す。
【図７】図３のＳ３０００において明度が減じられた平均値の例を示す。
【図８】図３のＳ４０００において算出される補正平均値と、補正平均値の算出方法を示す。
【図９】図３のＳ５０００において生成される第２の画像のうち、図８に対応する部分を示す。
【図１０】図３のＳ５０００において生成される第２の画像のうち、図４に対応する部分を示す。
【図１１】上記画像処理装置４０において一次元バーコードを解析する処理の詳細を示すフローチャートである。
【図１２】図１１のＳ６１００において第２の画像から抽出された複数の第２の処理ブロックを示す。
【図１３】上記画像処理装置４０において第２の処理ブロックを抽出する処理の詳細を示すフローチャートである。
【図１４】当該ブロックが有効ブロックか否かの判定の過程を示す。
【図１５】上記画像処理装置４０において当該ブロックが有効ブロックか否かを判定する処理の詳細を示すフローチャートである。
【図１６】上記画像処理装置４０において一次元バーコードエリアを決定する処理の詳細を示すフローチャートである。
【図１７】上記画像処理装置４０においてｎ番目の一次元バーコードエリアを抽出する処理の詳細を示すフローチャートである。
【図１８】隣接又は一部重なる有効ブロックを関連付けた状態を示す。
【図１９】一次元バーコードエリアを拡大した状態を示す。
【図２０】上記画像処理装置４０において二次元バーコードを解析する処理の詳細を示すフローチャートである。
【図２１】図２０のＳ６５００において第２の画像から抽出された複数の第２の処理ブロックを示す。
【図２２】複数の第２の処理ブロックの各々についての有効ブロックか否かの判定結果を示す。
【図２３】上記画像処理装置４０において二次元バーコードエリアを決定する処理の詳細を示すフローチャートである。
【図２４】上記画像処理装置４０においてｎ番目の二次元バーコードエリアを抽出する処理の詳細を示すフローチャートである。
【図２５】二次元バーコードエリアを抽出する過程を示す。
【図２６】上記画像処理装置４０において二次元バーコードを読み取る処理の詳細を示すフローチャートである。
【図２７】Ｓ６９０１において切り取られる画像の範囲の例と、画像の加工バリエーションの例を示す。
【発明を実施するための形態】
【０００６】
以下、本開示の実施形態を、図面を参照しながら詳細に説明する。以下に説明される各実施形態は、本開示の一例を示すものであって、本開示の内容を限定するものではない。また、各実施形態で説明される構成及び動作のすべてが本開示の構成及び動作として必須であるとは限らない。なお、同一の構成要素には同一の参照符号を付して、重複する説明を省略する。
【０００７】
なお、本開示において、「一次元バーコード」とは白黒パターンが１方向に配列されたバーコードをいうものとする。「二次元バーコード」とは白黒パターンが互いに交差する２方向に配列されたバーコードをいうものとする。「白」及び「黒」は、厳密な意味での白色及び黒色を意味するものではなく、「白」は一定の明度よりも明るい色をいい、「黒」は上記一定の明度よりも暗い色をいうものとする。
【０００８】
＜１．画像処理装置の構成＞
図１は、本開示の実施形態に係る画像処理装置４０の機能ブロック図である。画像処理装置４０は、入出力部１０と、撮像部２０と、処理部３０と、を備える。
【０００９】
入出力部１０は、タッチパネルのように情報の入力と出力とが行える装置を含む。あるいは、入出力部１０は、入力装置と出力装置とを別々に含んでいてもよい。入出力部１０は、ユーザーによる設定情報や撮像指示などの入力を受け付けて処理部３０に送信可能となっている。入出力部１０は、処理部３０によって処理された画像や、処理部３０によるバーコードのデコード結果などを表示可能となっている。
【００１０】
撮像部２０は、ＣＣＤカメラを含んでいる。撮像部２０は、処理部３０からの駆動信号に応じて撮影を行い、画像データを処理部３０に送信可能となっている。
【００１１】
処理部３０は、プロセッサ、主記憶装置、ストレージメモリ等を含む。ストレージメモリには、プロセッサにより実行可能な画像処理プログラム３１及びバーコード解析プログラム３２が格納されている。バーコード解析プログラム３２は、図１に示される画像処理装置４０とは別の装置に格納されていてもよい。当該別の装置に、画像処理プログラム３１による計算結果が送信されて、当該別の装置から、バーコード解析プログラムを用いたバーコードのデコード結果を受信してもよい。処理部３０は、入出力部１０との間及び撮像部２０との間で、上述のデータ又は信号のやり取りを行う。
【００１２】
上述の各種機能を有する画像処理装置４０は、例えば、１台の携帯電話機で構成することもできる。
【００１３】
＜２．画像処理装置の使用例＞
図２は、上記画像処理装置４０によって撮影及び処理される画像の例を示す。画像処理装置４０は、例えば、トレイ５０に載せられた複数の商品５１を撮影して１枚の画像を取得する。複数の商品５１には、様々な文字５２やバーコード５３が印刷されている。複数の商品５１のデザインは様々で、バーコード５３の印刷箇所や大きさも様々なことがある。このような様々な商品５１のバーコード５３を１枚の画像からそれぞれ読み取ることにより、例えば、どの商品を幾つ出荷したかの管理が可能となる。その他、流通業での入出庫管理、医療業での薬品管理など幅広い応用が可能となる。
【００１４】
＜３．第１の画像から第２の画像を生成する処理＞
図３は、上記画像処理装置４０において第１の画像から第２の画像を生成する処理を示すフローチャートである。画像処理装置４０の処理部３０は、画像処理プログラム３１を実行して、以下の処理により第１の画像から第２の画像を生成する。第１の画像は、例えば、撮像部２０が撮像した元の画像である。第２の画像は、例えば、後の処理でバーコードエリアを抽出しやすいように白黒パターン部分が強調処理された二値画像である。本開示において、第１の画像から第２の画像を生成する処理は、一次元バーコードの読み取りと二次元バーコードの読み取りとで共通であるが、本開示の趣旨を逸脱しない範囲でそれぞれ別々の改変が行われてもよい。
【００１５】
図４は、第１の画像の一部を示す。図４は、第１の画像のうち、１つの一次元バーコードと、別の１つの一次元バーコードの一部と、が含まれた部分を示している。特許出願の様式上の都合から、図４はグレースケール画像を示しているが、第１の画像はカラー画像でよい。撮影対象への光の当たり方などの撮影条件によって、撮影された画像における階調が影響を受けることがある。また、図２を参照しながら説明したように、様々なデザインの商品を撮影したときに、一次元バーコードエリアの特定が困難なことがある。そこで、以下の処理により、白黒パターン部分が強調処理された第２の画像を生成する。
【００１６】
図３のＳ１０００において、処理部３０は、第１の画像から複数の第１の処理ブロックを抽出する。第１の処理ブロックは、複数の画素を含む。Ｓ１０００の処理を行うモジュールは、本開示の第１のモジュールに相当し得る。
【００１７】
図５は、図３のＳ１０００において第１の画像から抽出された複数の第１の処理ブロックを示す。図５は、図４の太枠線内の部分を示している。説明を簡易にするため、図５においては、複数の第１の処理ブロックの各々は４行×４列の１６画素を含むものとしているが、８行×８列の６４画素を含むものとしてもよい。さらに、図５においては、それぞれの画素の階調を示す数値の例が示されている。また、それぞれの画素は、階調を示す数値に応じて、色分けして示されている。階調を示す数値は、図５においては、紙幅の都合から０から１５までの１６階調となっているが、０から２５５までの２５６階調でもよい。ここでは、階調を示す数値が小さいほど明度が低く、暗い色であることを示し、階調を示す数値が大きいほど明度が高く、明るい色であることを示す。
【００１８】
次に、図３のＳ２０００において、処理部３０は、複数の第１の処理ブロックの各々について、階調を示す値の平均値を算出する。上述の図５に示された例で言えば、複数の第１の処理ブロックの各々に含まれる１６個の画素の階調を示す値を合計し、その合計値を画素数１６で除算する。
図６は、図３のＳ２０００において算出された平均値の例を示す。１つの第１の処理ブロックについて、１つの平均値が算出される。
【００１９】
次に、図３のＳ３０００において、処理部３０は、複数の第１の処理ブロックの各々について、階調を示す値の平均値の明度を減じる。上述のように数値が低い方が明度が低いことを示す場合には、例えば、上述の図６に示された平均値の各々に１未満の軽減率を乗算する。軽減率は、例えば、０．７以上０．９５以下の範囲で設定される。軽減率は、撮影現場の明るさなどによって最適値が変化することがあるので、入出力部１０を用いてユーザーによって設定可能とされてもよい。あるいは、Ｓ３０００において明度を減じるために、上述の図６に示された平均値の各々から一定のオフセット値を減算してもよい（但し、負数にはしない）。
【００２０】
図７は、図３のＳ３０００において明度が減じられた平均値の例を示す。図７においては、上述の図６に示された平均値の各々に０．８が乗算されている。
Ｓ２０００の処理を行うモジュール、又はＳ２０００とＳ３０００の処理を行うモジュールは、本開示の第２のモジュールに相当し得る。第２のモジュールは、平均値の明度を減じる処理を行っても、行わなくてもよい。あるいは、第２のモジュールは、Ｓ２０００とＳ３０００の処理順序を入れ替えて、複数の画素の各々について明度を減じてから、複数の第１の処理ブロックの各々について平均値を算出してもよい。Ｓ２０００とＳ３０００の処理順序を入れ替えると、計算量が若干増加するが、それでもなお本開示の効果を奏し得る。
【００２１】
次に、図３のＳ４０００において、処理部３０は、複数の第１の処理ブロックの各々について、当該ブロックの補正平均値を以下のようにして算出する。Ｓ４０００の処理を行うモジュールは、本開示の第３のモジュールに相当し得る。
【００２２】
図８は、図３のＳ４０００において算出される補正平均値と、補正平均値の算出方法を示す。当該ブロックの補正平均値は、当該ブロックの周辺に位置する複数の周辺ブロックについてそれぞれ算出された複数の第１の平均値D1〜D8と、当該ブロックについて算出された第２の平均値Dとを用いて算出される。第１の平均値D1〜D8及び第２の平均値Dは、図６又は図７に示される平均値である。図８の下部に示されるように、第１の平均値D1〜D8のうち、D1〜D4は、当該ブロックの上下左右にそれぞれ隣接するブロックの平均値であり、D5〜D8は、当該ブロックの斜め方向にずれた位置にあるブロックの平均値である。補正平均値Eは、以下の式により算出される。
E = [4×D＋2×(D1+D2+D3+D4)＋(D5+D6+D7+D8)]/16
以上のようにして、当該ブロックの周辺に位置する複数の周辺ブロックについてそれぞれ算出された複数の第１の平均値D1〜D8に基づいて、当該ブロックについて算出された第２の平均値Dが補正される。
補正平均値Eは、第１の平均値D1〜D8に第１の重み１又は２を付与し、前記第２の平均値Dに第１の重みより大きい第２の重み４を付与して算出される、第１の平均値D1〜D8と第２の平均値Dとの平均値である。これらの重みの値は、別の値に変更されてもよい。さらに、当該ブロックの上下左右及び斜めにそれぞれ隣接する８つのブロックだけでなく、８つのブロックのさらに周辺に位置するブロックを考慮に入れてもよい。この場合、当該ブロックの近くに位置するブロックには、当該ブロックから遠くに位置するブロックよりも大きい重みを付与することが望ましい。
【００２３】
図５に示された領域の階調データだけでは補正平均値を算出できない処理ブロックについては、図８に補正平均値の算出結果が示されていない。しかし、さらに周辺の階調データを用いて補正平均値が算出されてもよい。
【００２４】
次に、図３のＳ５０００において、処理部３０は、以下のようにして第２の画像を生成する。Ｓ５０００の処理を行うモジュールは、本開示の第４のモジュールに相当し得る。
【００２５】
図９は、図３のＳ５０００において生成される第２の画像のうち、図８に対応する部分を示す。Ｓ５０００において、処理部３０は、第１の画像に含まれる複数の画素の各々の階調を示す値と、当該画素が属する第１の処理ブロックについて算出された補正平均値とを比較する。図５に示される画素の階調を示す値が、図８に示される補正平均値より大きい、すなわち明度が高い場合は、第２の画像における当該画素を白点（０）とする。図５に示される画素の階調を示す値が図８に示される補正平均値より小さい、すなわち明度が低い場合は、第２の画像における当該画素を黒点（１）とする。以上のようにして二値画像が生成される。
【００２６】
図１０は、図３のＳ５０００において生成される第２の画像のうち、図４に対応する部分を示す。図１０に示されるように、第２の画像においては、第１の画像の背景部分の濃淡がかなり消去され、一次元バーコードにおける白黒の繰返しパターンが強調されている。このような第２の画像を生成できるのは、当該画素の階調を示す値を、周囲の補正平均値と比較しているためである。さらに、本実施形態においては、Ｓ３０００及びＳ４０００の処理をブロック単位で行っているので、ブロックサイズに応じて計算量が低減される。例えば、ブロックサイズが４行×４列であれば、Ｓ３０００及びＳ４０００の計算量は１６分の１となる。また、Ｓ５０００の処理は、画素数に応じた計算量が必要になるが、ブロックサイズに応じて補正平均値の読み込み回数が低減される。
【００２７】
次に、図３のＳ６０００において、処理部３０は、バーコードの解析を行う。上述の第２の画像を用いてＳ６０００の処理を行うことにより、バーコードエリアの特定を高速化し、正確にバーコードを解析できる。Ｓ６０００の処理の詳細については、一次元バーコードの解析（図１１〜図１９）と、二次元バーコードの解析（図２０〜図２７）と、に分けて以下に説明する。
【００２８】
＜４．一次元バーコードの解析＞
図１１は、上記画像処理装置４０において一次元バーコードを解析する処理の詳細を示すフローチャートである。図１１に示される処理は、図３のＳ６０００のサブルーチンとして、処理部３０によって行われる。図１１に示される処理は、特に言及しない限り、画像処理プログラム３１に基づいて行われる。
【００２９】
＜４−１．第２の処理ブロックの抽出＞
まず、図１１のＳ６１００において、処理部３０は、図３のＳ５０００で生成された第２の画像から複数の第２の処理ブロックを抽出する。第２の処理ブロックは、複数の画素を含む。第２の処理ブロックは、第１の処理ブロックと同じ画素数を有していてもよいし、異なる画素数を有していてもよい。第２の処理ブロックの画素数は、入出力部１０を用いてユーザーによって設定されてもよい。また、ユーザーによって一次元バーコード方向が入力されている場合に、第２の処理ブロックは一次元バーコード方向と交差する方向に一部重なるように設定される。ここで、「一次元バーコード方向」とは、一次元バーコードに含まれる白黒の繰り返しパターンの繰り返し方向をいう。Ｓ６１００の処理を行うモジュールは、本開示の第５のモジュールに相当し得る。
【００３０】
図１２は、図１１のＳ６１００において第２の画像から抽出された複数の第２の処理ブロックを示す。図１２においては、複数の第２の処理ブロックの各々は、１６行×１６列の２５６画素を含むものとしている。図１２において、一次元バーコード方向は横方向となっている。この場合、第２の処理ブロックは、縦方向に一部重なるように設定される。
【００３１】
ここで、ブロック番号（ｉ，ｊ）を横方向の座標ｉと縦方向の座標ｊを用いて特定するとした場合、ブロック番号（１，１）に対してブロック番号（１，２）は第２の処理ブロックの縦の長さの半分だけ重なっている。すなわち、ブロック番号（１，１）に対してブロック番号（１，２）は第２の処理ブロックの縦の長さの半分だけずれて位置している。このように第２の処理ブロックを設定することにより、一次元バーコード方向と垂直な方向の一次元バーコードの幅が狭くても、適切な範囲の一次元バーコードエリアを抽出することができる。これにより、一次元バーコード領域の特定の精度を向上し得る。
【００３２】
図１３は、上記画像処理装置４０において第２の処理ブロックを抽出する処理の詳細を示すフローチャートである。図１３に示される処理は、図１１のＳ６１００のサブルーチンとして、処理部３０によって行われる。
【００３３】
まず、Ｓ６１０１において、処理部３０は、一次元バーコード方向が入力されたか否かを判定する。ユーザーが一次元バーコード方向を入力する場合には、図２に示されるようにユーザーが一次元バーコード方向をほぼそろえて複数の一次元バーコードを撮影するのが好ましい。
【００３４】
一次元バーコード方向が入力されていない場合（Ｓ６１０１；ＮＯ）、処理部３０は、一次元バーコード方向が入力されるまで待機する。あるいは、処理部３０は、第２の処理ブロックが重ならないように、第２の処理ブロックを設定してもよい。あるいは、処理部３０は、第２の処理ブロックが縦横いずれの方向にもそれぞれ一部重なるように、第２の処理ブロックを設定してもよい。
【００３５】
一次元バーコード方向が入力された場合（Ｓ６１０１；ＹＥＳ）、処理部３０は、Ｓ６１０２に処理を進める。Ｓ６１０２において、処理部３０は、第２の処理ブロックが一次元バーコード方向と垂直な方向に一部重なるように、第２の処理ブロックを設定する。Ｓ６１０２の後、処理部３０は、本フローチャートの処理を終了して図１１に示される処理に戻る。
【００３６】
＜４−２．有効ブロックか否かの判定＞
図１１のＳ６２００において、処理部３０は、複数の第２の処理ブロックの各々について、当該ブロックが有効ブロックか否かを判定する。Ｓ６２００の処理を行うモジュールは、本開示の第６のモジュールに相当し得る。当該ブロックが有効ブロックか否かの判定は、以下のように行われる。
図１４は、当該ブロックが有効ブロックか否かの判定の過程を示す。図１４は、図１２の太枠内の部分に相当するブロック番号（４，４）を示している。
図１５は、上記画像処理装置４０において当該ブロックが有効ブロックか否かを判定する処理の詳細を示すフローチャートである。図１５に示される処理は、図１１のＳ６２００のサブルーチンとして、処理部３０によって行われる。
【００３７】
まず、図１５のＳ６２０１において、処理部３０は、一次元バーコード方向と交差する方向の複数の列を抽出し、各列における黒点の数と白点の数とをカウントする。一次元バーコード方向と交差する方向の複数の列は、本開示の複数の第１の列又は行に相当し得る。
図１４の上端付近に、各列における黒点の数が示されている。図１４の中央付近に、各列における白点の数が示されている。なお、各列において、黒点の数と白点の数の合計は１６であり、この値はブロックサイズBlock_sizeに等しい。
【００３８】
図１５のＳ６２０２において、処理部３０は、一次元バーコード方向の複数の行を抽出し、一次元バーコード方向の各行における黒点の数と白点の数とをカウントする。一次元バーコード方向の複数の行は、本開示の複数の第２の行又は列に相当し得る。
図１４の左端付近に、各行における黒点の数が示されている。図１４の右端付近に、各行における白点の数が示されている。なお、各行において、黒点の数と白点の数の合計は１６であり、この値はブロックサイズBlock_sizeに等しい。
【００３９】
次に、図１５のＳ６２０３において、処理部３０は、各列について、黒線か、白線か、いずれでもないかを判定する。各列における黒点の数が第１の閾値より大きければ、その列は黒線であると判定される。第１の閾値は、各列における黒点の数の平均値より大きい値、例えば、当該平均値の１．１倍以上、１．３倍以下の値に設定される。各列における白点の数が第２の閾値より大きければ、その列は白線であると判定される。第２の閾値は、各列における白点の数の平均値より大きい値、例えば、当該平均値の１．１倍以上、１．３倍以下の値に設定される。
【００４０】
図１４の上端付近に、各列についての黒線か否かの判定結果が示されている。第１の閾値は、各列における黒点の数の平均より大きい値に設定されている。縦黒線か否かの判定結果は、縦黒線なら１、縦黒線でないなら０として示されている。
図１４の中央付近に、各列についての白線か否かの判定結果が示されている。第２の閾値は、各列における白点の数の平均より大きい値に設定されている。縦白線か否かの判定結果は、縦白線なら１、縦白線でないなら０として示されている。
【００４１】
次に、図１５のＳ６２０４において、処理部３０は、縦黒線の数HORZblackと、縦白線の数HORZwhiteと、をそれぞれカウントする。
図１４の上端付近に、縦黒線の数HORZblackの算出結果が示されている。
図１４の中央付近に、縦白線の数HORZwhiteの算出結果が示されている。
【００４２】
次に、図１５のＳ６２０５において、処理部３０は、縦黒線の数HORZblackと、縦白線の数HORZwhiteと、の和が第１の所定値より大きいか否かを判定する。第１の所定値は、ブロックサイズBlock_sizeに所定の判定率を乗算した値でよい。判定率は、例えば、０．２以上、０．３以下の値を有している。
【００４３】
縦黒線の数HORZblackと、縦白線の数HORZwhiteと、の和が第１の所定値より大きくない場合（Ｓ６２０５；ＮＯ）、処理部３０は、処理をＳ６２１０に進める。
縦黒線の数HORZblackと、縦白線の数HORZwhiteと、の和が第１の所定値より大きい場合（Ｓ６２０５；ＹＥＳ）、処理部３０は、処理をＳ６２０６に進める。
【００４４】
図１５のＳ６２０６において、処理部３０は、各行について、黒線か、白線か、いずれでもないかを判定する。各行における黒点の数が第１の閾値より大きければ、その行は黒線であると判定される。第１の閾値は、上記黒点の数の平均より大きい値に設定される。各行における白点の数が第２の閾値より大きければ、その行は白線であると判定される。第２の閾値は、各行における白点の数の平均より大きい値に設定される。
【００４５】
図１４の左端付近に、各行についての黒線か否かの判定結果が示されている。第１の閾値は、各行における黒点の数の平均より大きい値に設定されている。横黒線か否かの判定結果は、横黒線なら１、横黒線でないなら０として示されている。
図１４の中央付近に、各行についての白線か否かの判定結果が示されている。第２の閾値は、各行における白点の数の平均より大きい値に設定されている。横白線か否かの判定結果は、横白線なら１、横白線でないなら０として示されている。
【００４６】
次に、図１５のＳ６２０７において、処理部３０は、横黒線の数VERTblackと、横白線の数VERTwhiteと、をそれぞれカウントする。
図１４の左端付近に、横黒線の数VERTblackの算出結果が示されている。
図１４の右端付近に、横白線の数VERTwhiteの算出結果が示されている。
【００４７】
次に、図１５のＳ６２０８において、処理部３０は、縦黒線の数HORZblackと、横黒線の数VERTblackと、の差と、縦白線の数HORZwhiteと、横白線の数VERTwhiteと、の差と、を算出する。そして、処理部３０は、これらの差の積の絶対値が第２の所定値より大きいか否かを判定する。第２の所定値は、ブロックサイズBlock_sizeに上記の判定率の２乗を乗算した値でよい。
上述の差の積の絶対値が第２の所定値より大きくない場合（Ｓ６２０８；ＮＯ）、処理部３０は、処理をＳ６２１０に進める。
上述の差の積の絶対値が第２の所定値より大きい場合（Ｓ６２０８；ＹＥＳ）、処理部３０は、処理をＳ６２０９に進める。
【００４８】
Ｓ６２０９において、処理部３０は、当該ブロックが有効ブロックであると判定する。
Ｓ６２１０において、処理部３０は、当該ブロックが有効ブロックではなく無効ブロックであると判定する。
上述のＳ６２０５の判定結果がＹＥＳであることを有効ブロックの条件とすることにより、一次元バーコード方向と垂直な方向の黒線及び白線の数が少ないブロックを除外することができる。
上述のＳ６２０８の判定結果がＹＥＳであることを有効ブロックの条件とすることにより、縦黒線数と横黒線数との差が小さいブロックや、縦白線数と横白線数との差が小さいブロックを除外することができる。
複数の第２の処理ブロックの各々についてＳ６２０９又はＳ６２１０の判定結果を得た後、処理部３０は、本フローチャートの処理を終了して図１１に示される処理に戻る。
【００４９】
なお、ここでは、Ｓ６１０１において一次元バーコード方向が入力された場合について説明したが、一次元バーコード方向が入力されていない場合、特に一次元バーコード方向が画像の縦横方向に対して斜めである場合には、図１４における走査線の角度を傾けて、この走査線の方向と垂直な方向及び平行な方向に沿ってそれぞれ黒点及び白点をカウントする。
また、一次元バーコード方向が入力されていない場合、複数の方向で有効ブロックとして判定されることがある。その場合には、Ｓ６２０８を参照しながら説明した差の積の絶対値が大きい方の走査線の方向を一次元バーコード方向とする。
【００５０】
＜４−３．一次元バーコードエリアの決定＞
図１１のＳ６３００において、処理部３０は、複数の第２の処理ブロックの各々について得られた有効ブロックか否かの判定結果に基づいて、一次元バーコードが含まれる可能性のある一次元バーコードエリアを決定する。Ｓ６３００の処理を行うモジュールは、本開示の第７のモジュールに相当し得る。一次元バーコードエリアの決定は、以下のように行われる。
図１６は、上記画像処理装置４０において一次元バーコードエリアを決定する処理の詳細を示すフローチャートである。図１６に示される処理は、図１１のＳ６３００のサブルーチンとして、処理部３０によって行われる。
【００５１】
まず、図１６のＳ６３１０において、処理部３０は、一次元バーコードエリアをカウントするカウンタｎを１にセットする。
次に、図１６のＳ６３２０において、処理部３０は、ｎ番目の一次元バーコードエリアを抽出する。
【００５２】
図１７は、上記画像処理装置４０においてｎ番目の一次元バーコードエリアを抽出する処理の詳細を示すフローチャートである。図１７に示される処理は、図１６のＳ６３２０のサブルーチンとして、処理部３０によって行われる。
【００５３】
まず、Ｓ６３２１において、処理部３０は、第２の画像に含まれる複数の第２の処理ブロックをスキャンして、１つの有効ブロックを探す。処理部３０は、この有効ブロックを起点として横方向及び縦方向に探索を行い、隣接する有効ブロック又は一部重なる有効ブロックを関連付ける。処理部３０は、隣接又は一部重なる複数の有効ブロックを関連付けたら、Ｓ６３２２に処理を進める。
【００５４】
Ｓ６３２２において、処理部３０は、関連付けられた複数の有効ブロックが所定サイズ以上になるか否かを判定する。
関連付けられた複数の有効ブロックが所定サイズ未満である場合（Ｓ６３２２；ＮＯ）、処理部３０は、これらの有効ブロックはｎ番目の一次元バーコードエリアとしない。処理部３０は、Ｓ６３２１に処理を戻して、これらの有効ブロックとは別の１つの有効ブロックを探し、当該別の有効ブロックを起点として、隣接又は一部重なる複数の有効ブロックをスキャンする。
関連付けられた複数の有効ブロックが所定サイズ以上となる場合（Ｓ６３２２；ＹＥＳ）、処理部３０は、これらの有効ブロックをｎ番目の一次元バーコードエリアとする。その後、処理部３０は、本フローチャートの処理を終了して、図１６に示される処理に戻る。
【００５５】
図１８は、隣接又は一部重なる有効ブロックを関連付けた状態を示す。ブロック番号（２，３）からブロック番号（４，５）までの９個の有効ブロックが関連付けられている。
【００５６】
図１６のＳ６３４０において、処理部３０は、一次元バーコードエリアをすべて抽出したか否かを判定する。例えば、処理部３０は、第２の画像に含まれる複数の第２の処理ブロックをすべてスキャンしたら、一次元バーコードエリアをすべて抽出したと判定する。
【００５７】
一次元バーコードエリアをすべて抽出していない場合（Ｓ６３４０；ＮＯ）、処理部３０は、Ｓ６３５０において、カウンタｎの値に１を加算してｎの値を更新する。その後、処理部３０は、上述のＳ６３２０に処理を戻して、ｎ番目の一次元バーコードエリアを抽出する。例えば、図１８に示されるブロック番号（１，８）、ブロック番号（２，９）などの有効ブロックを含む別の一次元バーコードエリアを抽出する。
一次元バーコードエリアをすべて抽出した場合（Ｓ６３４０；ＹＥＳ）、処理部３０は、Ｓ６３６０に処理を進める。
【００５８】
Ｓ６３６０において、処理部３０は、一次元バーコードエリアを拡大する。
図１９は、一次元バーコードエリアを拡大した状態を示す。図１８において関連付けられたブロック番号（２，３）からブロック番号（４，５）までの有効ブロックに対し、上方向に１ブロック分、左方向に１ブロック分、右方向に１ブロック分だけそれぞれ一次元バーコードエリアが拡大されている。拡大幅は１ブロック分とする場合に限られず、２ブロック分としてもよい。
但し、図１９において、下方向には０．５ブロック分しか拡大していない。これは、下方向に１ブロック分拡大すると、ブロック番号（１，８）、ブロック番号（２，９）などの有効ブロックを含む別の一次元バーコードエリアと重なってしまうためである。このような処理により、適切な範囲の一次元バーコードエリアを決定することができる。
図１６のＳ６３６０の後、処理部３０は、本フローチャートの処理を終了し、図１１に示される処理に戻る。
【００５９】
＜４−４．一次元バーコードの読み取り＞
図１１のＳ６４００において、処理部３０は、Ｓ６３００において決定されたｎ個の一次元バーコードエリアの各々について、第１の画像から該当するエリアを切り取る。そして、処理部３０は、バーコード解析プログラム３２を用いて一次元バーコードの読み取りを行う。
以上のように、一次元バーコードの解析が行われる。
【００６０】
＜５．二次元バーコードの解析＞
図２０は、上記画像処理装置４０において二次元バーコードを解析する処理の詳細を示すフローチャートである。図２０に示される処理は、図３のＳ６０００のサブルーチンとして、処理部３０によって行われる。図２０に示される処理は、特に言及しない限り、画像処理プログラム３１に基づいて行われる。
【００６１】
＜５−１．第２の処理ブロックの抽出＞
まず、図２０のＳ６５００において、処理部３０は、図３のＳ５０００で生成された第２の画像から複数の第２の処理ブロックを抽出する。第２の処理ブロックは、複数の画素を含む。第２の処理ブロックは、第１の処理ブロックと同じ画素数を有していてもよいし、異なる画素数を有していてもよい。第２の処理ブロックの画素数は、入出力部１０を用いてユーザーによって設定されてもよい。また、Ｓ６５００において、第２の処理ブロックは互いに重ならないように設定されてもよい。Ｓ６５００の処理を行うモジュールは、本開示の第５のモジュールに相当し得る。
【００６２】
図２１は、図２０のＳ６５００において第２の画像から抽出された複数の第２の処理ブロックを示す。図２１においては、複数の第２の処理ブロックの各々は、４行×４列の１６画素を含むものとしている。以下の説明において、ブロック番号（ｉ，ｊ）を横方向の座標ｉと縦方向の座標ｊを用いて特定するものとする。
【００６３】
＜５−２．有効ブロックか否かの判定＞
図２０のＳ６６００において、処理部３０は、複数の第２の処理ブロックの各々について、当該ブロックが有効ブロックか否かを判定する。当該ブロックが有効ブロックか否かの判定は、例えば、当該ブロックに黒点が所定数以上含まれるか否かによって行われる。所定数は、ブロック内の画素数の１０％以上、５０％以下の範囲で設定される。Ｓ６６００の処理を行うモジュールは、本開示の第６のモジュールに相当し得る。
図２２は、複数の第２の処理ブロックの各々についての有効ブロックか否かの判定結果を示す。図２２において、有効ブロックは「Ａ」で示され、無効ブロックは「Ｘ」で示されている。
【００６４】
＜５−３．二次元バーコードエリアの決定＞
図２０のＳ６７００において、処理部３０は、複数の第２の処理ブロックの各々について得られた有効ブロックか否かの判定結果に基づいて、二次元バーコードが含まれる可能性のある二次元バーコードエリアを決定する。Ｓ６７００の処理を行うモジュールは、本開示の第７のモジュールに相当し得る。二次元バーコードエリアの決定は、以下のように行われる。
図２３は、上記画像処理装置４０において二次元バーコードエリアを決定する処理の詳細を示すフローチャートである。図２３に示される処理は、図２０のＳ６７００のサブルーチンとして、処理部３０によって行われる。
【００６５】
まず、図２３のＳ６７１０において、処理部３０は、二次元バーコードエリアをカウントするカウンタｎの値を１にセットする。また、処理部は、二次元バーコードエリアを決定する過程で当該二次元バーコードエリアの先頭の行番号を記憶する変数Jminの値を１にセットする。
次に、図２３のＳ６７２０において、処理部３０は、ｎ番目の二次元バーコードエリアを抽出する。
【００６６】
図２４は、上記画像処理装置４０においてｎ番目の二次元バーコードエリアを抽出する処理の詳細を示すフローチャートである。図２４に示される処理は、図２３のＳ６７２０のサブルーチンとして、処理部３０によって行われる。
【００６７】
まず、Ｓ６７２１において、処理部３０は、ｎ番目の二次元バーコードエリアを抽出するために、先頭の行番号Jminから数えて何行目を注目しているか、を示すカウンタｍを０に設定する。
【００６８】
次に、Ｓ６７２２において、処理部３０は、Jminの行にＮ個以上連続する有効ブロックがあるか否かを判定する。閾値Ｎは、例えば、３個以上でもよい。Jminの行において連続する有効ブロックのうちの左端に位置する有効ブロックをI(m)minとし、Jminの行において連続する有効ブロックのうちの右端に位置する有効ブロックをI(m)maxとする。Ｓ６７２２においては、ｍの値が０なので、I(m)minはI(0)minであり、I(m)maxはI(0)maxである。
Jminの行にＮ個以上連続する有効ブロックがない場合（Ｓ６７２２；ＮＯ）、処理部は、処理をＳ６７２８に進める。
【００６９】
Ｓ６７２８において、処理部３０は、Jminの値が、第２の画像に含まれる複数の第２の処理ブロックのうちの最終の行番号Ｊから閾値Ｎを減算した値より大きいか否かを判定する。
Jminの値が、最終の行番号Ｊから閾値Ｎを減算した値よりも大きくない場合（Ｓ６７２８；ＮＯ）、処理部３０は、処理をＳ６７２９に進める。
【００７０】
Ｓ６７２９において、処理部３０は、現在のJminの値に１を加算してJminの値を更新し、処理を上述のＳ６７２１に戻す。これにより、Ｓ６７２２において、次の行にＮ個以上連続する有効ブロックがあるか否かを判定する。
【００７１】
図２５は、二次元バーコードエリアを抽出する過程を示す。図２５においては、上から３行目において３個の連続する有効ブロックがあった場合を示している。
図２４において、Jminの行にＮ個以上連続する有効ブロックがある場合（Ｓ６７２２；ＹＥＳ）、処理部は、処理をＳ６７２３に進める。
【００７２】
Ｓ６７２３において、処理部３０は、カウンタｍの値に１を加算してｍの値を更新する。
次に、Ｓ６７２４において、処理部３０は、Jmin＋ｍの行にＭ個以上の有効ブロックがあるか否かを判定する。例えば、ｍ＝１の場合、処理部３０は、先頭の行番号Jminの次の行について、有効ブロックの数をカウントし、有効ブロックの数がＭ個以上であるか否かを判定する。Ｓ６７２４における有効ブロックの数のカウントは、以下のように行う。
【００７３】
第１に、直前のJmin＋ｍ−１の行における有効ブロックのうちの左端に位置する有効ブロックI(m-1)minと、Jmin＋ｍ−１の行における有効ブロックのうちの右端に位置する有効ブロックI(m-1)maxとの間に位置する処理ブロックに対して、それぞれ、直下の処理ブロックが有効ブロック（Ａ）であれば有効ブロック（Ｂ）とし、無効ブロック（Ｘ）であれば無効ブロック（Ｙ）とする。但し、直前のJmin＋ｍ−１の行における有効ブロック（Ａ）の直下の無効ブロック（Ｘ）については、Jmin＋ｍの行に限って有効ブロック（Ｃ）として扱う。
第２に、I(m-1)minの直下のブロックの左隣のブロックが有効ブロック（Ａ）であるときは、このブロックも有効ブロック（Ｂ）とする。左側に有効ブロック（Ａ）が連続するときは、これらの連続する有効ブロックをすべて有効ブロック（Ｂ）とする。
同様に、I(m-1)maxの直下のブロックの右隣のブロックが有効ブロック（Ａ）であるときは、このブロックも有効ブロック（Ｂ）とする。右側に有効ブロック（Ａ）が連続するときは、これらの連続する有効ブロックをすべて有効ブロック（Ｂ）とする。
第３に、Jmin＋ｍの行に存在する有効ブロック（Ｂ）又は（Ｃ）の数をカウントする。
【００７４】
Ｓ６７２４において、有効ブロック（Ｂ）又は（Ｃ）はＭ個連続していなくてもよい。閾値Ｍは、例えば、Ｎ個以上で、且つ、直前のJmin＋ｍ−１の行における有効ブロック（Ｂ）又は（Ｃ）の数の０．５倍以上であることを条件とする。
Jmin＋ｍの行における有効ブロック（Ｂ）又は（Ｃ）のうちの左端に位置する有効ブロック（Ｂ）又は（Ｃ）をI(m)minとし、Jmin＋ｍの行における有効ブロック（Ｂ）又は（Ｃ）のうちの右端に位置する有効ブロック（Ｂ）又は（Ｃ）をI(m)maxとする。
Ｍ個以上の有効ブロック（Ｂ）又は（Ｃ）がある場合（Ｓ６７２４；ＹＥＳ）、処理部３０は、処理を上述のＳ６７２３に戻してカウンタｍの値に１を加算し、次の行にＭ個以上の有効ブロックがあるか否かを判定する。
図２５に示される例においては、ｍ＝１のときに有効ブロックが５個に増加し、ｍ＝２のときに有効ブロックが７個に増加し、ｍ＝５のときに有効ブロックが８個に増加している。
Ｍ個以上の有効ブロック（Ｂ）又は（Ｃ）がない場合（Ｓ６７２４；ＮＯ）、処理部３０は、処理をＳ６７２５に進める。
図２５に示される例においては、ｍ＝５のときに有効ブロックが８個であったのに対し、ｍ＝６のときに有効ブロックが３個に減少している。すなわち、直前の行における有効ブロックの数の０．５倍未満となっている。
【００７５】
Ｓ６７２５において、ｎ番目の二次元バーコードエリアを特定するためのInmin、Inmax、Jnmin、及びJnmaxの値を、それぞれ以下のように算出する。
行番号Jminから数えて０行目からｍ−１行目までの有効ブロックのうちの左端の有効ブロックI(0)min、I(1)min、...、I(m-1)minの最小値を、Inminとする。なお、I(m)minは、Ｓ６７２４においてＭ個以上の有効ブロックがなかった行についての左端の有効ブロックなので、Ｓ６７２５においては使用しない。
行番号Jminから数えて０行目からｍ−１行目までの有効ブロックのうちの右端の有効ブロックI(0)max、I(1)max、...、I(m-1)maxの最大値を、Inmaxとする。なお、I(m)maxは、Ｓ６７２４においてＭ個以上の有効ブロックがなかった行についての右端の有効ブロックなので、Ｓ６７２５においては使用しない。
行番号Jminを、Jnminとする。
行番号Jmin＋ｍ−１を、Jnmaxとする。なお、Jmin＋ｍは、Ｓ６７２４においてＭ個以上の有効ブロックがなかった行なので、Ｓ６７２５においては使用しない。
【００７６】
次に、Ｓ６７２６において、Inmin、Inmax、Jnmin、及びJnmaxで特定される処理ブロック（Inmin，Jnmin）から（Inmax，Jnmax）までを、判定済みの処理ブロックとする。
次に、Ｓ６７２７において、処理部３０は、カウンタｍの値がＮ以上であるか否かを判定する。
【００７７】
カウンタｍの値がＮ以上である場合（Ｓ６７２７；ＹＥＳ）、処理部３０は、ブロック番号（Inmin−１，Jnmin−１）から（Inmax＋１，Jnmax＋１）までをｎ番目の二次元バーコードエリアとする。このように、判定済みの処理ブロックよりも二次元バーコードエリアを上下左右に拡大することにより、適切な範囲の二次元バーコードエリアを抽出できる。拡大幅は１ブロック分でなくてもよく、例えば２ブロック分でも３ブロック分でもよい。
その後、処理部３０は、本フローチャートの処理を終了して、図２３に示される処理に戻る。
【００７８】
カウンタｍの値がＮ以上ではない場合（Ｓ６７２７；ＮＯ）、有効ブロックのｊ方向の行数が少ないので、（Inmin，Jnmin）から（Inmax，Jnmax）までを二次元バーコードエリアにはしない。この場合、処理部３０は、上述のＳ６７２１に処理を戻す。これにより、Ｓ６７２２において、Jminの行にＮ個以上連続する有効ブロックがあるか否かを判定する。なお、既に判定済みとなっている処理ブロック（Inmin，Jnmin）から（Inmax，Jnmax）までについては、その後は有効ブロックの判定をしない。また、Ｓ６７２７からＳ６７２２に処理を戻すときに、Jminの値は更新しない。行番号Jminの中に、判定済みではない有効ブロックがあれば、その有効ブロックを起点として、上述のＳ６７２１からＳ６７２６までの処理を行う。
【００７９】
上述のＳ６７２８において、Jminの値が、第２の画像に含まれる複数の第２の処理ブロックのうちの最終の行番号Ｊから閾値Ｎを減算した値より大きい場合（Ｓ６７２８；ＹＥＳ）、Jminに１を加算してもｊ方向にＮ行以上の有効ブロックが存在することはない。この場合、処理部３０は、ｎ番目の二次元バーコードエリアを抽出せずに本フローチャートの処理を終了して、図２３に示される処理に戻る。
【００８０】
図２５に実線の太枠で示されるように、ブロック番号（Inmin−１，Jnmin−１）から（Inmax＋１，Jnmax＋１）までが二次元バーコードエリアとして抽出されている。
【００８１】
図２３のＳ６７４０において、処理部３０は、二次元バーコードエリアをすべて抽出したか否かを判定する。例えば、処理部３０は、上述のＳ６７２８においてＹＥＳと判定されていた場合には、二次元バーコードエリアをすべて抽出したと判定する。
【００８２】
二次元バーコードエリアをすべて抽出していない場合（Ｓ６７４０；ＮＯ）、処理部３０は、Ｓ６７５０において、カウンタｎの値に１を加算してｎの値を更新する。その後、処理部３０は、上述のＳ６７２０に処理を戻して、ｎ番目の二次元バーコードエリアを抽出する。Ｓ６７５０において、Jminの値は変更しない。従って、Ｓ６７２０に処理を戻したときも、従前のJminの行から順番に、ｎ番目の二次元バーコードエリアを抽出する。
二次元バーコードエリアをすべて抽出した場合（Ｓ６７４０；ＹＥＳ）、処理部３０は、Ｓ６７６０に処理を進める。
図２５は、一点鎖線の太枠で示されるもう１つの二次元バーコードエリアが抽出されたことを示している。
【００８３】
Ｓ６７６０において、処理部３０は、複数の隣接する二次元バーコードエリアがある場合に、これらの隣接する二次元バーコードエリアを結合して１つの二次元バーコードエリアとする。
図２５に示されるように、実線の太枠で示される二次元バーコードエリアと、これに隣接する一点鎖線の太枠で示される二次元バーコードエリアと、を結合することにより、適切な二次元バーコードエリアを抽出することができる。
図２３のＳ６７６０の後、処理部３０は、本フローチャートの処理を終了し、図２０に示される処理に戻る。
【００８４】
＜５−４．二次元バーコードの読み取り＞
図２０のＳ６９００において、処理部３０は、Ｓ６７００において決定された二次元バーコードエリアの各々について二次元バーコードの読み取りを行う。二次元バーコードの読み取りは、以下のように行われる。
図２６は、上記画像処理装置４０において二次元バーコードを読み取る処理の詳細を示すフローチャートである。図２６に示される処理は、図２０のＳ６９００のサブルーチンとして、処理部３０によって行われる。
【００８５】
まず、図２６のＳ６９０１において、処理部３０は、１つの二次元バーコードエリアを中心として上下左右に範囲を広げた画像を、第１の画像から切り取る。
図２７（Ａ）は、Ｓ６９０１において切り取られる画像の範囲の例を一点鎖線で示す。Ｓ６９０１において切り取られる画像の範囲は、破線で示される二次元バーコードエリアに対して、上方向及び下方向のそれぞれに、当該二次元バーコードエリアの縦の幅と同じ幅だけ広げ、左方向及び右方向のそれぞれに、当該二次元バーコードエリアの横の幅と同じ幅だけ広げた範囲とする。
次に、Ｓ６９０２において、処理部３０は、画像の加工バリエーションを示すカウンタｋの値を１にセットする。
【００８６】
次に、Ｓ６９０３において、処理部３０は、カウンタｋの値に応じた画像の加工を行い、第３の画像を生成する。Ｓ６９０３の処理を行うモジュールは、本開示の第８のモジュールに相当し得る。
図２７（Ｂ）〜図２７（Ｅ）は、画像の加工バリエーションの例を示す。図２７（Ｂ）に示されるように、１つの加工バリエーションは、二次元バーコードエリアの左下側に読み取り範囲を拡大するものでもよい。読み取り範囲は、左側及び下側にそれぞれ二次元バーコードエリアの幅と同じ幅だけ拡大してもよい。また、他の加工バリエーションとして、二次元バーコードエリアの右下側に読み取り範囲を拡大するもの、右上側に読み取り範囲を拡大するもの、左上側に読み取り範囲を拡大するものがそれぞれあってもよい。このように斜め方向に読み取り範囲を拡大し、画像の中心位置をずらすことにより、画像の左右方向又は上下方向での濃淡バランスが調整され、バーコード解析プログラム３２による読み取りが成功することがある。
また、図２７（Ｃ）に示されるように、他の加工バリエーションとして、読み取り範囲の拡大幅が図２７（Ｂ）に示される拡大幅と異なるものがあってもよい。読み取り範囲は、左側及び下側にそれぞれ二次元バーコードエリアの幅の半分の幅だけ拡大してもよい。このように拡大幅を変えた加工バリエーションは、二次元バーコードエリアの右下側に読み取り範囲を拡大するもの、右上側に読み取り範囲を拡大するもの、左上側に読み取り範囲を拡大するものについてそれぞれあってもよい。
【００８７】
また、図２７（Ｄ）に示されるように、他の加工バリエーションとして、読み取り範囲を上下左右にほぼ均等に拡大してもよい。さらに他の加工バリエーションとして、読み取り範囲の拡大幅が図２７（Ｄ）と異なるものがあってもよい。例えば、読み取り範囲の拡大幅が８段階のバリエーションを有していてもよい。
また、図２７（Ｅ）に示されるように、他の加工バリエーションとして、画像を所定角度回転させたものがあってもよい。この所定角度には、例えば、２度きざみで２２段階のバリエーションが存在してもよい。さらに、所定角度が同じでも、読み取り範囲の大きさに応じて、加工バリエーションが存在してもよい。
図２７（Ａ）に示されるように、Ｓ６９０１において画像を切り取ってから種々の加工を行うことにより、第１の画像から直接種々の加工を行う場合に比べて計算量を軽減できる。
【００８８】
次に、Ｓ６９０４において、処理部３０は、Ｓ６９０３において加工された画像と、バーコード解析プログラム３２とを用いて二次元バーコードの読み取りを行う。Ｓ６９０４の処理を行うモジュールは、本開示の第９のモジュールに相当し得る。
次に、Ｓ６９０５において、処理部３０は、二次元バーコードの読み取りが成功したか否かを判定する。二次元バーコードの読み取りが成功した場合（Ｓ６９０５；ＹＥＳ）、処理部３０は、本フローチャートの処理を終了する。二次元バーコードの読み取りが成功しなかった場合（Ｓ６９０５；ＮＯ）、処理部３０は、Ｓ６９０６において、カウンタｋが最大値ｋｍａｘに達したか否かを判定する。
【００８９】
カウンタｋが最大値ｋｍａｘに達していない場合（Ｓ６９０６；ＮＯ）、処理部３０は、カウンタｋの値に１を加算してｋの値を更新し、別の加工バリエーションによって画像の加工を行い、二次元バーコードの読み取りを試みる。
カウンタｋが最大値ｋｍａｘに達した場合（Ｓ６９０６；ＹＥＳ）、処理部３０は、Ｓ６９０７において、読み取りエラーを示す信号を出力して、本フローチャートの処理を終了する。
図２６の処理は、Ｓ６７００で抽出されたすべての二次元バーコードエリアについてそれぞれ行われる。
【００９０】
＜６．その他＞
本開示の範囲は、特許請求の範囲に記述される。その他、本開示は以下の発明を含む。
［請求項Ａ］
第５から第７のモジュールを含む画像処理装置であって、
前記第５のモジュールは、第２の画像から複数の第２の処理ブロックを抽出し、
前記第６のモジュールは、前記複数の第２の処理ブロックの各々について、バーコードの一部が含まれる可能性の高い有効ブロックか否かを判定し、
前記第７のモジュールは、前記複数の第２の処理ブロックのうちの前記有効ブロックと判定された複数のブロックの存在位置に基づいて、前記第２の画像において１つのバーコードが含まれる可能性のあるバーコードエリアを抽出する、
画像処理装置。
［請求項Ａ１］
請求項Ａに記載の画像処理装置であって、
前記第５のモジュールは、前記複数の第２の処理ブロックの各々が、前記複数の第２の処理ブロックのうちの少なくとももう１つの第２の処理ブロックと一部重なるように、前記複数の第２の処理ブロックを抽出する、
画像処理装置。
［請求項Ａ２］
請求項Ａ１に記載の画像処理装置であって、
前記第５のモジュールは、前記第２の画像に含まれる少なくとも１つの一次元バーコードの明暗パターンの繰り返し方向を示すデータが入力された場合に、前記複数の第２の処理ブロックの各々が、前記繰り返し方向と交差する方向に前記もう１つの第２の処理ブロックと一部重なるように、前記複数の第２の処理ブロックを抽出する、
画像処理装置。
［請求項Ａ３］
請求項Ａに記載の画像処理装置であって、
前記第６のモジュールは、前記複数の第２の処理ブロックの各々について、
当該第２の処理ブロックの画素配列から複数の第１の列又は行を抽出し、前記複数の第１の列又は行の各々は、第１の所定方向を有し、かつ所定幅を有し、
前記複数の第１の列又は行の各々が白線か、黒線か、いずれでもないかを判定し、
前記複数の第１の列又は行のうちの白線の数と、前記複数の第１の列又は行のうちの黒線の数と、に基づいて、当該第２の処理ブロックが前記有効ブロックか否かを判定する、
画像処理装置。
［請求項Ａ４］
請求項Ａ３に記載の画像処理装置であって、
前記第６のモジュールは、前記第２の画像に含まれる少なくとも１つの一次元バーコードの明暗パターンの繰り返し方向を示すデータが入力された場合に、当該繰り返し方向と前記第１の所定方向とが交差するように前記複数の第１の列又は行を抽出する、
画像処理装置。
［請求項Ａ５］
請求項Ａ３に記載の画像処理装置であって、
前記第６のモジュールは、前記複数の第２の処理ブロックの各々について、
当該第２の処理ブロックの画素配列から複数の第２の行又は列を抽出し、前記複数の第２の行又は列の各々は、前記第１の所定方向と交差する第２の所定方向を有し、かつ前記所定幅を有し、
前記複数の第２の行又は列の各々が白線か、白線でないかを判定し、
前記複数の第１の列又は行のうちの白線の数と前記複数の第２の行又は列のうちの白線の数とを比較した比較結果に基づいて、当該第２の処理ブロックが前記有効ブロックか否かを判定する、
画像処理装置。
［請求項Ａ６］
請求項Ａ３に記載の画像処理装置であって、
前記第６のモジュールは、前記複数の第２の処理ブロックの各々について、
当該第２の処理ブロックの画素配列から複数の第２の行又は列を抽出し、前記複数の第２の行又は列の各々は、前記第１の所定方向と交差する第２の所定方向を有し、かつ前記所定幅を有し、
前記複数の第２の行又は列の各々が黒線か、黒線でないかを判定し、
前記複数の第１の列又は行のうちの黒線の数と前記複数の第２の行又は列のうちの黒線の数とを比較した比較結果に基づいて、当該第２の処理ブロックが前記有効ブロックか否かを判定する、
画像処理装置。
［請求項Ａ７］
請求項Ａに記載の画像処理装置であって、
前記第７のモジュールは、前記有効ブロックと判定された複数のブロックのうちの隣接又は一部重なるブロックを関連付けることにより、複数のバーコードエリアを抽出し、
前記複数のバーコードエリアの各々について、当該バーコードエリアを、前記複数のバーコードエリアのうちの他のバーコードエリアと重ならないように拡大する、
画像処理装置。
［請求項Ｂ］
第７から第１０のモジュールを含む画像処理装置であって、
前記第７のモジュールは、第１の画像から、１つのバーコードが含まれる可能性のあるバーコードエリアを抽出し、
前記第８のモジュールは、前記第１の画像から、前記バーコードエリアを含む第３の画像を生成し、
前記第９のモジュールは、前記第８のモジュールが生成した画像に対してバーコード解析プログラムを実行し、
前記第８のモジュールは、前記第９のモジュールによるバーコードの解析が失敗したときに、前記第１の画像から、前記バーコードエリアを含み且つ前記第３の画像と異なる範囲の第４の画像を生成する、
画像処理装置。
［請求項Ｂ１］
請求項Ｂに記載の画像処理装置であって、
前記第８のモジュールは、前記第３の画像の中心位置と前記第４の画像の中心位置とが互いに異なるように前記第４の画像を生成する、
画像処理装置。
【符号の説明】
【００９１】
１０…入出力部、２０…撮像部、３０…処理部、４０…画像処理装置、５０…トレイ、５１…商品、５２…文字、５３…バーコード
【図１】
2018036737.tif 000003
【図２】
2018036737.tif 000004
【図３】
2018036737.tif 000005
【図４】
2018036737.tif 000006
【図５】
2018036737.tif 000007
【図６】
2018036737.tif 000008
【図７】
2018036737.tif 000009
【図８】
2018036737.tif 000010
【図９】
2018036737.tif 000011
【図１０】
2018036737.tif 000012
【図１１】
2018036737.tif 000013
【図１２】
2018036737.tif 000014
【図１３】
2018036737.tif 000015
【図１４】
2018036737.tif 000016
【図１５】
2018036737.tif 000017
【図１６】
2018036737.tif 000018
【図１７】
2018036737.tif 000019
【図１８】
2018036737.tif 000020
【図１９】
2018036737.tif 000021
【図２０】
2018036737.tif 000022
【図２１】
2018036737.tif 000023
【図２２】
2018036737.tif 000024
【図２３】
2018036737.tif 000025
【図２４】
2018036737.tif 000026
【図２５】
2018036737.tif 000027
【図２６】
2018036737.tif 000028
【図２７】
2018036737.tif 000029