2次元コード読取装置とそのプログラム
【課題】 2次元コード画像が曲線状歪みを有する場合でも、この曲線状歪みを効果的に矯正して高精度のコード解読を可能にする。
【解決手段】 カメラ2により撮像された2次元コードの画像データを二値化画像に変換した後、当該二値化画像から2次元コードのファインダパターンを検出し、この検出されたファインダパターンの上下左右各辺の座標値を検出する。そして、この検出されたファインダパターンの上下左右各辺の座標値をもとに、上記2次元コードの画像データの上下左右各辺の形状を直線及び曲線で近似した近似線を生成し、この生成された近似線をもとに上記2次元コードの画像データの歪みを矯正して、この歪みが矯正された2次元コードの画像データをもとに上記2次元コードを解読する。
【解決手段】 カメラ2により撮像された2次元コードの画像データを二値化画像に変換した後、当該二値化画像から2次元コードのファインダパターンを検出し、この検出されたファインダパターンの上下左右各辺の座標値を検出する。そして、この検出されたファインダパターンの上下左右各辺の座標値をもとに、上記2次元コードの画像データの上下左右各辺の形状を直線及び曲線で近似した近似線を生成し、この生成された近似線をもとに上記2次元コードの画像データの歪みを矯正して、この歪みが矯正された2次元コードの画像データをもとに上記2次元コードを解読する。
【発明の詳細な説明】
【技術分野】
【0001】
この発明は、例えば印刷された2次元コードをカメラにより撮像し、その画像データをもとに2次元コードを解読する2次元コード読取装置とそのプログラムに関する。
【背景技術】
【0002】
近年、雑誌等の印刷物に表示されたQRコードに代表される2次元コードを例えば携帯電話機のカメラにより撮像し、その画像データから上記2次元コードに含まれるURL(Uniform Resource Locator)を認識する。そして、このURLをもとにインターネットに対しアクセスすることにより、対応するWebサーバから情報を取得できるようにするサービスが普及している。この種のサービスを利用すると、ユーザはURLをキー操作により入力する必要がなくなり、大変便利である。
【0003】
しかしながら、2次元コードを携帯電話機のカメラにより撮像する際に、2次元コードにカメラが正対していないと、2次元コードの撮像画像が台形状に歪んでしまい、2次元コードを正しく認識できなくなることがある。そこで、従来では撮像された2次元コードの形状を矯正する機能を備えた2次元コード読取装置が提案されている。例えば、図19に示すように撮像された2次元コード画像PCの周囲に四角形ABCDを設定し、0≦s≦1,0≦t≦1を満たすs、tに対してAP:PB=CP′:P′D=s:1−s、AQ:QC=BQ′:Q′D=t:1−tとなるPP′及びQQ′を設定する。これにより任意のs及びtに対してPP′とQQ′の交点R(s,t) が求まる。ここで、あるtに対して0から1までsを変化させることにより2次元コードの一部を検査することが可能となる。さらに、0から1までのtに対して上記検査線を設定することにより2次元コード全体を検査することが可能となり、画像に含まれるデータ領域のセル位置が決定される(例えば、特許文献1を参照。)。
【0004】
【特許文献1】特開2006−155218号公報
【発明の開示】
【発明が解決しようとする課題】
【0005】
ところが、上記従来より提案されている装置は、台形状の歪みに対しては有効であるが、例えばカメラの光学系の歪みや印刷物の表面の歪みの影響により、2次元コードの撮像画像が例えば図18(a),(b)に示すように糸巻き型又は樽型に歪んだ場合には、このような曲線状歪みを補正することができず、その結果高精度の認識を行うことができなかった。
【0006】
この発明は上記事情に着目してなされたもので、その目的とするところは、2次元コード画像が曲線状歪みを有する場合でも、この曲線状歪みを効果的に矯正して高精度のコード解読を可能にした2次元コード読取装置とそのプログラムを提供することにある。
【課題を解決するための手段】
【0007】
上記目的を達成するためにこの発明の一観点は、撮像手段から2次元コードの画像データを取り込んでメモリに記憶する。そして、メモリから読み出した画像データから、先ず当該2次元コードに含まれる複数のファインダパターンを検出し、この検出された複数のファインダパターンの各々についてその輪郭を表す辺の境界点を検出する。次に、この検出された複数のファインダパターンの辺の境界点をもとに、上記2次元コードの画像データの輪郭を表す4辺の形状を直線及び曲線の少なくとも一方で近似した近似線を生成し、この生成された近似線をもとに上記2次元コードの画像データの歪みを矯正して、この歪みが矯正された2次元コードの画像データを上記メモリに記憶する。そして、この歪みが矯正された2次元コードの画像データをもとに上記2次元コードを解読して出力するように構成したものである。
【0008】
したがって、撮像した2次元コードの画像が例えば糸巻き型又は樽型の曲線状歪みを有していても、2次元コードの画像データの輪郭を表す4辺の形状が直線及び曲線の少なくとも一方により近似され、その近似線をもとに上記2次元コードの画像データの歪みが矯正される。このため、上記糸巻き型又は樽型の曲線状歪みを有する2次元コード画像に対しても高精度のコード解読を行うことが可能となる。
【0009】
さらにこの発明は、以下のような具体的な構成を備えることを特徴とする。
第1の構成は、上記2次元コードの画像データの4辺の形状を近似して当該4辺の境界線を検出する際に、複数のファインダパターンの辺の境界点をもとに上記2次元コードの画像データの輪郭を表す辺の傾きを算出し、この算出された辺の傾きから推測される方向に画素探索を行って、上記2次元コードの画像データの辺を表す境界点を検出する。そして、上記算出された辺の傾きをもとに、上記検出された境界点に含まれるエラー点を除去する。
より具体的には、上記2次元コード画像の辺の傾きを算出する際に、第1及び第2のファインダパターンの各辺を表す境界点をもとにそれぞれ当該各辺の傾きを算出し、この算出された第1及び第2のファインダパターンの各辺の傾きをもとに、上記2次元コードの画像データの一辺の傾きを推測する。
【0010】
このようにすると、各ファインダパターンの境界点をもとに当該ファインダパターン間の2次元コード画像の辺の傾きが推測され、この傾きをもとに当該辺の境界点が探索される。そして、この探索された境界点の中からエラー点が除去される。このため、2次元コード画像の辺の境界線を精度良く推測できる。
【0011】
第2の構成は、上記エラー点を除去する際に、上記検出された境界点の各々について、当該境界点が、上記算出された辺の傾きから推測される範囲内に含まれているか否かを判定し、含まれていないと判定された境界点をエラー点として上記境界点から削除するものである。
【0012】
第3の構成は、上記エラー点を除去する際に、2次元コードの画像データの4辺のうち互いに直交する第1及び第2の辺の交点を算出し、この交点より外側の範囲に位置する境界点をエラー点として削除するものである。上記交点の算出手段としては、先ず第1の辺を表す境界点集合に含まれる1個以上の境界点を算出基準点としてしきい値線を引き、第2の辺を表す境界点集合に含まれる境界点が上記しきい値線より交点側に位置するか否かを判定する。そして、上記第2の辺を表す境界点集合のうち上記しきい値線より交点側に位置しない境界点の中から、当該交点に最も近い境界点をしきい値外近接点として検出する。次に、上記算出基準点から上記第1の辺の傾きを推定して引いた直線と上記第2の辺のしきい値外近接点から第2の辺の傾きを推定して引いた直線との交点をもとに交点候補点を算出し、上記第1の辺を表す境界点集合に含まれる境界点のうち上記しきい値線より交点側に位置する境界点の中から上記しきい値直線に最も近い境界点をしきい値内近接点として検出すると共に、上記第2の辺を表す境界点集合に含まれる境界点のうち上記しきい値線より交点側に位置する境界点の中から上記しきい値直線に最も近い境界点をしきい値内近接点として検出する。そして、上記検出された第1の辺のしきい値内近接点と、上記検出された第2の辺のしきい値内近接点のうち、上記算出された交点候補点より外側にあるものはどれかを判定する。
このようにすることで、2次元コードの画像データの4辺において探索された境界点の集合に含まれるエラー点を、より一層確実に削除することが可能となる。
【0013】
第4の構成は、2次元コードの歪みを矯正する際に以下のような処理を実行するものである。すなわち、先ず2次元コードの画像データの各頂点を結ぶ頂点フレームを生成する。次に、矯正対象の2次元コードの画像データにおける目標座標のピクセル値を算出するために、上記生成された頂点フレームの、上辺における上記目標座標に対応する点の座標値と、下辺における上記目標座標に対応する点の座標値と、左辺における上記目標座標に対応する点の座標値と、右辺における上記目標座標に対応する点の座標値をそれぞれ算出する。またそれと共に、上記2次元コードの画像データの、上辺における上記目標座標に対応する境界点の座標値と、下辺における上記目標座標に対応する境界点の座標値と、左辺における上記目標座標に対応する境界点の座標値と、右辺における上記目標座標に対応する境界点の座標値をそれぞれ算出する。さらに、上記頂点フレームにおいて上記目標座標に対応する目標座標値を算出する。そして、上記頂点フレームの上下左右の各辺について算出された上記目標座標に対応する点から、上記2次元コードの画像データの上下左右の各辺について算出された上記目標座標に対応する境界点へのベクトルを重み付け加算して、2次元コード歪みベクトルを算出し、上記頂点フレームについて算出された目標座標値に、上記算出された2次元コード歪みベクトルを加算して、上記2次元コードの画像データにおける上記目標座標に対応する目標座標値を算出する。
以上の処理を行うことで、曲線状歪みを有する2次元コードの画像データを長方形に矯正することが可能となる。
【発明の効果】
【0014】
すなわちこの発明の一観点によれば、2次元コード画像が曲線状歪みを有する場合でも、この曲線状歪みを効果的に矯正して高精度のコード解読を可能にした2次元コード読取装置とそのプログラムを提供することができる。
【発明を実施するための最良の形態】
【0015】
以下、図面を参照してこの発明に係わる実施形態を説明する。
図1は、この発明の一実施形態における2次元コード読取装置のハードウエア及びソフトウエアの構成を示すブロック図である。
本実施形態の2次元コード読取装置は、中央処理制御ユニット1と、カメラ2と、入力デバイス3と、表示デバイス4とを具備している。なお、2次元コード読取装置が携帯電話機に設けられる場合には、上記中央処理制御ユニット1、カメラ2、入力デバイス3及び表示デバイス4はいずれも携帯電話機が備える既存の構成を利用する。
【0016】
中央処理制御ユニット1は、CPU(Central Processing Unit)11を備え、このCPU11に対しバス12を介してプログラムメモリ13と、カメラインタフェース(カメラI/F)14と、入出力インタフェース(入力I/F)15と、データメモリ16を接続したものとなっている。
【0017】
カメラI/F14にはカメラ2が接続される。カメラ2は、例えばCCD又はCMOS等の半導体撮像素子を使用したものである。カメラI/F14は、CPU11の制御の下で上記カメラ2を起動し、カメラ2により撮像された2次元コードの画像データを取り込む。
【0018】
入出力I/F15には入力デバイス3及び表示デバイス4が接続される。入力デバイス3は、ダイヤルキーと複数の機能キーとから構成される。なお、キーの構成は機構式のキーであっても、また表示デバイス4に表示されたソフトウエアキーであってもよい。表示デバイス4は、例えばLCD又はELを使用したディスプレイからなる。入出力I/F15は、上記入力デバイス3の操作データを取り込むと共に、CPU11の制御の下で表示データを上記表示デバイスに表示させる。
【0019】
データメモリ16には、携帯電話機の送受信に必要な電話帳や送受信履歴、送受信メール等の各種データを記憶する領域に加え、この発明に係わる2次元コード読取処理を実施するために必要なデータを一次記憶する領域を備える。2次元コード読取処理を実施するために必要なデータとしては、カメラ2により撮像された2次元コードの画像データやその二値化画像データ、処理過程で生成される種々データが含まれる。
【0020】
プログラムメモリ13には、この発明に係わる2次元コード読取処理を実施するために必要なアプリケーション・プログラムとして、二値化画像生成プログラム131と、ファインダパターン検出プログラム132と、画像回転処理プログラム133と、ファインダパターン境界検出プログラム134と、2次元コード境界線算出プログラム135と、2次元コード歪み矯正プログラム136が格納されている。
【0021】
二値化画像生成プログラム131は、カメラ2により撮像された2次元コードの画像データをカメラI/F14を介して取り込んでデータメモリ16に一旦記憶させ、このデータメモリ16から当該画像データを読み出して二値化画像データに変換し、この変換された二値化画像データをデータメモリ16に記憶させる処理を、上記CPU11に実行させる。
【0022】
ファインダパターン検出プログラム132は、上記データメモリ16から上記二値化画像データを読み出し、この二値化画像データから2次元コードに含まれる複数のファインダパターン(例えばQRコードの場合には3個)を検出するための処理を、上記CPU11に実行させる。
【0023】
画像回転処理プログラム133は、上記ファインダパターン検出処理により検出されたファインダパターンの位置に基づいて、上記2次元コードの画像が正立した状態となるように上記二値化画像データを回転させ、この回転処理後の二値化画像データをデータメモリ16に記憶させる処理を、上記CPU11に実行させる。
【0024】
ファインダパターン境界検出プログラム134は、上記回転処理後の二値化画像データをデータメモリ16から読み出し、この読み出した二値化画像データから各ファインダパターンの黒枠の辺を表す境界点を検出してその座標値をデータメモリ16に記憶させる処理を、上記CPU11に実行させる。
【0025】
2次元コード境界線算出プログラム135は、上記検出された各ファインダパターンの黒枠の辺を表す境界点の座標値をデータメモリ16から読み出し、この読み出した境界点の座標値に基づいて、2次元コードの輪郭を表す上下左右の各辺の形状を直線及び曲線で近似した近似線を生成する。そして、この生成された近似直線と近似曲線のうちいずれか妥当であるかを判定して、妥当と判定された近似線を上記2次元コードの上下左右の各辺の形状を表す境界線としてその座標値をデータメモリ16に記憶させる処理を、上記CPU11に実行させる。
【0026】
2次元コード歪み矯正プログラム136は、上記2次元コード境界線算出プログラム135により算出された上記2次元コード画像の上下左右の各辺の境界線を表す座標値をデータメモリ16から読み出し、この読み出した上下左右の各辺の境界線をもとに、上記2次元コード画像の二値化画像データの歪みを矯正する処理を、上記CPU11に実行させる。
【0027】
次に、以上のように構成された装置による2次元コードの読取処理動作を説明する。図2乃至図5はCPU11によるその処理手順と処理内容を示すフローチャートである。
(1)2次元コードの画像データの取り込み
入力デバイス3においてユーザが撮像操作を行うと、CPU11はステップS11により上記撮像操作を入出力I/F15を介して検出する。そして、ステップS12に移行し、カメラI/F14を介してカメラ2を起動して、当該カメラ2により撮像された2次元コードの画像データをカメラI/F14を介して取り込んでデータメモリ16に記憶させる。
【0028】
なお、上記二次元コードの画像データは複数のピクセルにより構成される。ここで、取り込んだ画像データの幅をwidth、高さをheightとすると、取り込んだ画像データはwidth×heightこのピクセルにより構成される。各ピクセルは、RGBカラーモデルにおいて色を表現するデータであり、フレームにおけるx座標値、y座標値及びRGBの各値によって構成され、x座標値は0以上width未満の整数値、y座標値は0以上height未満の整数値であり、x軸は左から右方向へ、y軸は上から下方向へそれぞれ向くものとする。またRGBの各値はいずれも0以上255以下の整数値である。ここで、座標(x,y)におけるRGB各値が(r,g,b)であるとき、
p(x,y)=(r,g,b)
と表される。
【0029】
(2)二値化画像データの生成処理
上記二次元コードの画像データが取り込まれると、CPU11はステップS2において二値化画像生成プログラム131を起動し、上記二次元コードの画像データのコントラストを強調するために、当該二次元コードの画像データを二値化画像データに変換する処理を以下のように実行する。
【0030】
すなわち、先ずステップS21により、上記データメモリ16から二次元コードの画像データを読み出し、当該画像データの各ピクセルの輝度値を算出することによりグレースケール化する。例えば、
Grayscale(x,y)=RGBtoLuminance(r,g,b)
によって輝度値を算出して、グレースケール画像を生成する。なお、輝度値は0以上255以下の値を持つものとする。
【0031】
続いて、ステップS22において、上記生成されたグレースケール画像の最大輝度値maxL、再使用輝度値minLをそれぞれ検出し、この検出された最大輝度値maxL、再使用輝度値minLを用いて、以下に示す(1)式によりコントラスト拡大画像を生成する。
【数1】
【0032】
さらに、ステップS23において、例えばしきい値を128として下記(2)式に示す処理を実行し、二値化画像データを生成する。そして、この生成した二値化画像データをデータメモリ16に記憶させる。
【数2】
【0033】
(3)ファインダパターンの検出処理
上記二値化画像データの生成が終了すると、CPU11は次にステップS3によりファインダパターン検出プログラム132を起動し、上記二値化画像データからQRコードに含まれる3個の位置パターン、つまりファインダパターンを検出するための処理を以下のように実行する。
【0034】
すなわち、先ずステップS31において、データメモリ16から上記二値化画像データを読み出し、この二値化画像データに対しy軸の座標値を固定してx軸方向に走査する。そして、この走査により、例えば図6に示すように“白”、“黒”、“白”、“黒”、“白”のラインパターンを検出すると、各“白”と、各“黒”の長さをそれぞれ確認し、2個目の“黒”から6個目の“黒”までの長さの比、B1:W1:B2:W2:B3が1:1:3:1:1となっている箇所を検出し、この検出値をデータメモリ16に保持させる。
【0035】
具体的には、
L=B1+W1+B2+W2+B3
として0以上のしきい値tに対して
【数3】
を満たす箇所を検出する。例えば、t=0.3等の値を用いる。
【0036】
以下同様に、上記ステップS31によるラインパターンの検出処理をy軸方向の全ての座標値について実行する。そして、全てのラインパターンの検出値が得られたことがステップS32で確認されると、ステップS33に移行して、上記検出された複数のラインパターンのうち互いに接するラインパターンをセグメント化し、このセグメントのサイズが大きい3個をQRコードのファインダパターンとして認識して、その座標値をデータメモリ16に保存させる。
【0037】
(4)画像回転処理
上記3個のファインダパターンの検出が終了すると、CPU11は続いてステップS4に移行して画像回線処理プログラム133を起動し、上記検出されたファインダパターンの位置をもとに上記二値化画像データを以下のように回転させる。
すなわち、先ずステップS41において、上記検出された3個のファインダパターンF1,F2,F3の重心をそれぞれ算出する。そして、この算出された重心をW1=(u1,v1)、W2=(u2,v2)、W3=(u3,v3)として、下記(4)式によりD1,D2,D3を算出する。
【数4】
【0038】
そして、上記D1,D2,D3の算出結果をもとに、ステップS42において左上、右上、左下の各ファインダパターンを認識する。例えばD1が最大であればF1、D2が最大であればF2、D3が最大であればF3を左上ファインダパターンとして認識する。この処理は、右上と左上のファインダパターン間の距離が最大となることを利用している。図7にD1が最大となる場合の例を示す。
【0039】
続いて、右上ファインダパターンと左下ファインダパターンを認識するが、W2とW3を通り直線に対しW1が右側にある場合にはF2を右上ファインダパターン、F3を左下ファインダパターンとし、そうでない場合にはF3を右上ファインダパターン、F2を左下ファインダパターンとする。
【0040】
そうして左上、右上、左下の各ファインダパターンが認識されると、CPU11はステップS43において、例えば図8に示すように左上ファインダパターンFPLTのx軸方向に右上ファインダパターンFPRTが位置するように、二次元コード画像の二値化画像データを回転させる。
【0041】
(5)ファインダパターン境界の検出処理
次にCPU11は、ステップS5によりファインダパターン境界検出プログラム134を起動し、上記回転処理後の二値化画像データから3個のファインダパターンの黒枠の辺を表す境界点を検出する処理を以下のように実行する。
すなわち、CPU11は先ずステップS51において、例えば図9に示すように黒枠のセグメントSを抽出し、黒枠の4角の座標を算出する。4角の座標は、セグメントSに含まれる座標のうち、−x−yが最大となる座標を左上の角(cx1,cy1)、x−yが最大となる座標を右上の角(cx2,cy2)、y−xが最大となる座標を左下の角(cx3,cy3)、x−yが最大となる座標を右下の角(cx4,cy4)となるようにそれぞれ設定する。
【0042】
CPU11は次にステップS52において、上記黒枠のセグメントの上下左右の各辺を検出する。例えば、上辺FinderTopは、
【数5】
として検出される。
【0043】
これは、図10に示すように黒枠のセグメントS内において左上の角と右上の角との間のxについて、それぞれyが最小となる点の集合を表す。同様に、下辺FinderBottom、左辺FinderLeft、右辺FinderRightは、
【数6】
として検出される。
【0044】
(6)2次元コード境界線の算出処理
CPU11は、次にステップS6に移行して2次元コード境界線算出プログラム135を起動し、上記検出された3個のファインダパターンの黒枠の上下左右各辺の座標値に基づいて、2次元コード画像の輪郭を表す上下左右各辺に含まれる座標をそれぞれ検出し、その近似線を上下左右各辺の境界線として算出する処理を実行する。
【0045】
例えば、2次元コード画像の上辺の境界点座標を検出する場合、CPU11はステップS61〜S68により以下の処理を行う。すなわち、上辺の左側には左上ファインダパターンFPLT、右側には右上ファインダパターンFPRTが位置する。それぞれのファインダパターンFPLT,FPRTの上辺の境界点座標は、先に述べたファインダパターン境界検出処理により既に検出されているので、その検出結果を利用してファインダパターンFPLT,FPRT間に位置する2次元コード画像の上辺上の境界点の集合をステップS62により検出する。
【0046】
ここで、左側のファインダパターンFPLTの上辺の境界点の集合をLeftFinderEdge、右側のファインダパターンFPRTの上辺の境界点の集合をRightFinderEdgeとし、LeftFinderEdgeの右端の境界点を(LeftEndX,LeftEndY)、RightFinderEdgeの左端の境界点を(RightStartX,RightStartY)とする。また、LeftFinderEdgeに含まれる境界点の重心を(LeftCenterX,LeftCenterY)、RightFinderEdgeに含まれる座標点の重心を(RightCenterX,RightCenterY)とする。また、LeftFinderEdgeから最小二乗法によって近似した直線をy=alx+bl、RightFinderEdgeから最小二乗法によって近似した直線をy=arx+brとする。この最小二乗法によって得られた直線から、あるx座標における上辺の傾きedgeSlope(x)は、
【数7】
と推測できる。
【0047】
次にCPU11は、データメモリ16から読み出した二値化画像データにおいて、LeftEndXとRightStartXとの間の2次元コード画像の上辺を検出する。その検出処理は例えば図10に示すように、検出された上辺上の点P=(px,py)に対してx座標がpx+k(初期条件ではk=1)となる上辺上の点を検出するためにqy及びryを設定する。そして、qyからryまで下方向に“白”から“黒”に変わる最初の境界点を探索し、見つかった境界点P′=(px+k,py′)を新たな上辺上の境界点として検出する。ここで、qy及びryは、定数cq、cr,dq、drを用いて
【数8】
として求める。なお、定数については、例えばcq=5、cr=0、dq=0.1、dr=0.1等の値を用いる。
【0048】
一方、以上の処理により新たな境界点が見つからない場合には、kの値を1ずつ増やして探索し、見つかった場合にはP′に対してk=1から同様の処理を行うことで次の境界点を探索する。P=(LeftEndX,LeftEndY)から探索を開始し、px+k=RightStartXとなれば探索終了である。以上の処理によって、左上ファインダパターンFPLTと右上ファインダパターンFPRTとの間に位置する2次元コードの上辺上の境界点の集合MiddleEdgeが検出される。
【0049】
以上のステップS62の処理により検出された2次元コードの上辺上の境界点集合MiddleEdgeには、本来の上辺より2次元コード画像の内側の点も含まれる。そこでCPU11は、続いて2次元コード画像内の点の除去を行う。このエラー点の除去方法には、上辺の傾きから推測される範囲に含まれない点をエラーとして除去する第1の方法と、互いに直交する2つの辺の交点を求め、この交点より外側の範囲に位置する境界点をエラー点として削除する第2の方法とがある。ここでは、先ず第1の方法について説明し、第2の方法は後に詳しく説明する。
【0050】
第1の方法は以下のように行われる。すなわち、CPU11はエラー点の除去処理を右から左に向かって行う。ここで、点P=(px,py)に対し、MiddleEdgeに含まれ、Pより左に位置する最初の点をP′=(px′,py′)とする。このとき線分PP′の傾きは、
【数9】
と表される。
【0051】
ここで、あるxにおける上辺の傾きより定数ct(例えば0.1)だけ小さい傾きを返す関数edgeMinSlope(x)を、
【数10】
と定義する。
【0052】
ここで、P′がエラーであるか否かを、
【数11】
によって判定する。この式は、
【数12】
とも表現される。
【0053】
この判定処理は、図11に示すように、線分PQの傾きを推定される上辺の傾きとし、線分PRの傾きをPRの傾きよりctだけ小さい傾きであるとすると、P1′やP2′のようにRより上に位置する点はエラーではないが、P3′のようにRより下に位置する点はエラーとして検出される。ただし、図11においてQ、R、P1′、P2′、P3′のx座標値は全てpx′であるとする。上記手順によって、MiddleEdgeからエラー点が除去される。
【0054】
以上の手順によって、LeftFinderEdge、MiddleEdge、RightFinderEdgeによって2次元コード画像の上辺の境界点集合が検出される。ここで上辺の点集合TopEdgeは
【数13】
と表される。
【0055】
次にCPU11は、ステップS64,S65において、上記上辺の点集合TopEdge をもとにその近似線を算出する。TopEdgeの近似線は、近似直線或いは近似曲線によって表現する。TopEdgeに含まれる点列を
(x1,y1),(x2,y2),…,(xn,yn)
とすると、最小二乗法による近似直線y=ax+bは
【数14】
によって求まる。
【0056】
一方、近似曲線は最小二乗法による円への近似により求める。最小二乗法による円への近似では、(a,b)を中心とする半径Rの円(x−a)2 +(y−b)2 =Rを求めるために
【数15】
の最小化を行う。
【0057】
ただし、zi,B,C,Dはそれぞれ
【数16】
とする。
【0058】
F(a,b,R)をB、C、Dについてそれぞれ偏微分すると、
【数17】
となる。この連立方程式をCholesky分解により解き、B、C、Dを得て、
【数18】
によりa、b、Rを得る。
【0059】
次にCPU11は、ステップS66において近似直線と近似曲線とを比較してどちらが妥当であるかを判定する。この判定は、近似直線から各 (xi,yi)への距離の和と、近似曲線から各(xi,yi)への距離の和を比較し、距離の和が小さい方の近似線が妥当であると判定することにより正確に行うことができる。なお、計算量を低減したい場合には、(x1,y1)、(xM,yM)、(xn,yn)への距離の和によって判定しても良い。ただし、mは
【数19】
によって求まる整数であり、(xM,yM)は検出された上辺の点集合の中央の点である。以上の上辺の近似線算出の手順を図12のステップS121〜S126に示す。
【0060】
以上の手順によって上辺の境界線が算出される。同様に、図13に示すように左辺についても、xy座標系を左へ90度回転させて考える(上方向をx軸方向、右方向をy軸方向とする)ことで、同じ手順によって境界線が算出される。また、下辺については、xy座標系のy方向を逆転させることで、2次元コード画像の下辺の点集合を算出できる。ただし、QRコードには右下にファインダパターンはないため、RightFinderEdgeは存在しない。そこで、edgeSlope(x)は、(LeftCenterX,LeftCenterY)から(px′,py′)へ引いた線分の傾き
【数20】
によって算出する。
【0061】
また、RightFinderEdgeが存在しないため、探索は2次元コード画像の端まで行うものとし、そうして検出した点の集合をMiddleBottomEdgeとする。また右辺についても、xy座標系を右へ90度回転させて考える(下方向をx軸方向、左方向をy軸方向とする)ことで2次元コード画像の下辺の点集合を検出できる。しかし、この場合も上辺におけるRightFinderEdgeが存在しないので、edgeSlope(x)は下辺と同様に
【数21】
によって算出し、こちらも2次元コード画像の端まで探索を行うものとし、そうして検出した点の集合をMiddleRightEdgeとする。
【0062】
次に、2次元コード画像の右下の角の座標RightBottomを検出する。初期のxy座標系(右方向がx軸方向、下方向がy軸方向)におけるMiddleBottomEdgeを
【数22】
とし、同様に初期のxy座標系におけるMiddleRightEdgeを
【数23】
とする。このときbx1<bx2<...<bxM及びry1<ry2<...<ryNとなる。また、左下ファインダパターンFPLBは右上ファインダパターンFPRTより左下に位置すると考えられるので、bx1<rx1かつry1<by1となる。
【0063】
またCPU11は、RightBottomは2次元コードにおいてf(x,y)=x+yが最大となる点だと仮定し、MiddleBottomEdgeとMiddleRightEdgeからRightBottomの近くに位置する点を探索する。ただし、MiddleBottomEdgeはRightBottomより右側の点を、MiddleRightEdgeはRightBottomより下側の点を含んでいう可能性があるので、これらのエラー点を除去する必要がある。
【0064】
このエラー点の除去は、先に述べた第2の方法により以下のように行われる。図4はその処理の一部である交点算出処理の手順を示すフローチャートである。
すなわち、CPU11は、ステップS631〜S635において、例えば図14に示すようにMiddleBottomEdgeに含まれる各点(bxi,byi)から傾き−1の閾値直線、つまり
y=−(x-bxi)+bxi
を引き、各直線の上方向に位置し、bxi≦rxjでかつy座標の最も大きいMiddleRightEdge内の点を示すjの値を算出する関数f(i)を
【数24】
とする。そして、j=f(i)としたとき(bxi, byi)および(rxj, ryj)からRightBottomを推定する関数InferRightBottom(i)を
【数25】
とする。
【0065】
ここでInferRightBottom(i)と比較してbi+1が右側にあるか、rj+1が下側にあるような最小のiをBottomEndとすると、BottomEndは
【数26】
となる。上記BottomEndを用いてRightBottomは、
【数27】
によって検出される。
【0066】
次にCPU11は、MiddleBottomEdgeからRightBottomより右側に位置する点(x座標値の大きい点)を除去する。また、MiddleRightEdgeからRightBottomより下側に位置する点(y座標値の大きい点)を除去する。さらに、MiddleBottomEdgeについて再びxy座標系のy方向を逆転させ、上辺における処理と同様に図11に示したような2次元コード画像内のエラー点の除去を行う。MiddleRightEdgeについては、xy座標系を右へ90度回転させて、同様に2次元コード画像内のエラー点の除去を行う。
【0067】
さらにCPU11は、左下ファインダパターンFPLBの下辺をLeftFinderBottomEdge、右上ファインダパターンFPRTの右辺をTopFinderRightEdgeとして、2次元コード画像の下辺の点集合BottomEdge及び右辺の点集合RightEdgeを、
【数28】
とする。
【0068】
CPU11は、以上の手順によって求めた下辺の点集合BottomEdgeから、上辺において近似線を算出した手順と同様の手順によって近似線を算出し、再び元のxy座標系に戻すことで下辺の近似線を算出する。また、右辺の点集合からも同様に近似線が算出され、元のxy座標系に戻すことで右辺の近似線が算出される。
【0069】
(7)2次元コード画像の歪みの矯正
以上の処理により2次元コード画像の上下左右各辺についての境界線が算出されると、続いてCPU11は図5に示すステップS7において2次元コード歪み矯正プログラム136を起動し、上記算出された2次元コード画像の上下左右各辺の境界線を利用して2次元コード画像の歪みの矯正を次のように行う。
【0070】
すなわち、2次元コード画像の歪みの矯正においては、2次元コード画像をその幅codeWidth、高さcodeHeightについてそれぞれ矯正するものとし、矯正後の2次元コードにおける目標座標(x,y)のピクセル値を求めることによって矯正後の2次元コードを生成する。
【0071】
CPU11は、先ずステップS71において、2次元コードの4角の座標を算出する。2次元コードの4角の座標は、上辺と左辺の境界線から左上角の点LeftTopを、上辺と右辺の境界線から右上角の点RightTopを、下辺と左辺の境界線から左下角の点LeftBottomを、左辺と右辺の境界線から右下角の点RightBottomを算出する。
【0072】
次に、LeftTop、RightTop、RightBottom、LeftBottomの4点を結ぶ四角形BaseFrameを作成する。そして、
【数29】
とした上で、上記作成されたBaseFrameにおいて、図15に示すように、LeftTopからの距離とRightTopからの距離の比が(1-LeftWeight)LeftWeightとなる上辺上の点をBaseTop(LeftWeight)とし、LeftBottomからの距離とRightBottomからの距離の比が(1-LeftWeight)LeftWeightとなる点をBaseBottom(LeftWeight)とし、LeftrTopからの距離とLeftBottomからの距離の比が(1-TopWeight)TopWeightとなる点をBaseLeft(TopWeight)とし、RightTopからの距離とRightBottomからの距離の比が(1-TopWeight)TopWeightとなる点をBaseRight(TopWeight)とする。
【0073】
続いてCPU11は、ステップS72,S73により、BaseFrameにおいて目標座標に対応する座標BaseCross(TopWeight,LeftWeight)を求める。ただし、図15に示すようにBaseTop(LeftWeight)とBaseBottom(LeftWeight)とを結ぶ線分と、BaseLeft(TopWeight)とBaseRight(TopWeight)とを結ぶ線分の交点をBaseCross(TopWeight,LeftWeight)とする。
BaseCross(TopWeight,LeftWeight)は、
【数30】
を満たす。
【0074】
またCPU11は、ステップS74において、図16に示すようにBaseTopとx座標値が同一となる上辺上の点をTopPoint(LeftWeight)とし、BaseBottomとx座標値が同一となる下辺上の点をBottomPoint(LeftWeight)とし、LeftBaseとy座標値が同一となる左辺上の点をLeftPoint(TopWeight)とし、RightBaseとy座標値が同一となる右辺上の点をRightPoint(TbpWeight)とする。
【0075】
そして、ステップS75において、図16に示すように2次元コード画像における上辺の歪みDistortionTop(LeftWeight)、下辺の歪みDistortionBottom(LeftWeight)、左辺の歪みDistortionLeft(TopWeight)、右辺の歪みDistortionRightRight(TopWieight)をそれぞれ
【数31】
とし、歪みベクトルDistortionVector(TopWeight,LeftWeight)を
【数32】
とする。
【0076】
次にCPU11は、ステップS76において、図17に示すようにBaseCross(TopWeight, LeftWeight)にDistortionVbctor(TopWeight,LeftWeight)を加えた点を算出する関数CrossPoint(TopWeight,LeftWeight)を
【数33】
とする。なお、CrossPoint(TopWeight,LeftWeight)は、
【数34】
を満たし、DistortionVector(TopWeight, LeftWeight)を算出せずに求めることもできる。
【0077】
CPU11は、以上のように定義したCrossPoint(TopWeight,LeftWeight)を用いて、2次元コード画像の歪みの矯正を行う。TopWeight及びLeftWeightは上記にて示した定義の通りである。したがって、矯正後の2次元コード画像における座標(x,y)のピクセル値には、矯正前の2次元コード画像における
【数35】
のピクセル値と同一の値を持たせる。
【0078】
以上の処理により、図18(a),(b)に示すような糸巻き型又は樽型の曲線歪みを有する2次元コード画像を長方形に矯正することが可能となる。また、codeWidthとcodeHeightを同一の値に設定することにより、正方形への矯正も可能となる。
【0079】
そしてCPU11は、以上の処理によって矯正された2次元コード画像を、ステップS8によりコード解析し、このコード解析されたコードをデータメモリ16に記憶させる。このデータメモリ16に記憶されたコードは、例えば入力デバイス3においてユーザが2次元コードの送信操作を行った場合に、データメモリ16から読み出されてWebサーバ等に送信される。
【0080】
以上説明したようにこの実施形態では、カメラ2により撮像された2次元コードの画像データを二値化画像に変換した後、当該二値化画像から2次元コードのファインダパターンを検出し、この検出されたファインダパターンの上下左右各辺の座標値を検出する。そして、この検出されたファインダパターンの上下左右各辺の座標値をもとに、上記2次元コードの画像データの上下左右各辺の形状を直線及び曲線で近似した近似線を生成し、この生成された近似線をもとに上記2次元コードの画像データの歪みを矯正して、この歪みが矯正された2次元コードの画像データをもとに上記2次元コードを解読するようにしている。
【0081】
したがって、撮像した2次元コードの画像が例えば糸巻き型又は樽型の曲線状歪みを有していても、2次元コードの画像データの上下左右各辺の形状が直線及び曲線により近似され、その近似線をもとに上記2次元コードの画像データの歪みが矯正される。このため、上記糸巻き型又は樽型の曲線状歪みを有する2次元コード画像に対しても高精度のコード解読を行うことが可能となる。
【0082】
なお、この発明は上記実施形態に限定されるものではない。例えば、前記実施形態では二次元コード読取装置を携帯電話機に内蔵した場合を例にとって説明したが、二次元コード読取装置をテレビジョン受信機やビデオ記録再生装置のリモートコントローラに内蔵するようにしてもよく、またパーソナル・コンピュータに内蔵するようにしてもよい。また、前記実施形態では二次元コード読取装置がカメラを内蔵する場合を例にとって説明したが、二次元コード読取装置とは別に設けられたディジタルカメラにより2次元コードを撮像し、その画像データを信号ケーブル又は記録媒体を介して二次元コード読取装置に取り込むようにしてもよい。
【0083】
その他、二値化画像生成処理、ファインダパターン検出処理、画像回転処理、ファインダパターン境界検出処理、2次元コード境界線算出処理及び2次元コード歪み矯正処理の各処理手順と処理内容についても、この発明の要旨を逸脱しない範囲で種々変形して実施できる。
【0084】
要するにこの発明は、上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態に亘る構成要素を適宜組み合せてもよい。
【図面の簡単な説明】
【0085】
【図1】この発明の一実施形態に係わる二次元コード読取装置のハードウエア及びソフトウエアの構成を示すブロック図である。
【図2】図1に示した二次元コード読取装置による二次元コード読取制御のうち、撮像制御から画像回転処理までの処理手順と処理内容を示すフローチャートである。
【図3】図1に示した二次元コード読取装置による二次元コード読取制御のうち、ファインダパターン境界検出処理から2次元コード境界線算出処理までの処理手順と処理内容を示すフローチャートである。
【図4】図3に示した2次元コード境界線算出処理過程におけるエラー点除去のための交点算出処理手順とその内容を示すフローチャートである。
【図5】図1に示した二次元コード読取装置による二次元コード読取制御のうち、2次元コード歪み矯正処理の手順と内容を示すフローチャートである。
【図6】ファインダパターン検出処理の説明に用いる図である。
【図7】ファインダパターン検出処理の説明に用いる図である。
【図8】2次元コード画像の回転処理の説明に用いる図である。
【図9】ファインダパターンの上下左右各辺の座標値を検出する処理に用いる図である。
【図10】ファインダパターンの上下左右各辺の座標値を検出する処理に用いる図である。
【図11】2次元コード境界線を算出する処理において、エラー点を除去する第1の処理を説明するための図である。
【図12】2次元コード境界線を算出する処理において、2次元コード画像の上辺を直線及び曲線で近似するときの手順を説明するための図である。
【図13】2次元コード境界線を算出する処理を説明するための図である。
【図14】2次元コード境界線を算出する処理において、エラー点を除去する第2の処理を説明するための図である。
【図15】2次元コード画像の歪み矯正処理の説明に用いる図である。
【図16】2次元コード画像の歪み矯正処理の説明に用いる図である。
【図17】2次元コード画像の歪み矯正処理の説明に用いる図である。
【図18】撮像された2次元コード画像に発生する糸巻き型及び樽型歪みの一例を示す図である。
【図19】従来の2次元コード読取装置を説明するための図である。
【符号の説明】
【0086】
1…中央処理制御ユニット、2…カメラ、3…入力デバイス、4…表示デバイス、11…CPU、12…バス、13…プログラムメモリ、14…カメラI/F、15…入出力I/F、16…データメモリ、131…二値化画像生成プログラム、132…ファインダパターン検出プログラム、133…画像回転処理プログラム、134…ファインダパターン境界検出プログラム、135…2次元コード境界線算出プログラム、136…2次元コード歪み矯正プログラム。
【技術分野】
【0001】
この発明は、例えば印刷された2次元コードをカメラにより撮像し、その画像データをもとに2次元コードを解読する2次元コード読取装置とそのプログラムに関する。
【背景技術】
【0002】
近年、雑誌等の印刷物に表示されたQRコードに代表される2次元コードを例えば携帯電話機のカメラにより撮像し、その画像データから上記2次元コードに含まれるURL(Uniform Resource Locator)を認識する。そして、このURLをもとにインターネットに対しアクセスすることにより、対応するWebサーバから情報を取得できるようにするサービスが普及している。この種のサービスを利用すると、ユーザはURLをキー操作により入力する必要がなくなり、大変便利である。
【0003】
しかしながら、2次元コードを携帯電話機のカメラにより撮像する際に、2次元コードにカメラが正対していないと、2次元コードの撮像画像が台形状に歪んでしまい、2次元コードを正しく認識できなくなることがある。そこで、従来では撮像された2次元コードの形状を矯正する機能を備えた2次元コード読取装置が提案されている。例えば、図19に示すように撮像された2次元コード画像PCの周囲に四角形ABCDを設定し、0≦s≦1,0≦t≦1を満たすs、tに対してAP:PB=CP′:P′D=s:1−s、AQ:QC=BQ′:Q′D=t:1−tとなるPP′及びQQ′を設定する。これにより任意のs及びtに対してPP′とQQ′の交点R(s,t) が求まる。ここで、あるtに対して0から1までsを変化させることにより2次元コードの一部を検査することが可能となる。さらに、0から1までのtに対して上記検査線を設定することにより2次元コード全体を検査することが可能となり、画像に含まれるデータ領域のセル位置が決定される(例えば、特許文献1を参照。)。
【0004】
【特許文献1】特開2006−155218号公報
【発明の開示】
【発明が解決しようとする課題】
【0005】
ところが、上記従来より提案されている装置は、台形状の歪みに対しては有効であるが、例えばカメラの光学系の歪みや印刷物の表面の歪みの影響により、2次元コードの撮像画像が例えば図18(a),(b)に示すように糸巻き型又は樽型に歪んだ場合には、このような曲線状歪みを補正することができず、その結果高精度の認識を行うことができなかった。
【0006】
この発明は上記事情に着目してなされたもので、その目的とするところは、2次元コード画像が曲線状歪みを有する場合でも、この曲線状歪みを効果的に矯正して高精度のコード解読を可能にした2次元コード読取装置とそのプログラムを提供することにある。
【課題を解決するための手段】
【0007】
上記目的を達成するためにこの発明の一観点は、撮像手段から2次元コードの画像データを取り込んでメモリに記憶する。そして、メモリから読み出した画像データから、先ず当該2次元コードに含まれる複数のファインダパターンを検出し、この検出された複数のファインダパターンの各々についてその輪郭を表す辺の境界点を検出する。次に、この検出された複数のファインダパターンの辺の境界点をもとに、上記2次元コードの画像データの輪郭を表す4辺の形状を直線及び曲線の少なくとも一方で近似した近似線を生成し、この生成された近似線をもとに上記2次元コードの画像データの歪みを矯正して、この歪みが矯正された2次元コードの画像データを上記メモリに記憶する。そして、この歪みが矯正された2次元コードの画像データをもとに上記2次元コードを解読して出力するように構成したものである。
【0008】
したがって、撮像した2次元コードの画像が例えば糸巻き型又は樽型の曲線状歪みを有していても、2次元コードの画像データの輪郭を表す4辺の形状が直線及び曲線の少なくとも一方により近似され、その近似線をもとに上記2次元コードの画像データの歪みが矯正される。このため、上記糸巻き型又は樽型の曲線状歪みを有する2次元コード画像に対しても高精度のコード解読を行うことが可能となる。
【0009】
さらにこの発明は、以下のような具体的な構成を備えることを特徴とする。
第1の構成は、上記2次元コードの画像データの4辺の形状を近似して当該4辺の境界線を検出する際に、複数のファインダパターンの辺の境界点をもとに上記2次元コードの画像データの輪郭を表す辺の傾きを算出し、この算出された辺の傾きから推測される方向に画素探索を行って、上記2次元コードの画像データの辺を表す境界点を検出する。そして、上記算出された辺の傾きをもとに、上記検出された境界点に含まれるエラー点を除去する。
より具体的には、上記2次元コード画像の辺の傾きを算出する際に、第1及び第2のファインダパターンの各辺を表す境界点をもとにそれぞれ当該各辺の傾きを算出し、この算出された第1及び第2のファインダパターンの各辺の傾きをもとに、上記2次元コードの画像データの一辺の傾きを推測する。
【0010】
このようにすると、各ファインダパターンの境界点をもとに当該ファインダパターン間の2次元コード画像の辺の傾きが推測され、この傾きをもとに当該辺の境界点が探索される。そして、この探索された境界点の中からエラー点が除去される。このため、2次元コード画像の辺の境界線を精度良く推測できる。
【0011】
第2の構成は、上記エラー点を除去する際に、上記検出された境界点の各々について、当該境界点が、上記算出された辺の傾きから推測される範囲内に含まれているか否かを判定し、含まれていないと判定された境界点をエラー点として上記境界点から削除するものである。
【0012】
第3の構成は、上記エラー点を除去する際に、2次元コードの画像データの4辺のうち互いに直交する第1及び第2の辺の交点を算出し、この交点より外側の範囲に位置する境界点をエラー点として削除するものである。上記交点の算出手段としては、先ず第1の辺を表す境界点集合に含まれる1個以上の境界点を算出基準点としてしきい値線を引き、第2の辺を表す境界点集合に含まれる境界点が上記しきい値線より交点側に位置するか否かを判定する。そして、上記第2の辺を表す境界点集合のうち上記しきい値線より交点側に位置しない境界点の中から、当該交点に最も近い境界点をしきい値外近接点として検出する。次に、上記算出基準点から上記第1の辺の傾きを推定して引いた直線と上記第2の辺のしきい値外近接点から第2の辺の傾きを推定して引いた直線との交点をもとに交点候補点を算出し、上記第1の辺を表す境界点集合に含まれる境界点のうち上記しきい値線より交点側に位置する境界点の中から上記しきい値直線に最も近い境界点をしきい値内近接点として検出すると共に、上記第2の辺を表す境界点集合に含まれる境界点のうち上記しきい値線より交点側に位置する境界点の中から上記しきい値直線に最も近い境界点をしきい値内近接点として検出する。そして、上記検出された第1の辺のしきい値内近接点と、上記検出された第2の辺のしきい値内近接点のうち、上記算出された交点候補点より外側にあるものはどれかを判定する。
このようにすることで、2次元コードの画像データの4辺において探索された境界点の集合に含まれるエラー点を、より一層確実に削除することが可能となる。
【0013】
第4の構成は、2次元コードの歪みを矯正する際に以下のような処理を実行するものである。すなわち、先ず2次元コードの画像データの各頂点を結ぶ頂点フレームを生成する。次に、矯正対象の2次元コードの画像データにおける目標座標のピクセル値を算出するために、上記生成された頂点フレームの、上辺における上記目標座標に対応する点の座標値と、下辺における上記目標座標に対応する点の座標値と、左辺における上記目標座標に対応する点の座標値と、右辺における上記目標座標に対応する点の座標値をそれぞれ算出する。またそれと共に、上記2次元コードの画像データの、上辺における上記目標座標に対応する境界点の座標値と、下辺における上記目標座標に対応する境界点の座標値と、左辺における上記目標座標に対応する境界点の座標値と、右辺における上記目標座標に対応する境界点の座標値をそれぞれ算出する。さらに、上記頂点フレームにおいて上記目標座標に対応する目標座標値を算出する。そして、上記頂点フレームの上下左右の各辺について算出された上記目標座標に対応する点から、上記2次元コードの画像データの上下左右の各辺について算出された上記目標座標に対応する境界点へのベクトルを重み付け加算して、2次元コード歪みベクトルを算出し、上記頂点フレームについて算出された目標座標値に、上記算出された2次元コード歪みベクトルを加算して、上記2次元コードの画像データにおける上記目標座標に対応する目標座標値を算出する。
以上の処理を行うことで、曲線状歪みを有する2次元コードの画像データを長方形に矯正することが可能となる。
【発明の効果】
【0014】
すなわちこの発明の一観点によれば、2次元コード画像が曲線状歪みを有する場合でも、この曲線状歪みを効果的に矯正して高精度のコード解読を可能にした2次元コード読取装置とそのプログラムを提供することができる。
【発明を実施するための最良の形態】
【0015】
以下、図面を参照してこの発明に係わる実施形態を説明する。
図1は、この発明の一実施形態における2次元コード読取装置のハードウエア及びソフトウエアの構成を示すブロック図である。
本実施形態の2次元コード読取装置は、中央処理制御ユニット1と、カメラ2と、入力デバイス3と、表示デバイス4とを具備している。なお、2次元コード読取装置が携帯電話機に設けられる場合には、上記中央処理制御ユニット1、カメラ2、入力デバイス3及び表示デバイス4はいずれも携帯電話機が備える既存の構成を利用する。
【0016】
中央処理制御ユニット1は、CPU(Central Processing Unit)11を備え、このCPU11に対しバス12を介してプログラムメモリ13と、カメラインタフェース(カメラI/F)14と、入出力インタフェース(入力I/F)15と、データメモリ16を接続したものとなっている。
【0017】
カメラI/F14にはカメラ2が接続される。カメラ2は、例えばCCD又はCMOS等の半導体撮像素子を使用したものである。カメラI/F14は、CPU11の制御の下で上記カメラ2を起動し、カメラ2により撮像された2次元コードの画像データを取り込む。
【0018】
入出力I/F15には入力デバイス3及び表示デバイス4が接続される。入力デバイス3は、ダイヤルキーと複数の機能キーとから構成される。なお、キーの構成は機構式のキーであっても、また表示デバイス4に表示されたソフトウエアキーであってもよい。表示デバイス4は、例えばLCD又はELを使用したディスプレイからなる。入出力I/F15は、上記入力デバイス3の操作データを取り込むと共に、CPU11の制御の下で表示データを上記表示デバイスに表示させる。
【0019】
データメモリ16には、携帯電話機の送受信に必要な電話帳や送受信履歴、送受信メール等の各種データを記憶する領域に加え、この発明に係わる2次元コード読取処理を実施するために必要なデータを一次記憶する領域を備える。2次元コード読取処理を実施するために必要なデータとしては、カメラ2により撮像された2次元コードの画像データやその二値化画像データ、処理過程で生成される種々データが含まれる。
【0020】
プログラムメモリ13には、この発明に係わる2次元コード読取処理を実施するために必要なアプリケーション・プログラムとして、二値化画像生成プログラム131と、ファインダパターン検出プログラム132と、画像回転処理プログラム133と、ファインダパターン境界検出プログラム134と、2次元コード境界線算出プログラム135と、2次元コード歪み矯正プログラム136が格納されている。
【0021】
二値化画像生成プログラム131は、カメラ2により撮像された2次元コードの画像データをカメラI/F14を介して取り込んでデータメモリ16に一旦記憶させ、このデータメモリ16から当該画像データを読み出して二値化画像データに変換し、この変換された二値化画像データをデータメモリ16に記憶させる処理を、上記CPU11に実行させる。
【0022】
ファインダパターン検出プログラム132は、上記データメモリ16から上記二値化画像データを読み出し、この二値化画像データから2次元コードに含まれる複数のファインダパターン(例えばQRコードの場合には3個)を検出するための処理を、上記CPU11に実行させる。
【0023】
画像回転処理プログラム133は、上記ファインダパターン検出処理により検出されたファインダパターンの位置に基づいて、上記2次元コードの画像が正立した状態となるように上記二値化画像データを回転させ、この回転処理後の二値化画像データをデータメモリ16に記憶させる処理を、上記CPU11に実行させる。
【0024】
ファインダパターン境界検出プログラム134は、上記回転処理後の二値化画像データをデータメモリ16から読み出し、この読み出した二値化画像データから各ファインダパターンの黒枠の辺を表す境界点を検出してその座標値をデータメモリ16に記憶させる処理を、上記CPU11に実行させる。
【0025】
2次元コード境界線算出プログラム135は、上記検出された各ファインダパターンの黒枠の辺を表す境界点の座標値をデータメモリ16から読み出し、この読み出した境界点の座標値に基づいて、2次元コードの輪郭を表す上下左右の各辺の形状を直線及び曲線で近似した近似線を生成する。そして、この生成された近似直線と近似曲線のうちいずれか妥当であるかを判定して、妥当と判定された近似線を上記2次元コードの上下左右の各辺の形状を表す境界線としてその座標値をデータメモリ16に記憶させる処理を、上記CPU11に実行させる。
【0026】
2次元コード歪み矯正プログラム136は、上記2次元コード境界線算出プログラム135により算出された上記2次元コード画像の上下左右の各辺の境界線を表す座標値をデータメモリ16から読み出し、この読み出した上下左右の各辺の境界線をもとに、上記2次元コード画像の二値化画像データの歪みを矯正する処理を、上記CPU11に実行させる。
【0027】
次に、以上のように構成された装置による2次元コードの読取処理動作を説明する。図2乃至図5はCPU11によるその処理手順と処理内容を示すフローチャートである。
(1)2次元コードの画像データの取り込み
入力デバイス3においてユーザが撮像操作を行うと、CPU11はステップS11により上記撮像操作を入出力I/F15を介して検出する。そして、ステップS12に移行し、カメラI/F14を介してカメラ2を起動して、当該カメラ2により撮像された2次元コードの画像データをカメラI/F14を介して取り込んでデータメモリ16に記憶させる。
【0028】
なお、上記二次元コードの画像データは複数のピクセルにより構成される。ここで、取り込んだ画像データの幅をwidth、高さをheightとすると、取り込んだ画像データはwidth×heightこのピクセルにより構成される。各ピクセルは、RGBカラーモデルにおいて色を表現するデータであり、フレームにおけるx座標値、y座標値及びRGBの各値によって構成され、x座標値は0以上width未満の整数値、y座標値は0以上height未満の整数値であり、x軸は左から右方向へ、y軸は上から下方向へそれぞれ向くものとする。またRGBの各値はいずれも0以上255以下の整数値である。ここで、座標(x,y)におけるRGB各値が(r,g,b)であるとき、
p(x,y)=(r,g,b)
と表される。
【0029】
(2)二値化画像データの生成処理
上記二次元コードの画像データが取り込まれると、CPU11はステップS2において二値化画像生成プログラム131を起動し、上記二次元コードの画像データのコントラストを強調するために、当該二次元コードの画像データを二値化画像データに変換する処理を以下のように実行する。
【0030】
すなわち、先ずステップS21により、上記データメモリ16から二次元コードの画像データを読み出し、当該画像データの各ピクセルの輝度値を算出することによりグレースケール化する。例えば、
Grayscale(x,y)=RGBtoLuminance(r,g,b)
によって輝度値を算出して、グレースケール画像を生成する。なお、輝度値は0以上255以下の値を持つものとする。
【0031】
続いて、ステップS22において、上記生成されたグレースケール画像の最大輝度値maxL、再使用輝度値minLをそれぞれ検出し、この検出された最大輝度値maxL、再使用輝度値minLを用いて、以下に示す(1)式によりコントラスト拡大画像を生成する。
【数1】
【0032】
さらに、ステップS23において、例えばしきい値を128として下記(2)式に示す処理を実行し、二値化画像データを生成する。そして、この生成した二値化画像データをデータメモリ16に記憶させる。
【数2】
【0033】
(3)ファインダパターンの検出処理
上記二値化画像データの生成が終了すると、CPU11は次にステップS3によりファインダパターン検出プログラム132を起動し、上記二値化画像データからQRコードに含まれる3個の位置パターン、つまりファインダパターンを検出するための処理を以下のように実行する。
【0034】
すなわち、先ずステップS31において、データメモリ16から上記二値化画像データを読み出し、この二値化画像データに対しy軸の座標値を固定してx軸方向に走査する。そして、この走査により、例えば図6に示すように“白”、“黒”、“白”、“黒”、“白”のラインパターンを検出すると、各“白”と、各“黒”の長さをそれぞれ確認し、2個目の“黒”から6個目の“黒”までの長さの比、B1:W1:B2:W2:B3が1:1:3:1:1となっている箇所を検出し、この検出値をデータメモリ16に保持させる。
【0035】
具体的には、
L=B1+W1+B2+W2+B3
として0以上のしきい値tに対して
【数3】
を満たす箇所を検出する。例えば、t=0.3等の値を用いる。
【0036】
以下同様に、上記ステップS31によるラインパターンの検出処理をy軸方向の全ての座標値について実行する。そして、全てのラインパターンの検出値が得られたことがステップS32で確認されると、ステップS33に移行して、上記検出された複数のラインパターンのうち互いに接するラインパターンをセグメント化し、このセグメントのサイズが大きい3個をQRコードのファインダパターンとして認識して、その座標値をデータメモリ16に保存させる。
【0037】
(4)画像回転処理
上記3個のファインダパターンの検出が終了すると、CPU11は続いてステップS4に移行して画像回線処理プログラム133を起動し、上記検出されたファインダパターンの位置をもとに上記二値化画像データを以下のように回転させる。
すなわち、先ずステップS41において、上記検出された3個のファインダパターンF1,F2,F3の重心をそれぞれ算出する。そして、この算出された重心をW1=(u1,v1)、W2=(u2,v2)、W3=(u3,v3)として、下記(4)式によりD1,D2,D3を算出する。
【数4】
【0038】
そして、上記D1,D2,D3の算出結果をもとに、ステップS42において左上、右上、左下の各ファインダパターンを認識する。例えばD1が最大であればF1、D2が最大であればF2、D3が最大であればF3を左上ファインダパターンとして認識する。この処理は、右上と左上のファインダパターン間の距離が最大となることを利用している。図7にD1が最大となる場合の例を示す。
【0039】
続いて、右上ファインダパターンと左下ファインダパターンを認識するが、W2とW3を通り直線に対しW1が右側にある場合にはF2を右上ファインダパターン、F3を左下ファインダパターンとし、そうでない場合にはF3を右上ファインダパターン、F2を左下ファインダパターンとする。
【0040】
そうして左上、右上、左下の各ファインダパターンが認識されると、CPU11はステップS43において、例えば図8に示すように左上ファインダパターンFPLTのx軸方向に右上ファインダパターンFPRTが位置するように、二次元コード画像の二値化画像データを回転させる。
【0041】
(5)ファインダパターン境界の検出処理
次にCPU11は、ステップS5によりファインダパターン境界検出プログラム134を起動し、上記回転処理後の二値化画像データから3個のファインダパターンの黒枠の辺を表す境界点を検出する処理を以下のように実行する。
すなわち、CPU11は先ずステップS51において、例えば図9に示すように黒枠のセグメントSを抽出し、黒枠の4角の座標を算出する。4角の座標は、セグメントSに含まれる座標のうち、−x−yが最大となる座標を左上の角(cx1,cy1)、x−yが最大となる座標を右上の角(cx2,cy2)、y−xが最大となる座標を左下の角(cx3,cy3)、x−yが最大となる座標を右下の角(cx4,cy4)となるようにそれぞれ設定する。
【0042】
CPU11は次にステップS52において、上記黒枠のセグメントの上下左右の各辺を検出する。例えば、上辺FinderTopは、
【数5】
として検出される。
【0043】
これは、図10に示すように黒枠のセグメントS内において左上の角と右上の角との間のxについて、それぞれyが最小となる点の集合を表す。同様に、下辺FinderBottom、左辺FinderLeft、右辺FinderRightは、
【数6】
として検出される。
【0044】
(6)2次元コード境界線の算出処理
CPU11は、次にステップS6に移行して2次元コード境界線算出プログラム135を起動し、上記検出された3個のファインダパターンの黒枠の上下左右各辺の座標値に基づいて、2次元コード画像の輪郭を表す上下左右各辺に含まれる座標をそれぞれ検出し、その近似線を上下左右各辺の境界線として算出する処理を実行する。
【0045】
例えば、2次元コード画像の上辺の境界点座標を検出する場合、CPU11はステップS61〜S68により以下の処理を行う。すなわち、上辺の左側には左上ファインダパターンFPLT、右側には右上ファインダパターンFPRTが位置する。それぞれのファインダパターンFPLT,FPRTの上辺の境界点座標は、先に述べたファインダパターン境界検出処理により既に検出されているので、その検出結果を利用してファインダパターンFPLT,FPRT間に位置する2次元コード画像の上辺上の境界点の集合をステップS62により検出する。
【0046】
ここで、左側のファインダパターンFPLTの上辺の境界点の集合をLeftFinderEdge、右側のファインダパターンFPRTの上辺の境界点の集合をRightFinderEdgeとし、LeftFinderEdgeの右端の境界点を(LeftEndX,LeftEndY)、RightFinderEdgeの左端の境界点を(RightStartX,RightStartY)とする。また、LeftFinderEdgeに含まれる境界点の重心を(LeftCenterX,LeftCenterY)、RightFinderEdgeに含まれる座標点の重心を(RightCenterX,RightCenterY)とする。また、LeftFinderEdgeから最小二乗法によって近似した直線をy=alx+bl、RightFinderEdgeから最小二乗法によって近似した直線をy=arx+brとする。この最小二乗法によって得られた直線から、あるx座標における上辺の傾きedgeSlope(x)は、
【数7】
と推測できる。
【0047】
次にCPU11は、データメモリ16から読み出した二値化画像データにおいて、LeftEndXとRightStartXとの間の2次元コード画像の上辺を検出する。その検出処理は例えば図10に示すように、検出された上辺上の点P=(px,py)に対してx座標がpx+k(初期条件ではk=1)となる上辺上の点を検出するためにqy及びryを設定する。そして、qyからryまで下方向に“白”から“黒”に変わる最初の境界点を探索し、見つかった境界点P′=(px+k,py′)を新たな上辺上の境界点として検出する。ここで、qy及びryは、定数cq、cr,dq、drを用いて
【数8】
として求める。なお、定数については、例えばcq=5、cr=0、dq=0.1、dr=0.1等の値を用いる。
【0048】
一方、以上の処理により新たな境界点が見つからない場合には、kの値を1ずつ増やして探索し、見つかった場合にはP′に対してk=1から同様の処理を行うことで次の境界点を探索する。P=(LeftEndX,LeftEndY)から探索を開始し、px+k=RightStartXとなれば探索終了である。以上の処理によって、左上ファインダパターンFPLTと右上ファインダパターンFPRTとの間に位置する2次元コードの上辺上の境界点の集合MiddleEdgeが検出される。
【0049】
以上のステップS62の処理により検出された2次元コードの上辺上の境界点集合MiddleEdgeには、本来の上辺より2次元コード画像の内側の点も含まれる。そこでCPU11は、続いて2次元コード画像内の点の除去を行う。このエラー点の除去方法には、上辺の傾きから推測される範囲に含まれない点をエラーとして除去する第1の方法と、互いに直交する2つの辺の交点を求め、この交点より外側の範囲に位置する境界点をエラー点として削除する第2の方法とがある。ここでは、先ず第1の方法について説明し、第2の方法は後に詳しく説明する。
【0050】
第1の方法は以下のように行われる。すなわち、CPU11はエラー点の除去処理を右から左に向かって行う。ここで、点P=(px,py)に対し、MiddleEdgeに含まれ、Pより左に位置する最初の点をP′=(px′,py′)とする。このとき線分PP′の傾きは、
【数9】
と表される。
【0051】
ここで、あるxにおける上辺の傾きより定数ct(例えば0.1)だけ小さい傾きを返す関数edgeMinSlope(x)を、
【数10】
と定義する。
【0052】
ここで、P′がエラーであるか否かを、
【数11】
によって判定する。この式は、
【数12】
とも表現される。
【0053】
この判定処理は、図11に示すように、線分PQの傾きを推定される上辺の傾きとし、線分PRの傾きをPRの傾きよりctだけ小さい傾きであるとすると、P1′やP2′のようにRより上に位置する点はエラーではないが、P3′のようにRより下に位置する点はエラーとして検出される。ただし、図11においてQ、R、P1′、P2′、P3′のx座標値は全てpx′であるとする。上記手順によって、MiddleEdgeからエラー点が除去される。
【0054】
以上の手順によって、LeftFinderEdge、MiddleEdge、RightFinderEdgeによって2次元コード画像の上辺の境界点集合が検出される。ここで上辺の点集合TopEdgeは
【数13】
と表される。
【0055】
次にCPU11は、ステップS64,S65において、上記上辺の点集合TopEdge をもとにその近似線を算出する。TopEdgeの近似線は、近似直線或いは近似曲線によって表現する。TopEdgeに含まれる点列を
(x1,y1),(x2,y2),…,(xn,yn)
とすると、最小二乗法による近似直線y=ax+bは
【数14】
によって求まる。
【0056】
一方、近似曲線は最小二乗法による円への近似により求める。最小二乗法による円への近似では、(a,b)を中心とする半径Rの円(x−a)2 +(y−b)2 =Rを求めるために
【数15】
の最小化を行う。
【0057】
ただし、zi,B,C,Dはそれぞれ
【数16】
とする。
【0058】
F(a,b,R)をB、C、Dについてそれぞれ偏微分すると、
【数17】
となる。この連立方程式をCholesky分解により解き、B、C、Dを得て、
【数18】
によりa、b、Rを得る。
【0059】
次にCPU11は、ステップS66において近似直線と近似曲線とを比較してどちらが妥当であるかを判定する。この判定は、近似直線から各 (xi,yi)への距離の和と、近似曲線から各(xi,yi)への距離の和を比較し、距離の和が小さい方の近似線が妥当であると判定することにより正確に行うことができる。なお、計算量を低減したい場合には、(x1,y1)、(xM,yM)、(xn,yn)への距離の和によって判定しても良い。ただし、mは
【数19】
によって求まる整数であり、(xM,yM)は検出された上辺の点集合の中央の点である。以上の上辺の近似線算出の手順を図12のステップS121〜S126に示す。
【0060】
以上の手順によって上辺の境界線が算出される。同様に、図13に示すように左辺についても、xy座標系を左へ90度回転させて考える(上方向をx軸方向、右方向をy軸方向とする)ことで、同じ手順によって境界線が算出される。また、下辺については、xy座標系のy方向を逆転させることで、2次元コード画像の下辺の点集合を算出できる。ただし、QRコードには右下にファインダパターンはないため、RightFinderEdgeは存在しない。そこで、edgeSlope(x)は、(LeftCenterX,LeftCenterY)から(px′,py′)へ引いた線分の傾き
【数20】
によって算出する。
【0061】
また、RightFinderEdgeが存在しないため、探索は2次元コード画像の端まで行うものとし、そうして検出した点の集合をMiddleBottomEdgeとする。また右辺についても、xy座標系を右へ90度回転させて考える(下方向をx軸方向、左方向をy軸方向とする)ことで2次元コード画像の下辺の点集合を検出できる。しかし、この場合も上辺におけるRightFinderEdgeが存在しないので、edgeSlope(x)は下辺と同様に
【数21】
によって算出し、こちらも2次元コード画像の端まで探索を行うものとし、そうして検出した点の集合をMiddleRightEdgeとする。
【0062】
次に、2次元コード画像の右下の角の座標RightBottomを検出する。初期のxy座標系(右方向がx軸方向、下方向がy軸方向)におけるMiddleBottomEdgeを
【数22】
とし、同様に初期のxy座標系におけるMiddleRightEdgeを
【数23】
とする。このときbx1<bx2<...<bxM及びry1<ry2<...<ryNとなる。また、左下ファインダパターンFPLBは右上ファインダパターンFPRTより左下に位置すると考えられるので、bx1<rx1かつry1<by1となる。
【0063】
またCPU11は、RightBottomは2次元コードにおいてf(x,y)=x+yが最大となる点だと仮定し、MiddleBottomEdgeとMiddleRightEdgeからRightBottomの近くに位置する点を探索する。ただし、MiddleBottomEdgeはRightBottomより右側の点を、MiddleRightEdgeはRightBottomより下側の点を含んでいう可能性があるので、これらのエラー点を除去する必要がある。
【0064】
このエラー点の除去は、先に述べた第2の方法により以下のように行われる。図4はその処理の一部である交点算出処理の手順を示すフローチャートである。
すなわち、CPU11は、ステップS631〜S635において、例えば図14に示すようにMiddleBottomEdgeに含まれる各点(bxi,byi)から傾き−1の閾値直線、つまり
y=−(x-bxi)+bxi
を引き、各直線の上方向に位置し、bxi≦rxjでかつy座標の最も大きいMiddleRightEdge内の点を示すjの値を算出する関数f(i)を
【数24】
とする。そして、j=f(i)としたとき(bxi, byi)および(rxj, ryj)からRightBottomを推定する関数InferRightBottom(i)を
【数25】
とする。
【0065】
ここでInferRightBottom(i)と比較してbi+1が右側にあるか、rj+1が下側にあるような最小のiをBottomEndとすると、BottomEndは
【数26】
となる。上記BottomEndを用いてRightBottomは、
【数27】
によって検出される。
【0066】
次にCPU11は、MiddleBottomEdgeからRightBottomより右側に位置する点(x座標値の大きい点)を除去する。また、MiddleRightEdgeからRightBottomより下側に位置する点(y座標値の大きい点)を除去する。さらに、MiddleBottomEdgeについて再びxy座標系のy方向を逆転させ、上辺における処理と同様に図11に示したような2次元コード画像内のエラー点の除去を行う。MiddleRightEdgeについては、xy座標系を右へ90度回転させて、同様に2次元コード画像内のエラー点の除去を行う。
【0067】
さらにCPU11は、左下ファインダパターンFPLBの下辺をLeftFinderBottomEdge、右上ファインダパターンFPRTの右辺をTopFinderRightEdgeとして、2次元コード画像の下辺の点集合BottomEdge及び右辺の点集合RightEdgeを、
【数28】
とする。
【0068】
CPU11は、以上の手順によって求めた下辺の点集合BottomEdgeから、上辺において近似線を算出した手順と同様の手順によって近似線を算出し、再び元のxy座標系に戻すことで下辺の近似線を算出する。また、右辺の点集合からも同様に近似線が算出され、元のxy座標系に戻すことで右辺の近似線が算出される。
【0069】
(7)2次元コード画像の歪みの矯正
以上の処理により2次元コード画像の上下左右各辺についての境界線が算出されると、続いてCPU11は図5に示すステップS7において2次元コード歪み矯正プログラム136を起動し、上記算出された2次元コード画像の上下左右各辺の境界線を利用して2次元コード画像の歪みの矯正を次のように行う。
【0070】
すなわち、2次元コード画像の歪みの矯正においては、2次元コード画像をその幅codeWidth、高さcodeHeightについてそれぞれ矯正するものとし、矯正後の2次元コードにおける目標座標(x,y)のピクセル値を求めることによって矯正後の2次元コードを生成する。
【0071】
CPU11は、先ずステップS71において、2次元コードの4角の座標を算出する。2次元コードの4角の座標は、上辺と左辺の境界線から左上角の点LeftTopを、上辺と右辺の境界線から右上角の点RightTopを、下辺と左辺の境界線から左下角の点LeftBottomを、左辺と右辺の境界線から右下角の点RightBottomを算出する。
【0072】
次に、LeftTop、RightTop、RightBottom、LeftBottomの4点を結ぶ四角形BaseFrameを作成する。そして、
【数29】
とした上で、上記作成されたBaseFrameにおいて、図15に示すように、LeftTopからの距離とRightTopからの距離の比が(1-LeftWeight)LeftWeightとなる上辺上の点をBaseTop(LeftWeight)とし、LeftBottomからの距離とRightBottomからの距離の比が(1-LeftWeight)LeftWeightとなる点をBaseBottom(LeftWeight)とし、LeftrTopからの距離とLeftBottomからの距離の比が(1-TopWeight)TopWeightとなる点をBaseLeft(TopWeight)とし、RightTopからの距離とRightBottomからの距離の比が(1-TopWeight)TopWeightとなる点をBaseRight(TopWeight)とする。
【0073】
続いてCPU11は、ステップS72,S73により、BaseFrameにおいて目標座標に対応する座標BaseCross(TopWeight,LeftWeight)を求める。ただし、図15に示すようにBaseTop(LeftWeight)とBaseBottom(LeftWeight)とを結ぶ線分と、BaseLeft(TopWeight)とBaseRight(TopWeight)とを結ぶ線分の交点をBaseCross(TopWeight,LeftWeight)とする。
BaseCross(TopWeight,LeftWeight)は、
【数30】
を満たす。
【0074】
またCPU11は、ステップS74において、図16に示すようにBaseTopとx座標値が同一となる上辺上の点をTopPoint(LeftWeight)とし、BaseBottomとx座標値が同一となる下辺上の点をBottomPoint(LeftWeight)とし、LeftBaseとy座標値が同一となる左辺上の点をLeftPoint(TopWeight)とし、RightBaseとy座標値が同一となる右辺上の点をRightPoint(TbpWeight)とする。
【0075】
そして、ステップS75において、図16に示すように2次元コード画像における上辺の歪みDistortionTop(LeftWeight)、下辺の歪みDistortionBottom(LeftWeight)、左辺の歪みDistortionLeft(TopWeight)、右辺の歪みDistortionRightRight(TopWieight)をそれぞれ
【数31】
とし、歪みベクトルDistortionVector(TopWeight,LeftWeight)を
【数32】
とする。
【0076】
次にCPU11は、ステップS76において、図17に示すようにBaseCross(TopWeight, LeftWeight)にDistortionVbctor(TopWeight,LeftWeight)を加えた点を算出する関数CrossPoint(TopWeight,LeftWeight)を
【数33】
とする。なお、CrossPoint(TopWeight,LeftWeight)は、
【数34】
を満たし、DistortionVector(TopWeight, LeftWeight)を算出せずに求めることもできる。
【0077】
CPU11は、以上のように定義したCrossPoint(TopWeight,LeftWeight)を用いて、2次元コード画像の歪みの矯正を行う。TopWeight及びLeftWeightは上記にて示した定義の通りである。したがって、矯正後の2次元コード画像における座標(x,y)のピクセル値には、矯正前の2次元コード画像における
【数35】
のピクセル値と同一の値を持たせる。
【0078】
以上の処理により、図18(a),(b)に示すような糸巻き型又は樽型の曲線歪みを有する2次元コード画像を長方形に矯正することが可能となる。また、codeWidthとcodeHeightを同一の値に設定することにより、正方形への矯正も可能となる。
【0079】
そしてCPU11は、以上の処理によって矯正された2次元コード画像を、ステップS8によりコード解析し、このコード解析されたコードをデータメモリ16に記憶させる。このデータメモリ16に記憶されたコードは、例えば入力デバイス3においてユーザが2次元コードの送信操作を行った場合に、データメモリ16から読み出されてWebサーバ等に送信される。
【0080】
以上説明したようにこの実施形態では、カメラ2により撮像された2次元コードの画像データを二値化画像に変換した後、当該二値化画像から2次元コードのファインダパターンを検出し、この検出されたファインダパターンの上下左右各辺の座標値を検出する。そして、この検出されたファインダパターンの上下左右各辺の座標値をもとに、上記2次元コードの画像データの上下左右各辺の形状を直線及び曲線で近似した近似線を生成し、この生成された近似線をもとに上記2次元コードの画像データの歪みを矯正して、この歪みが矯正された2次元コードの画像データをもとに上記2次元コードを解読するようにしている。
【0081】
したがって、撮像した2次元コードの画像が例えば糸巻き型又は樽型の曲線状歪みを有していても、2次元コードの画像データの上下左右各辺の形状が直線及び曲線により近似され、その近似線をもとに上記2次元コードの画像データの歪みが矯正される。このため、上記糸巻き型又は樽型の曲線状歪みを有する2次元コード画像に対しても高精度のコード解読を行うことが可能となる。
【0082】
なお、この発明は上記実施形態に限定されるものではない。例えば、前記実施形態では二次元コード読取装置を携帯電話機に内蔵した場合を例にとって説明したが、二次元コード読取装置をテレビジョン受信機やビデオ記録再生装置のリモートコントローラに内蔵するようにしてもよく、またパーソナル・コンピュータに内蔵するようにしてもよい。また、前記実施形態では二次元コード読取装置がカメラを内蔵する場合を例にとって説明したが、二次元コード読取装置とは別に設けられたディジタルカメラにより2次元コードを撮像し、その画像データを信号ケーブル又は記録媒体を介して二次元コード読取装置に取り込むようにしてもよい。
【0083】
その他、二値化画像生成処理、ファインダパターン検出処理、画像回転処理、ファインダパターン境界検出処理、2次元コード境界線算出処理及び2次元コード歪み矯正処理の各処理手順と処理内容についても、この発明の要旨を逸脱しない範囲で種々変形して実施できる。
【0084】
要するにこの発明は、上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態に亘る構成要素を適宜組み合せてもよい。
【図面の簡単な説明】
【0085】
【図1】この発明の一実施形態に係わる二次元コード読取装置のハードウエア及びソフトウエアの構成を示すブロック図である。
【図2】図1に示した二次元コード読取装置による二次元コード読取制御のうち、撮像制御から画像回転処理までの処理手順と処理内容を示すフローチャートである。
【図3】図1に示した二次元コード読取装置による二次元コード読取制御のうち、ファインダパターン境界検出処理から2次元コード境界線算出処理までの処理手順と処理内容を示すフローチャートである。
【図4】図3に示した2次元コード境界線算出処理過程におけるエラー点除去のための交点算出処理手順とその内容を示すフローチャートである。
【図5】図1に示した二次元コード読取装置による二次元コード読取制御のうち、2次元コード歪み矯正処理の手順と内容を示すフローチャートである。
【図6】ファインダパターン検出処理の説明に用いる図である。
【図7】ファインダパターン検出処理の説明に用いる図である。
【図8】2次元コード画像の回転処理の説明に用いる図である。
【図9】ファインダパターンの上下左右各辺の座標値を検出する処理に用いる図である。
【図10】ファインダパターンの上下左右各辺の座標値を検出する処理に用いる図である。
【図11】2次元コード境界線を算出する処理において、エラー点を除去する第1の処理を説明するための図である。
【図12】2次元コード境界線を算出する処理において、2次元コード画像の上辺を直線及び曲線で近似するときの手順を説明するための図である。
【図13】2次元コード境界線を算出する処理を説明するための図である。
【図14】2次元コード境界線を算出する処理において、エラー点を除去する第2の処理を説明するための図である。
【図15】2次元コード画像の歪み矯正処理の説明に用いる図である。
【図16】2次元コード画像の歪み矯正処理の説明に用いる図である。
【図17】2次元コード画像の歪み矯正処理の説明に用いる図である。
【図18】撮像された2次元コード画像に発生する糸巻き型及び樽型歪みの一例を示す図である。
【図19】従来の2次元コード読取装置を説明するための図である。
【符号の説明】
【0086】
1…中央処理制御ユニット、2…カメラ、3…入力デバイス、4…表示デバイス、11…CPU、12…バス、13…プログラムメモリ、14…カメラI/F、15…入出力I/F、16…データメモリ、131…二値化画像生成プログラム、132…ファインダパターン検出プログラム、133…画像回転処理プログラム、134…ファインダパターン境界検出プログラム、135…2次元コード境界線算出プログラム、136…2次元コード歪み矯正プログラム。
【特許請求の範囲】
【請求項1】
撮像手段から2次元コードの画像データを取り込んでメモリに記憶する手段と、
前記メモリに記憶された2次元コードの画像データを読み出し、この読み出した画像データから当該2次元コードに含まれる複数のファインダパターンを検出するファインダパターン検出手段と、
前記検出された複数のファインダパターンの各々についてその輪郭を表す辺の境界点を検出するファインダパターン境界検出手段と、
前記検出された複数のファインダパターンの辺の境界点をもとに、前記2次元コードの画像データの輪郭を表す4辺の形状を直線及び曲線の少なくとも一方で近似した近似線を生成する2次元コード境界線検出手段と、
前記生成された近似線をもとに前記2次元コードの画像データの歪みを矯正し、歪みが矯正された2次元コードの画像データを前記メモリに記憶する2次元コード歪み矯正手段と、
前記歪みが矯正された2次元コードの画像データをもとに前記2次元コードを解読し、その解読データを出力する解読手段と
を具備することを特徴とする2次元コード読取装置。
【請求項2】
前記2次元コード境界線検出手段は、
前記ファインダパターン境界検出手段により検出された複数のファインダパターンの辺の境界点をもとに、前記2次元コードの画像データの輪郭を表す辺の傾きを算出する手段と、
前記算出された辺の傾きから推測される方向に画素探索を行って、前記2次元コードの辺を表す境界点を検出する手段と、
前記検出された境界点に含まれるエラー点を除去する手段と
を備えることを特徴とする請求項1記載の2次元コード読取装置。
【請求項3】
前記辺の傾きを算出する手段は、第1及び第2のファインダパターンの各辺を表す境界点をもとにそれぞれ当該各辺の傾きを算出し、この算出された第1及び第2のファインダパターンの各辺の傾きをもとに、前記2次元コードの画像データの一辺の傾きを推測することを特徴とする請求項2記載の2次元コード読取装置。
【請求項4】
前記エラー点を除去する手段は、前記検出された境界点の各々について、当該境界点が、前記算出された辺の傾きから推測される範囲内に含まれているか否かを判定し、含まれていないと判定された境界点をエラー点として前記境界点から削除することを特徴とする請求項2記載の2次元コード読取装置。
【請求項5】
前記エラー点を除去する手段は、前記2次元コードの画像データの4辺のうち直交する第1及び第2の辺の交点を算出する手段と、この算出された交点より外側の範囲に位置する境界点をエラー点として削除する手段とを備え、
前記2次元コードの画像データの第1及び第2の辺の交点を算出する手段は、
第1の辺を表す境界点の集合に含まれる1個以上の境界点を算出基準点としてしきい値線を引き、第2の辺を表す境界点集合に含まれる境界点が前記しきい値線より交点側に位置するか否かを判定する手段と、
前記第2の辺を表す境界点の集合のうち前記しきい値線より交点側に位置しない境界点の中から、当該交点に最も近い境界点をしきい値外近接点として検出する手段と、
前記算出基準点から前記第1の辺の傾きを推定して引いた直線と、前記第2の辺のしきい値外近接点から第2の辺の傾きを推定して引いた直線との交点をもとに、交点候補点を算出する手段と、
前記第1の辺を表す境界点の集合に含まれる境界点のうち前記しきい値線より交点側に位置する境界点の中から前記しきい値直線に最も近い境界点をしきい値内近接点として検出すると共に、前記第2の辺を表す境界点集合に含まれる境界点のうち前記しきい値線より交点側に位置する境界点の中から前記しきい値直線に最も近い境界点をしきい値内近接点として検出する手段と、
前記検出された第1の辺のしきい値内近接点と、前記検出された第2の辺のしきい値内近接点のうち、前記算出された交点候補点より外側にあるものはどれかを判定する手段と
を有することを特徴とする請求項2記載の2次元コード読取装置。
【請求項6】
前記2次元コード歪み矯正手段は、
2次元コードの画像データの各頂点を結ぶ頂点フレームを生成する頂点フレーム生成手段と、
前記矯正対象の2次元コードの画像データにおける目標座標のピクセル値を算出する際に、前記生成された頂点フレームの、上辺における前記目標座標に対応する点の座標値と、下辺における前記目標座標に対応する点の座標値と、左辺における前記目標座標に対応する点の座標値と、右辺における前記目標座標に対応する点の座標値をそれぞれ算出する頂点フレーム対応点算出手段と、
前記2次元コードの画像データの、上辺における前記目標座標に対応する境界点の座標値と、下辺における前記目標座標に対応する境界点の座標値と、左辺における前記目標座標に対応する境界点の座標値と、右辺における前記目標座標に対応する境界点の座標値をそれぞれ算出する境界対応点算出手段と、
前記頂点フレームにおいて前記目標座標に対応する目標座標値を算出する頂点フレーム内目標座標値算出手段と、
前記頂点フレームの上下左右の各辺について算出された前記目標座標に対応する点から、前記2次元コードの画像データの上下左右の各辺について算出された前記目標座標に対応する境界点へのベクトルを重み付け加算して、2次元コード歪みベクトルを算出する2次元コード歪み算出手段と、
前記頂点フレームについて算出された目標座標値に、前記算出された2次元コード歪みベクトルを加算して、前記2次元コードの画像データにおける前記目標座標に対応する目標座標値を算出する2次元コード内目標座標値算出手段と
を
備えることを特徴とする請求項1記載の2次元コード読取装置。
【請求項7】
前記請求項1乃至6のいずれか記載の2次元コード読取装置において、各手段の処理を実行するために使用されるプログラム。
【請求項1】
撮像手段から2次元コードの画像データを取り込んでメモリに記憶する手段と、
前記メモリに記憶された2次元コードの画像データを読み出し、この読み出した画像データから当該2次元コードに含まれる複数のファインダパターンを検出するファインダパターン検出手段と、
前記検出された複数のファインダパターンの各々についてその輪郭を表す辺の境界点を検出するファインダパターン境界検出手段と、
前記検出された複数のファインダパターンの辺の境界点をもとに、前記2次元コードの画像データの輪郭を表す4辺の形状を直線及び曲線の少なくとも一方で近似した近似線を生成する2次元コード境界線検出手段と、
前記生成された近似線をもとに前記2次元コードの画像データの歪みを矯正し、歪みが矯正された2次元コードの画像データを前記メモリに記憶する2次元コード歪み矯正手段と、
前記歪みが矯正された2次元コードの画像データをもとに前記2次元コードを解読し、その解読データを出力する解読手段と
を具備することを特徴とする2次元コード読取装置。
【請求項2】
前記2次元コード境界線検出手段は、
前記ファインダパターン境界検出手段により検出された複数のファインダパターンの辺の境界点をもとに、前記2次元コードの画像データの輪郭を表す辺の傾きを算出する手段と、
前記算出された辺の傾きから推測される方向に画素探索を行って、前記2次元コードの辺を表す境界点を検出する手段と、
前記検出された境界点に含まれるエラー点を除去する手段と
を備えることを特徴とする請求項1記載の2次元コード読取装置。
【請求項3】
前記辺の傾きを算出する手段は、第1及び第2のファインダパターンの各辺を表す境界点をもとにそれぞれ当該各辺の傾きを算出し、この算出された第1及び第2のファインダパターンの各辺の傾きをもとに、前記2次元コードの画像データの一辺の傾きを推測することを特徴とする請求項2記載の2次元コード読取装置。
【請求項4】
前記エラー点を除去する手段は、前記検出された境界点の各々について、当該境界点が、前記算出された辺の傾きから推測される範囲内に含まれているか否かを判定し、含まれていないと判定された境界点をエラー点として前記境界点から削除することを特徴とする請求項2記載の2次元コード読取装置。
【請求項5】
前記エラー点を除去する手段は、前記2次元コードの画像データの4辺のうち直交する第1及び第2の辺の交点を算出する手段と、この算出された交点より外側の範囲に位置する境界点をエラー点として削除する手段とを備え、
前記2次元コードの画像データの第1及び第2の辺の交点を算出する手段は、
第1の辺を表す境界点の集合に含まれる1個以上の境界点を算出基準点としてしきい値線を引き、第2の辺を表す境界点集合に含まれる境界点が前記しきい値線より交点側に位置するか否かを判定する手段と、
前記第2の辺を表す境界点の集合のうち前記しきい値線より交点側に位置しない境界点の中から、当該交点に最も近い境界点をしきい値外近接点として検出する手段と、
前記算出基準点から前記第1の辺の傾きを推定して引いた直線と、前記第2の辺のしきい値外近接点から第2の辺の傾きを推定して引いた直線との交点をもとに、交点候補点を算出する手段と、
前記第1の辺を表す境界点の集合に含まれる境界点のうち前記しきい値線より交点側に位置する境界点の中から前記しきい値直線に最も近い境界点をしきい値内近接点として検出すると共に、前記第2の辺を表す境界点集合に含まれる境界点のうち前記しきい値線より交点側に位置する境界点の中から前記しきい値直線に最も近い境界点をしきい値内近接点として検出する手段と、
前記検出された第1の辺のしきい値内近接点と、前記検出された第2の辺のしきい値内近接点のうち、前記算出された交点候補点より外側にあるものはどれかを判定する手段と
を有することを特徴とする請求項2記載の2次元コード読取装置。
【請求項6】
前記2次元コード歪み矯正手段は、
2次元コードの画像データの各頂点を結ぶ頂点フレームを生成する頂点フレーム生成手段と、
前記矯正対象の2次元コードの画像データにおける目標座標のピクセル値を算出する際に、前記生成された頂点フレームの、上辺における前記目標座標に対応する点の座標値と、下辺における前記目標座標に対応する点の座標値と、左辺における前記目標座標に対応する点の座標値と、右辺における前記目標座標に対応する点の座標値をそれぞれ算出する頂点フレーム対応点算出手段と、
前記2次元コードの画像データの、上辺における前記目標座標に対応する境界点の座標値と、下辺における前記目標座標に対応する境界点の座標値と、左辺における前記目標座標に対応する境界点の座標値と、右辺における前記目標座標に対応する境界点の座標値をそれぞれ算出する境界対応点算出手段と、
前記頂点フレームにおいて前記目標座標に対応する目標座標値を算出する頂点フレーム内目標座標値算出手段と、
前記頂点フレームの上下左右の各辺について算出された前記目標座標に対応する点から、前記2次元コードの画像データの上下左右の各辺について算出された前記目標座標に対応する境界点へのベクトルを重み付け加算して、2次元コード歪みベクトルを算出する2次元コード歪み算出手段と、
前記頂点フレームについて算出された目標座標値に、前記算出された2次元コード歪みベクトルを加算して、前記2次元コードの画像データにおける前記目標座標に対応する目標座標値を算出する2次元コード内目標座標値算出手段と
を
備えることを特徴とする請求項1記載の2次元コード読取装置。
【請求項7】
前記請求項1乃至6のいずれか記載の2次元コード読取装置において、各手段の処理を実行するために使用されるプログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【公開番号】特開2010−44586(P2010−44586A)
【公開日】平成22年2月25日(2010.2.25)
【国際特許分類】
【出願番号】特願2008−208095(P2008−208095)
【出願日】平成20年8月12日(2008.8.12)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.QRコード
【出願人】(000004226)日本電信電話株式会社 (13,992)
【Fターム(参考)】
【公開日】平成22年2月25日(2010.2.25)
【国際特許分類】
【出願日】平成20年8月12日(2008.8.12)
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.QRコード
【出願人】(000004226)日本電信電話株式会社 (13,992)
【Fターム(参考)】
[ Back to top ]