(57)【特許請求の範囲】
【請求項１】
セルの分布パターンによって情報を表現する２次元コードであり、情報記録領域が複数のブロックに分割されていると共に、前記ブロック内に記録されている情報の記録形式を示す記録形式指示コードが前記ブロック毎に含まれ、前記複数のブロックの内の少なくとも一つには、他のブロックに記録された情報の誤り訂正用の情報が記録されており、さらに、前記情報の記録された情報ブロック及び当該情報ブロックに記録された情報の誤り訂正用の情報が記録された誤り訂正ブロックによって構成されるブロック対が前記情報記録領域中に複数存在する場合に、そのブロック対単位で個別に設定された誤り訂正率に基づいて記録されており、当該ブロック対単位での誤り訂正率を示す訂正率指示コードが前記ブロック毎に含まれた２次元コードを生成する方法であって、
まず、コード化すべき情報を、初期値として指定された誤り訂正率に基づいてコード生成した上で、前記ブロック対単位での誤り訂正率の変更が指示されている場合には、その変更後の誤り訂正率に基づいてコード生成し直し、
コード生成をし直した状態で、コード化すべき情報が対応するブロック内に収まっているか否かのオーバーフロー判定を行い、
当該オーバーフロー判定にてブロック内に収まらないと判定された場合には、情報記録領域の広いフォーマットに基づいてコード生成し直してから前記オーバーフロー判定を再度行い、一方、前記オーバーフロー判定にてブロック内に収まっていると判定された場合には、コード生成完了とすること、
を特徴とする２次元コードの生成方法。
【請求項２】
請求項１記載の２次元コードの生成方法において、
前記ブロック対単位での誤り訂正率を示す訂正率指示コードを前記ブロック毎に含めてコード生成を行うこと、
を特徴とする２次元コードの生成方法。
【請求項３】
請求項２記載の２次元コードの生成方法において、
前記ブロック対単位での誤り訂正率の変更が指示されていない場合には、前記訂正率指示コードを含めないこと、
を特徴とする２次元コードの生成方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、２次元コードの生成方法などに関する。
【０００２】
【従来の技術】
従来、提案されている２次元コードとしては、例えば特開平７−２５４０３７号公報記載のものがある。ここで示されている２次元コードは、ＱＲコードと呼ばれるものであり、図１８（ｂ）に一例を示すごとく情報が２次元的な広がりを持ち、図１８（ａ）に示すバーコードに比べて格段に大量の情報を記録できるが、構造は複雑なものとなっている。すなわち、図１９に示すごとく、２次元コード５００の存在位置の確定を容易にするため特定寸法比率の正方形を組み合わせた位置決め用シンボル５１０ａ，５１０ｂ，５１０ｃや、それら３個の位置決め用シンボル５１０ａ，５１０ｂ，５１０ｃ相互の間に設けられた白と黒とが交互に組み合わせられた各データセル位置の指標となる基準パターンであるタイミングセル５２０ａ，５２０ｂを備えている。
【０００３】
２次元コード５００の内部は、ｎ×ｎの正方形の升目（以下、これをセルという）に区切られており、位置決め用シンボル５１０ａ，５１０ｂ，５１０ｃは、例えば、一辺の長さが７セルに相当する黒い正方形５１２、一辺の長さが５セルに相当する白い正方形５１４、一辺の長さが３セルに相当する黒い正方形５１６を同心状に重ね合わせた時にできる図形である。この位置決め用シンボル５１０ａ，５１０ｂ，５１０ｃの中心付近を直線的に横切ると、黒、白、黒、白、黒のパターンが１：１：３：１：１の比率で検出されるので、この性質を利用して、前記比率で黒と白が交互に検出された場合、そのパターンを位置決め用シンボル５１０ａ，５１０ｂ，５１０ｃの有力な候補と判断し、２次元コード５００の存在位置を確定するために優先的に検査する。
【０００４】
そして、２次元コード５００の形状は、３個の位置決め用シンボル５１０ａ，５１０ｂ，５１０ｃで一義的に決まる平行四辺形の範囲であると推定できる。なお、データは、位置決め用シンボルや基準パターンなどを除外した情報記録領域５３０のセル（すなわち、データセル）で表され、各データセルを白あるいは黒に色分けすることにより、各データセルを１ビットのデータに対応させている。ただし、図１９ではデータセルの白黒のパターンは判り易くするために省略されている。各データセルの位置は、３個の位置決め用シンボル５１０ａ，５１０ｂ，５１０ｃの中心と２つのタイミングセル５２０ａ，５２０ｂを、それぞれ縦方向と横方向の座標の指標として、簡単な計算により求めることができる。このように位置が決定した、各データセルの中心付近が黒であるか白であるかを判定して、黒を例えば１，白を例えば０に対応させることにより、２値データとして認識でき、解読することができる。
【０００５】
そして、このような２次元コードにおいては、いわゆる誤り訂正機能を備えたものがある。これは、２次元コードの一部が破損や汚れによって読み取れない場合であっても、データ解読が可能にする機能である。具体的には、図１９に示すように、領域５３０をデータブロックと誤り訂正ブロックとに分割し、誤り訂正ブロックには例えばリード・ソロモンなどを用いた誤り訂正データを配置しておくのである。誤り訂正データの量によって誤り訂正レベルは異なる。つまり、コード全体の何％の情報が読み取れなくても誤り訂正にて対処できるかというレベルは異なるが、その誤り訂正が可能か不可能かの判断は、「コード全体の何％の情報が読み取れないのか」を基準としていた。
【０００６】
【発明が解決しようとする課題】
しかしながら、このようにコード内の情報全体（つまり、データブロック＋誤り訂正ブロック）に対する破損などの割合を基準とした場合には、実際には解読可能なデータが含まれている場合であっても、一律に誤り訂正不可能として対処してしまう状況が発生する。その点を具体例で説明する。
【０００７】
例えば、図２０に示した２次元コード（ＱＲコード）においては、Ｄ１〜Ｄ４６で示すものがデータブロックであり、Ｅ１〜Ｅ８８で示すものが誤り訂正ブロックであって、この場合の誤り訂正レベルは３０％である。なお、データブロックはＤ１〜Ｄ４６で示す４６個のデータコードワードで構成され、誤り訂正ブロックはＥ１〜Ｅ８８で示す８８個の誤り訂正コードワードで構成されている。なお、ここではリード・ソロモン（ＲＳ）を用いて誤り訂正を行うため、誤り訂正ブロックをＲＳブロック、誤り訂正コードワードをＲＳコードワードと表すこととする。
【０００８】
また、データブロックはＤ１〜Ｄ２３で示すデータコードワードで構成されるデータブロック１とＤ２４〜Ｄ４６で示すデータコードワードで構成されるデータブロック２に分割されているものとする。それに対応して、ＲＳブロックもＥ１〜Ｄ４４で示すＲＳコードワードで構成されるＲＳブロック１とＥ４５〜Ｄ８８で示すＲＳコードワードで構成されるＲＳブロック２に分割されている。
【０００９】
そして、データブロックの内のデータコードワードＤ１〜Ｄ２３と、ＲＳブロックの内のＲＳコードワードＥ１〜Ｄ４４が破損などで読み取れない状況を考える。この場合の全コードワード数は、４６＋８８＝１３４であり、破損などで読み取れないコードワード数は６７である。すると、破損率は６７／１３４＝５０％であるため、誤り訂正レベルの３０％を超えているため、データ解読が不可能であると判断される。
【００１０】
ところが、図２０からも判るように、この場合には、データブロック２を構成するデータコードワードＤ２４〜Ｄ４６については全く破損しておらず、この部分だけを取り出せれば、データ解読ができるのである。つまり、全コードワード数を基準にして見ると、破損度合いが誤り訂正レベルを超えている場合であっても、データブロックが複数に分割されている場合には、ブロック単位で見ると破損率が小さく、誤り訂正によって十分にデータ解読できるような場合もある。
【００１１】
このような観点からすれば、情報記録領域を複数のブロックで構成し、そのブロック単位でのデコードを可能とすることが望ましい。この場合、極力多くのデータ解読を実現できる。また、このようにブロック単位でのデコードが可能な構成を前提とすれば、ブロック単位で誤り訂正率を変えるなど、種々の展開が可能である。そこで、このように２次元コードを生成する方法を提供することを目的とする。
【００１３】
【課題を解決するための手段及び発明の効果】
請求項１記載の生成方法で生成される２次元コードは、セルの分布パターンによって情報を表現する２次元コードであって、情報記録領域が複数のブロックに分割されていると共に、ブロック内に記録されている情報の記録形式を示す記録形式指示コードがブロック毎に含まれていることを特徴とする。情報はセルの分布パターン、一般的には白黒（明暗）２種類のセルの分布パターンにて表現されており、０，１のビット列で情報を示すこととなる。そして、そのビット列に実質的な意味を与えるため、例えば数字・英字・漢字などの記録形式（モード）を特定する。
【００１４】
このこと自体は従来から実施されているのであるが、従来は、例えば「記録形式指示コード（数字）」→実際の情報のビット列→「記録形式指示コード（英字）」→実際の情報のビット列→「記録形式指示コード（漢字）」→実際の情報のビット列→……といった具合に、記録形式が変わる場所にのみ記録形式指示コードが配置されていた。そのため、記録形式指示コードが破損などでデコードできなくなると、その後に記録されている実際の情報のビット列がどのような記録形式なのかが判らないため、デコードできなくなる。そこで、情報記録領域を複数のブロックに分割すると共に、そこに記録されている情報に対応して記録形式指示コードをブロック毎に含ませた。そのため、どのブロックについても、ブロック内に記録されている情報の記録形式は自ブロック内の記録形式指示コードのみに基づいて特定できるようになった。
【００１５】
この点について、図１０を参照してさらに具体的に説明する。図１０（ａ）に示すように、従来は、第１ブロックの最初に記録形式指示コードαがあり、第１ブロックの途中で記録形式が変わるとその場所に記録形式指示コードβが配置される。そして、第２ブロックは第１ブロックの最後と同じ記録形式であった場合、第２ブロック内には記録形式指示コードが存在しない。第１ブロックも正常にデコードできれば問題ないが、記録形式指示コードβを含む第１ブロックの一部あるいは全部が破損し、記録形式指示コードβがデコードできなかった場合には、第２ブロックに記録された情報の記録形式を特定することができない。つまり、第２ブロックに記録された情報については全く破損などがなくても、読み取れないのである。
【００１６】
そこで、今回発明した２次元コードは、図１０（ｂ）に示すように、第２ブロックの記録形式を示す記録形式指示コードγを第２ブロック内（ここではブロックの先頭）に配置してある。記録形式指示コードγは第１ブロック内の記録形式指示コードβと同じであるが、このように重複する場合であっても自ブロック内に配置することで、第１ブロックの情報のデコードの可否に影響されず、第２ブロックだけでもデコードすることができるようになる。
【００２０】
また、請求項１記載の生成方法で生成される２次元コードにおいて、情報記録領域中の複数のブロックの内の少なくとも一つには、他のブロックに記録された情報の誤り訂正用の情報が記録されている。
【００２２】
さらに、請求項１記載の生成方法で生成される２次元コードにおいて、情報ブロック及び誤り訂正ブロックによって構成されるブロック対が情報記録領域中に複数存在する場合に、そのブロック対単位で個別に設定された誤り訂正率に基づいて記録されており、そのブロック対単位での誤り訂正率を示す訂正率指示コードがブロック毎に含まれている。
【００２３】
このようにすれば、コード化される情報の内容の重要度などに応じて適切な誤り訂正率を選択設定することができる。つまり、重要度の異なる情報があった場合に、全ての情報に対して誤り訂正率を高くしてしまうと、あまり重要でない情報について設定された誤り訂正用情報に無駄が生じるが、このように区別して設定できれば、合理的なコード化を実現することができる。
【００２５】
このような２次元コードを生成する場合には、請求項１に示すような方法を採用すればよい。すなわち、まず、コード化すべき情報を、初期値として指定された誤り訂正率に基づいてコード生成する。
その上で、ブロック対単位での誤り訂正率の変更が指示されている場合には、その変更後の誤り訂正率に基づいてコード生成し直す。そして、コード生成をし直した状態で、コード化すべき情報が対応するブロック内に収まっているか否かのオーバーフロー判定を行う。このオーバーフロー判定にてブロック内に収まらないと判定された場合には、情報記録領域の広いフォーマットに基づいてコード生成し直してからオーバーフロー判定を再度行う。当然ながら、再度ブロック内に収まらないと判定された場合には、さらに情報記録領域の広いフォーマットに基づいてコード生成し直してからオーバーフロー判定を行う。一方、オーバーフロー判定にてブロック内に収まっていると判定された場合には、コード生成完了とする。
【００２６】
このようにすれば、コード化すべき情報を全てコード化しながら、重要度が高い情報について誤り訂正率を高くすることが可能となる。もちろん、コード化すべき情報量が相対的に少なく、誤り訂正率を高くする前の状態において、ブロック内の一部にしか実質的に意味のあるコードが存在しない場合には、誤り訂正率を高くした場合にも、オーバーフローしない可能性も考えられる。しかし、一般的には、コード化すべき情報を全てコード化する前提であれば、情報記録領域の広いフォーマットに基づいてコード生成し直す（一般的には「バージョンを大きくする」などと呼ばれる。）ことが必要であるため、このような生成方法が適切である。
【００２７】
そして、このようにブロック対単位での誤り訂正率が異なる場合には、そのブロック対単位での誤り訂正率を示す訂正率指示コードをブロック毎に含める構成を採用することが望ましい。したがって、その場合の生成方法としては、請求項２に示すように、誤り訂正率を示す訂正率指示コードをブロック毎に含めてコード生成を行えばよい。
【００２８】
なお、ブロック対単位での誤り訂正率を変更しないような２次元コードも生成できるようにするためには、請求項３に示すように、ブロック対単位での誤り訂正率の変更が指示されていない場合には、訂正率指示コードを含めないようにすれば対処できる。
【００４３】
【発明の実施の形態】
以下、本発明が適用された実施例について図面を用いて説明する。なお、本発明の実施の形態は、下記の実施例に何ら限定されることなく、本発明の技術的範囲に属する限り、種々の形態を採り得ることは言うまでもない。
【００４４】
図１のブロック図には、２次元コード読取装置２の概略構成、図２には、２次元コード読取装置２にて検出される２次元コードの一例の概略図を示す。まず、２次元コード５２について説明する。図２に示す２次元コード５２は、いわゆるＱＲ（Quick Response）コードであって、白色の台紙５３の上に印刷されており、３個の位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃ、頂点検出用セル５５、情報記録領域５６、タイミングセル２０ａ，２０ｂ及びフォーマットコード７０などから構成されている。
【００４５】
情報記録領域５６中の各セルは、光学的に異なった２種類のセルから選ばれており、図および説明上では白（明）・黒（暗）で区別して表す。なお、図２では便宜上、情報記録領域５６のデータセルの白黒のパターンは省略している。
３つの位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃは、２次元コード５２の４つの頂点の内、３つに配置されている。この位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃのセルの明暗配置は、図３（Ａ）に示すごとく、１セル幅の黒部からなる枠状正方形５５ａ内の中心部分に、１セル幅の白部からなる縮小した枠状正方形５５ｂが形成され、その内側の中心部分に黒部からなる３セル×３セルの大きさの正方形５５ｃが形成されているパターンである。
【００４６】
また、頂点検出用セル５５は、図２に示すごとく、４つの頂点の内、３つの位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃが配置されていない残りの頂点に配置されている。
一方、タイミングセル２０ａ，２０ｂは、位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃ間に配置されており、白と黒とが交互に組み合わせられた各データセル位置の指標となる基準パターンとして用いられる。
【００４７】
また、フォーマットコード７０は、位置決め用シンボル５４Ａの近傍に配置されており、情報記録領域５６内に記録された情報のフォーマットについて、予め設定されたバージョン情報を示すものとなっている。本実施例の２次元コード（ＱＲコード）の規格におけるバージョン情報は、１〜８のバージョンと、各バージョンについて４つの誤り訂正レベルＬ，Ｍ，Ｑ，Ｈとの組み合わせで構成されるものとし、例えば「３−Ｌ」，「５−Ｈ」などと表すこととなる。
ここで、バージョン情報に対応して設定されている情報について説明する。まず、バージョン１〜８は、主に総コードワード数の違いに対応する。コードワードは８ビットで構成されており、図５に示すＤ１〜Ｄ４６及びＥ１〜Ｅ８８で示すそれぞれがコードワードに対応する。なお、Ｄ１〜Ｄ４６で示す４６個のコードはデータコードワードであり、Ｅ１〜Ｅ８８で示す８８個のコード誤り訂正コードワードである。本実施例ではリード・ソロモン（ＲＳ）を用いて誤り訂正を行うため、誤り訂正コードワードをＲＳコードワードと表す。図５に示す例は、バージョン５に対応するものであり、４６個のデータコードワードと８８個のＲＳコードワードとの和である１３４個が総コードワード数となる。
【００４８】
なお、データコードワードＤ１〜Ｄ４６及びＲＳコードワードＥ１〜Ｅ８８の数字は、デコードの順番に対応しており、Ｄ１からデコードを開始してＤ４６までデコードすると続いてＥ１をデコードし、最後のＥ８８で終了する。本実施例では、図５において下から上へ縦の列を順番にデコードしながら、右から左へデコードする列を移動していく。
【００４９】
また、上述したように各コードワードは８ビットで構成されるため、Ｄ１〜Ｄ４６及びＥ１〜Ｅ８８はそれぞれ８つのセルで構成されることとなる。但し、最初のデータコードワードＤ１は４ビットで構成されている。しかし、誤り訂正のためのリード・ソロモン計算時は、４個のゼロビットを頭に付けて８ビットのコードワードとして処理される。
【００５０】
そして、４６個のデータコードワードの内のＤ１〜Ｄ２３によってデータブロック１が構成され、Ｄ２４〜Ｄ４６によってデータブロック２が構成される。それに対応して、ＲＳコードワードの内のＥ１〜Ｄ４４によってＲＳブロック１が構成され、Ｅ４５〜Ｄ８８によってＲＳブロック２が構成される。つまり、情報記録領域５６は複数（ここでは４つ）のブロックに分割されている。なお、図５では、判り易いように、データブロック２及びＲＳブロック２をそれぞれ太枠にて囲ってある。
【００５１】
バージョン１〜８が主に総コードワード数の違いに対応することを説明したが、誤り訂正レベル（Ｌ，Ｍ，Ｑ，Ｈ）は、例えばＲＳコードワード数やＲＳブロック数あるいはデータコードワード数などを規定する。例えば、図５に示す例は、バージョン５−Ｈに対応するものであり、ＲＳコードワード数が８８でＲＳブロック数が２である。したがって、上述したようにバージョン５の総コードワード数は１３４であるため、ブロック単位で考えると、１つのデータブロックは２３個のデータコードワードで構成され、１つのＲＳブロックは４４個のコードワードで構成され、それらの組み合わせが２セット存在することとなる。
【００５２】
なお、ここで説明している規格の場合には、同じバージョン５でもＬ，Ｍ，ＱについてはＲＳブロック数が１である。また、誤り訂正能力は、誤り訂正レベルで言えばＨ→Ｑ→Ｍ→Ｌの順番で小さくなっている。全体の内のどの程度の割合のコードワードが破損などで読み取れなくても誤り訂正によって正常にデコードすることができるかを示す許容破損率で示すと、以下のようになる。
【００５３】
誤り訂正レベルＨ…約３０％
誤り訂正レベルＱ…約２５％
誤り訂正レベルＭ…約２０％
誤り訂正レベルＬ…約１０％
このようなバージョン情報とその実質的な内容（総コードワード数、ＲＳコードワード数、誤り訂正能力など）との対応関係が、２次元コード読取装置２の例えば制御回路２８内のＲＡＭ等にテーブル化して格納されている。
【００５４】
そして、図５で言えば１３４個のコードワードＤ１〜Ｄ４４，Ｅ１〜Ｅ８８の内の所定位置には、インジケータと呼ばれるコードが記録される。これは、記録されているビット列が何を意味しているのかを定義するための「記録形式指示コード」である。本実施例では４ビットで示すこととし、例えば０００１は数字、００１０は英数字、１０００は漢字といった具合である。本実施例では、このインジケータが記録されている部分から再度インジケータが記録されるまでの間の記録形式を定義することとする。
【００５５】
このインジケータは、図６に示すように、各ブロックの先頭、つまりデータブロック１の先頭のデータコードワードＤ１、データブロック２の先頭のデータコードワードＤ２４、ＲＳブロック１の先頭のＲＳコードワードＥ１、ＲＳブロック２の先頭のＲＳコードワードＥ４５にそれぞれインジケータが記録されている。もちろん、データブロック１中で記録形式が変化する場合には、対応するデータコードワードＤｎにインジケータが記録される。他のブロックについても同様である。
【００５６】
このように、各ブロックの先頭にインジケータを記録することは、次のような利点がある。
図１０（ａ）に示すように、従来は、第１ブロックの最初にインジケータαがあり、第１ブロックの途中で記録形式が変わるとその場所にインジケータβが配置され、第２ブロックは第１ブロックの最後と同じ記録形式であった場合、第２ブロック内にはインジケータが存在しなかった。第１ブロックも正常にデコードできれば問題ないが、インジケータβを含む第１ブロックの一部あるいは全部が破損し、インジケータβがデコードできなかった場合には、第２ブロックに記録された情報の記録形式を特定することができない。つまり、図５の場合で言えば、データブロック１内のインジケータが破損されている場合には、データブロック２に記録された情報については全く破損などがなくても、それが数字を示すものなのか漢字を示すものなのか、といった記録形式が判らないため、結果的に読み取れなくなる。
【００５７】
それに対して、本実施例の場合には、図１０（ｂ）に示すように、第２ブロックの記録形式を示すインジケータγを第２ブロックの先頭に配置した。インジケータγは第１ブロック内のインジケータβと同じであるが、このように重複する場合であっても自ブロック内に配置することで、第１ブロックの情報のデコードの可否に影響されず、第２ブロックだけでもデコードすることができるようになる。したがって、図５の場合で言えば、データブロック１あるいはデータブロック２は、各々のブロックについて誤り訂正可能な範囲の破損であれば、他方のデータブロックの破損状況に関係なく、自ブロックの記録形式が把握できる。
【００５８】
なお、図１０（ａ），（ｂ）では、第１ブロックの途中にインジケータβが配置され、第２ブロックは第１ブロックの最後と同じ記録形式である場合を想定したが、図１０（ｃ）に示すように、第１ブロックの最初にインジケータαがあり、第１ブロック及び第２ブロックの記録形式が同じ場合でも同様である。つまり、図１０（ｄ）に示すように、第２ブロックの先頭にはインジケータγを配置する。このインジケータγの記録形式はインジケータαと同じであるが、上述した理由で重複配置させる。
【００５９】
次に、２次元コード読取装置２について説明する。図１に示すように、２次元コード読取装置２は、ＣＣＤ４、２値化回路６、画像メモリ８、クロック信号出力回路１４、アドレス発生回路１６、変化点検出回路１８、比検出回路２０、アドレス記憶メモリ２２および制御回路２８から構成されている。
【００６０】
制御回路２８は、ＣＰＵ、ＲＯＭ、ＲＡＭ、Ｉ／Ｏ等を備えたコンピュータシステムとして構成され、ＲＯＭに記憶されているプログラムに従って、２次元コード読み取り処理等を実行し、２次元コード読取装置２の各構成を制御する。この制御回路２８は、以下に述べるごとく読み取り制御を行う。
【００６１】
まず制御回路２８の指示により、ＣＣＤ４にて２次元コード５２が通過する場所の２次元画像を検出する。ＣＣＤ４は、２次元画像を検出すると、図４（ａ）に示すごとくの多段階のレベルからなる信号にて２次元画像データを出力する。この２次元画像データを、２値化回路６が制御回路２８から指示された閾値にて２値化して、図４（ｂ）に示すごとくの１（ハイ）／０（ロー）の２つのレベルからなる信号に変換する。
【００６２】
一方、ＣＣＤ４から出力される同期パルスに応じて、クロック信号出力回路１４がＣＣＤ４から出力される２次元画像データのパルスより十分に細かいクロックパルスを出力する。アドレス発生回路１６はこのクロックパルスをカウントして、画像メモリ８に対するアドレスを発生させる。２値化された２次元画像データは、このアドレス毎に８ビット単位で書き込まれる。
【００６３】
一方、２値化回路６からの信号における「１」から「０」への変化あるいは「０」から「１」への変化時に、変化点検出回路１８は、比検出回路２０にパルス信号を出力する。比検出回路２０は、変化点検出回路１８からのパルス信号入力から次のパルス信号入力までに、クロック信号出力回路１４から出力されたクロックパルスをカウントすることによって、２次元画像中の明（１）の連続する長さおよび暗（０）の連続する長さを求める。この長さの比から、２次元コード５２の位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃに該当するパターンを検出する。
【００６４】
図３（Ａ）に示したごとく、位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃのほぼ中心を代表的な角度で横切るＣＣＤ４の走査線（ａ），（ｂ），（ｃ）での明暗パターンは、図３（Ｂ）に示すごとく、すべて同じ明暗成分比を持つ構造になっている。すなわち、位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃの中心を横切るそれぞれの走査線（ａ），（ｂ），（ｃ）の明暗成分比は暗：明：暗：明：暗＝１：１：３：１：１となっている。勿論、走査線（ａ），（ｂ），（ｃ）の中間の角度の走査線においても比率は１：１：３：１：１である。また、図３（Ａ）の図形が、ＣＣＤ４側から見て斜めの面に配置されていたとしても、前記走査線（ａ），（ｂ），（ｃ）の明暗成分比は暗：明：暗：明：暗＝１：１：３：１：１を維持する。なお、図３（Ｂ）は、２値化回路６からの２値化された信号に該当する。
【００６５】
このことにより、比検出回路２０は、この「１：１：３：１：１」なる明暗成分比を検出し、検出した場合は、そのタイミングにアドレス発生回路１６にて発生されている画像メモリ８のアドレスをアドレス記憶メモリ２２に記憶する。
したがって、ＣＣＤ４が１フレーム分の２次元画像データを検出すると、画像メモリ８には、２値化された２次元画像データが記憶され、アドレス記憶メモリ２２には、検出された分の位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃのアドレスが記憶されている。
【００６６】
なお、最初の２次元画像の１フレーム分の画像が得られると、制御回路２８は、画像メモリ８およびアドレス記憶メモリ２２のデータに基づいて後述する２次元コード読み取り処理を行い、この処理が終了すれば、制御回路２８は、続けて、ＣＣＤ４に次の１フレームの２次元画像の検出を指示する。したがって、ＣＣＤ４からは、再度、２次元画像が２値化回路６に出力され、上述したごとくの処理が繰り返される。
【００６７】
次に、１フレーム分の２次元コード５２の画像とその位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃのアドレスが、画像メモリ８とアドレス記憶メモリ２２とにそれぞれ記憶された後に、制御回路２８は、２次元コード読み取り処理を実行する。この２次元コード読み取り処理を図７〜９のフローチャートを参照して説明する。
【００６８】
処理が開始されると、まず、位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃの検出処理が行われる（Ｓ１００）。
この処理では、画像メモリ８およびアドレス記憶メモリ２２に対してアクセスし、その記憶内容から位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃが適切な位置に、３つ存在しているか否かの判断と位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃの画像上での正確な形状と中心位置とを決定する。
【００６９】
この処理は、まずアドレス記憶メモリ２２に多数検出された位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃのアドレスが、位置的に３つのグループに分けられるかを、そのアドレス値と画像メモリ８の画像とを参照しつつ判断する。更に、各位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃの形状と中心位置とを、画像メモリ８の画像の１（白）／０（黒）のパターンから決定し、その３つが図２に示したごとく３つの頂点に存在する配置状態になっているかを判断する。
【００７０】
次に、ステップＳ１００にて適切な３つの位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃが検出されたか否かが判定され（Ｓ１２０）、検出されていなければ（Ｓ１１０：ＮＯ）、次の画像の検出をＣＣＤ４に指示して（Ｓ１８０）、処理を終了する。
【００７１】
適切な３つの位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃが検出されると（Ｓ１１０：ＹＥＳ）、次に新しい２次元コード５２か否かが判定される（Ｓ１２０）。この処理は、前回以前に検出された２次元コード５２がいまだＣＣＤ４により検出され続けている場合に、別の２次元コードとして解読するのを防止するためである。例えば、前回または所定回数前の本処理にて、適切な３つの位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃが検出され、更にそのコード内容も既に適切に読み取られていた場合には、同一の２次元コード５２を検出しているものとして（Ｓ１２０：ＮＯ）、次の画像の検出をＣＣＤ４に指示して（Ｓ２８０）、処理を終了する。
【００７２】
新しい２次元コード５２であると判定すると（Ｓ１２０：ＹＥＳ）、次に位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃの形状に応じて、各位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃを構成する各セルの形状と中心位置が計算される（Ｓ１３０）。
【００７３】
すなわち、まず、位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃについては、図２，図３（Ａ）に示すように、黒の枠状正方形５５ａの幅が１セル分、白の枠状正方形５５ｂの幅が１セル分、および黒の正方形５５ｃの幅が３セル分の形状であることから、画像メモリ８内の各位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃ全体の高さと幅とから、その高さと幅とをそれぞれ７で割ることにより、各位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃの位置におけるセルの高さと幅の値、すなわちセルの形状を各３つ得る。
【００７４】
次に、このようにして求められた各位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃにおけるセルの高さと幅に基づいて、各位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃにおける各セル位置を決定する。
次に、位置決め用シンボル５４Ａに基づいてフォーマットコード７０の検出処理を行う（Ｓ１４０）。このフォーマットコード７０は、位置決め用シンボル５４Ａの最外周の枠状正方形５５ａ（図３（Ａ）参照）を構成する４辺の内、位置決め用シンボル５４Ｂに対向する辺に対して、１セル分だけ離れて平行に配置されている。したがって、この関係に基づけばフォーマットコード７０の位置が判り、コード検出することができる。
【００７５】
次に、設定されている処理モードが第１のデコード処理であるかどうかを判断する（Ｓ１５０）。本実施例においては、詳しくは後述するように、従来通りに情報記録領域５６全体を対象としたデコード（全体デコード処理）を行い、失敗した場合にだけブロック単位でのデコード（部分デコード処理）を実施する第１のデコード処理と、最初から部分デコード処理を実施する第２のデコード処理があり、ユーザが図示しない設定スイッチなどを操作していずれかを設定できるようになっている。このＳ１５０ではその設定結果に基づいて、第１のデコード処理が設定されているかどうかを判断するのである。そして、第１のデコード処理が設定されている場合は（Ｓ１５０：ＹＥＳ）、第１のデコード処理を実行し（Ｓ１６０）、第２のデコード処理が設定されている場合は（Ｓ１５０：ＮＯ）、第２のデコード処理を実行する（Ｓ１７０）。
【００７６】
ここで、Ｓ１６０において実行する第１のデコード処理及びＳ１７０において実行する第２のデコード処理の詳細について、図８，９のフローチャートを参照して説明する。
まず、Ｓ１６０での第１のデコード処理について説明する。
【００７７】
図８に示すように、本処理ルーチンが開始すると、まず、全体デコード処理を実行する（Ｓ１６１）。具体的には、図７のＳ１４０にて検出したフォーマットコード７０に基づき、そのバージョンに対応する２次元コード５２中の情報記録領域５６の存在するエリアを特定する。本実施例の場合には１セルのサイズは予め固定であるため、存在エリア及びセルの大きさが判り、図７のＳ１３０にて検出された位置決め用シンボル５４Ａ，５４Ｂ，５４Ｃの形状及び中心位置に基づいて、情報記録領域５６の各データセルの中心位置を決定する。そして、各データセルの中心位置の画素から２値を読み取り、各セルの種類を決定しコード内容を得る。すなわち情報記録領域５６内の全てのコードワードを対象としたデコード処理を行う。
【００７８】
なお、このデコードの際には、必要に応じてフォーマットコード７０から得たフォーマット情報に基づいた処理を実行する。例えば、図５に示すように、コードワードは基本的に２セル×４セルで構成されることとなるが、縦長のものと横長のものが混在している。したがって、どのようなセルグループでコードワードが構成されるかというフォーマット情報をフォーマットコード７０から得て、それに基づいてデコードすればよい。
【００７９】
こうして、全体デコード処理（Ｓ１６１）を実行した後は、続くＳ１６２において、デコードしたコード内容が正常なものか否かが判定される。なお、Ｓ１６１における全体デコード処理では、ＲＳコードワードを用いた誤り訂正が行われているため、その誤り訂正レベル以内の破損であれば正常なコード内容が得られるが、誤り訂正レベルを超える破損などがあると正常なコード内容を得ることはできない。
【００８０】
コード内容が正常であれば（Ｓ１６２：ＹＥＳ）、そのまま本処理ルーチンを終了して、図７のＳ１８０へ移行するが、コード内容が正常でなければ（Ｓ１６２：ＮＯ）、Ｓ１６３へ移行する。
Ｓ１６３では情報記録領域５６が複数のブロックに分割されているかどうかを判断する。複数ブロックに分割されていない場合には（Ｓ１６３：ＮＯ）、ブロック単位でのデコードが不可能なので、そのまま本処理ルーチンを終了する。
【００８１】
一方、複数ブロックに分割されていれば（Ｓ１６３：ＹＥＳ）、デコード順序に従ってコードワードＤ１…Ｄ４６，Ｅ１…Ｅ８８を探索して、インジケータを検出する（Ｓ１６４）。そして、インジケータを検出できた場合には（Ｓ１６５：ＹＥＳ）、そのインジケータが含まれるブロックについてデコード処理（部分デコード処理）を行う（Ｓ１６６）。
【００８２】
その後、Ｓ１６４へ戻る。なお、Ｓ１６４へ戻って行うインジケータ検出は、直前のＳ１６６でのデコード処理にてデコードしたブロックの後に存在するインジケータを検出する。このようにして、インジケータが検出できる限り、対応するブロックのデコード処理（Ｓ１６６）を行い、インジケータが検出できなくなった時点で（Ｓ１６５：ＮＯ）、Ｓ１６７へ移行する。このようにすることで、インジケータが検出できたブロックについてはそのインジケータで定義される記録形式に基づいてデコードすることができる。もちろん、コードワードの破損量が多ければ、誤り訂正によっても正常にコード内容を得ることができないかもしれないが、そのような判断もブロック単位で行われる。
【００８３】
Ｓ１６７では、コード内容結合処理を実行する。このコード内容結合処理は、ブロック単位でデコードされたコード内容を、必要に応じて結合する処理である。つまり、デコードしたブロック単位のコード内容をどのように使用するかによってこの結合処理は変えればよく、例えば結合をしない場合もあるし、特定のブロックのコード内容のみを結合させることも考えられる。
【００８４】
Ｓ１６７でのコード内容結合処理の後は、本処理ルーチンを終了して、図７のＳ１８０へ移行する。
次に、Ｓ１７０での第２のデコード処理について説明する。
図９に示すように、本処理ルーチンが開始すると、まず、情報記録領域５６が複数のブロックに分割されているかどうかを判断する（Ｓ１７１）。複数ブロックに分割されていない場合には（Ｓ１７１：ＮＯ）、ブロック単位でのデコードが不可能なので、そのまま本処理ルーチンを終了する。
【００８５】
一方、複数ブロックに分割されていれば（Ｓ１７１：ＹＥＳ）、デコード順序を決定する（Ｓ１７２）。図７のＳ１４０にて検出したフォーマットコード７０に基づき、そのバージョンが判るので、情報記録領域５６内に存在するブロックの数及びその存在エリアが判る。そして、例えば図５に示すようにデータブロック及びＲＳブロックがそれぞれ２つずつ存在する場合であれば、４つのブロックをどのような順序でデコードしていくかを決定する。なお、必ずしもデータブロック１→データブロック２→ＲＳブロック１→ＲＳブロック２の順序でデコードしなくてもよいので、Ｓ１７２では、任意の順序を決定すればよい。
【００８６】
デコード順序が決定した後は、順序番号ｎ＝１にして（Ｓ１７３）、順序ｎのブロックにおけるインジケータを検出する（Ｓ１７４）。そして、インジケータを検出できなかった場合には（Ｓ１７５：ＮＯ）、Ｓ１７７へ移行するが、インジケータを検出できた場合には（Ｓ１７５：ＹＥＳ）、そのインジケータが含まれるブロックについてデコード処理（部分デコード処理）を行ってから（Ｓ１７６）、Ｓ１７７へ移行する。
【００８７】
Ｓ１７７では、順序番号をインクリメント（ｎ＝ｎ＋１）し、その順序ｎのブロックがあるかどうかを判断する（Ｓ１７８）。順序ｎのブロックがあれば（Ｓ１７８：ＹＥＳ）、Ｓ１７４へ戻る。このようにして、Ｓ１７２にて設定された順序に従ってインジケータを検出し、対応するブロックのデコード処理（Ｓ１７６）を行い、全てデコードし終えた場合（Ｓ１７８：ＮＯ）、コード内容結合処理を実行する（Ｓ１７９）。このコード内容結合処理は、上述した図８のＳ１６８と同様なので説明は繰り返さない。
【００８８】
Ｓ１７９でのコード内容結合処理の後は、本処理ルーチンを終了して、図７のＳ１８０へ移行する。
このように、本実施例の２次元コード読取装置２においては、ブロックの先頭に配置されたインジケータの示す記録形式に基づいて当該ブロック内のコードをデコードする部分デコード処理を、複数のブロックについてそれぞれ行い、その複数のブロックのデコード結果に基づいて、２次元コード５２の内容を読み取ることができる。ブロック内のコードに対する記録形式は、自ブロックの先頭のインジケータさえあれば特定できるため、他のブロックでのデコード結果に影響を受けずにデコードすることができる。したがって、ブロック単位で実行する部分デコード処理によって、ブロック単位で極力多くの情報を読み取ることができるようになる。
【００８９】
例えば、図２０に示す２次元コード（ＱＲコード）は、図５に示すものと同じバージョン５−Ｈであり、約３０％のコードワードの破損があっても誤り訂正が可能である。しかし、図２０中に網掛けして示したように、データブロック１を構成するデータコードワードＤ１〜Ｄ２３と、ＲＳブロック１内のＲＳコードワードＥ１〜Ｄ４４が破損などで読み取れない場合、コードワードの破損率は６７／１３４＝５０％で誤り訂正可能な３０％を超えているため、データ解読が不可能であると判断される。
【００９０】
ところが、図２０からも判るように、この場合には、データブロック２を構成するデータコードワードＤ２４〜Ｄ４６については全く破損しておらず、この部分だけを取り出せれば、データ解読ができるのである。つまり、全コードワード数を基準にして見ると、破損度合いが誤り訂正レベルを超えている場合であっても、データブロックが複数に分割されている場合には、ブロック単位で見ると破損率が小さく、誤り訂正によって十分にデータ解読できるような場合もある。
【００９１】
上述したように、本実施例ではブロックの先頭にインジケータを配置することで、ブロック単位でデコードすることができるようにしたため、図２０のような状況であれば、データブロック２のコードを正常にデコードすることができる。なお、本実施例では、第１のデコード処理（Ｓ１６０）と第２のデコード処理を選択的に実行することとしたが、それぞれのデコード処理の利点は次の通りである。まず、第１のデコード処理の場合は、最初に情報記録領域５６全体をデコード対象とした全体デコード処理を実行し（Ｓ１６１）、その全体デコード処理によっては情報記録領域５６の内容を正常に読み取ることができなかった場合に限って（Ｓ１６２：ＮＯ）、部分デコード処理を実行している（Ｓ１６４〜Ｓ１６７）。そのため、Ｓ１６１の全体デコード処理によって正常に読み取れれば、部分デコード処理は不要となる。したがって、情報記録領域５６の誤り訂正限度以上の破損が発生することが少ないと想定される状況においてはこの第１のデコード処理が有効である。
【００９２】
逆に、情報記録領域５６の誤り訂正限度以上の破損が発生することが多いと想定される状況においては、一旦、全体デコード処理をしてから、再度部分デコード処理を行う必要があるため、最初から部分デコード処理のみを実行する第２のデコード処理の方が有効である。
【００９３】
以上、本発明はこのような実施形態に何等限定されるものではなく、本発明の主旨を逸脱しない範囲において種々なる形態で実施し得る。それらのいくつかを説明する。
（１）上述した実施例では、インジケータをブロックの先頭に配置したが、ブロックの内のどこかに配置されていれば記録形式が判り、ブロック単位でのデコードが可能となる。但し、ブロックの先頭に配置されている方が処理効率としては有利である。なぜなら、ブロックの途中に配置されていると、その記録形式指示コードを見つけた後、デコード順序からすれば前に戻ってブロックの最初から処理をしなければならないのに対し、先頭に配置されていれば、部分デコード処理は、インジケータの示す記録形式に基づいて、当該インジケータ以降に記録された情報をデコードすればよいからである。つまりデコード順序に従って順次処理することができる。
【００９４】
（２）また、上述した実施例では、バージョン情報とその実質的な内容（総コードワード数、ＲＳコードワード数、誤り訂正能力など）との対応関係を、２次元コード読取装置２の制御回路２８内のＲＡＭ等にテーブル化して格納しておき、フォーマットコード７０から得たバージョン情報を基にして、情報記録領域５６中の複数のブロックの存在エリアを特定した。しかし、自ブロックの存在領域を直接あるいは間接的に特定可能な存在領域指示コードを作成し、ブロック内に配置しておいてもよい。このような２次元コードの場合には、２次元コードの画像を得ると共に、その画像中での存在領域指示コードを検出し、その存在領域指示コードに基づいてデコード対象のブロックの存在領域を特定し、部分デコード処理を実行すればよい。そして、このような存在領域指示コードを配置する場合には、上述したインジケータと合わせて一つのコードワードを構成することが望ましい。そうすれば、インジケータを特定した後、それに続いて配置された存在領域指示コードを自動的に特定したり、逆に、存在領域指示コードを特定した後、それに続いて配置されたインジケータを自動的に特定できるからである。
【００９５】
（３）上述した実施例では、２次元コード５２の例としてＱＲコードを例に取って説明したが、他の２次元コードであっても同様に適用できる。
（４）上述した実施例で読取対象として説明した２次元コード５２においては、例えば図２に示すように、位置決め用シンボル５４Ａ〜５４Ｃを二重の正方形で、中心を横切る周波数成分比が黒：白：黒：白：黒＝１：１：３：１：１の図形で表していたが、図１１（ａ）のように円形でもよく、図１１（ｂ）のように六角形でもよく、また他の正多角形でも良い。即ち、同心状に相似形の図形が重なり合う形に形成したものであればよく、図７のＳ１００にて行う位置決め用シンボル検出処理の内容はなんら変わらない。さらに、中心を横切る周波数成分比があらゆる角度で同じならば、図１１（ｃ）に示すごとく、図形を何重にしても良い。この場合には、対応する周波数成分比を検出する処理が、図７のＳ１００にて行う位置決め用シンボル検出処理となるだけである。
【００９６】
（５）さらに、上述した実施例では、例えば図２に示すように、読取対象の２次元コード５２の外形を正方形で示したが、長方形でも良い。また、例えば図２に示すように、位置決め用シンボル５４Ａ〜５４Ｃは、２次元コード５２の４つの頂点の内、３つに配置されていたが、２次元コード５２内での配置は任意である。また１つの２次元コード５２に４つ以上の位置決め用シンボルを設けても良い。
【００９７】
（６）また位置決め用シンボルは２つでも良い。この場合に対角の２頂点に位置決め用シンボルを配置すれば２次元コード５２の配置は決定する。
（７）また、前記実施例では、位置決め用シンボル５４Ａ〜５４Ｃは比検出回路２０によりハード的に検出していたが、ソフト的に検出しても良い。
【００９８】
（８）さらに、上述した実施例においては、２次元コード５２を構成するセルサイズを全て同じにしたが、図１２に示す２次元コード１５２のように、ブロック単位でセルサイズを変更しても良い。この場合、コード化したい情報の重要度が高いほどセルサイズを大きくすることが考えられる。セルサイズが大きいほど、汚れや（２次元コード１５２を印刷する場合には）印刷精度などの影響を受けにくく、データ解読がより確実に実現できるようになるからである。なお、この図１２に示す例では誤り訂正ブロックが存在するので、セルサイズは「ブロック対」単位で変更する。
【００９９】
（９）また、ブロック単位でデコードできるという特徴を鑑みれば、図１３に示す２次元コード２５２ように、あるブロックにはセルを配置せず、人間が視認可能な情報を書き込むようにしてもよい。例えば、漢字・仮名文字・英数字・各種記号である。但し各種記号の場合には、その記号の表す意味をユーザが知っていることが前提である。そして、この「人間が視認可能な情報」は、別のブロックの情報との間で特定の関係を持たせる。例えば、パーソナルデータが情報として別のブロックにある場合、その一部に個人名が存在していればそれを記してもよいし、情報内に個人名がなく（例えば数字などで管理されている場合）ても、誰のデータかを示すために個人名を記すことが考えられる。また、何に関するデータであるかを示すテーマを記してもよい。
【０１００】
このようにすれば、少なくとも誰に（何に）関するデータが記された２次元コード２５２なのかかが判り、管理面でのメリットが期待できる。これはいわば、キャッシュカードやクレジットカードなどにおいてカードにエンボス加工で所有者名を記す場合と、その目的は似ている。
【０１０１】
（１０）また、同様にブロック単位でデコードできるという特徴を鑑みれば、図１４に示す２次元コード３５２のように、２次元コード３５２の情報記録領域中の複数のブロックの内、特定のブロックの情報についてのみ、特殊な読取装置でなければ実質的な内容が読み取れない状態で記録しておくようにしてもよい。つまり、特殊な読取装置でなければ実質的な内容が読み取れない「特殊規格」に沿って記録した領域と、一般的な読取装置で読み取ることのできる「一般規格」に沿って記録した領域とを混在させて構成するのである。なお、この図１４に示す例では誤り訂正ブロックが存在するので、特殊な読取装置でなければ実質的な内容が読み取れない状態で記録する対象も、「ブロック対」単位とする。
【０１０２】
具体的には、特殊規格に沿った記録領域については、磁気インクあるいは特定波長を変調する特殊なインクで記録されていることにより、光学的には読み取れない状態で記録することが考えられる。特殊なインクは、小切手や手形、あるいは紙幣などにおいても実現されているものである。したがって、磁気インクなどに限らず、同様の目的で用いられる「特殊インク」であればどのようなものでも採用可能である。
【０１０３】
また、光学的な読取自体は一般的な読取装置でも可能であるが、特殊規格に沿った記録領域の情報に対して所定の暗号化処理を施すことにより、読み取った情報をさらに暗号解読しなくては実質的な内容が読み取れない状態で記録しておいてもよい。
【０１０４】
このような２次元コード３５２であれば、コード化する情報の一部に機密性が高い情報が含まれている場合に、その情報の漏洩防止に有効である。例えば健康診断などのプライバシー性の高い情報を処理する際、事務処理に必要な事項については通常の読取装置で読み取れるようにし、実質的な診断内容については専用の読取装置でないと読み取れないようにする。なお、機密性の高い情報には、上述した健康診断などのプライバシー性の高い情報だけでなく、例えば会社内で運用する場合には社外秘とされる情報などがこれに該当する。
【０１０５】
そして、このように機密性の高い情報をコード化する場合、例えばコード全体を特殊規格にする手法も考えられるが、事務的処理自体も専用の読取装置で扱う必要が出てくる。したがって、実質的に機密性の高い情報内容が漏洩することを防止しながら、事務的処理自体は通常通り（つまり重要度の低い情報がコード化された２次元コードと同様に）行うことができる本２次元コード３５２の有用性は明らかである。
【０１０６】
（１１）さらに、上述した実施例においては、複数のブロック対、つまりデータブロック１＋ＲＳブロック１で構成される第１のブロック対と、データブロック２＋ＲＳブロック２で構成される第２のブロック対が存在していたが、これらの誤り訂正レベルは一定であった。しかしながら、ブロック単位での部分デコード処理が実行できることが前提となる場合には、図１５に示す２次元コード４５２のように、ブロック対単位で誤り訂正レベルを個別に設定することもできる。例えば第１のブロック対については誤り訂正レベルＨとし、第２のブロック対については誤り訂正レベルＬとするといった具合である。
【０１０７】
このようにすれば、コード化される情報の内容の重要度などに応じて適切な誤り訂正率を選択設定することができる。つまり、重要度の異なる情報があった場合に、全ての情報に対して誤り訂正率を高くしてしまうと、あまり重要でない情報について設定された誤り訂正用情報に無駄が生じるが、このように区別して設定できれば、合理的なコード化を実現することができる。
【０１０８】
そして、このようにブロック対単位で誤り訂正レベルを変更できるようにした場合には、誤り訂正率を指示するための訂正率指示コードを上述のインジケータに含めておくことが好ましい。具体的には、誤り訂正レベルを変更した場合にのみ、インジケータの先頭に所定のビット列（例えば００００００）を付け、続けて誤り訂正レベルを示すビット列を付ける。誤り訂正レベルを示すビット列としては、例えば規格で定められた次のビット列を用いる。
【０１０９】
誤り訂正レベルＭ…ビット列００
誤り訂正レベルＬ…ビット列０１
誤り訂正レベルＱ…ビット列１１
誤り訂正レベルＨ…ビット列１０
そうすれば、２次元コード４５２を読み取る場合に、部分デコード処理として、訂正率指示コードの示す誤り訂正率に基づいて、該当するブロックに記録された情報をデコードすればよい。そのデコード処理について図１６のフローチャートを参照して説明する。
【０１１０】
まず、各ブロックの先頭のインジケータビットをチェックし（Ｓ３１０）、ビット列「００００００」が存在しているか否かを判断する（Ｓ３２０）。上述したように、誤り訂正レベルを変更した場合にのみ、インジケータの先頭にビット列「００００００」が付けられている。そこで、ビット列「００００００」が存在する場合には（Ｓ３２０：ＹＥＳ）、Ｓ３３０へ移行し、ビット列「００００００」の後の２ビットに基づいて誤り訂正レベルを取得し、その誤り訂正レベルにて該当ブロックをデコードする。
【０１１１】
一方、当該ビット列が存在しない場合には（Ｓ３２０：ＮＯ）、Ｓ３４０へ移行して、通常のデコード手法にてデコードする（Ｓ３４０）。この場合には、ブロック内に誤り訂正レベルを示す情報はないが、図２に示すフォーマットコード７０から得られるバージョン情報に基づいてコード全体の誤り訂正レベルを判断できる。
【０１１２】
以上は、ブロック単位で誤り訂正レベルを変更した２次元コード４５２及びその読取方法に関して説明したが、このような２次元コード４５２を生成する際には、通常とは異なる考慮が必要なので、次に、コード生成に関して説明する。ここでいうコード生成とは、例えば最終的に２次元コード４５２を台紙に印刷するのであれば、その印刷用のデータを生成することを意味する。したがって、コード生成のための装置としては、印刷まで行うのであれば、コンピュータシステムとプリンタを備えればよい。コンピュータシステムは、ユーザ入力のためのキーボードやマウス、ユーザが内容確認するためのディスプレイなどを備える。
【０１１３】
それでは、このような生成装置にて実行される生成方法の概略を最初に説明し、その後に、具体的な処理内容についてフローチャートを参照して説明する。
［生成方法の概略］
まず、コード化すべき情報を、初期値として指定された誤り訂正率に基づいてコード生成する。その上で、ブロック対単位での誤り訂正率の変更が指示されている場合には、その変更後の誤り訂正率に基づいてコード生成し直す。そして、コード生成をし直した状態で、コード化すべき情報が対応するブロック内に収まっているか否かのオーバーフロー判定を行う。このオーバーフロー判定にてブロック内に収まらないと判定された場合には、情報記録領域の広いフォーマットに基づいてコード生成し直してからオーバーフロー判定を再度行う。当然ながら、再度ブロック内に収まらないと判定された場合には、さらに情報記録領域の広いフォーマットに基づいてコード生成し直してからオーバーフロー判定を行う。一方、オーバーフロー判定にてブロック内に収まっていると判定された場合には、コード生成完了とする。
【０１１４】
このようにすれば、コード化すべき情報を全てコード化しながら、重要度が高い情報について誤り訂正率を高くすることが可能となる。もちろん、コード化すべき情報量が相対的に少なく、誤り訂正率を高くする前の状態において、ブロック内の一部にしか実質的に意味のあるコードが存在しない場合には、誤り訂正率を高くした場合にも、オーバーフローしない可能性も考えられる。しかし、一般的には、コード化すべき情報を全てコード化する前提であれば、情報記録領域の広いフォーマットに基づいてコード生成し直す（一般的には「バージョンを大きくする」などと呼ばれる。）ことが必要であるため、このような生成方法が適切である。
そして、このようにブロック対単位での誤り訂正率が異なる場合には、そのブロック対単位での誤り訂正率を示す訂正率指示コードをブロック毎に含める構成を採用することが望ましい。したがって、その場合の生成方法としては、誤り訂正率を示す訂正率指示コードをブロック毎に含めてコード生成を行えばよい。なお、ブロック対単位での誤り訂正率を変更しないような２次元コードも生成できるようにするためには、ブロック対単位での誤り訂正率の変更が指示されていない場合には、訂正率指示コードを含めないようにすれば対処できる。
【０１１５】
［具体的な処理内容］
図１７のフローチャートは２次元コード４５２の生成処理を示しているが、この処理が開始される前の準備として、▲１▼誤り訂正レベルをブロック毎に変える変更モードか、変更しない通常モードかの指定、▲２▼誤り訂正率の指定、がユーザによってなされる。この誤り訂正率の指定は、上述したＨ，Ｑ，Ｍ，Ｌという誤り訂正レベルで指定すればよい。なお、以降の説明においても、誤り訂正率は具体的には誤り訂正レベルとして取り扱われることとなる。
【０１１６】
上述した前準備がなされ、コード生成を開始すると、図１７の最初のステップ５１０に示すように、ブロック毎に訂正レベルを変更するかどうかを判定する（Ｓ５１０）。これは、上述のモード指定の結果に基づいて判定する。
そして、ブロック毎に訂正レベルを変更しない場合には（Ｓ５１０：ＮＯ）、Ｓ５２０へ移行し、コード化したい情報を入力して、各ブロックともに同じ誤り訂正率（上記▲２▼で指定された誤り訂正レベルに基づく訂正率）で生成する。この場合には、各ブロック先頭のインジケータには訂正率情報は含まれない。したがって、デコード時には、上述した図１９のＳ３２０にて否定判定となり、通常のデコード手法にてデコードを行うこととなる。
【０１１７】
一方、ブロック毎に訂正レベルを変更する場合には（Ｓ５１０：ＹＥＳ）、Ｓ５３０へ移行し、まずＳ５２０と同様に、コード化したい情報を入力して、各ブロックともに同じ誤り訂正率で生成する。
そして、続くＳ５４０で、誤り訂正率を変えたいブロック及び変更後の誤り訂正率を受け付ける。上記▲２▼で指定された誤り訂正率が前提であるので、その訂正率から変更したいブロックについてのみ訂正率の受付を行う。この誤り訂正率の受付は、例えばディスプレイに設定画面を表示し、キーボードやマウスによってユーザからの入力を受け付ければよい。ユーザの指定方法を考慮すると、最初に訂正率の小さな方を指定しておき、このステップでは訂正率を大きくする方を指定するのが一般的かと思われる。もちろん、レアケースであるが、最初の指定訂正率から全てのブロックについて変更することも考えられる。例えば訂正レベルを間違って指定してしまった場合などである。
【０１１８】
続くＳ５５０では、誤り訂正率を変更する対象のブロック先頭のインジケータに、所定のビット列「００００００」及び訂正率を示す２ビットを付加する。誤り訂正率を示すビット列は、上述したように、誤り訂正レベルＭ，Ｌ，Ｑ，Ｈに対してそれぞれビット列００，０１，１１，１０が規格により定められている。
【０１１９】
続くＳ５６０では、誤り訂正率を変更した後の情報量を、該当するブロックの記録可能な容量と比較し、Ｓ５７０では、オーバーフロー（誤り訂正率を変更した後の情報量＞記録可能容量）したか否かを判定する。
オーバーフローしていなければ（Ｓ５７０：ＮＯ）、これでコード生成処理を終了する。なお、一般的には誤り訂正率を大きくするため、最初の判定ではオーバーフローすることが多いと考えられるが、レアケースとして、誤り訂正率を小さくした場合、あるいは誤り訂正率を大きくしたが元々の情報量が少なかったため、誤り訂正率を大きくしてもブロック内に収まるような場合には、最初のオーバーフロー判定にて否定判定（Ｓ５７０：ＮＯ）となる。
【０１２０】
一方、オーバーフローしている場合には（Ｓ５７０：ＹＥＳ）、このままのバージョンでは収まりきらないため、Ｓ５８０へ移行して、バージョンを所定段階大きくする。その後、Ｓ５６０へ戻って、再度、該当するブロックの容量と比較する。バージョンが大きくなれば、当然ながら該当するブロックの容量も従前よりは大きくなっているので、Ｓ５７０での判定にてオーバーフローでなくなる可能性が高い。オーバーフローでなくなれば（Ｓ５７０：ＮＯ）、コード生成処理を終了する。
【０１２１】
なお、バージョンを大きくする際には、オーバーフローしたビット数を考慮して、そのオーバーフローした分が収まるような容量を持つ最小のバージョンを決定することが好ましい。これは、極力小さなバージョンのものを用いた方が、コードサイズが小さくなるからである。また、オーバーフローしたビット数を考慮せずに、機械的に１バージョンずつ大きくしていく方法もある。このようにすれば、何回かバージョンを大きくした時点で、オーバーフローしない状態となるからである。
【０１２２】
なお、このように生成されたコードは、例えば印刷用のデータに変換されて印刷されることとなる。
【図面の簡単な説明】
【図１】  実施例における２次元コード読取装置の概略構成を表すブロック図である。
【図２】  実施例における２次元コードの概略構成説明図である。
【図３】  実施例における位置決め用シンボルを走査した場合の明暗検出の説明図である。
【図４】  実施例におけるＣＣＤと２値化回路との出力信号の説明図である。
【図５】  実施例における２次元コードの情報記録領域内のコードワードの構成を示す説明図である。
【図６】  実施例における２次元コードの情報記録領域内におけるインジケータの配置場所を示す説明図である。
【図７】  実施例における２次元コード読み取り処理の全体を示すフローチャートである。
【図８】  実施例における２次元コード読み取り処理内で実行される第１のデコード処理ルーチンを示すフローチャートである。
【図９】  実施例における２次元コード読み取り処理内で実行される第２のデコード処理ルーチンを示すフローチャートである。
【図１０】  記録形式指示コード（インジケータ）の配置に関する従来技術と本願発明との対比説明図である。
【図１１】  位置決め用シンボルの他の形状の例を示す説明図である。
【図１２】  別実施例における２次元コードの概略構成説明図である。
【図１３】  別実施例における２次元コードの概略構成説明図である。
【図１４】  別実施例における２次元コードの概略構成説明図である。
【図１５】  別実施例における２次元コードの概略構成説明図である。
【図１６】  図１５に示す別実施例における２次元コードのデコード方法を示すフローチャートである。
【図１７】  図１５に示す別実施例における２次元コードの生成方法を示すフローチャートである。
【図１８】  従来のバーコードおよび２次元コードの説明図である。
【図１９】  従来の２次元コードの概略構成説明図である。
【図２０】  ２次元コードの情報記録領域内のコードワードの５０％が破損した状態を示す説明図である。
【符号の説明】
２…２次元コード読取装置            ４…ＣＣＤ
６…２値化回路                      ８…画像メモリ
１４…クロック信号出力回路          １６…アドレス発生回路
１８…変化点検出回路                ２０…比検出回路
２０ａ…タイミングセル                ２２…アドレス記憶メモリ
２８…制御回路
５２，１５２，２５２，３５２，４５２…２次元コード
５３…台紙                ５４Ａ，５４Ｂ…位置決め用シンボル
５５…頂点検出用セル      ５５ａ，５５ｂ…枠状正方形
５５ｃ…正方形                        ５６…情報記録領域
７０…フォーマットコード          ５００…２次元コード
５１０ａ，５１０ｂ，５１０ｃ…位置決め用シンボル
５１２，５１６…黒い正方形          ５１４…白い正方形
５２０ａ，５２０ｂ…タイミングセル  ５３０…情報記録領域
【図１】
0004122629.tif 000002
【図２】
0004122629.tif 000003
【図３】
0004122629.tif 000004
【図４】
0004122629.tif 000005
【図５】
0004122629.tif 000006
【図６】
0004122629.tif 000007
【図７】
0004122629.tif 000008
【図８】
0004122629.tif 000009
【図９】
0004122629.tif 000010
【図１０】
0004122629.tif 000011
【図１１】
0004122629.tif 000012
【図１２】
0004122629.tif 000013
【図１３】
0004122629.tif 000014
【図１４】
0004122629.tif 000015
【図１５】
0004122629.tif 000016
【図１６】
0004122629.tif 000017
【図１７】
0004122629.tif 000018
【図１８】
0004122629.tif 000019
【図１９】
0004122629.tif 000020
【図２０】
0004122629.tif 000021