弧検出装置、弧検出プログラム及び携帯端末装置
【課題】弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出すること。
【解決手段】画像を入力する入力部と、画像から複数の線分を検出する線分検出部と、複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、2つの線分が関連付けられるかを判定する判定部と、判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、を備える。
【解決手段】画像を入力する入力部と、画像から複数の線分を検出する線分検出部と、複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、2つの線分が関連付けられるかを判定する判定部と、判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、を備える。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、弧を検出する弧検出装置、弧検出プログラム及び携帯端末装置に関する。
【背景技術】
【0002】
画像上で楕円を検出する技術として、エッジを抽出してハフ変換を行う方式が知られている。ハフ変換は様々な形状の図形検出に応用可能な特徴抽出法である。一方、ハフ変換は、変換で扱うパラメータ数に応じて処理時間が長くなり、メモリ消費も多くなる。楕円を検出する場合、座標(X,Y)、半径(短辺,長辺)と最低4つのパラメータを扱うため、楕円検出にかかる処理時間は長く、メモリ消費量も多かった。
【0003】
そこで、ハフ変換を用いずに、楕円の弧を検出する技術がある。例えば、円弧を検出する技術として、図形の細線化及び折れ線近似に基づいて円弧を検出する技術が記載されている(特許文献1、2、3)。また、楕円などを含む閉領域を抽出する技術として、地図上で線分や曲線で囲まれた閉領域を抽出する技術がある(特許文献4)。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特公平07−104954号公報
【特許文献2】特開昭63−213087号公報
【特許文献3】特開平01−180678号公報
【特許文献4】特開2006−293809号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、特許文献1乃至3の技術における折れ線近似による円弧の検出では、細線が途切れていない範囲でなければ円弧を抽出できないという問題点があった。この問題点を回避するために、エッジ抽出を高感度に行うことが考えられるが、より多くの細線で円弧検出処理を行わなければならず、処理時間がかかるとともに、誤検出の可能性が高くなってしまう。
【0006】
また、特許文献1に記載されている線分からの円又は円弧の再構成や、特許文献3に記載されている隣り合う折れ線の連続性を調べる方法では、円の中心や半径を推定する方式が開示されている。しかし、この方式では、円の長径と短径との比が大きい楕円では適切に検出できないという問題点があった。
【0007】
また、特許文献4の技術では、閉領域を抽出することはできるものの、その閉領域が楕円であることは判断できず、閉領域を構成する線分の内側に別の線分がある場合は閉領域を抽出できないという問題点があった。
【0008】
そこで、開示の技術は、上記課題に鑑みてなされたものであり、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができることを目的とする。
【課題を解決するための手段】
【0009】
開示の一態様における弧検出装置は、画像を入力する入力部と、前記画像から複数の線分を検出する線分検出部と、前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、を備える。
【発明の効果】
【0010】
開示の技術は、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができる。
【図面の簡単な説明】
【0011】
【図1】弧検出装置の構成の一例を示すブロック図。
【図2】検出部の構成の一例を示すブロック図。
【図3】線分検出の一例を示す図。
【図4】線分データのデータ構造の一例を示す図。
【図5】線分の一例を示す図。
【図6】角度の定義を説明するための図。
【図7】線分連結情報のデータ構造の一例を示す図。
【図8】2つの線分の近接関係を説明するための図。
【図9】2つの線分の角度関係を説明するための図。
【図10】線分連鎖情報のデータ構造の一例を示す図。
【図11】実施例1における楕円検出処理の一例を示すフローチャート。
【図12】実施例1における線分連結処理の一例を示すフローチャート。
【図13】検出された線分の端点、位置及び角度変化量を示す図。
【図14】実施例1における近接判定処理の一例を示すフローチャート。
【図15】実施例1における角度関係判定処理の一例を示すフローチャート。
【図16】角度平均及び角度差算出処理の一例を示すフローチャート。
【図17】線分連結情報の一例を示す図。
【図18】実施例1における線分連鎖処理の一例を示すフローチャート。
【図19】実施例1における線分連鎖抽出処理の一例を示すフローチャート。
【図20】実施例1におけるロールバック処理の一例を示すフローチャート。
【図21】実施例1における連分連鎖を一つにまとめる処理の一例を示すフローチャート。
【図22】実施例1における弧検出処理の一例を示すフローチャート。
【図23】各処理結果のデータの一例を示す図。
【図24】実施例1における楕円の位置推定処理の一例を示すフローチャート。
【図25】実施例1における楕円検出処理の一例を示すフローチャート。
【図26】楕円検出の手順(その1)を図形で示す図。
【図27】実施例1における角度変化の方向確認処理の一例を示すフローチャート。
【図28】楕円検出の手順(その2)を図形で示す図。
【図29】線分連鎖が一巡する場合の図形を示す図。
【図30】楕円を8分割した場合の一例を示す図。
【図31】実施例2における方向抽出処理の一例を示すフローチャート。
【図32】実施例2における時計回り方向に揃える処理の一例を示すフローチャート。
【図33】実施例2における最初の方向抽出処理(その1)の一例を示すフローチャート。
【図34】実施例2における最初の方向抽出処理(その2)の一例を示すフローチャート。
【図35】実施例2における最初の方向抽出処理(その3)の一例を示すフローチャート。
【図36】実施例2における最後の方向等抽出処理の一例を示すフローチャート。
【図37】実施例2における楕円検出処理(その1)の一例を示すフローチャート。
【図38】実施例2における楕円検出処理(その2)の一例を示すフローチャート。
【図39】e2のiniPosの違いによる図形を説明するための図。
【図40】処理Bの一例を説明するための図。
【図41】携帯端末装置のハードウェア構成の一例を示す図。
【図42】画像処理装置のハードウェア構成の一例を示す図。
【発明を実施するための形態】
【0012】
以下、添付図面を参照しながら各実施例について詳細に説明する。
【0013】
[実施例1]
<構成>
図1は、各実施例に共通する弧検出装置10の構成の一例を示すブロック図である。図1において、弧検出装置10は、入力部101、制御部102、検出部103、出力部104を含む。
【0014】
入力部101は、撮像素子により撮像された画像データを取得し、制御部102に画像データを入力する。以下、画像データは、単に画像ともいう。
【0015】
制御部102は、各部に対するデータのやり取りや、各部の制御を行う。例えば、制御部102は、入力部101から画像を取得した場合、検出部103に画像を出力し、弧を検出するよう検出部103を制御する。制御部102は、検出部103による検出結果を取得し、出力部104に出力する。
【0016】
検出部103は、制御部102から画像を取得すると、この画像に対し、楕円又は楕円の一部(例えば、弧)を検出する処理を実行する。検出部103は、検出結果を制御部102に返す。検出部103の詳細は後述する。
【0017】
出力部104は、制御部102から取得した検出結果及び/又は画像を取得し、次の工程の処理部に対し、検出結果及び/又は画像を出力する。
【0018】
次に、検出部103の構成について説明する。図2は、各実施例における検出部103の構成の一例を示すブロック図である。検出部103は、線分検出部201、判定部202、弧検出部203、楕円検出部204を含む。
【0019】
線分検出部201は、取得した画像に対し、線分検出を行う。例えば、線分検出部201は、画像からエッジを抽出し、抽出したエッジに対しハフ変換を用いて線分を検出する。線分を検出するハフ変換は、パラメータが少ないため、処理負荷は大きくない。なお、線分検出部201は、その他の従来技術を用いて線分を検出してもよい。
【0020】
図3は、線分検出の一例を示す図である。図3(A)は、入力された画像を示し、図3(B)は、図3(A)に示す画像に対し、線分検出を行った後の画像を示す。線分検出部201は、図3(B)に示すように、画像から線分を検出する。以降の処理では、これらの線分から、図3(B)に示すa11やa12のような同じ方向に角度が変化する線分の連なりが検出される。
【0021】
線分検出部201は、検出した線分の線分データを保持する。図4は、線分データのデータ構造の一例を示す図である。図4に示す線分データは、線分ID、端点(pt1,pt2)座標、線分の長さ、線分の角度(0〜179)を有する。
【0022】
図5は、線分の一例を示す図である。図5に示す例では、線分の端点pt1、pt2のそれぞれの座標はpt1(80,120)、pt2(160,40)であり、長さは113であり、角度は45度とする。
【0023】
図6は、角度の定義を説明するための図である。図6に示すように、画像に対して垂直方向の上方(時計の0時方向)を0度とし、水平方向の右方向(時計の3時方向)を90度とし、垂直方向の下方(時計の6時方向)を180度とする。しかし、180度は0度として、角度は0〜179度で表わすことにする。なお、角度は、0〜359度で表現してもよい。
【0024】
図2に戻り、判定部202は、線分検出部201により検出された複数の線分に対し、楕円の一部(弧)として関連付けられるかを判定し、関連付けられると判定した線分に対し、関連付けを行う。判定部202は、線分連結部211、線分連鎖部212を含む。
【0025】
線分連結部211は、2つの線分が弧をなす線分として連結できるかを、2つの線分の位置及び角度を用いて判定し、連結できると判定した線分の関連付けを行う。線分連結部211は、連結した線分の情報を示す線分連結情報を生成し、保持する。
【0026】
図7は、線分連結情報のデータ構造の一例を示す図である。図7に示すように、線分連結情報は、線分IDと、端点pt1、pt2からの他の線分へのリンク情報b11とを含む。リンク情報b11は、リンク数と、リンク数分の線分リンクを含む。線分リンクは、図7のb12に示すように、リンク先の線分ID、リンク先の線分の端点pt1、pt2のどちらにリンクしているか、リンク先の線分に対する角度変化量を含む。
【0027】
図8、9を用いて、線分連結部211が連結する(関連付ける)線分について説明する。図8は、2つの線分の近接関係を説明するための図である。図8(A)は、2つの線分は近接すると判定される例を示す。図8(A)に示す交点c11は、2つの線分の延長線上の交点である。線分連結部211は、交点c11に近い各線分の端点が、交点c11から所定距離以内であれば、近接すると判定する。所定距離は、例えば2つの線分の長さの平均の1/4である。所定距離は他にも2つの線分の平均の長さの1/3などでもよい。図8(A)に示す場合は、所定距離の条件を満たすので近接すると判定される。
【0028】
図8(B)は、2つの線分は近接すると判定される例を示す。図8(B)に示す交点c12は、2つの線分の交点である。線分連結部211は、交点c12に近い各線分の端点が、交点c12から所定距離以内であれば、近接すると判定する。図8(B)に示す場合は、所定距離の条件を満たすので近接すると判定される。
【0029】
図8(C)は、2つの線分は近接しないと判定される例を示す。図8(C)に示す交点c13は、2つの線分の延長線上の交点である。線分連結部211は、交点c13と、交点c13に近い各線分の端点との距離が所定距離以上離れているため、これらの線分を近接しないと判定する。
【0030】
図9は、2つの線分の角度関係を説明するための図である。図9(A)は、2つの線分は連結すると判定される例を示す。図9(A)に示すθ1は、2つの線分の角度変化量を示す。線分連結部211は、角度θ1が所定角度未満であれば、連結すると判定する。所定角度は、例えば40度である。この場合、角度変化量θ1が所定角度より小さいため、線分連結部211は、これらの線分を連結すると判定する。
【0031】
図9(B)は、2つの線分は連結しないと判定される例を示す。図9(B)に示すθ2は、2つの線分の角度変化量を示す。この場合、線分連結部211は、この角度変化量θ2が所定角度以上であるため、これらの線分は連結しないと判定する。
【0032】
図9(C)は、2つの線分は連結しないと判定される例を示す。図9(C)に示すθ3は、2つの線分の角度変化量を示す。この場合、線分連結部211は、角度変化量θ3は、所定角度未満であるが、2つの線分の位置関係がNGであるため、連結しないと判定する。位置関係については、例えば、2つの線分の中心のX座標が左右に位置しているか、Y座標が同程度の位置に位置しているかなどを判定する。位置関係の判定の詳細は後述する。
【0033】
線分連結部211は、図8、9に示すように、2つの線分の端点同士が近接していて、2つの線分の角度変化量が小さく、2つの線分が適切な位置にあるかを判定し、これらの条件を満たすと判定した線分を連結する(関連付ける)。線分連結部211は、連結された線分の線分連結情報を生成し、保持する。
【0034】
図2に戻り、線分連鎖部212は、線分連結部211から線分連結情報を取得する。線分連鎖部212は、両端点で連結されている線分(以下、基準線分ともいう)を探し、この基準線分と連結される線分が他の線分と連結されているかを判定する。
【0035】
線分連鎖部212は、他の線分と連結されている場合は、これらの線分を連鎖するとして関連付ける。線分連鎖部212は、基準線分を移動させてこの処理を繰り返し、連鎖数を増やしていく。以下、この処理を連鎖探索処理という。線分連鎖部212は、連鎖探索処理を行って、連鎖した線分の情報を示す線分連鎖情報を生成し、保持する。
【0036】
図10は、線分連鎖情報のデータ構造の一例を示す図である。図10に示す例では、線分連鎖情報は、要素数(線分数)、要素数分の要素リストを含む。図10に示すd11は、要素のデータを示す。要素のデータは、線分ID、線分リンク番号、端点フラグ、リンク先への角度変化量を有する。
【0037】
線分リンク番号は、線分連結で抽出した端点からのリンクの番号である。端点フラグは、線分IDの線分のpt1、pt2のいずれかの端点とリンクするかを示す。
【0038】
図2に戻り、弧検出部203は、線分連鎖情報を取得し、角度変化が同一方向の線分連鎖であり、要素数(線分数)が閾値以上の線分連鎖を抽出する。まず、弧検出部203は、取得した線分連鎖情報に基づき、その線分連鎖が、角度変化が同一方向の線分連鎖かを判定する。角度変化が同一方向の線分連鎖の場合、弧検出部203は、その線分連鎖に含まれる線分(要素数)をカウントする。弧検出部203は、カウント値が閾値以上であれば、この角度変化が同一方向の線分連鎖に含まれる線分を、楕円の一部(弧)であるとして検出する。
【0039】
楕円検出部204は、弧検出部203により検出された弧を所定の条件を満たす場合に組み合わせ、組み合わせ結果から楕円を検出する。楕円検出部204は、後述するように、楕円の一部が欠けている場合でも楕円とみなして検出することができる。また、楕円検出部204は、線分連鎖部212により線分が一巡した場合は、一巡した線分の線分連鎖情報を取得し、楕円であるかの確認処理を行う。
【0040】
<動作>
次に、弧検出装置10の動作について説明する。図11は、実施例1における楕円検出処理の一例を示すフローチャートである。図11に示すように、ステップS11で、線分検出部201は、取得した画像から線分を検出する。線分検出処理は、従来の技術を用いればよい。
【0041】
ステップS12で、線分連結部211は、検出された全線分に対し、線分の位置及び角度に基づいて連結(関連付け)できる線分がないかを判定する。線分連結部211は、連結できると判定した線分を連結し、線分連結情報を生成し、保持する。
【0042】
ステップS13で、線分連鎖部212は、線分連結情報に基づいて、連結された線分が連鎖するかを判定する。線分連鎖部212は、連鎖すると判定された線分を連鎖し(関連付け)、線分連鎖情報を生成し、保持する。
【0043】
ステップS14で、弧検出部203は、線分連鎖情報に基づいて、角度変化が同一方向の線分連鎖を抽出し、線分連鎖の要素数(線分数)が閾値以上であるかを判定する。弧検出部203は、角度変化が同一方向であり、要素数が閾値以上である線分連鎖に含まれる線分を、弧として検出する。
【0044】
ステップS15で、楕円検出部204は、検出された弧を所定の条件を満たす場合に組み合わせる。楕円検出部204は、この組み合わせに基づいて、楕円を検出する。以下、ステップS12〜S15の各処理を具体的に説明する。
【0045】
(1)線分連結処理
図12は、実施例1における線分連結処理の一例を示すフローチャートである。図12に示す処理は、ステップS12に相当し、線分検出処理により検出された線分の全ての組み合わせに対して実行される。なお、検出された線分には、他の線分を識別するために線分ID(例えば0,1,2,・・・,n)が付与される。
【0046】
ステップS101で、線分連結部211は、線分IDが0の線分をAの線分として抽出し、A=0とする。
【0047】
ステップS102で、線分連結部211は、線分検出部201により検出された線分数を取得し、Aが(線分数−1)未満であるかを判定する。Aが(線分数−1)未満である場合(ステップS102−YES)ステップS103に進み、Aが(線分数−1)以上である場合(ステップS102−NO)この処理を終了する。図では、YESをY、NOをNと表現する。
【0048】
ステップS103で、線分連結部211は、線分IDがA+1の線分をBとして抽出し、B=A+1とする。
【0049】
ステップS104で、線分連結部211は、Bが線分数未満であるかを判定する。Bが線分数未満である場合(ステップS104−YES)ステップS106に進み、Bが線分数以上である場合(ステップS104−NO)ステップS105に進む。
【0050】
ステップS105で、線分連結部211は、線分IDがA+1の線分をAとして抽出し、A=A+1とする。ステップS105の処理後はステップS102に戻る。
【0051】
ステップS106で、線分連結部211は、抽出した線分A,Bの近接判定処理を行う。近接判定については、図14を用いて後述する。
【0052】
ステップS107で、線分連結部211は、線分A,Bの近接判定がOKであるかを判定する。「近接判定がOK」の場合、線分A,Bは近接する。近接判定がOKである場合(ステップS107−YES)ステップS109に進み、近接判定がNGである場合(ステップS107−NO)ステップS108に進む。
【0053】
ステップS108で、線分連結部211は、線分IDがB+1の線分をBとして抽出し、B=B+1とする。ステップS108の処理後はステップS104に戻る。
【0054】
ステップS109で、線分連結部211は、線分A,Bの角度関係判定処理を行う。角度関係判定については、図15を用いて後述する。
【0055】
ステップS110で、線分連結部211は、角度関係がOKであるかを判定する。「角度関係がOK」とは、2つの線分の角度変化が小さく、所定の位置関係にある場合をいう。角度関係がOKである場合(ステップS110−YES)ステップS111に進み、角度関係がNGである場合(ステップS110−NO)ステップS108に進む。
【0056】
ステップS111で、線分連結部211は、線分連結情報をメモリに記録する。ステップS111の処理後はステップS108に戻る。これにより、全ての線分の組み合わせに対して線分連結処理を行うことができ、関連付けられた線分の組み合わせに対する線分連結情報を保持することができる。
【0057】
次に、具体例を用いて、近接判定処理及び角度関係判定処理を説明する。図13は、検出された線分の端点、位置及び角度を示す図である。図13に示す例では、線分ID0〜7に対し、近接する線分の角度変化量を示す。
【0058】
(1−1)近接判定処理
図14は、実施例1における近接判定処理の一例を示すフローチャートである。図14に示すステップS201で、線分連結部211は、線分A,Bの平均の長さを算出する。
【0059】
ステップS202で、線分連結部211は、線分A,Bの交点を抽出する。線分A,Bが実際に交わらない場合は、線分連結部211は、両線分を延長し、延長線上の交点を抽出する。
【0060】
ステップS203で、線分連結部211は、線分の交点から、両線分の交点に近いほうの端点までの距離が、例えば平均長さの1/4以下であるかを判定する。この距離が平均長さの1/4以下である場合(ステップS203−YES)ステップS204に進み、この距離が平均長さの1/4より長い場合(ステップS203−NO)ステップS205に進む。「1/4」については、実験により適切な値が与えられればよい。
【0061】
ステップS204で、線分連結部211は、この2つの線分は、近接判定OKであると判定する。ステップS205で、線分連結部211は、この2つの線分は、近接判定NGであると判定する。
【0062】
(1−2)角度関係判定処理
図15は、実施例1における角度関係判定処理の一例を示すフローチャートである。図15に示すステップS301で、線分連結部211は、線分A,Bの角度平均及び角度差を算出する。線分A,Bの角度平均及び角度差の算出については、図16を用いて後述する。
【0063】
ステップS302で、線分連結部211は、線分A,Bの角度差が40度未満であるかを判定する。角度差が40度未満である場合(ステップS302−YES)ステップS303に進み、角度差が40度以上である場合(ステップS302−NO)ステップS311に進む。
【0064】
ステップS303で、線分連結部211は、X座標での位置関係の判定処理を行う。線分連結部211は、両線分の中間点のX座標を比較し、左にある線分を線分L、右にある線分を線分Rとする。
【0065】
このとき、線分連結部211は、次の条件を満たすかを判定する。
線分Lの中間点のX座標<線分Rの両端点のX座標 かつ
線分Rの中間点のX座標>線分Lの両端点のX座標
線分連結部211は、この条件を満たす場合、X座標での位置関係をOKとする。線分連結部211は、条件を満たさない場合、X座標での位置関係はNGとする。線分連結部211は、例えば、この2つの線分にはX座標の位置関係の判定結果を表すフラグを立てるとよい。
【0066】
ステップS304で、線分連結部211は、Y座標での位置関係の判定処理を行う。線分連結部211は、両線分の中間点のY座標を比較し、上にある線分を線分U、下にある線分を線分Dとする。
【0067】
このとき、線分連結部211は、次の条件を満たすかを判定する。
線分Uの中間点のY座標<線分Dの両端点のY座標 かつ
線分Dの中間点のY座標>線分Uの両端点のY座標
線分連結部211は、この条件を満たす場合、Y座標での位置関係をOKとする。線分連結部211は、例えば、この2つの線分にはY座標の位置関係がOKであるフラグを立てる。画像上のY座標は、下に行くほど値が大きくなるとする。
【0068】
ステップS305で、線分連結部211は、両線分の角度の平均が30度未満又は150度以上であるかを判定する。この条件を満たす場合(ステップS305−YES)ステプS306に進み、この条件を満たさない場合(ステップS305−NO)ステップS308に進む。
【0069】
ステップS306で、線分連結部211は、Y座標での位置関係がOKであるかを判定する。Y座標での位置関係がOKである場合(ステップS306−YES)ステップS307に進み、Y座標での位置関係がNGである場合(ステップS306−NO)ステップS311に進む。
【0070】
ステップS307で、線分連結部211は、この2つの線分は、角度関係判定がOKであると判定する。
【0071】
ステップS308で、線分連結部211は、両線分の角度の平均が60度以上かつ120度未満であるかを判定する。この条件を満たす場合(ステップS308−YES)ステプS309に進み、この条件を満たさない場合(ステップS308−NO)ステップS310に進む。
【0072】
ステップS309で、線分連結部211は、X座標での位置関係がOKであるかを判定する。X座標での位置関係がOKである場合(ステップS309−YES)ステップS307に進み、X座標での位置関係がNGである場合(ステップS309−NO)ステップS311に進む。
【0073】
ステップS310で、線分連結部211は、X座標での位置関係がOKであり、Y座標での位置関係がOKであるかを判定する。この条件を満たす場合(ステップS310−YES)ステップS307に進み、この条件を満たさない場合(ステップS310−NO)ステップS311に進む。
【0074】
ステップS311で、線分連結部211は、この2つの線分は、角度関係がNGであると判定する。
【0075】
(1−2−1)角度平均及び角度差算出
図16は、角度平均及び角度差算出処理の一例を示すフローチャートである。図16に示すステップS401で、線分連結部211は、次の式によりangA2を算出する。
angA2=線分Aの角度+90
【0076】
ステップS402で、線分連結部211は、angA2が180度以上であるかを判定する。180度以上である場合(ステップS402−YES)ステップS403に進み、180度未満である場合(ステップS402−NO)ステップS404に進む。
【0077】
ステップS403で、線分連結部211は、次の式によりangA2を算出する。
angA2=angA2−180
【0078】
ステップS404で、線分連結部211は、次の式によりangB2を算出する。
angB2=線分Bの角度+90
【0079】
ステップS405で、線分連結部211は、angB2が180度以上であるかを判定する。180度以上である場合(ステップS405−YES)ステップS406に進み、180度未満である場合(ステップS405−NO)ステップS407に進む。
【0080】
ステップS406で、線分連結部211は、次の式によりangB2を算出する。
angB2=angB2−180
【0081】
ステップS407で、線分連結部211は、角度差1を次の式により算出する。
角度差1=(線分Aの角度−線分Bの角度)の絶対値
【0082】
ステップS408で、線分連結部211は、角度差2を次の式により算出する。
角度差2=(angA2−angB2)の絶対値
【0083】
ステップS409で、線分連結部211は、角度差1が角度差2以下であるかを判定する。角度差1が角度差2以下である場合(ステップS409−YES)ステップS410に進み、角度差1が角度差2より大きい場合(ステップS409−NO)ステップS411に進む。
【0084】
ステップS410で、線分連結部211は、次の式により角度平均を算出する。
角度平均=(線分Aの角度+線分Bの角度)/2
線分連結部211は、次の式により角度差を算出する。
角度差=角度差1
【0085】
ステップS411で、線分連結部211は、次の式により角度平均を算出する。
角度平均=((angA2+angB2)/2)−90
線分連結部211は、次の式により角度差を算出する。
角度差=角度差2
【0086】
ステップS412で、線分連結部211は、算出した角度平均が0未満であるかを判定する。0未満である場合(ステップS412−YES)ステップS413に進み、0以上である場合(ステップS412−NO)この処理を終了する。
【0087】
ステップS413で、線分連結部211は、次の式により角度平均を修正する。
角度平均=180+角度平均
以上の処理を行うことで、角度平均を求めることができる。
【0088】
図17は、線分連結情報の一例を示す図である。図17に示す線分連結情報は、図13に示す線分から線分連結処理を行った結果を示す。
【0089】
図17に示すように、線分ID=0のpt1側には、2つの線分が関連(リンク)付けられ、linkNum=2が付与される。「linkNum」は、リンク総数を表す。「リンク0」は、線分ID=1の線分とのリンクを表す。
【0090】
線分リンク番号「リンク0」は、linkId、linkPt、angleの各データを有する。「linkId」は、関連付けられている線分の線分IDを示す。「linkPt」は、関連付けられている線分の端点を示す。「angle」は、基準となる線分から関連付けられた線分への角度変化量を示し、時計回りを正とする。図17に示す例では、基準となる線分は、線分ID=0の線分であり、関連付けられた線分は、線分ID=1の線分である。
【0091】
例えば、線分リンク番号「リンク0」は、linkId=1、linkPt=pt2、angle=30の各データを有する。線分リンク番号「リンク1」は、線分ID=2の線分とのリンクを表す。「リンク1」は、linkId=2、linkPt=pt1、angle=15の各データを有する。
【0092】
図17に示すように、線分ID=0の線分のpt2側には、1つの線分が関連(リンク)付けられ、linkNum=1が付与される。「リンク0」は、線分ID=4の線分とのリンクを表す。「リンク0」は、linkId=4、linkPt=pt2、angle=−18の各データを有する。図17に示すように、線分連結部211は、全ての線分に対して、線分連結情報を生成する。
【0093】
(2)線分連鎖処理
図18は、実施例1における線分連鎖処理の一例を示すフローチャートである。図18に示す処理は、図11に示すステップS13、S14に相当する。図18に示すステップS501で、線分連鎖部212は、初期化のため、探索するIDを0に設定する。
【0094】
ステップS502で、線分連鎖部212は、IDが全線分数未満であるかを判定する。IDが全線分数未満である場合(ステップS502−YES)ステップS503に進み、IDが全線分数以上である場合(ステップS502−NO)この処理を終了する。
【0095】
ステップS503で、線分連鎖部212は、IDと同じ線分IDの線分について、pt1、pt2両方に線分リンクがあるかを判定する。「線分リンクがある」とは、他の線分と関連付け(リンク)されている場合をいう。両方に線分リンクがある場合(ステップS503−YES)ステップS505に進み、両方に線分リンクがない場合(ステップS503−NO)ステップS504に進む。
【0096】
ステップS504で、線分連鎖部212は、IDに1を加算する。ステップS504の処理後は、ステップS502に戻る。
【0097】
ステップS505で、線分連鎖部212は、探索開始線分ID=IDとする。ステップS506で、線分連鎖部212は、探索開始線分IDと同じ線分IDを有する線分のpt1側で、線分のリンク数を増やす線分連鎖抽出処理を行う。線分連鎖抽出処理は、図19を用いて後述する。
【0098】
ステップS507で、線分連鎖部212は、線分のリンク数を増やした結果、線分の連鎖が一巡したかを判定する。線分連鎖部212は、探索開始線分IDと同じ線分IDに戻ってきた場合に、一巡したと判定できる。一巡した場合(ステップS507−YES)ステップS508に進み、一巡しなかった場合(ステップS507−NO)ステップS509に進む。
【0099】
ステップS508で、楕円検出部204は、角度変化方向の確認処理を行う。角度変化方向の確認処理は、図27を用いて後述する。
【0100】
ステップS509で、線分連鎖部212は、探索開始線分IDと同じ線分IDを有する線分のpt2側で、線分連鎖抽出処理を行う。連分連鎖抽出処理は、図19を用いて後述する。
【0101】
ステップS510で、線分連鎖部212は、pt1側の連鎖と、pt2側の連鎖とを1つにまとめる。この処理は、図21を用いて後述する。
【0102】
ステップS511で、弧検出部203は、ステップS510で1つにまとめられた線分連鎖から、角度変化が同一方向であり、線分数が閾値以上の線分連鎖を検出する。検出した線分連鎖は、弧であり、楕円の一部となりうる。この処理は、弧検出処理として図22を用いて後述する。ステップS511は、図11に示すステップS14に相当する。
【0103】
ステップS511の処理後は、ステップS504に進み、全ての線分に対して処理を実行する。
【0104】
(2−1)線分連鎖抽出処理
図19は、実施例1における線分連鎖抽出処理の一例を示すフローチャートである。図19に示すステップS601で、線分連鎖部212は、線分連鎖を探索するための初期化を行う。例えば、要素数num=0、最大要素数max=0、注目線分lid=探索開始線分ID、線分リンクlink=注目端点の0番目の線分リンクが設定される。
【0105】
ステップS602で、線分連鎖部212は、注目線分lidの注目端点の線分リンク数が0より大きいかを判定する。線分リンク数が0より大きい場合(ステップS602−YES)、ステップS603に進み、線分リンク数が0以下である場合(ステップS602−NO)ステップS608に進む。
【0106】
ステップS603で、線分連鎖部212は、連鎖探索リスト[num]に、注目線分lid、注目中の線分リンク番号、線分リンクlinkの端点フラグ、角度変化量を記録する。
【0107】
ステップS604で、線分連鎖部212は、注目線分lidをlink先の線分IDに更新する。また、線分連鎖部212は、linkを新lidの元linkとリンクしている端点の反対側の端点に設定する。これは、図13を用いて説明すれば、線分ID=0から線分ID=1に更新した場合、linkは、線分ID=0のpt1から線分ID=1のpt1に更新される。つまり、新linkは、線分ID=1の線分が線分ID=0の線分とリンクしている端点の反対側に設定される。
【0108】
ステップS605で、線分連鎖部212は、numに1を加算する。numは、リンク数を表す。
【0109】
ステップS606で、注目線分lidが探索開始線分IDと同じであるかを判定する。注目線分lidが探索開始線分IDと同じである場合(ステップS606−YES)ステプS607に進み、注目線分lidが探索開始線分IDと違う場合(ステップS606−NO)ステップS602に戻る。
【0110】
ステップS607で、線分連鎖部212は、完全に一巡していると判定し、現在の連鎖探索リスト[0〜num]を線分連鎖の抽出結果とする。
【0111】
ステップS608で、線分連鎖部212は、numがmax以上であるかを判定する。numがmax以上である場合(ステップS608−YES)ステップS609に進み、numがmax未満である場合(ステップS608−NO)ステップS610に進む。
【0112】
ステップS609で、線分連鎖部212は、S603で記録した連鎖探索リスト[0〜num]を所定の記録領域に記録する。以下では、所定の記録領域を、最大連鎖記録領域と呼ぶ。この連鎖探索リストが線分連鎖情報になる。
【0113】
ステップS610で、線分連鎖部212は、ロールバック処理を行う。ロールバック処理は、線分連鎖の枝分かれした連鎖に対してリンクを辿るための処理である。ロールバック処理は、図20を用いて後述する。
【0114】
ステップS611で、線分連鎖部212は、numが0より大きいかを判定する。numが0より大きい場合(ステップS611−YES)ステップS602に戻り、numが0以下の場合(ステップS611−NO)ステップS612に進む。
【0115】
ステップS612で、線分連鎖部212は、最大連鎖記録領域に記録された連鎖探索リストを線分連鎖の抽出結果とする。
【0116】
以上の処理を行うことで、線分連鎖部212は、探索開始線分から一番長い線分連鎖を抽出することができる。
【0117】
(2−1−1)ロールバック処理
図20は、実施例1におけるロールバック処理の一例を示すフローチャートである。図20に示すステップS701で、線分連鎖部212は、numが0より大きいかを判定する。numが0より大きい場合(ステップS701−YES)ステップS702に進み、numが0より以下の場合(ステップS701−NO)処理を終了する。
【0118】
ステップS702で、線分連鎖部212は、連鎖探索リスト[num−1]の線分リンク番号に1を追加する。これは、線分連鎖の終端の一つ前の線分に戻り、その線分の枝分かれした線分を探すための処理である。
【0119】
ステップS703で、線分連鎖部212は、連鎖探索リスト[num−1]について、線分リンク番号が端点フラグ側のリンク総数より小さいかを判定する。リンク番号がリンク総数よりも小さい場合(ステップS703−YES)ステップS704に進み、リンク番号がリンク総数以上である場合(ステップS703−NO)ステップS705に進む。
【0120】
ステップS704で、線分連鎖部212は、注目線分lidを連鎖探索リスト[num−1]の端点フラグ側の線分リンク番号のリンクが指す線分IDに更新する。線分連鎖部212は、線分リンクを注目線分lidの、連鎖探索リスト[num−1]の線分とリンクしている端点の反対側の端点に設定する。これは、線分連鎖の終端の手前の線分から枝分かれした線分に対して連鎖探索処理を開始するための処理である。
【0121】
ステップS705で、線分連鎖部212は、numから1を減算する。ステップS705の処理後はステップS701に戻る。これにより、ステップS705で、最大連鎖から逆に辿っていき探索開始線分に戻ったとき、又はステップS704の処理後に、ロールバック処理を終了する。
【0122】
(2−2)線分連鎖を一つにまとめる処理
図21は、実施例1における連分連鎖を一つにまとめる処理の一例を示すフローチャートである。図21に示すステップS801で、線分連鎖部212は、この処理を行うための初期化を行う。例えば、要素数num=0、インデックスidx=pt2側の要素数−1が設定される。
【0123】
ステップS802で、線分連鎖部212は、idxが0より大きいかを判定する。idxが0より大きい場合(ステップS802−YES)ステップS803に進み、idxが0以下の場合(ステップS802−NO)ステップS805に進む。
【0124】
ステップS803で、線分連鎖部212は、次の演算を行う。
合計線分連鎖[num]=pt2側の線分連鎖[idx]
合計線分連鎖[num]の角度変化量=pt2側の線分連鎖[idx−1]の角度変化量×(−1)
ここで、線分連鎖[]は、図19に示すステップS612で抽出結果となる連鎖探索リスト[]である。
この処理は、線分連鎖を反対向きに辿っているので、角度は+、−を入れ替えるための処理である。
【0125】
ステップS804で、線分連鎖部212は、次の演算を行う。
num=num+1
idx=idx−1
ステップS804の処理後はステップS802に戻る。
【0126】
ステップS805で、線分連鎖部212は、idxを0にする。ステップS806で、線分連鎖部212は、idxがpt1側の要素数より小さいかを判定する。idxが要素数よりも小さい場合(ステップS806−YES)ステップS807に進み、idxがpt1側の要素数以上である場合(ステップS806−NO)この処理を終了する。
【0127】
ステップS807で、線分連鎖部212は、次の演算を行う。
合計線分連鎖[num]=pt1側の線分連鎖[idx]
【0128】
ステップS808で、線分連鎖部212は、次の演算を行う。
num=num+1
idx=idx+1
ステップS808の処理後はステップS806に戻る。
【0129】
以上の処理により、pt1側の線分連鎖とpt2側の線分連鎖とを1つにまとめることができる。
【0130】
(3)弧検出処理
図22は、実施例1における弧検出処理の一例を示すフローチャートである。図22に示す処理は、図11に示すステップS14に相当する。弧は、楕円又は楕円の一部を含むとする。図22に示すステップS901で、弧検出部203は、弧を検出するための初期化を行う。例えば、インデックスidx=1、始点pos=0、連続数cont=1が設定される。
【0131】
ステップS902で、弧検出部203は、idxが合計要素数よりも小さいかを判定する。idxが合計要素数よりも小さい場合(ステップS902−YES)ステップS903に進み、idxが合計要素数以上である場合(ステップS902−NO)処理を終了する。
【0132】
ステップS903で、弧検出部203は、idxが(合計要素数−1)と同じであるかを判定する。idxが(合計要素数−1)と同じである場合(ステップS903−YES)ステップS907に進み、idxが(合計要素数−1)と違う場合(ステップS903−NO)ステップS904に進む。
【0133】
ステップS904で、弧検出部203は、(idx−1)番目の角度変化量×idx番目の角度変化量が0より大きいかを判定する。これは、両者の角度変化量の符号(+、−)が同じならば正になる。乗算結果が正である場合(ステップS904−YES)ステップS905に進み、乗算結果が0以下である場合(ステップS904−NO)ステップS907に進む。
【0134】
ステップS905で、弧検出部203は、contに1を加算する。ステップS906で、弧検出部203は、idxに1を加算する。ステップS906の処理後はステップS902に戻る。
【0135】
ステップS907で、弧検出部203は、contが3以上であるかを判定する。contが3以上である場合(ステップS907−YES)ステップS908に進み、contが3未満である場合(ステップS907−NO)ステップS909に進む。
【0136】
ステップS908で、弧検出部203は、合計線分連鎖[pos〜idx]を弧(楕円又は楕円の一部)として記録する。
【0137】
ステップS909で、弧検出部203は、次の演算を行う。
pos=idx
cont=1
ステップ909の処理が終わると、ステップS906に進む。
【0138】
以上の処理を行うことで、合計線分連鎖のうち、同じ方向の角度変化をしている部分を楕円の一部として検出することができる。
【0139】
図23は、各処理結果のデータの一例を示す図である。図23は、図13に示す線分に対し、図18に示すステップS506、S509、S510、S511の各処理をした結果を示す。図23に示す「lineId」は線分IDを表し、「linkPt」は端点フラグを表し、「linkId」は線分リンク番号を表し、「angle」は角度変化量を表す。
【0140】
図23(A)は、S506の処理結果のデータを示す。図23(A)は、線分ID=0の線分のpt1側の連鎖抽出結果を示す。図23(A)に示すように、線分ID=0の線分のpt1側では、線分ID(lineId)=2の線分、線分ID=3の線分、線分ID=5の線分が連鎖していることを表す。要素数は、リンク数を表し、この場合の要素数は4である。
【0141】
図23(B)は、S509の処理結果のデータを示す。図23(B)は、線分ID=0の線分のpt2側の連鎖抽出結果を示す。図23(B)に示すように、線分ID=0の線分のpt2側では、線分ID=4の線分が連鎖していることを表す。この場合の要素数は、2である。
【0142】
図23(C)は、S510の処理結果のデータを示す。図23(C)は、図23(A)に示すデータと、図23(B)に示すデータとを重複を除いて1つにまとめた例を示す。この場合の要素数は、5である。
【0143】
図23(D)は、S511の処理結果のデータを示す。図23(D)は、図23(C)に示す線分連鎖から、角度変化が同一方向の線分が抽出された結果を示す。図23(D)に示すように、線分ID=5の線分が、線分ID=3の線分からの角度変化の符号が他の線分間の角度変化の符号と異なるため、リストから消去される。
【0144】
(4)楕円検出
以下に説明する処理は、図11に示すステップS15に相当する。
(4−1)楕円の位置推定処理
図24は、実施例1における楕円の位置推定処理の一例を示すフローチャートである。図24に示す処理で、弧(楕円の一部)が楕円のどの部分に相当するかを推定する。
【0145】
ステップS1001で、楕円検出部204は、フラグ上、下、左、右をOFFにセットする。ステップS1002で、楕円検出部204は、idxを0に設定する。
【0146】
ステップS1003で、楕円検出部204は、idxが(要素数−1)より小さいかを判定する。idxが(要素数−1)より小さい場合(ステップS1003−YES)ステップS1004に進み、idxが(要素数−1)以上である場合(ステップS1003−NO)この処理を終了する。
【0147】
ステップS1004で、楕円検出部204は、次の設定を行う。
a1=idx番目の要素の線分の角度
a2=(idx+1)番目の要素の線分の角度
【0148】
ステップS1005で、楕円検出部204は、次の条件を満たすかを判定する。
(45≦a1<90)AND(90≦a2<135)又は
(45≦a2<90)AND(90≦a1<135)
この条件を満たす場合(ステップS1005−YES)ステップS1008に進み、この条件を満たさない場合(ステップS1005−NO)ステップS1006に進む。
【0149】
ステップS1006で、楕円検出部204は、次の条件を満たすかを判定する。
a1<45 AND a2≧135 又は
a2<45 AND a1≧135
この条件を満たす場合(ステップS1006−YES)ステップS1012に進み、この条件を満たさない場合(ステップS1006−NO)ステップS1007に進む。
【0150】
ステップS1007で、楕円検出部204は、idxに1を加算する。ステップS1007の処理後はステップS1003に戻る。
【0151】
ステップS1008で、楕円検出部204は、左側にある線分をL、右側にある線分をRとし、2つの線分の交点を算出する。楕円検出部204は、線分Lについて、交点に近い端点のY座標をLY1、他方をLY2とし、線分Rについて、交点に近い端点のY座標をRY1、他方をRY2とする。
【0152】
ステップS1009で、楕円検出部204は、次の条件を満たすかを判定する。なお、Y座標は下に行くほど値が大きい。
LY1≦LY2 AND RY1≦RY2
この条件を満たす場合(ステップS1009−YES)ステップS1010に進み、この条件を満たさない場合(ステップS1009−NO)ステップS1011に進む。
【0153】
ステップS1010で、楕円検出部204は、フラグ上をONにし、交点座標を記録する。
【0154】
ステップS1011で、楕円検出部204は、フラグ下をONにし、交点座標を記録する。ステップS1010、S1011の処理後はステップS1007に戻る。
【0155】
ステップS1012で、楕円検出部204は、上側にある線分をU、下側にある線分をDとし、2つの線分の交点を算出する。楕円検出部204は、線分Uについて、交点に近い端点のX座標をUX1、他方をUX2とし、線分Dについて、交点に近い端点のX座標をDX1、他方をDX2とする。
【0156】
ステップS1013で、楕円検出部204は、次の条件を満たすかを判定する。なお、X座標は、右に行くほど値が大きい。
UX1≦UX2 AND DX1≦DX2
この条件を満たす場合(ステップS1013−YES)ステップS1014に進み、この条件を満たさない場合(ステップS1013−NO)ステップS1015に進む。
【0157】
ステップS1014で、楕円検出部204は、フラグ左をONにし、交点座標を記録する。
【0158】
ステップS1015で、楕円検出部204は、フラグ右をONにし、交点座標を記録する。ステップS1014、S1015の処理後はステップS1017に戻る。
【0159】
以上の処理を行うことで、楕円の一部が、楕円のどの部分に相当するかを推定し、楕円の一部に推定結果を示すフラグを立てることができる。
【0160】
(4−2)楕円検出処理
図25は、実施例1における楕円検出処理の一例を示すフローチャートである。図25に示すステップS1101で、楕円検出部204は、楕円検出のための初期化を行う。例えば、idx1=0が設定される。
【0161】
ステップS1102で、楕円検出部204は、idx1が(楕円の一部数(弧の数)−1)より小さいかを判定する。idx1が(楕円の一部数−1)より小さい場合(ステップS1102−YES)ステップS1103に進み、idx1が(楕円の一部数−1)以上である場合(ステップS1102−NO)この処理を終了する。
【0162】
ステップS1103で、楕円検出部204は、次の演算を行う。
idx2=idx1+1
【0163】
ステップS1104で、楕円検出部204は、idx2が楕円の一部数より小さいかを判定する。idx2が楕円の一部数より小さい場合(ステップS1104−YES)ステップS1106に進み、idx2が楕円の一部数以上である場合(ステップS1104−NO)ステップS1105に進む。
【0164】
ステップS1105で、楕円検出部204は、idx1に1を加算する。ステップS1005の処理後はステップS1002に戻る。
【0165】
ステップS1106で、楕円検出部204は、次の設定を行う。
e1=idx1番目の楕円の一部
e2=idx2番目の楕円の一部
【0166】
ステップS1107で、楕円検出部204は、次の条件を満たすかを判定する。
e1のフラグ上がON AND e2のフラグ下がON、又は
e1のフラグ下がON AND e2のフラグ上がON
この条件を満たす場合(ステップS1107−YES)ステップS1108に進み、この条件を満たさない場合(ステップS1107−NO)ステップS1111に進む。
【0167】
ステップS1108で、楕円検出部204は、次の設定を行う。
E1=e1、e2の上側
E2=e1、e2の下側
【0168】
ステップS1109で、楕円検出部204は、以下の設定を行う。
R1=E1を囲む矩形
R2=E2を囲む矩形
【0169】
ステップS1110で、楕円検出部204は、次の条件を満たすかを判定する。
E1交点とE2交点のX座標の差分<(R1、R2の平均幅/4)
この条件を満たす場合(ステップS1110−YES)ステップS1112に進み、この条件を満たさない場合(ステップS1110−NO)ステップS1111に進む。この条件は、線分の交点のうち、最も上側にある交点と、最も下側にある交点との差分が、楕円の一部を囲う矩形のX方向の幅の1/4未満であるかを調べる。「1/4」という数字は、所定の数字に適宜変更することができる。
【0170】
ステップS1111で、楕円検出部204は、idx2に1を加算する。ステップS1111の処理後はステップS1104に戻る。
【0171】
ステップS1112で、楕円検出部204は、R1高さ<R2高さであるかを判定する。R1の高さがR2の高さよりも小さい場合(ステップS1112−YES)ステップS1113に進み、R1の高さがR2以上である場合(ステップS1112−NO)進む。
【0172】
ステップS1113で、楕円検出部204は、(R1の高さ×2)>R2の高さの条件を満たすかを判定する。この条件を満たす場合(ステップS1113−YES)ステップS1115に進み、この条件を満たさない場合(ステップS1113−NO)ステップS1111に進む。
【0173】
ステップS1114で、楕円検出部204は、R1の高さ<(R2の高さ×2)の条件を満たすかを判定する。この条件を満たす場合(ステップS1114−YES)ステップS1115に進み、条件を満たさない場合(ステップS1114−NO)ステップS1111に進む。
【0174】
ステップS1115で、楕円検出部204は、次の条件を満たすかを判定する。
(R2上辺Y座標−R1下辺Y座標)<R1、R2の高さ平均
この条件を満たす場合(ステップS1115−YES)ステップS1116に進み、この条件を満たさない場合(ステップS1115−NO)ステップS1111に進む。
【0175】
ステップS1116で、楕円検出部204は、e1とe2との組み合わせを楕円と判断する。ステップS1116の処理後はステップS1111に戻る。
【0176】
以上の処理を行うことで、検出された楕円の一部(弧)が楕円のどの部分に相当するかを判断し、楕円の一部(弧)を組み合わせることで、楕円を検出することができる。以上の処理は、両矩形の高さに大きな差が無く、上側の矩形と下側の矩形との間に大きな差がなければ、両矩形内の楕円の一部の組み合わせを楕円として検出する処理である。
【0177】
なお、以上の処理は、楕円の一部(弧)が上、下の場合を説明したが、楕円の一部(弧)が左、右の場合にも適用できる。例えば、図25に示す処理の上、下を左、右に変え、XをYに変え、高さを幅に変え、幅を高さに変えれば、楕円の一部が左、右にある場合でも、これらを組み合わせて楕円を検出することができる。
【0178】
図26は、楕円検出の手順(その1)を図形で示す図である。図26(A)は、入力画像を示す。図26(B)は、図26(A)の入力画像に対して、図11に示す線分検出処理(S11)を行い、線分を検出した結果の画像を示す。
【0179】
図26(C)は、図26(B)に示す線分に対して、図11に示す線分連結処理(S12)、線分連鎖処理(S13)、弧検出処理(S14)を行った結果の画像を示す。図26(C)に示す点線枠内の線分は、弧として検出された線分連鎖を示す。
【0180】
図26(D)は、図26(C)に示す弧に対して、組み合わせを判断して楕円を検出した結果の画像を示す。図26(D)に示す点線枠は、弧を囲む矩形を示す。図26(D)に示すd11は、楕円上部の交点を示し、d12は楕円下部の交点を示し、d13は交点のX座標の差分を示し、d14は、矩形間のY座標における差(R2上辺Y座標−R1下辺Y座標)を示す。
【0181】
(5)角度変化の方向確認処理
次に、連分連鎖が一巡した場合の処理について説明する。この処理は、図18に示す線分連鎖が一巡した場合に行う処理である。
【0182】
図27は、実施例1における角度変化の方向確認処理の一例を示すフローチャートである。図27に示す処理は、図11に示すステップS15に相当する。図27に示すステップS1201で、楕円検出部204は、線分連鎖部212から線分連鎖が一巡した線分連鎖情報を取得し、idxを1に設定する。
【0183】
ステップS1202で、楕円検出部204は、idxが線分連鎖数より小さいかを判定する。idxが線分連鎖数より小さい場合(ステップS1202−YES)ステップS1203に進み、idxが線分連鎖数以上になる場合(ステップS1202−NO)ステップS1205に進む。
【0184】
ステップS1203で、楕円検出部204は、次の条件を満たすかを判定する。
(0番目の要素の角度変化量×idx番目の要素の角度変化量)>0
これは、角度変化量の符号が同じであれば正になり、2つの線分は、同一方向の角度変化をしているといえる。この条件を満たす場合(ステップS1203−YES)ステップS1202に戻り、この条件を満たさない場合(ステップS1203−NO)ステップS1204に進む。
【0185】
ステップS1204で、楕円検出部204は、一巡している線分連鎖を楕円ではないと判断する。一巡している線分連鎖の中に、1つでも角度変化の方向(符号)が同じでないものがあるからである。
【0186】
ステップS1205で、楕円検出部204は、一巡している線分連鎖を楕円であると判断する。一巡している線分連鎖の角度変化が、全て同じ方向(符号)であるからである。
【0187】
以上の処理を行うことで、線分連鎖が一巡している場合でも、適切に楕円を検出することができる。
【0188】
図28は、楕円検出の手順(その2)を図形で示した図である。図28(A)は、入力画像を示す。図28(B)は、図28(A)の入力画像に対して、図11に示す線分検出処理(S11)を行い、線分を検出した結果の画像を示す。
【0189】
図28(C)は、図28(B)に示す線分に対して、図11に示す線分連結処理(S12)、線分連鎖処理(S13)を行った結果の画像を示す。図28(C)に示す点線枠内の線分は、一巡した線分連鎖を示す。
【0190】
図28(D)は、図28(C)に示す線分連鎖に対して、角度変化の方向を確認して楕円を検出した結果の画像を示す。
【0191】
図29は、線分連鎖が一巡する場合の図形を示す図である。図29(A)は楕円の図形を示し、図29(B)は、楕円ではない図形を示す。図11に示す線分連鎖処理(S13)では、図29(A)、(B)どちらも一巡する線分連鎖として抽出される。しかし、楕円検出部204により、図27に示す角度変化の確認処理を行えば、図29(A)に示す図形のみを楕円と判断することができる。
【0192】
以上、実施例1によれば、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができる。また、実施例1によれば、検出した弧を組み合わせることで楕円を検出することができる。これは、ハフ変換を用いて楕円検出するよりも高速にかつ処理負荷を軽減して楕円を検出することができる。また、実施例1によれば、楕円の長径と短径との比が大きい場合でも、適切に楕円を検出することができる。なお、従来技術のように、複数の弧を組み合わせる場合に、各弧の中心と半径が略一致することで一つの弧と推測する方法では、楕円の長径と短径との比が大きい場合(例えば細長い楕円)、各弧は一つの弧とは推測されない。各弧の中心と半径が異なるからである。しかし、実施例1の弧検出方法では、幅広く楕円の弧を検出することができる。
【0193】
[実施例2]
次に、実施例2における弧検出装置について説明する。実施例2では、楕円の一部が欠けている場合でも楕円とみなして楕円を検出する。実施例2における弧検出装置の構成は、図1に示す構成と同様であり、検出部の構成は、図2に示す構成と同様である。実施例2における弧を検出する方法は、実施例1と同様であるため、説明を省略する。実施例2では、楕円検出部204による楕円検出の方法が、実施例1と異なるため、以下では楕円検出部204について説明する。
【0194】
<構成>
楕円検出部204は、弧検出部203により検出された弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上であれば、これらの所定位置に相当する弧を楕円とみなして検出する。
【0195】
図30は、楕円を8分割した場合の一例を示す図である。図30に示すように、楕円が8分割され、分割された楕円の一部にそれぞれ方向0〜7の識別子が付与される。楕円検出部204は、検出された弧が、方向0〜7の楕円の一部のどこに相当するかを判定し、例えば6つ以上の方向に相当すると判定された場合、この6つ以上の方向に相当する弧を楕円とみなして検出する。楕円検出部204による楕円検出の具体的な処理は、処理手順を示して説明する。
【0196】
<動作>
次に、実施例2における弧検出装置10の動作について説明する。実施例2では、図11に示す処理手順と同様であり、楕円検出処理の具体的な処理が実施例1とは異なるため、図11に示すステップS15の処理について具体的に説明する。
【0197】
(6)方向抽出処理
楕円検出部204は、弧として検出された線分連鎖が属する方向を抽出する。図31は、実施例2における方向抽出処理の一例を示すフローチャートである。図31に示すステップS1301で、楕円検出部204は、インデックスidxを0に設定する。
【0198】
ステップS1302で、楕円検出部204は、idxが線分連鎖数よりも小さいかを判定する。線分連鎖数は、弧検出部203により検出された弧(線分連鎖)の数である。idxが線分連鎖数よりも小さい場合(ステップS1302−YES)ステップS1303に進み、idxが線分連鎖数以上の場合(ステップS1302−NO)この処理を終了する。
【0199】
ステップS1303で、楕円検出部204は、線分連鎖[idx]を時計回り方向に揃える処理を行う。この処理は、図32を用いて後述する。連分連鎖[idx]は、例えば、図23(D)に示すリストを示す。
【0200】
ステップS1304で、楕円検出部204は、線分連鎖[idx]の最初の方向(iniPos)を抽出する。この処理は、図33〜図35を用いて後述する。
【0201】
ステップS1305で、楕円検出部204は、線分連鎖[idx]の最後の方向(finPos)を抽出する。この処理は、図36を用いて後述する。
【0202】
ステップS1306で、楕円検出部204は、idxに1を加算する。ステップS1306の処理の後は、ステップS1302に戻る。
【0203】
(6−1)時計回り方向に揃える処理
図32は、実施例2における時計回り方向に揃える処理の一例を示すフローチャートである。図32に示すステップS1401で、楕円検出部204は、線分連鎖[idx]の0番目の要素の角度変化量が0より小さいかを判定する。角度変化量が0より小さい場合(ステップS1401−YES)ステップS1402に進み、角度変化量が0以上の場合(ステップS1401−NO)この処理を終了する。
【0204】
ステップS1402で、楕円検出部204は、次の設定を行う。
cnt0=線分連鎖[idx]の長さ−1(長さ=要素数)
cnt1=0
【0205】
ステップS1403で、楕円検出部204は、cnt0が0より大きいかを判定する。cnt0が0より大きい場合(ステップS1403−YES)ステップS1405に進み、cnt0が0以下の場合(ステップS1403−NO)ステップS1404に進む。
【0206】
ステップS1404で、楕円検出部204は、線分連鎖[idx]を新線分連鎖[idx]に置き換える。
【0207】
ステップS1405で、楕円検出部204は、次の設定を行う。
新線分連鎖要素[cnt1]=線分連鎖要素「cnt0」
【0208】
ステップS1406で、楕円検出部204は、次の設定を行う。
新線分連鎖要素[cnt1]の角度変化量=線分連鎖要素[cnt0−1]の角度変化量×(−1)
【0209】
ステップS1407で、楕円検出部204は、cnt0から1を減算し、cnt1に1を加算する。ステップS1407の処理後は、ステップS1403に戻る。
【0210】
以上の処理を行うことで、線分連鎖の線分について、角度変化量がマイナス(反時計回り)をプラス(時計回り)に揃えることができる。
【0211】
(6−2)最初の方向抽出処理
図33〜35は、実施例2における最初の方向抽出処理の一例を示すフローチャートである。図33に示すステップS1501で、楕円検出部204は、次の設定を行う。
line0=線分連鎖[idx]の0番目の線分
line1=線分連鎖[idx]の1番目の線分
【0212】
ステップS1502で、楕円検出部204は、次の設定を行う。
ang0=line0の角度
ang1=line1の角度
この角度は、絶対角度を表す。
【0213】
ステップS1503で、楕円検出部204は、次の設定を行う。
xc0=line0の中間点のX座標
yc0=line0の中間点のY座標
xc1=line1の中間点のX座標
yc1=line1の中間点のY座標
ステップS1502及びS1503は順不同である。
【0214】
ステップS1504で、楕円検出部204は、次の条件を満たすかを判定する。
45≦ang1<90 かつ
90≦ang2<135
この条件を満たす場合(ステップS1504−YES)ステップS1505に進み、この条件を満たさない場合(ステップS1504−NO)ステップS1508に進む。
【0215】
ステップS1505で、楕円検出部204は、xc0<xc1を満たすかを判定する。xc0がxc1より小さい場合(ステップS1505−YES)ステップS1506に進み、xc0がxc1以上の場合(ステップS1505−NO)ステップS1507に進む。
【0216】
ステップS1506で、楕円検出部204は、「iniPos」は、7であると判定する。ここで、「iniPos」の数字は、図30に示す方向のことをいう。
【0217】
ステップS1507で、楕円検出部204は、「iniPos」は、3であると判定する。これにより、水平方向の弧を、分割された楕円のどの位置に相当するかを判定することができる。ステップS1506及びS1507の処理後は図36の処理に遷移する。
【0218】
ステップS1508で、楕円検出部204は、次の条件を満たすかを判定する。
135≦ang1 かつ
ang2<24
この条件を満たす場合(ステップS1508−YES)ステップS1509に進み、この条件を満たさない場合)(ステップS1508−NO)図34に示す処理1に進む。
【0219】
ステップS1509で、楕円検出部204は、yc0がyc1より小さいかを判定する。yc0がyc1より小さい場合(ステップS1509−YES)ステップS1510に進み、yc0がyc1以上の場合(ステップS1509−NO)ステップS1511に進む。
【0220】
ステップS1510で、楕円検出部204は、「iniPos」は、1であると判定する。
【0221】
ステップS1511で、楕円検出部204は、「iniPos」は、5であると判定する。これにより、垂直方向の弧を、分割された楕円のどの位置に相当するかを判定することができる。ステップS1510及びS1511の処理後は図36の処理に遷移する。
【0222】
図34は、実施例2における最初の方向抽出処理(その2)の一例を示すフローチャートである。図34に示すステップS1512で、楕円検出部204は、角度平均を次の式により算出する。
ave=(ang0+ang1)/2
【0223】
ステップS1513で、楕円検出部204は、aveが45より小さいかを判定する。aveが45より小さい場合(ステップS1513−YES)ステップS1514に進み、aveが45以上の場合(ステップ1513−NO)ステップS1521に進む。
【0224】
ステップS1514で、楕円検出部204は、yc0がyc1より小さいかを判定する。yc0がyc1より小さい場合(ステップS1514−YES)ステップS1515に進み、yc0がyc1以上の場合(ステップS1514−NO)ステップS1518に進む。
【0225】
ステップS1515で、楕円検出部204は、ang0が45より小さいかを判定する。ang0が45より小さい場合(ステップS1515−YES)ステップS1516に進み、ang0が45以上の場合(ステップS1515−NO)ステップS1517に進む。
【0226】
ステップS1516で、楕円検出部204は、「iniPos」は、2であると判定する。
【0227】
ステップS1517で、楕円検出部204は、「iniPos」は、3であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1516及びS1517の処理後は図36に遷移する。
【0228】
ステップS1518で、楕円検出部204は、ang0が45より小さいかを判定する。ang0が45より小さい場合(ステップS1518−YES)ステップS1519に進み、ang0が45以上の場合(ステップS1518−NO)ステップS1520に進む。
【0229】
ステップS1519で、楕円検出部204は、「iniPos」は、6であると判定する。
【0230】
ステップS1520で、楕円検出部204は、「iniPos」は、7であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1519及びS1520の処理後は図36に遷移する。
【0231】
ステップS1521で、楕円検出部204は、aveが90より小さいかを判定する。aveが90より小さい場合(ステップS1521−YES)ステップS1522に進み、aveが90以上の場合(ステップ1521−NO)図35に示す処理2に進む。
【0232】
ステップS1522で、楕円検出部204は、xc0がxc1より小さいかを判定する。xc0がxc1より小さい場合(ステップS1522−YES)ステップS1523に進み、xc0がxc1以上の場合(ステップS1522−NO)ステップS1526に進む。
【0233】
ステップS1523で、楕円検出部204は、ang0が45より小さいかを判定する。ang0が45より小さい場合(ステップS1523−YES)ステップS1524に進み、ang0が45以上の場合(ステップS1523−NO)ステップS1525に進む。
【0234】
ステップS1524で、楕円検出部204は、「iniPos」は、6であると判定する。
【0235】
ステップS1525で、楕円検出部204は、「iniPos」は、7であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1524及びS1525の処理後は図36に遷移する。
【0236】
ステップS1526で、楕円検出部204は、ang0が45より小さいかを判定する。ang0が45より小さい場合(ステップS1526−YES)ステップS1527に進み、ang0が45以上の場合(ステップS1526−NO)ステップS1528に進む。
【0237】
ステップS1527で、楕円検出部204は、「iniPos」は、2であると判定する。
【0238】
ステップS1528で、楕円検出部204は、「iniPos」は、3であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1527及びS1528の処理後は図36に遷移する。
【0239】
図35は、実施例2における最初の方向抽出処理(その3)の一例を示すフローチャートである。図35に示すステップS1529で、楕円検出部204は、aveが135より小さいかを判定する。aveが135より小さい場合(ステップS1529−YES)ステップS1520に進み、aveが135以上の場合(ステップS1529−NO)ステップS1527に進む。
【0240】
ステップS1530で、楕円検出部204は、xc0がxc1より小さいかを判定する。xc0がxc1より小さい場合(ステップS1530−YES)ステップS1531に進み、xc0がxc1以上の場合(ステップS1530−NO)ステップS1534に進む。
【0241】
ステップS1531で、楕円検出部204は、ang0が135より小さいかを判定する。ang0が135より小さい場合(ステップS1531−YES)ステップS1532に進み、ang0が135以上の場合(ステップS1531−NO)ステップS1533に進む。
【0242】
ステップS1532で、楕円検出部204は、「iniPos」は、0であると判定する。
【0243】
ステップS1533で、楕円検出部204は、「iniPos」は、1であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1532及びS1533の処理後は図36に遷移する。
【0244】
ステップS1534で、楕円検出部204は、ang0が135より小さいかを判定する。ang0が135より小さい場合(ステップS1534−YES)ステップS1535に進み、ang0が135以上の場合(ステップS1534−NO)ステップS1536に進む。
【0245】
ステップS1535で、楕円検出部204は、「iniPos」は、4であると判定する。
【0246】
ステップS1536で、楕円検出部204は、「iniPos」は、5であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1535及びS1536の処理後は図36に遷移する。
【0247】
ステップS1537で、楕円検出部204は、yc0がyc1より小さいかを判定する。yc0がyc1より小さい場合(ステップS1537−YES)ステップS1538に進み、yc0がyc1以上の場合(ステップS1537−NO)ステップS1541に進む。
【0248】
ステップS1538で、楕円検出部204は、ang0が135より小さいかを判定する。ang0が135より小さい場合(ステップS1538−YES)ステップS1539に進み、ang0が135以上の場合(ステップS1538−NO)ステップS1540に進む。
【0249】
ステップS1539で、楕円検出部204は、「iniPos」は、0であると判定する。
【0250】
ステップS1540で、楕円検出部204は、「iniPos」は、1であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1539及びS1540の処理後は図36に遷移する。
【0251】
ステップS1541で、楕円検出部204は、ang0が135より小さいかを判定する。ang0が135より小さい場合(ステップS1541−YES)ステップS1542に進み、ang0が135以上の場合(ステップS1541−NO)ステップS1543に進む。
【0252】
ステップS1542で、楕円検出部204は、「iniPos」は、4であると判定する。
【0253】
ステップS1543で、楕円検出部204は、「iniPos」は、5であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1542及びS1543の処理後は図36に遷移する。
【0254】
以上の処理を行うことで、線分連鎖の最初の線分が、楕円のどの部分に相当するかを判定することができる。
【0255】
(6−3)最後の方向等抽出処理
図36は、最後の方向等抽出処理の一例を示すフローチャートである。図36に示すステップS1601で、楕円検出部204は、次の式により基準角度baseを算出する。
base=ang0−(ang0を45で割った余り)
baseは、次の方向に該当するまでの角度を表す。1つの方向に相当するのは45(360/8)度である。ang0は、図33に示すステップS1502のang0である。
【0256】
ステップS1602で、楕円検出部204は、次の設定を行う。
finPos=iniPos
方向数=1
方向数は、検出された弧に相当する、分割された楕円の一部の数を表す。
【0257】
ステップS1603で、楕円検出部204は、cnt=1とする。ステップS1604で、楕円検出部204は、cntが線分連鎖[idx]の長さ(要素数)より小さいかを判定する。cntが線分連鎖[idx]の長さより小さい場合(ステップS1604−YES)ステップS1605に進み、cntが線分連鎖[idx]の長さ以上の場合(ステップS1604−NO)この処理を終了する。
【0258】
ステップS1605で、楕円検出部204は、以下の式により角度差を算出する。
角度差=線分[cnt]の角度−base
ステップS1606で、楕円検出部204は、次の条件を満たすかを判定する。
0≦角度差<45
この条件を満たす場合(ステップS1606−YES)ステップS1607に進み、この条件を満たさない場合(ステップS1606−NO)ステップS1608に進む。この条件を満たす場合は、次の線分を連鎖しても次の方向に到達していないことを表す。この条件を満たさない場合は、次の線分を連鎖したら次の方向に到達することを表す。
【0259】
ステップS1607で、楕円検出部204は、cntに1を加算する。ステップS1607の処理後は、ステップS1604に戻る。
【0260】
ステップS1608で、楕円検出部204は、方向数に1を加算する。ステップS1609で、楕円検出部204は、finPosに1を加算する。ステップS1608及びS1609は、順不同である。
【0261】
ステップS1610で、楕円検出部204は、finPosが7より大きいかを判定する。finPosが7より大きい場合(ステップS1610−YES)ステップS1611に進み、finPosが7以下の場合(ステップS1610−NO)ステップS1612に進む。
【0262】
ステップS1611で、楕円検出部204は、finPosを0に設定する。ステップS1612で、楕円検出部204は、baseに45を加算する。
【0263】
ステップS1613で、楕円検出部204は、baseが180以上になるかを判定する。baseが180以上である場合(ステップS1613−YES)ステップS1614に進み、baseが180未満の場合(ステップS1613−NO)ステップS1615に進む。
【0264】
ステップS1614で、楕円検出部204は、基準角度のbaseを0に設定する。ステップS1615で、楕円検出部204は、finPosが0であるかを判定する。finPosが0である場合(ステップS1615−YES)ステップS1616に進み、finPosが0でない場合(ステップS1615−NO)ステップS1617に進む。
【0265】
ステップS1616で、楕円検出部204は、上端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【0266】
ステップS1617で、楕円検出部204は、finPosが2であるかを判定する。finPosが2である場合(ステップS1617−YES)ステップS1618に進み、finPosが0でない場合(ステップS1617−NO)ステップS1619に進む。
【0267】
ステップS1618で、楕円検出部204は、右端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【0268】
ステップS1619で、楕円検出部204は、finPosが4であるかを判定する。finPosが4である場合(ステップS1619−YES)ステップS1620に進み、finPosが4でない場合(ステップS1619−NO)ステップS1621に進む。
【0269】
ステップS1620で、楕円検出部204は、下端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【0270】
ステップS1621で、楕円検出部204は、finPosが6であるかを判定する。finPosが6である場合(ステップS1621−YES)ステップS1622に進み、finPosが6でない場合(ステップS1621−NO)ステップS1607に進む。
【0271】
ステップS1622で、楕円検出部204は、左端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【0272】
以上の処理を行うことで、弧検出部203により検出された弧が、分割された楕円のどの位置に相当するかを判定でき、相当すると判定された楕円の一部の数や、楕円の端の座標を求めることができる。
【0273】
(7)楕円検出処理
図37、38は、実施例2における楕円検出処理の一例を示すフローチャートである。図37に示すステップS1701で、楕円検出部204は、idx1に0を設定する。
【0274】
ステップS1702で、楕円検出部204は、idx1が(楕円の一部数−1)より小さいかを判定する。楕円の一部数は、相当すると判定した楕円の一部の数(方向数)である。idx1が(楕円の一部数−1)より小さい場合(ステップS1702−YES)ステップS1703に進む。idx1が(楕円の一部数−1)以上である場合(ステップS1702−NO)この処理を終了する。
【0275】
ステップS1703で、楕円検出部204は、次の設定を行う。
idx2=idx1+1
【0276】
ステップS1704で、楕円検出部204は、idx2が楕円の一部数より小さいかを判定する。idx2が楕円の一部数より小さい場合(ステップS1704−YES)ステプS1706に進み、idx2が楕円の一部数以上の場合(ステップS1704−NO)ステップS1705に進む。
【0277】
ステップS1705で、楕円検出部204は、idx1に1を加算する。ステップS1705の処理後、ステップS1702に戻る。
【0278】
ステップS1706で、楕円検出部204は、次の設定を行う。
e1=idx1番目の線分連鎖
e2=idx2番目の線分連鎖
【0279】
ステップS1707で、楕円検出部204は、次の条件を満たすかを判定する。
(e1の方向数+e2の方向数)≧6
閾値の値(6)は、楕円検出の厳しさの度合いを示し、適宜設定変更可能である。e1とe2の方向数の和が閾値以上の場合(ステップS1707−YES)ステップS1709に進み、e1とe2の方向数の和が閾値未満の場合(ステップS1707−NO)ステップS1708に進む。
【0280】
ステップS1708で、楕円検出部204は、idx2に1を加算する。ステップS1708の処理後にステップS1704に戻る。
【0281】
ステップS1709で、楕円検出部204は、次の条件を満たすかを判定する。
e1の方向数==3 かつ
e2の方向数==3
この条件を満たす場合(ステップS1709−YES)ステップS1711に進み、この条件を満たさない場合(ステップS1709−NO)ステップS1710に進む。
【0282】
ステップS1710で、楕円検出部204は、処理Aを行う。処理Aについては、後述する。
【0283】
ステップS1711で、楕円検出部204は、次の条件を満たすかを判定する。
e1のiniPos==0 かつ
e2のiniPos==4又は5
この条件を満たす場合(ステップS1711−YES)ステップS1713に進み、この条件を満たさない場合(ステップS1711−NO)ステップS1712に進む。
【0284】
ステップS1712で、楕円検出部204は、処理Bを行う。処理Bについては、後述する。
【0285】
ステップS1713で、楕円検出部204は、次の設定を行う。
R1=e1を囲む矩形
R2=e2を囲む矩形
【0286】
ステップS1714で、楕円検出部204は、次の条件を満たすかを判定する。
e1の右端交点Y座標とe2の左端交点Y座標の差分<(R1,R2の平均の高さ/3)
R1,R2の高さとは、Y方向の矩形の長さをいう。
この条件を満たす場合(ステップS1714−YES)ステップS1715に進み、この条件を満たさない場合(ステップS1714−NO)ステップS1708に戻る。
【0287】
ステップS1715で、楕円検出部204は、R1の幅がR2の幅より小さいかを判定する。R1の幅がR2の幅より小さい場合(ステップS1715−YES)ステップS1716に進み、R1の幅がR2の幅以上の場合(ステップS1715−NO)ステップS1717に進む。
【0288】
ステップS1716で、楕円検出部204は、(R1の幅×2)がR2の幅より大きいかを判定する。(R1の幅×2)がR2の幅よりも大きい場合(ステップS1716−YES)図39に示す処理Cに進み、(R1の幅×2)がR2の幅以下の場合(ステップS1716−NO)ステップS1708に戻る。
【0289】
ステップS1717で、楕円検出部204は、R1の幅が(R2の幅×2)より小さいかを判定する。R1の幅が(R2の幅×2)より小さい場合(ステップS1717−YES)処理Cに進み、R1の幅が(R2の幅×2)以上の場合(ステップS1717−NO)ステップS1708に戻る。
【0290】
図38は、実施例2における楕円検出処理(その2)の一例を示すフローチャートである。図38に示すステップS1718で、楕円検出部204は、次の設定を行う。
x1=R1の左辺のX座標
x2=R2の右辺のX座標
【0291】
ステップS1719で、楕円検出部204は、次の条件を満たすかを判定する。
(x1−x2)≧0
この条件を満たす場合(ステップS1719−YES)ステップS1721に進み、この条件を満たさない場合(ステップS1719−NO)ステップS1720に進む。
【0292】
ステップS1720で、楕円検出部204は、次の条件を満たすかを判定する。
(x2−x1)<(R1幅+R2幅)/4
この条件を満たす場合(ステップS1720−YES)ステップS1722に進み、この条件を満たさない場合(ステップS1720−NO)ステップS1708に戻る。図38に示す「D」は、図37に示す「D」に遷移することを表し、つまり、ステップS1708に戻ることを表す。
【0293】
ステップS1721で、楕円検出部204は、次の条件を満たすかを判定する。
(x1−x2)<(R1幅+R2幅)/2
この条件を満たす場合(ステップS1721−YES)ステップS1722に進み、この条件を満たさない場合(ステップS1721−NO)ステップS1708に戻る。
【0294】
ステップS1722で、楕円検出部204は、次の式によりY1を算出する。
Y1=e1右端交点Y座標−R1上辺Y座標
ステップS1723で、楕円検出部204は、e2のiniPosが4であるかを判定する。e2のiniPosが4である場合(ステップS1723−YES)ステップS1724に進み、e2のiniPosが4でない場合(ステップS1723−NO)ステップS1725に進む。
【0295】
ステップS1724で、楕円検出部204は、次の式によりY2を算出する。
Y2=R2下辺Y座標−e2左端交点Y座標
【0296】
ステップS1725で、楕円検出部204は、次の式によりY2を算出する。
Y2=e2左端交点Y座標−R2上辺Y座標
【0297】
図39は、e2のiniPosの違いによる図形を説明するための図である。図39(A)は、e2のiniPosが4である場合の例を示す。この場合、ステップS1723の判定でYESとなり、ステップS1724の処理がなされる。
【0298】
図39(B)は、e2のiniPosが5である場合の例を示す。この場合、ステップS1723の判定でNOとなり、ステップS1725の処理がなされる。
【0299】
ステップS1726で、楕円検出部204は、Y1がY2より小さいかを判定する。Y1がY2より小さい場合(ステップS1726−YES)ステップS1728に進み、Y1がY2以上の場合(ステップS1726−NO)ステップS1727に進む。
【0300】
ステップS1727で、楕円検出部204は、Y1が(Y2×2)より小さいかを判定する。Y1が(Y2×2)より小さい場合(ステップS1727−YES)ステップS1729に進み、Y1が(Y2×2)以上の場合(ステップS1727−NO)ステップS1708に戻る。
【0301】
ステップS1728で、楕円検出部204は、(Y1×2)がY2より大きいかを判定する。(Y1×2)がY2より大きい場合(ステップS1728−YES)ステップS1729に進み、(Y1×2)がY2以下の場合(ステップS1728−NO)ステップS1708に戻る。
【0302】
ステップS1729で、楕円検出部204は、e1とe2とで楕円であると検出する。以上の処理を行うことで、楕円一部が欠けている場合でも、楕円とみなして検出することができる。
【0303】
次に、ステップS1710の処理Aについて説明する。ステップS1709の判定でNOということは、e1の方向数とe2の方向数とが同じではなく、e1とe2とを囲むそれぞれの矩形の大きさが異なる。よって、楕円検出部204は、e1とe2とを囲むそれぞれの矩形の大きさを考慮して、これらの矩形が楕円と判断してもよいほど近い位置にあるかを判定すればよい。判定の基本的な処理はステップS1711以降に示す処理と同様である。
【0304】
例えば、図39(A)に示すR1に線分が4つ含まれる場合、R1の高さは、矩形に含まれる線分が一つ増えるためR2の高さよりも大きくなりやすい。そこで、楕円検出部204は、図38に示すステップS1726のY1に係数(例えば3/4)を乗算することで、R1、R2の矩形の大きさを考慮して楕円検出処理を行えばよい。
【0305】
次に、ステップS1712の処理Bについて説明する。図40は、ステップS1712の処理Bの一例を説明するための図である。処理Bでは、e1,e2のiniPos値に応じてそれぞれ図37、38で説明したような処理をしてもよいが、図40に示すように、e1,e2を回転/左右反転などの処理をして、図37,38で説明した処理を行うようにしてもよい。
【0306】
図40(A)は、元の線分連鎖を示す。図40(B)は、元の線分連鎖を45度回転させた例を示す。図40(C)は、元の線分連鎖を90度回転させた例を示す。図40(B)や図40(C)に示すように、元の線分連鎖を回転させた場合、その後の処理のために、各線分の始点、終点座標と角度変化量を変換する必要がある。楕円の一部に相当する方向については、回転に応じて45度で1ずつ増加させればよい(7を超えたら0に戻る)。座標の変換については、例えば90度単位の回転に限定すれば、X−Y座標の入れ替えですみ、45度単位でも角度が固定のため簡易な処理ですむ。よって、この変換処理は、大きな処理負荷にはならない。
【0307】
以上、実施例2によれば、楕円の一部が欠けている場合でも楕円とみなして楕円を検出することができる。
【0308】
[変形例]
図41は、実施例1、2における弧検出装置10を含む携帯端末装置300のハードウェア構成の一例を示す図である。図41に示す携帯端末装置300は、アンテナ301、無線部302、ベースバンド処理部303、制御部304、出力部305、入力部306、メモリ307、電源308、カメラ309を有する。
【0309】
アンテナ301は、送信アンプで増幅された無線信号を送信し、また、基地局から無線信号を受信する。無線部302は、ベースバンド処理部303で拡散された送信信号をD/A変換し、直交変調により高周波信号に変換し、その信号を電力増幅器により増幅する。無線部302は、受信した無線信号を増幅し、その信号をA/D変換してベースバンド処理部303に伝送する。
【0310】
ベースバンド処理部303は、送信データの誤り訂正符号の追加、データ変調、拡散変調、受信信号の逆拡散、受信環境の判定、各チャネル信号の閾値判定、誤り訂正復号などのベースバンド処理を行う。
【0311】
制御部304は、制御信号の送受信などの無線制御を行う。また、制御部304は、各部を制御し、各種処理を実行する。出力部305は、例えばLCD(Liquid Crystal Display)に対し、制御部304からの指示に基づき、データを出力する。入力部306は、例えばマイクやキーボードなどからデータを受け付ける。
【0312】
メモリ307は、例えばROM(Read Only Memory)やRAM(Random Access Memory)などである。メモリ307は、各種データや携帯端末装置300で実行されるプログラムを格納する。電源308は、携帯端末装置300の電源を制御する。カメラ309は、撮像素子を有し、撮像画像を制御部304に出力する。
【0313】
なお、実施例1、2における制御部102、検出部103は、例えば制御部304やワークメモリとしてのメモリ307により実現され、入力部101は、カメラ309により、出力部104は、出力部305によりそれぞれ実現されうる。
【0314】
図42は、実施例1、2における弧検出装置10を含む画像処理装置400のハードウェア構成の一例を示す図である。図42に示す画像処理装置400は、CPU401、記憶装置402、メモリ403、読み取り装置404、通信インタフェース406、入出力装置407を含む。
【0315】
CPU401は、各装置の制御やデータの演算、加工を行う。CPU401は、メモリ403を利用して前述した弧検出処理を実行するためのプログラムを実行する。
【0316】
記憶装置402は、HDD(Hard Disk Drive)などであり、アプリケーションソフトウェアなどに関連するデータを記憶する記憶装置である。記憶装置402は、例えば弧検出プログラムを格納する。なお、記憶装置402は、外部記録装置であってもよい。
【0317】
メモリ403は、例えばROM(Read Only Memory)やRAM(Random Access Memory)などである。メモリ403は、例えばCPU401が実行する基本ソフトウェアであるOSやアプリケーションソフトウェアなどのプログラムやデータを記憶又は一時保存する記憶装置である。
【0318】
読み取り装置404は、CPU401の指示に従って可搬型記録媒体405にアクセスする。可搬性記録媒体405は、例えば、半導体デバイス(PCカード等)、磁気的作用により情報が入出力される媒体、光学的作用により情報が入出力される媒体を含むものとする。
【0319】
通信インタフェース406は、CPU401の指示に従って、ネットワークを介してデータを送受信する。入出力装置407は、前述した各実施例では、カメラ、表示装置、ユーザからの指示を受け付けるデバイス等に相当する。
【0320】
なお、各実施例における構成で、制御部102、検出部103は、例えばCPU401やワークメモリとしてのメモリ403により実現され、入力部101、出力部104は、例えば入出力装置407により実現されうる。この画像処理装置400は、デジタルカメラなどにも適用することができる。
【0321】
各実施例に係わる弧検出プログラムは、例えば、下記の形態で提供される。
・記憶装置402に予めインストールされている。
・可搬型記録媒体405により提供される。
・プログラムサーバ410からダウンロードする。
上記構成の携帯端末装置300や画像処理装置400で弧検出プログラムを実行することにより、各実施例に係わる装置が実現される。
【0322】
前述した各実施例における弧検出処理は、例えば、撮像画像内の皿を楕円とみなして検出し、撮影モードを自動で料理モードに変更するなどの機能に用いることができる。また、各実施例における弧検出処理は、皿の一部が料理や画面サイズの影響で欠けていた場合でも、皿を楕円とみなして検出することができる。よって、各実施例における弧検出処理を行う携帯端末装置やデジタルカメラの撮像部は、楕円の検出結果に基づいて、撮影モードを自動的に切り替えることができる。
【0323】
また、各実施例における弧検出処理は、目を楕円とみなして検出したりすることもできる。この場合、目の部分を拡大して前述した処理を行うようにすればよい。また、各実施例における弧検出処理は、外にある撮像装置のレンズについた雨粒を楕円とみなして検出し、この撮像装置を自動で電源OFFにするなどの場合にも適用できる。
【0324】
以上、各実施例について詳述したが、特定の実施例に限定されるものではなく、特許請求の範囲に記載された範囲内において、上記変形例以外にも種々の変形及び変更が可能である。
【0325】
なお、以上の実施例に関し、さらに以下の付記を開示する。
(付記1)
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える弧検出装置。
(付記2)
前記判定部は、
前記2つの線分うちの第一の線分の位置及び第二の線分の位置と、該第一の線分の基準に対する角度と該第二の線分の基準に対する角度とが、予め定められた条件を満たす場合に、該第一の線分と該第二の線分とを関連付ける連結部と、
前記連結部により、前記第一の線分が、前記第二の線分とは異なる第三の線分とさらに関連付けられる場合、該第一の線分と前記第二の線分と該第三の線分とを関連付ける連鎖部と、
を備える付記1記載の弧検出装置。
(付記3)
前記弧検出部は、
前記連鎖部により関連付けられた線分数及び近接する線分の角度変化量に基づき、弧を検出する付記2記載の弧検出装置。
(付記4)
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部をさらに備える付記1乃至3何れか一項に記載の弧検出装置。
(付記5)
前記楕円検出部は、
前記弧検出部により検出された複数の弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上あれば、前記所定位置に相当する弧の組み合わせを楕円とみなす付記4記載の弧検出装置。
(付記6)
前記楕円検出部は、
前記連鎖部により関連付けられた線分が一巡する場合、近接する線分の角度変化量に基づいて楕円を検出する付記4記載の弧検出装置。
(付記7)
画像を取得し、
前記画像から複数の線分を検出し、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定し、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する、
処理をコンピュータに実行させる弧検出プログラム。
(付記8)
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える携帯端末装置。
(付記9)
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部と、
前記楕円検出部による検出結果に応じて撮像モードを制御する撮像部と、
をさらに備える付記8記載の携帯端末装置。
【符号の説明】
【0326】
10 弧検出装置
101 入力部
102 制御部
103 検出部
106 出力部
201 線分検出部
202 判定部
203 弧検出部
204 楕円検出部
【技術分野】
【0001】
本発明は、弧を検出する弧検出装置、弧検出プログラム及び携帯端末装置に関する。
【背景技術】
【0002】
画像上で楕円を検出する技術として、エッジを抽出してハフ変換を行う方式が知られている。ハフ変換は様々な形状の図形検出に応用可能な特徴抽出法である。一方、ハフ変換は、変換で扱うパラメータ数に応じて処理時間が長くなり、メモリ消費も多くなる。楕円を検出する場合、座標(X,Y)、半径(短辺,長辺)と最低4つのパラメータを扱うため、楕円検出にかかる処理時間は長く、メモリ消費量も多かった。
【0003】
そこで、ハフ変換を用いずに、楕円の弧を検出する技術がある。例えば、円弧を検出する技術として、図形の細線化及び折れ線近似に基づいて円弧を検出する技術が記載されている(特許文献1、2、3)。また、楕円などを含む閉領域を抽出する技術として、地図上で線分や曲線で囲まれた閉領域を抽出する技術がある(特許文献4)。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特公平07−104954号公報
【特許文献2】特開昭63−213087号公報
【特許文献3】特開平01−180678号公報
【特許文献4】特開2006−293809号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、特許文献1乃至3の技術における折れ線近似による円弧の検出では、細線が途切れていない範囲でなければ円弧を抽出できないという問題点があった。この問題点を回避するために、エッジ抽出を高感度に行うことが考えられるが、より多くの細線で円弧検出処理を行わなければならず、処理時間がかかるとともに、誤検出の可能性が高くなってしまう。
【0006】
また、特許文献1に記載されている線分からの円又は円弧の再構成や、特許文献3に記載されている隣り合う折れ線の連続性を調べる方法では、円の中心や半径を推定する方式が開示されている。しかし、この方式では、円の長径と短径との比が大きい楕円では適切に検出できないという問題点があった。
【0007】
また、特許文献4の技術では、閉領域を抽出することはできるものの、その閉領域が楕円であることは判断できず、閉領域を構成する線分の内側に別の線分がある場合は閉領域を抽出できないという問題点があった。
【0008】
そこで、開示の技術は、上記課題に鑑みてなされたものであり、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができることを目的とする。
【課題を解決するための手段】
【0009】
開示の一態様における弧検出装置は、画像を入力する入力部と、前記画像から複数の線分を検出する線分検出部と、前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、を備える。
【発明の効果】
【0010】
開示の技術は、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができる。
【図面の簡単な説明】
【0011】
【図1】弧検出装置の構成の一例を示すブロック図。
【図2】検出部の構成の一例を示すブロック図。
【図3】線分検出の一例を示す図。
【図4】線分データのデータ構造の一例を示す図。
【図5】線分の一例を示す図。
【図6】角度の定義を説明するための図。
【図7】線分連結情報のデータ構造の一例を示す図。
【図8】2つの線分の近接関係を説明するための図。
【図9】2つの線分の角度関係を説明するための図。
【図10】線分連鎖情報のデータ構造の一例を示す図。
【図11】実施例1における楕円検出処理の一例を示すフローチャート。
【図12】実施例1における線分連結処理の一例を示すフローチャート。
【図13】検出された線分の端点、位置及び角度変化量を示す図。
【図14】実施例1における近接判定処理の一例を示すフローチャート。
【図15】実施例1における角度関係判定処理の一例を示すフローチャート。
【図16】角度平均及び角度差算出処理の一例を示すフローチャート。
【図17】線分連結情報の一例を示す図。
【図18】実施例1における線分連鎖処理の一例を示すフローチャート。
【図19】実施例1における線分連鎖抽出処理の一例を示すフローチャート。
【図20】実施例1におけるロールバック処理の一例を示すフローチャート。
【図21】実施例1における連分連鎖を一つにまとめる処理の一例を示すフローチャート。
【図22】実施例1における弧検出処理の一例を示すフローチャート。
【図23】各処理結果のデータの一例を示す図。
【図24】実施例1における楕円の位置推定処理の一例を示すフローチャート。
【図25】実施例1における楕円検出処理の一例を示すフローチャート。
【図26】楕円検出の手順(その1)を図形で示す図。
【図27】実施例1における角度変化の方向確認処理の一例を示すフローチャート。
【図28】楕円検出の手順(その2)を図形で示す図。
【図29】線分連鎖が一巡する場合の図形を示す図。
【図30】楕円を8分割した場合の一例を示す図。
【図31】実施例2における方向抽出処理の一例を示すフローチャート。
【図32】実施例2における時計回り方向に揃える処理の一例を示すフローチャート。
【図33】実施例2における最初の方向抽出処理(その1)の一例を示すフローチャート。
【図34】実施例2における最初の方向抽出処理(その2)の一例を示すフローチャート。
【図35】実施例2における最初の方向抽出処理(その3)の一例を示すフローチャート。
【図36】実施例2における最後の方向等抽出処理の一例を示すフローチャート。
【図37】実施例2における楕円検出処理(その1)の一例を示すフローチャート。
【図38】実施例2における楕円検出処理(その2)の一例を示すフローチャート。
【図39】e2のiniPosの違いによる図形を説明するための図。
【図40】処理Bの一例を説明するための図。
【図41】携帯端末装置のハードウェア構成の一例を示す図。
【図42】画像処理装置のハードウェア構成の一例を示す図。
【発明を実施するための形態】
【0012】
以下、添付図面を参照しながら各実施例について詳細に説明する。
【0013】
[実施例1]
<構成>
図1は、各実施例に共通する弧検出装置10の構成の一例を示すブロック図である。図1において、弧検出装置10は、入力部101、制御部102、検出部103、出力部104を含む。
【0014】
入力部101は、撮像素子により撮像された画像データを取得し、制御部102に画像データを入力する。以下、画像データは、単に画像ともいう。
【0015】
制御部102は、各部に対するデータのやり取りや、各部の制御を行う。例えば、制御部102は、入力部101から画像を取得した場合、検出部103に画像を出力し、弧を検出するよう検出部103を制御する。制御部102は、検出部103による検出結果を取得し、出力部104に出力する。
【0016】
検出部103は、制御部102から画像を取得すると、この画像に対し、楕円又は楕円の一部(例えば、弧)を検出する処理を実行する。検出部103は、検出結果を制御部102に返す。検出部103の詳細は後述する。
【0017】
出力部104は、制御部102から取得した検出結果及び/又は画像を取得し、次の工程の処理部に対し、検出結果及び/又は画像を出力する。
【0018】
次に、検出部103の構成について説明する。図2は、各実施例における検出部103の構成の一例を示すブロック図である。検出部103は、線分検出部201、判定部202、弧検出部203、楕円検出部204を含む。
【0019】
線分検出部201は、取得した画像に対し、線分検出を行う。例えば、線分検出部201は、画像からエッジを抽出し、抽出したエッジに対しハフ変換を用いて線分を検出する。線分を検出するハフ変換は、パラメータが少ないため、処理負荷は大きくない。なお、線分検出部201は、その他の従来技術を用いて線分を検出してもよい。
【0020】
図3は、線分検出の一例を示す図である。図3(A)は、入力された画像を示し、図3(B)は、図3(A)に示す画像に対し、線分検出を行った後の画像を示す。線分検出部201は、図3(B)に示すように、画像から線分を検出する。以降の処理では、これらの線分から、図3(B)に示すa11やa12のような同じ方向に角度が変化する線分の連なりが検出される。
【0021】
線分検出部201は、検出した線分の線分データを保持する。図4は、線分データのデータ構造の一例を示す図である。図4に示す線分データは、線分ID、端点(pt1,pt2)座標、線分の長さ、線分の角度(0〜179)を有する。
【0022】
図5は、線分の一例を示す図である。図5に示す例では、線分の端点pt1、pt2のそれぞれの座標はpt1(80,120)、pt2(160,40)であり、長さは113であり、角度は45度とする。
【0023】
図6は、角度の定義を説明するための図である。図6に示すように、画像に対して垂直方向の上方(時計の0時方向)を0度とし、水平方向の右方向(時計の3時方向)を90度とし、垂直方向の下方(時計の6時方向)を180度とする。しかし、180度は0度として、角度は0〜179度で表わすことにする。なお、角度は、0〜359度で表現してもよい。
【0024】
図2に戻り、判定部202は、線分検出部201により検出された複数の線分に対し、楕円の一部(弧)として関連付けられるかを判定し、関連付けられると判定した線分に対し、関連付けを行う。判定部202は、線分連結部211、線分連鎖部212を含む。
【0025】
線分連結部211は、2つの線分が弧をなす線分として連結できるかを、2つの線分の位置及び角度を用いて判定し、連結できると判定した線分の関連付けを行う。線分連結部211は、連結した線分の情報を示す線分連結情報を生成し、保持する。
【0026】
図7は、線分連結情報のデータ構造の一例を示す図である。図7に示すように、線分連結情報は、線分IDと、端点pt1、pt2からの他の線分へのリンク情報b11とを含む。リンク情報b11は、リンク数と、リンク数分の線分リンクを含む。線分リンクは、図7のb12に示すように、リンク先の線分ID、リンク先の線分の端点pt1、pt2のどちらにリンクしているか、リンク先の線分に対する角度変化量を含む。
【0027】
図8、9を用いて、線分連結部211が連結する(関連付ける)線分について説明する。図8は、2つの線分の近接関係を説明するための図である。図8(A)は、2つの線分は近接すると判定される例を示す。図8(A)に示す交点c11は、2つの線分の延長線上の交点である。線分連結部211は、交点c11に近い各線分の端点が、交点c11から所定距離以内であれば、近接すると判定する。所定距離は、例えば2つの線分の長さの平均の1/4である。所定距離は他にも2つの線分の平均の長さの1/3などでもよい。図8(A)に示す場合は、所定距離の条件を満たすので近接すると判定される。
【0028】
図8(B)は、2つの線分は近接すると判定される例を示す。図8(B)に示す交点c12は、2つの線分の交点である。線分連結部211は、交点c12に近い各線分の端点が、交点c12から所定距離以内であれば、近接すると判定する。図8(B)に示す場合は、所定距離の条件を満たすので近接すると判定される。
【0029】
図8(C)は、2つの線分は近接しないと判定される例を示す。図8(C)に示す交点c13は、2つの線分の延長線上の交点である。線分連結部211は、交点c13と、交点c13に近い各線分の端点との距離が所定距離以上離れているため、これらの線分を近接しないと判定する。
【0030】
図9は、2つの線分の角度関係を説明するための図である。図9(A)は、2つの線分は連結すると判定される例を示す。図9(A)に示すθ1は、2つの線分の角度変化量を示す。線分連結部211は、角度θ1が所定角度未満であれば、連結すると判定する。所定角度は、例えば40度である。この場合、角度変化量θ1が所定角度より小さいため、線分連結部211は、これらの線分を連結すると判定する。
【0031】
図9(B)は、2つの線分は連結しないと判定される例を示す。図9(B)に示すθ2は、2つの線分の角度変化量を示す。この場合、線分連結部211は、この角度変化量θ2が所定角度以上であるため、これらの線分は連結しないと判定する。
【0032】
図9(C)は、2つの線分は連結しないと判定される例を示す。図9(C)に示すθ3は、2つの線分の角度変化量を示す。この場合、線分連結部211は、角度変化量θ3は、所定角度未満であるが、2つの線分の位置関係がNGであるため、連結しないと判定する。位置関係については、例えば、2つの線分の中心のX座標が左右に位置しているか、Y座標が同程度の位置に位置しているかなどを判定する。位置関係の判定の詳細は後述する。
【0033】
線分連結部211は、図8、9に示すように、2つの線分の端点同士が近接していて、2つの線分の角度変化量が小さく、2つの線分が適切な位置にあるかを判定し、これらの条件を満たすと判定した線分を連結する(関連付ける)。線分連結部211は、連結された線分の線分連結情報を生成し、保持する。
【0034】
図2に戻り、線分連鎖部212は、線分連結部211から線分連結情報を取得する。線分連鎖部212は、両端点で連結されている線分(以下、基準線分ともいう)を探し、この基準線分と連結される線分が他の線分と連結されているかを判定する。
【0035】
線分連鎖部212は、他の線分と連結されている場合は、これらの線分を連鎖するとして関連付ける。線分連鎖部212は、基準線分を移動させてこの処理を繰り返し、連鎖数を増やしていく。以下、この処理を連鎖探索処理という。線分連鎖部212は、連鎖探索処理を行って、連鎖した線分の情報を示す線分連鎖情報を生成し、保持する。
【0036】
図10は、線分連鎖情報のデータ構造の一例を示す図である。図10に示す例では、線分連鎖情報は、要素数(線分数)、要素数分の要素リストを含む。図10に示すd11は、要素のデータを示す。要素のデータは、線分ID、線分リンク番号、端点フラグ、リンク先への角度変化量を有する。
【0037】
線分リンク番号は、線分連結で抽出した端点からのリンクの番号である。端点フラグは、線分IDの線分のpt1、pt2のいずれかの端点とリンクするかを示す。
【0038】
図2に戻り、弧検出部203は、線分連鎖情報を取得し、角度変化が同一方向の線分連鎖であり、要素数(線分数)が閾値以上の線分連鎖を抽出する。まず、弧検出部203は、取得した線分連鎖情報に基づき、その線分連鎖が、角度変化が同一方向の線分連鎖かを判定する。角度変化が同一方向の線分連鎖の場合、弧検出部203は、その線分連鎖に含まれる線分(要素数)をカウントする。弧検出部203は、カウント値が閾値以上であれば、この角度変化が同一方向の線分連鎖に含まれる線分を、楕円の一部(弧)であるとして検出する。
【0039】
楕円検出部204は、弧検出部203により検出された弧を所定の条件を満たす場合に組み合わせ、組み合わせ結果から楕円を検出する。楕円検出部204は、後述するように、楕円の一部が欠けている場合でも楕円とみなして検出することができる。また、楕円検出部204は、線分連鎖部212により線分が一巡した場合は、一巡した線分の線分連鎖情報を取得し、楕円であるかの確認処理を行う。
【0040】
<動作>
次に、弧検出装置10の動作について説明する。図11は、実施例1における楕円検出処理の一例を示すフローチャートである。図11に示すように、ステップS11で、線分検出部201は、取得した画像から線分を検出する。線分検出処理は、従来の技術を用いればよい。
【0041】
ステップS12で、線分連結部211は、検出された全線分に対し、線分の位置及び角度に基づいて連結(関連付け)できる線分がないかを判定する。線分連結部211は、連結できると判定した線分を連結し、線分連結情報を生成し、保持する。
【0042】
ステップS13で、線分連鎖部212は、線分連結情報に基づいて、連結された線分が連鎖するかを判定する。線分連鎖部212は、連鎖すると判定された線分を連鎖し(関連付け)、線分連鎖情報を生成し、保持する。
【0043】
ステップS14で、弧検出部203は、線分連鎖情報に基づいて、角度変化が同一方向の線分連鎖を抽出し、線分連鎖の要素数(線分数)が閾値以上であるかを判定する。弧検出部203は、角度変化が同一方向であり、要素数が閾値以上である線分連鎖に含まれる線分を、弧として検出する。
【0044】
ステップS15で、楕円検出部204は、検出された弧を所定の条件を満たす場合に組み合わせる。楕円検出部204は、この組み合わせに基づいて、楕円を検出する。以下、ステップS12〜S15の各処理を具体的に説明する。
【0045】
(1)線分連結処理
図12は、実施例1における線分連結処理の一例を示すフローチャートである。図12に示す処理は、ステップS12に相当し、線分検出処理により検出された線分の全ての組み合わせに対して実行される。なお、検出された線分には、他の線分を識別するために線分ID(例えば0,1,2,・・・,n)が付与される。
【0046】
ステップS101で、線分連結部211は、線分IDが0の線分をAの線分として抽出し、A=0とする。
【0047】
ステップS102で、線分連結部211は、線分検出部201により検出された線分数を取得し、Aが(線分数−1)未満であるかを判定する。Aが(線分数−1)未満である場合(ステップS102−YES)ステップS103に進み、Aが(線分数−1)以上である場合(ステップS102−NO)この処理を終了する。図では、YESをY、NOをNと表現する。
【0048】
ステップS103で、線分連結部211は、線分IDがA+1の線分をBとして抽出し、B=A+1とする。
【0049】
ステップS104で、線分連結部211は、Bが線分数未満であるかを判定する。Bが線分数未満である場合(ステップS104−YES)ステップS106に進み、Bが線分数以上である場合(ステップS104−NO)ステップS105に進む。
【0050】
ステップS105で、線分連結部211は、線分IDがA+1の線分をAとして抽出し、A=A+1とする。ステップS105の処理後はステップS102に戻る。
【0051】
ステップS106で、線分連結部211は、抽出した線分A,Bの近接判定処理を行う。近接判定については、図14を用いて後述する。
【0052】
ステップS107で、線分連結部211は、線分A,Bの近接判定がOKであるかを判定する。「近接判定がOK」の場合、線分A,Bは近接する。近接判定がOKである場合(ステップS107−YES)ステップS109に進み、近接判定がNGである場合(ステップS107−NO)ステップS108に進む。
【0053】
ステップS108で、線分連結部211は、線分IDがB+1の線分をBとして抽出し、B=B+1とする。ステップS108の処理後はステップS104に戻る。
【0054】
ステップS109で、線分連結部211は、線分A,Bの角度関係判定処理を行う。角度関係判定については、図15を用いて後述する。
【0055】
ステップS110で、線分連結部211は、角度関係がOKであるかを判定する。「角度関係がOK」とは、2つの線分の角度変化が小さく、所定の位置関係にある場合をいう。角度関係がOKである場合(ステップS110−YES)ステップS111に進み、角度関係がNGである場合(ステップS110−NO)ステップS108に進む。
【0056】
ステップS111で、線分連結部211は、線分連結情報をメモリに記録する。ステップS111の処理後はステップS108に戻る。これにより、全ての線分の組み合わせに対して線分連結処理を行うことができ、関連付けられた線分の組み合わせに対する線分連結情報を保持することができる。
【0057】
次に、具体例を用いて、近接判定処理及び角度関係判定処理を説明する。図13は、検出された線分の端点、位置及び角度を示す図である。図13に示す例では、線分ID0〜7に対し、近接する線分の角度変化量を示す。
【0058】
(1−1)近接判定処理
図14は、実施例1における近接判定処理の一例を示すフローチャートである。図14に示すステップS201で、線分連結部211は、線分A,Bの平均の長さを算出する。
【0059】
ステップS202で、線分連結部211は、線分A,Bの交点を抽出する。線分A,Bが実際に交わらない場合は、線分連結部211は、両線分を延長し、延長線上の交点を抽出する。
【0060】
ステップS203で、線分連結部211は、線分の交点から、両線分の交点に近いほうの端点までの距離が、例えば平均長さの1/4以下であるかを判定する。この距離が平均長さの1/4以下である場合(ステップS203−YES)ステップS204に進み、この距離が平均長さの1/4より長い場合(ステップS203−NO)ステップS205に進む。「1/4」については、実験により適切な値が与えられればよい。
【0061】
ステップS204で、線分連結部211は、この2つの線分は、近接判定OKであると判定する。ステップS205で、線分連結部211は、この2つの線分は、近接判定NGであると判定する。
【0062】
(1−2)角度関係判定処理
図15は、実施例1における角度関係判定処理の一例を示すフローチャートである。図15に示すステップS301で、線分連結部211は、線分A,Bの角度平均及び角度差を算出する。線分A,Bの角度平均及び角度差の算出については、図16を用いて後述する。
【0063】
ステップS302で、線分連結部211は、線分A,Bの角度差が40度未満であるかを判定する。角度差が40度未満である場合(ステップS302−YES)ステップS303に進み、角度差が40度以上である場合(ステップS302−NO)ステップS311に進む。
【0064】
ステップS303で、線分連結部211は、X座標での位置関係の判定処理を行う。線分連結部211は、両線分の中間点のX座標を比較し、左にある線分を線分L、右にある線分を線分Rとする。
【0065】
このとき、線分連結部211は、次の条件を満たすかを判定する。
線分Lの中間点のX座標<線分Rの両端点のX座標 かつ
線分Rの中間点のX座標>線分Lの両端点のX座標
線分連結部211は、この条件を満たす場合、X座標での位置関係をOKとする。線分連結部211は、条件を満たさない場合、X座標での位置関係はNGとする。線分連結部211は、例えば、この2つの線分にはX座標の位置関係の判定結果を表すフラグを立てるとよい。
【0066】
ステップS304で、線分連結部211は、Y座標での位置関係の判定処理を行う。線分連結部211は、両線分の中間点のY座標を比較し、上にある線分を線分U、下にある線分を線分Dとする。
【0067】
このとき、線分連結部211は、次の条件を満たすかを判定する。
線分Uの中間点のY座標<線分Dの両端点のY座標 かつ
線分Dの中間点のY座標>線分Uの両端点のY座標
線分連結部211は、この条件を満たす場合、Y座標での位置関係をOKとする。線分連結部211は、例えば、この2つの線分にはY座標の位置関係がOKであるフラグを立てる。画像上のY座標は、下に行くほど値が大きくなるとする。
【0068】
ステップS305で、線分連結部211は、両線分の角度の平均が30度未満又は150度以上であるかを判定する。この条件を満たす場合(ステップS305−YES)ステプS306に進み、この条件を満たさない場合(ステップS305−NO)ステップS308に進む。
【0069】
ステップS306で、線分連結部211は、Y座標での位置関係がOKであるかを判定する。Y座標での位置関係がOKである場合(ステップS306−YES)ステップS307に進み、Y座標での位置関係がNGである場合(ステップS306−NO)ステップS311に進む。
【0070】
ステップS307で、線分連結部211は、この2つの線分は、角度関係判定がOKであると判定する。
【0071】
ステップS308で、線分連結部211は、両線分の角度の平均が60度以上かつ120度未満であるかを判定する。この条件を満たす場合(ステップS308−YES)ステプS309に進み、この条件を満たさない場合(ステップS308−NO)ステップS310に進む。
【0072】
ステップS309で、線分連結部211は、X座標での位置関係がOKであるかを判定する。X座標での位置関係がOKである場合(ステップS309−YES)ステップS307に進み、X座標での位置関係がNGである場合(ステップS309−NO)ステップS311に進む。
【0073】
ステップS310で、線分連結部211は、X座標での位置関係がOKであり、Y座標での位置関係がOKであるかを判定する。この条件を満たす場合(ステップS310−YES)ステップS307に進み、この条件を満たさない場合(ステップS310−NO)ステップS311に進む。
【0074】
ステップS311で、線分連結部211は、この2つの線分は、角度関係がNGであると判定する。
【0075】
(1−2−1)角度平均及び角度差算出
図16は、角度平均及び角度差算出処理の一例を示すフローチャートである。図16に示すステップS401で、線分連結部211は、次の式によりangA2を算出する。
angA2=線分Aの角度+90
【0076】
ステップS402で、線分連結部211は、angA2が180度以上であるかを判定する。180度以上である場合(ステップS402−YES)ステップS403に進み、180度未満である場合(ステップS402−NO)ステップS404に進む。
【0077】
ステップS403で、線分連結部211は、次の式によりangA2を算出する。
angA2=angA2−180
【0078】
ステップS404で、線分連結部211は、次の式によりangB2を算出する。
angB2=線分Bの角度+90
【0079】
ステップS405で、線分連結部211は、angB2が180度以上であるかを判定する。180度以上である場合(ステップS405−YES)ステップS406に進み、180度未満である場合(ステップS405−NO)ステップS407に進む。
【0080】
ステップS406で、線分連結部211は、次の式によりangB2を算出する。
angB2=angB2−180
【0081】
ステップS407で、線分連結部211は、角度差1を次の式により算出する。
角度差1=(線分Aの角度−線分Bの角度)の絶対値
【0082】
ステップS408で、線分連結部211は、角度差2を次の式により算出する。
角度差2=(angA2−angB2)の絶対値
【0083】
ステップS409で、線分連結部211は、角度差1が角度差2以下であるかを判定する。角度差1が角度差2以下である場合(ステップS409−YES)ステップS410に進み、角度差1が角度差2より大きい場合(ステップS409−NO)ステップS411に進む。
【0084】
ステップS410で、線分連結部211は、次の式により角度平均を算出する。
角度平均=(線分Aの角度+線分Bの角度)/2
線分連結部211は、次の式により角度差を算出する。
角度差=角度差1
【0085】
ステップS411で、線分連結部211は、次の式により角度平均を算出する。
角度平均=((angA2+angB2)/2)−90
線分連結部211は、次の式により角度差を算出する。
角度差=角度差2
【0086】
ステップS412で、線分連結部211は、算出した角度平均が0未満であるかを判定する。0未満である場合(ステップS412−YES)ステップS413に進み、0以上である場合(ステップS412−NO)この処理を終了する。
【0087】
ステップS413で、線分連結部211は、次の式により角度平均を修正する。
角度平均=180+角度平均
以上の処理を行うことで、角度平均を求めることができる。
【0088】
図17は、線分連結情報の一例を示す図である。図17に示す線分連結情報は、図13に示す線分から線分連結処理を行った結果を示す。
【0089】
図17に示すように、線分ID=0のpt1側には、2つの線分が関連(リンク)付けられ、linkNum=2が付与される。「linkNum」は、リンク総数を表す。「リンク0」は、線分ID=1の線分とのリンクを表す。
【0090】
線分リンク番号「リンク0」は、linkId、linkPt、angleの各データを有する。「linkId」は、関連付けられている線分の線分IDを示す。「linkPt」は、関連付けられている線分の端点を示す。「angle」は、基準となる線分から関連付けられた線分への角度変化量を示し、時計回りを正とする。図17に示す例では、基準となる線分は、線分ID=0の線分であり、関連付けられた線分は、線分ID=1の線分である。
【0091】
例えば、線分リンク番号「リンク0」は、linkId=1、linkPt=pt2、angle=30の各データを有する。線分リンク番号「リンク1」は、線分ID=2の線分とのリンクを表す。「リンク1」は、linkId=2、linkPt=pt1、angle=15の各データを有する。
【0092】
図17に示すように、線分ID=0の線分のpt2側には、1つの線分が関連(リンク)付けられ、linkNum=1が付与される。「リンク0」は、線分ID=4の線分とのリンクを表す。「リンク0」は、linkId=4、linkPt=pt2、angle=−18の各データを有する。図17に示すように、線分連結部211は、全ての線分に対して、線分連結情報を生成する。
【0093】
(2)線分連鎖処理
図18は、実施例1における線分連鎖処理の一例を示すフローチャートである。図18に示す処理は、図11に示すステップS13、S14に相当する。図18に示すステップS501で、線分連鎖部212は、初期化のため、探索するIDを0に設定する。
【0094】
ステップS502で、線分連鎖部212は、IDが全線分数未満であるかを判定する。IDが全線分数未満である場合(ステップS502−YES)ステップS503に進み、IDが全線分数以上である場合(ステップS502−NO)この処理を終了する。
【0095】
ステップS503で、線分連鎖部212は、IDと同じ線分IDの線分について、pt1、pt2両方に線分リンクがあるかを判定する。「線分リンクがある」とは、他の線分と関連付け(リンク)されている場合をいう。両方に線分リンクがある場合(ステップS503−YES)ステップS505に進み、両方に線分リンクがない場合(ステップS503−NO)ステップS504に進む。
【0096】
ステップS504で、線分連鎖部212は、IDに1を加算する。ステップS504の処理後は、ステップS502に戻る。
【0097】
ステップS505で、線分連鎖部212は、探索開始線分ID=IDとする。ステップS506で、線分連鎖部212は、探索開始線分IDと同じ線分IDを有する線分のpt1側で、線分のリンク数を増やす線分連鎖抽出処理を行う。線分連鎖抽出処理は、図19を用いて後述する。
【0098】
ステップS507で、線分連鎖部212は、線分のリンク数を増やした結果、線分の連鎖が一巡したかを判定する。線分連鎖部212は、探索開始線分IDと同じ線分IDに戻ってきた場合に、一巡したと判定できる。一巡した場合(ステップS507−YES)ステップS508に進み、一巡しなかった場合(ステップS507−NO)ステップS509に進む。
【0099】
ステップS508で、楕円検出部204は、角度変化方向の確認処理を行う。角度変化方向の確認処理は、図27を用いて後述する。
【0100】
ステップS509で、線分連鎖部212は、探索開始線分IDと同じ線分IDを有する線分のpt2側で、線分連鎖抽出処理を行う。連分連鎖抽出処理は、図19を用いて後述する。
【0101】
ステップS510で、線分連鎖部212は、pt1側の連鎖と、pt2側の連鎖とを1つにまとめる。この処理は、図21を用いて後述する。
【0102】
ステップS511で、弧検出部203は、ステップS510で1つにまとめられた線分連鎖から、角度変化が同一方向であり、線分数が閾値以上の線分連鎖を検出する。検出した線分連鎖は、弧であり、楕円の一部となりうる。この処理は、弧検出処理として図22を用いて後述する。ステップS511は、図11に示すステップS14に相当する。
【0103】
ステップS511の処理後は、ステップS504に進み、全ての線分に対して処理を実行する。
【0104】
(2−1)線分連鎖抽出処理
図19は、実施例1における線分連鎖抽出処理の一例を示すフローチャートである。図19に示すステップS601で、線分連鎖部212は、線分連鎖を探索するための初期化を行う。例えば、要素数num=0、最大要素数max=0、注目線分lid=探索開始線分ID、線分リンクlink=注目端点の0番目の線分リンクが設定される。
【0105】
ステップS602で、線分連鎖部212は、注目線分lidの注目端点の線分リンク数が0より大きいかを判定する。線分リンク数が0より大きい場合(ステップS602−YES)、ステップS603に進み、線分リンク数が0以下である場合(ステップS602−NO)ステップS608に進む。
【0106】
ステップS603で、線分連鎖部212は、連鎖探索リスト[num]に、注目線分lid、注目中の線分リンク番号、線分リンクlinkの端点フラグ、角度変化量を記録する。
【0107】
ステップS604で、線分連鎖部212は、注目線分lidをlink先の線分IDに更新する。また、線分連鎖部212は、linkを新lidの元linkとリンクしている端点の反対側の端点に設定する。これは、図13を用いて説明すれば、線分ID=0から線分ID=1に更新した場合、linkは、線分ID=0のpt1から線分ID=1のpt1に更新される。つまり、新linkは、線分ID=1の線分が線分ID=0の線分とリンクしている端点の反対側に設定される。
【0108】
ステップS605で、線分連鎖部212は、numに1を加算する。numは、リンク数を表す。
【0109】
ステップS606で、注目線分lidが探索開始線分IDと同じであるかを判定する。注目線分lidが探索開始線分IDと同じである場合(ステップS606−YES)ステプS607に進み、注目線分lidが探索開始線分IDと違う場合(ステップS606−NO)ステップS602に戻る。
【0110】
ステップS607で、線分連鎖部212は、完全に一巡していると判定し、現在の連鎖探索リスト[0〜num]を線分連鎖の抽出結果とする。
【0111】
ステップS608で、線分連鎖部212は、numがmax以上であるかを判定する。numがmax以上である場合(ステップS608−YES)ステップS609に進み、numがmax未満である場合(ステップS608−NO)ステップS610に進む。
【0112】
ステップS609で、線分連鎖部212は、S603で記録した連鎖探索リスト[0〜num]を所定の記録領域に記録する。以下では、所定の記録領域を、最大連鎖記録領域と呼ぶ。この連鎖探索リストが線分連鎖情報になる。
【0113】
ステップS610で、線分連鎖部212は、ロールバック処理を行う。ロールバック処理は、線分連鎖の枝分かれした連鎖に対してリンクを辿るための処理である。ロールバック処理は、図20を用いて後述する。
【0114】
ステップS611で、線分連鎖部212は、numが0より大きいかを判定する。numが0より大きい場合(ステップS611−YES)ステップS602に戻り、numが0以下の場合(ステップS611−NO)ステップS612に進む。
【0115】
ステップS612で、線分連鎖部212は、最大連鎖記録領域に記録された連鎖探索リストを線分連鎖の抽出結果とする。
【0116】
以上の処理を行うことで、線分連鎖部212は、探索開始線分から一番長い線分連鎖を抽出することができる。
【0117】
(2−1−1)ロールバック処理
図20は、実施例1におけるロールバック処理の一例を示すフローチャートである。図20に示すステップS701で、線分連鎖部212は、numが0より大きいかを判定する。numが0より大きい場合(ステップS701−YES)ステップS702に進み、numが0より以下の場合(ステップS701−NO)処理を終了する。
【0118】
ステップS702で、線分連鎖部212は、連鎖探索リスト[num−1]の線分リンク番号に1を追加する。これは、線分連鎖の終端の一つ前の線分に戻り、その線分の枝分かれした線分を探すための処理である。
【0119】
ステップS703で、線分連鎖部212は、連鎖探索リスト[num−1]について、線分リンク番号が端点フラグ側のリンク総数より小さいかを判定する。リンク番号がリンク総数よりも小さい場合(ステップS703−YES)ステップS704に進み、リンク番号がリンク総数以上である場合(ステップS703−NO)ステップS705に進む。
【0120】
ステップS704で、線分連鎖部212は、注目線分lidを連鎖探索リスト[num−1]の端点フラグ側の線分リンク番号のリンクが指す線分IDに更新する。線分連鎖部212は、線分リンクを注目線分lidの、連鎖探索リスト[num−1]の線分とリンクしている端点の反対側の端点に設定する。これは、線分連鎖の終端の手前の線分から枝分かれした線分に対して連鎖探索処理を開始するための処理である。
【0121】
ステップS705で、線分連鎖部212は、numから1を減算する。ステップS705の処理後はステップS701に戻る。これにより、ステップS705で、最大連鎖から逆に辿っていき探索開始線分に戻ったとき、又はステップS704の処理後に、ロールバック処理を終了する。
【0122】
(2−2)線分連鎖を一つにまとめる処理
図21は、実施例1における連分連鎖を一つにまとめる処理の一例を示すフローチャートである。図21に示すステップS801で、線分連鎖部212は、この処理を行うための初期化を行う。例えば、要素数num=0、インデックスidx=pt2側の要素数−1が設定される。
【0123】
ステップS802で、線分連鎖部212は、idxが0より大きいかを判定する。idxが0より大きい場合(ステップS802−YES)ステップS803に進み、idxが0以下の場合(ステップS802−NO)ステップS805に進む。
【0124】
ステップS803で、線分連鎖部212は、次の演算を行う。
合計線分連鎖[num]=pt2側の線分連鎖[idx]
合計線分連鎖[num]の角度変化量=pt2側の線分連鎖[idx−1]の角度変化量×(−1)
ここで、線分連鎖[]は、図19に示すステップS612で抽出結果となる連鎖探索リスト[]である。
この処理は、線分連鎖を反対向きに辿っているので、角度は+、−を入れ替えるための処理である。
【0125】
ステップS804で、線分連鎖部212は、次の演算を行う。
num=num+1
idx=idx−1
ステップS804の処理後はステップS802に戻る。
【0126】
ステップS805で、線分連鎖部212は、idxを0にする。ステップS806で、線分連鎖部212は、idxがpt1側の要素数より小さいかを判定する。idxが要素数よりも小さい場合(ステップS806−YES)ステップS807に進み、idxがpt1側の要素数以上である場合(ステップS806−NO)この処理を終了する。
【0127】
ステップS807で、線分連鎖部212は、次の演算を行う。
合計線分連鎖[num]=pt1側の線分連鎖[idx]
【0128】
ステップS808で、線分連鎖部212は、次の演算を行う。
num=num+1
idx=idx+1
ステップS808の処理後はステップS806に戻る。
【0129】
以上の処理により、pt1側の線分連鎖とpt2側の線分連鎖とを1つにまとめることができる。
【0130】
(3)弧検出処理
図22は、実施例1における弧検出処理の一例を示すフローチャートである。図22に示す処理は、図11に示すステップS14に相当する。弧は、楕円又は楕円の一部を含むとする。図22に示すステップS901で、弧検出部203は、弧を検出するための初期化を行う。例えば、インデックスidx=1、始点pos=0、連続数cont=1が設定される。
【0131】
ステップS902で、弧検出部203は、idxが合計要素数よりも小さいかを判定する。idxが合計要素数よりも小さい場合(ステップS902−YES)ステップS903に進み、idxが合計要素数以上である場合(ステップS902−NO)処理を終了する。
【0132】
ステップS903で、弧検出部203は、idxが(合計要素数−1)と同じであるかを判定する。idxが(合計要素数−1)と同じである場合(ステップS903−YES)ステップS907に進み、idxが(合計要素数−1)と違う場合(ステップS903−NO)ステップS904に進む。
【0133】
ステップS904で、弧検出部203は、(idx−1)番目の角度変化量×idx番目の角度変化量が0より大きいかを判定する。これは、両者の角度変化量の符号(+、−)が同じならば正になる。乗算結果が正である場合(ステップS904−YES)ステップS905に進み、乗算結果が0以下である場合(ステップS904−NO)ステップS907に進む。
【0134】
ステップS905で、弧検出部203は、contに1を加算する。ステップS906で、弧検出部203は、idxに1を加算する。ステップS906の処理後はステップS902に戻る。
【0135】
ステップS907で、弧検出部203は、contが3以上であるかを判定する。contが3以上である場合(ステップS907−YES)ステップS908に進み、contが3未満である場合(ステップS907−NO)ステップS909に進む。
【0136】
ステップS908で、弧検出部203は、合計線分連鎖[pos〜idx]を弧(楕円又は楕円の一部)として記録する。
【0137】
ステップS909で、弧検出部203は、次の演算を行う。
pos=idx
cont=1
ステップ909の処理が終わると、ステップS906に進む。
【0138】
以上の処理を行うことで、合計線分連鎖のうち、同じ方向の角度変化をしている部分を楕円の一部として検出することができる。
【0139】
図23は、各処理結果のデータの一例を示す図である。図23は、図13に示す線分に対し、図18に示すステップS506、S509、S510、S511の各処理をした結果を示す。図23に示す「lineId」は線分IDを表し、「linkPt」は端点フラグを表し、「linkId」は線分リンク番号を表し、「angle」は角度変化量を表す。
【0140】
図23(A)は、S506の処理結果のデータを示す。図23(A)は、線分ID=0の線分のpt1側の連鎖抽出結果を示す。図23(A)に示すように、線分ID=0の線分のpt1側では、線分ID(lineId)=2の線分、線分ID=3の線分、線分ID=5の線分が連鎖していることを表す。要素数は、リンク数を表し、この場合の要素数は4である。
【0141】
図23(B)は、S509の処理結果のデータを示す。図23(B)は、線分ID=0の線分のpt2側の連鎖抽出結果を示す。図23(B)に示すように、線分ID=0の線分のpt2側では、線分ID=4の線分が連鎖していることを表す。この場合の要素数は、2である。
【0142】
図23(C)は、S510の処理結果のデータを示す。図23(C)は、図23(A)に示すデータと、図23(B)に示すデータとを重複を除いて1つにまとめた例を示す。この場合の要素数は、5である。
【0143】
図23(D)は、S511の処理結果のデータを示す。図23(D)は、図23(C)に示す線分連鎖から、角度変化が同一方向の線分が抽出された結果を示す。図23(D)に示すように、線分ID=5の線分が、線分ID=3の線分からの角度変化の符号が他の線分間の角度変化の符号と異なるため、リストから消去される。
【0144】
(4)楕円検出
以下に説明する処理は、図11に示すステップS15に相当する。
(4−1)楕円の位置推定処理
図24は、実施例1における楕円の位置推定処理の一例を示すフローチャートである。図24に示す処理で、弧(楕円の一部)が楕円のどの部分に相当するかを推定する。
【0145】
ステップS1001で、楕円検出部204は、フラグ上、下、左、右をOFFにセットする。ステップS1002で、楕円検出部204は、idxを0に設定する。
【0146】
ステップS1003で、楕円検出部204は、idxが(要素数−1)より小さいかを判定する。idxが(要素数−1)より小さい場合(ステップS1003−YES)ステップS1004に進み、idxが(要素数−1)以上である場合(ステップS1003−NO)この処理を終了する。
【0147】
ステップS1004で、楕円検出部204は、次の設定を行う。
a1=idx番目の要素の線分の角度
a2=(idx+1)番目の要素の線分の角度
【0148】
ステップS1005で、楕円検出部204は、次の条件を満たすかを判定する。
(45≦a1<90)AND(90≦a2<135)又は
(45≦a2<90)AND(90≦a1<135)
この条件を満たす場合(ステップS1005−YES)ステップS1008に進み、この条件を満たさない場合(ステップS1005−NO)ステップS1006に進む。
【0149】
ステップS1006で、楕円検出部204は、次の条件を満たすかを判定する。
a1<45 AND a2≧135 又は
a2<45 AND a1≧135
この条件を満たす場合(ステップS1006−YES)ステップS1012に進み、この条件を満たさない場合(ステップS1006−NO)ステップS1007に進む。
【0150】
ステップS1007で、楕円検出部204は、idxに1を加算する。ステップS1007の処理後はステップS1003に戻る。
【0151】
ステップS1008で、楕円検出部204は、左側にある線分をL、右側にある線分をRとし、2つの線分の交点を算出する。楕円検出部204は、線分Lについて、交点に近い端点のY座標をLY1、他方をLY2とし、線分Rについて、交点に近い端点のY座標をRY1、他方をRY2とする。
【0152】
ステップS1009で、楕円検出部204は、次の条件を満たすかを判定する。なお、Y座標は下に行くほど値が大きい。
LY1≦LY2 AND RY1≦RY2
この条件を満たす場合(ステップS1009−YES)ステップS1010に進み、この条件を満たさない場合(ステップS1009−NO)ステップS1011に進む。
【0153】
ステップS1010で、楕円検出部204は、フラグ上をONにし、交点座標を記録する。
【0154】
ステップS1011で、楕円検出部204は、フラグ下をONにし、交点座標を記録する。ステップS1010、S1011の処理後はステップS1007に戻る。
【0155】
ステップS1012で、楕円検出部204は、上側にある線分をU、下側にある線分をDとし、2つの線分の交点を算出する。楕円検出部204は、線分Uについて、交点に近い端点のX座標をUX1、他方をUX2とし、線分Dについて、交点に近い端点のX座標をDX1、他方をDX2とする。
【0156】
ステップS1013で、楕円検出部204は、次の条件を満たすかを判定する。なお、X座標は、右に行くほど値が大きい。
UX1≦UX2 AND DX1≦DX2
この条件を満たす場合(ステップS1013−YES)ステップS1014に進み、この条件を満たさない場合(ステップS1013−NO)ステップS1015に進む。
【0157】
ステップS1014で、楕円検出部204は、フラグ左をONにし、交点座標を記録する。
【0158】
ステップS1015で、楕円検出部204は、フラグ右をONにし、交点座標を記録する。ステップS1014、S1015の処理後はステップS1017に戻る。
【0159】
以上の処理を行うことで、楕円の一部が、楕円のどの部分に相当するかを推定し、楕円の一部に推定結果を示すフラグを立てることができる。
【0160】
(4−2)楕円検出処理
図25は、実施例1における楕円検出処理の一例を示すフローチャートである。図25に示すステップS1101で、楕円検出部204は、楕円検出のための初期化を行う。例えば、idx1=0が設定される。
【0161】
ステップS1102で、楕円検出部204は、idx1が(楕円の一部数(弧の数)−1)より小さいかを判定する。idx1が(楕円の一部数−1)より小さい場合(ステップS1102−YES)ステップS1103に進み、idx1が(楕円の一部数−1)以上である場合(ステップS1102−NO)この処理を終了する。
【0162】
ステップS1103で、楕円検出部204は、次の演算を行う。
idx2=idx1+1
【0163】
ステップS1104で、楕円検出部204は、idx2が楕円の一部数より小さいかを判定する。idx2が楕円の一部数より小さい場合(ステップS1104−YES)ステップS1106に進み、idx2が楕円の一部数以上である場合(ステップS1104−NO)ステップS1105に進む。
【0164】
ステップS1105で、楕円検出部204は、idx1に1を加算する。ステップS1005の処理後はステップS1002に戻る。
【0165】
ステップS1106で、楕円検出部204は、次の設定を行う。
e1=idx1番目の楕円の一部
e2=idx2番目の楕円の一部
【0166】
ステップS1107で、楕円検出部204は、次の条件を満たすかを判定する。
e1のフラグ上がON AND e2のフラグ下がON、又は
e1のフラグ下がON AND e2のフラグ上がON
この条件を満たす場合(ステップS1107−YES)ステップS1108に進み、この条件を満たさない場合(ステップS1107−NO)ステップS1111に進む。
【0167】
ステップS1108で、楕円検出部204は、次の設定を行う。
E1=e1、e2の上側
E2=e1、e2の下側
【0168】
ステップS1109で、楕円検出部204は、以下の設定を行う。
R1=E1を囲む矩形
R2=E2を囲む矩形
【0169】
ステップS1110で、楕円検出部204は、次の条件を満たすかを判定する。
E1交点とE2交点のX座標の差分<(R1、R2の平均幅/4)
この条件を満たす場合(ステップS1110−YES)ステップS1112に進み、この条件を満たさない場合(ステップS1110−NO)ステップS1111に進む。この条件は、線分の交点のうち、最も上側にある交点と、最も下側にある交点との差分が、楕円の一部を囲う矩形のX方向の幅の1/4未満であるかを調べる。「1/4」という数字は、所定の数字に適宜変更することができる。
【0170】
ステップS1111で、楕円検出部204は、idx2に1を加算する。ステップS1111の処理後はステップS1104に戻る。
【0171】
ステップS1112で、楕円検出部204は、R1高さ<R2高さであるかを判定する。R1の高さがR2の高さよりも小さい場合(ステップS1112−YES)ステップS1113に進み、R1の高さがR2以上である場合(ステップS1112−NO)進む。
【0172】
ステップS1113で、楕円検出部204は、(R1の高さ×2)>R2の高さの条件を満たすかを判定する。この条件を満たす場合(ステップS1113−YES)ステップS1115に進み、この条件を満たさない場合(ステップS1113−NO)ステップS1111に進む。
【0173】
ステップS1114で、楕円検出部204は、R1の高さ<(R2の高さ×2)の条件を満たすかを判定する。この条件を満たす場合(ステップS1114−YES)ステップS1115に進み、条件を満たさない場合(ステップS1114−NO)ステップS1111に進む。
【0174】
ステップS1115で、楕円検出部204は、次の条件を満たすかを判定する。
(R2上辺Y座標−R1下辺Y座標)<R1、R2の高さ平均
この条件を満たす場合(ステップS1115−YES)ステップS1116に進み、この条件を満たさない場合(ステップS1115−NO)ステップS1111に進む。
【0175】
ステップS1116で、楕円検出部204は、e1とe2との組み合わせを楕円と判断する。ステップS1116の処理後はステップS1111に戻る。
【0176】
以上の処理を行うことで、検出された楕円の一部(弧)が楕円のどの部分に相当するかを判断し、楕円の一部(弧)を組み合わせることで、楕円を検出することができる。以上の処理は、両矩形の高さに大きな差が無く、上側の矩形と下側の矩形との間に大きな差がなければ、両矩形内の楕円の一部の組み合わせを楕円として検出する処理である。
【0177】
なお、以上の処理は、楕円の一部(弧)が上、下の場合を説明したが、楕円の一部(弧)が左、右の場合にも適用できる。例えば、図25に示す処理の上、下を左、右に変え、XをYに変え、高さを幅に変え、幅を高さに変えれば、楕円の一部が左、右にある場合でも、これらを組み合わせて楕円を検出することができる。
【0178】
図26は、楕円検出の手順(その1)を図形で示す図である。図26(A)は、入力画像を示す。図26(B)は、図26(A)の入力画像に対して、図11に示す線分検出処理(S11)を行い、線分を検出した結果の画像を示す。
【0179】
図26(C)は、図26(B)に示す線分に対して、図11に示す線分連結処理(S12)、線分連鎖処理(S13)、弧検出処理(S14)を行った結果の画像を示す。図26(C)に示す点線枠内の線分は、弧として検出された線分連鎖を示す。
【0180】
図26(D)は、図26(C)に示す弧に対して、組み合わせを判断して楕円を検出した結果の画像を示す。図26(D)に示す点線枠は、弧を囲む矩形を示す。図26(D)に示すd11は、楕円上部の交点を示し、d12は楕円下部の交点を示し、d13は交点のX座標の差分を示し、d14は、矩形間のY座標における差(R2上辺Y座標−R1下辺Y座標)を示す。
【0181】
(5)角度変化の方向確認処理
次に、連分連鎖が一巡した場合の処理について説明する。この処理は、図18に示す線分連鎖が一巡した場合に行う処理である。
【0182】
図27は、実施例1における角度変化の方向確認処理の一例を示すフローチャートである。図27に示す処理は、図11に示すステップS15に相当する。図27に示すステップS1201で、楕円検出部204は、線分連鎖部212から線分連鎖が一巡した線分連鎖情報を取得し、idxを1に設定する。
【0183】
ステップS1202で、楕円検出部204は、idxが線分連鎖数より小さいかを判定する。idxが線分連鎖数より小さい場合(ステップS1202−YES)ステップS1203に進み、idxが線分連鎖数以上になる場合(ステップS1202−NO)ステップS1205に進む。
【0184】
ステップS1203で、楕円検出部204は、次の条件を満たすかを判定する。
(0番目の要素の角度変化量×idx番目の要素の角度変化量)>0
これは、角度変化量の符号が同じであれば正になり、2つの線分は、同一方向の角度変化をしているといえる。この条件を満たす場合(ステップS1203−YES)ステップS1202に戻り、この条件を満たさない場合(ステップS1203−NO)ステップS1204に進む。
【0185】
ステップS1204で、楕円検出部204は、一巡している線分連鎖を楕円ではないと判断する。一巡している線分連鎖の中に、1つでも角度変化の方向(符号)が同じでないものがあるからである。
【0186】
ステップS1205で、楕円検出部204は、一巡している線分連鎖を楕円であると判断する。一巡している線分連鎖の角度変化が、全て同じ方向(符号)であるからである。
【0187】
以上の処理を行うことで、線分連鎖が一巡している場合でも、適切に楕円を検出することができる。
【0188】
図28は、楕円検出の手順(その2)を図形で示した図である。図28(A)は、入力画像を示す。図28(B)は、図28(A)の入力画像に対して、図11に示す線分検出処理(S11)を行い、線分を検出した結果の画像を示す。
【0189】
図28(C)は、図28(B)に示す線分に対して、図11に示す線分連結処理(S12)、線分連鎖処理(S13)を行った結果の画像を示す。図28(C)に示す点線枠内の線分は、一巡した線分連鎖を示す。
【0190】
図28(D)は、図28(C)に示す線分連鎖に対して、角度変化の方向を確認して楕円を検出した結果の画像を示す。
【0191】
図29は、線分連鎖が一巡する場合の図形を示す図である。図29(A)は楕円の図形を示し、図29(B)は、楕円ではない図形を示す。図11に示す線分連鎖処理(S13)では、図29(A)、(B)どちらも一巡する線分連鎖として抽出される。しかし、楕円検出部204により、図27に示す角度変化の確認処理を行えば、図29(A)に示す図形のみを楕円と判断することができる。
【0192】
以上、実施例1によれば、弧検出にかかる処理負荷を軽減しつつ、適切に弧を検出することができる。また、実施例1によれば、検出した弧を組み合わせることで楕円を検出することができる。これは、ハフ変換を用いて楕円検出するよりも高速にかつ処理負荷を軽減して楕円を検出することができる。また、実施例1によれば、楕円の長径と短径との比が大きい場合でも、適切に楕円を検出することができる。なお、従来技術のように、複数の弧を組み合わせる場合に、各弧の中心と半径が略一致することで一つの弧と推測する方法では、楕円の長径と短径との比が大きい場合(例えば細長い楕円)、各弧は一つの弧とは推測されない。各弧の中心と半径が異なるからである。しかし、実施例1の弧検出方法では、幅広く楕円の弧を検出することができる。
【0193】
[実施例2]
次に、実施例2における弧検出装置について説明する。実施例2では、楕円の一部が欠けている場合でも楕円とみなして楕円を検出する。実施例2における弧検出装置の構成は、図1に示す構成と同様であり、検出部の構成は、図2に示す構成と同様である。実施例2における弧を検出する方法は、実施例1と同様であるため、説明を省略する。実施例2では、楕円検出部204による楕円検出の方法が、実施例1と異なるため、以下では楕円検出部204について説明する。
【0194】
<構成>
楕円検出部204は、弧検出部203により検出された弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上であれば、これらの所定位置に相当する弧を楕円とみなして検出する。
【0195】
図30は、楕円を8分割した場合の一例を示す図である。図30に示すように、楕円が8分割され、分割された楕円の一部にそれぞれ方向0〜7の識別子が付与される。楕円検出部204は、検出された弧が、方向0〜7の楕円の一部のどこに相当するかを判定し、例えば6つ以上の方向に相当すると判定された場合、この6つ以上の方向に相当する弧を楕円とみなして検出する。楕円検出部204による楕円検出の具体的な処理は、処理手順を示して説明する。
【0196】
<動作>
次に、実施例2における弧検出装置10の動作について説明する。実施例2では、図11に示す処理手順と同様であり、楕円検出処理の具体的な処理が実施例1とは異なるため、図11に示すステップS15の処理について具体的に説明する。
【0197】
(6)方向抽出処理
楕円検出部204は、弧として検出された線分連鎖が属する方向を抽出する。図31は、実施例2における方向抽出処理の一例を示すフローチャートである。図31に示すステップS1301で、楕円検出部204は、インデックスidxを0に設定する。
【0198】
ステップS1302で、楕円検出部204は、idxが線分連鎖数よりも小さいかを判定する。線分連鎖数は、弧検出部203により検出された弧(線分連鎖)の数である。idxが線分連鎖数よりも小さい場合(ステップS1302−YES)ステップS1303に進み、idxが線分連鎖数以上の場合(ステップS1302−NO)この処理を終了する。
【0199】
ステップS1303で、楕円検出部204は、線分連鎖[idx]を時計回り方向に揃える処理を行う。この処理は、図32を用いて後述する。連分連鎖[idx]は、例えば、図23(D)に示すリストを示す。
【0200】
ステップS1304で、楕円検出部204は、線分連鎖[idx]の最初の方向(iniPos)を抽出する。この処理は、図33〜図35を用いて後述する。
【0201】
ステップS1305で、楕円検出部204は、線分連鎖[idx]の最後の方向(finPos)を抽出する。この処理は、図36を用いて後述する。
【0202】
ステップS1306で、楕円検出部204は、idxに1を加算する。ステップS1306の処理の後は、ステップS1302に戻る。
【0203】
(6−1)時計回り方向に揃える処理
図32は、実施例2における時計回り方向に揃える処理の一例を示すフローチャートである。図32に示すステップS1401で、楕円検出部204は、線分連鎖[idx]の0番目の要素の角度変化量が0より小さいかを判定する。角度変化量が0より小さい場合(ステップS1401−YES)ステップS1402に進み、角度変化量が0以上の場合(ステップS1401−NO)この処理を終了する。
【0204】
ステップS1402で、楕円検出部204は、次の設定を行う。
cnt0=線分連鎖[idx]の長さ−1(長さ=要素数)
cnt1=0
【0205】
ステップS1403で、楕円検出部204は、cnt0が0より大きいかを判定する。cnt0が0より大きい場合(ステップS1403−YES)ステップS1405に進み、cnt0が0以下の場合(ステップS1403−NO)ステップS1404に進む。
【0206】
ステップS1404で、楕円検出部204は、線分連鎖[idx]を新線分連鎖[idx]に置き換える。
【0207】
ステップS1405で、楕円検出部204は、次の設定を行う。
新線分連鎖要素[cnt1]=線分連鎖要素「cnt0」
【0208】
ステップS1406で、楕円検出部204は、次の設定を行う。
新線分連鎖要素[cnt1]の角度変化量=線分連鎖要素[cnt0−1]の角度変化量×(−1)
【0209】
ステップS1407で、楕円検出部204は、cnt0から1を減算し、cnt1に1を加算する。ステップS1407の処理後は、ステップS1403に戻る。
【0210】
以上の処理を行うことで、線分連鎖の線分について、角度変化量がマイナス(反時計回り)をプラス(時計回り)に揃えることができる。
【0211】
(6−2)最初の方向抽出処理
図33〜35は、実施例2における最初の方向抽出処理の一例を示すフローチャートである。図33に示すステップS1501で、楕円検出部204は、次の設定を行う。
line0=線分連鎖[idx]の0番目の線分
line1=線分連鎖[idx]の1番目の線分
【0212】
ステップS1502で、楕円検出部204は、次の設定を行う。
ang0=line0の角度
ang1=line1の角度
この角度は、絶対角度を表す。
【0213】
ステップS1503で、楕円検出部204は、次の設定を行う。
xc0=line0の中間点のX座標
yc0=line0の中間点のY座標
xc1=line1の中間点のX座標
yc1=line1の中間点のY座標
ステップS1502及びS1503は順不同である。
【0214】
ステップS1504で、楕円検出部204は、次の条件を満たすかを判定する。
45≦ang1<90 かつ
90≦ang2<135
この条件を満たす場合(ステップS1504−YES)ステップS1505に進み、この条件を満たさない場合(ステップS1504−NO)ステップS1508に進む。
【0215】
ステップS1505で、楕円検出部204は、xc0<xc1を満たすかを判定する。xc0がxc1より小さい場合(ステップS1505−YES)ステップS1506に進み、xc0がxc1以上の場合(ステップS1505−NO)ステップS1507に進む。
【0216】
ステップS1506で、楕円検出部204は、「iniPos」は、7であると判定する。ここで、「iniPos」の数字は、図30に示す方向のことをいう。
【0217】
ステップS1507で、楕円検出部204は、「iniPos」は、3であると判定する。これにより、水平方向の弧を、分割された楕円のどの位置に相当するかを判定することができる。ステップS1506及びS1507の処理後は図36の処理に遷移する。
【0218】
ステップS1508で、楕円検出部204は、次の条件を満たすかを判定する。
135≦ang1 かつ
ang2<24
この条件を満たす場合(ステップS1508−YES)ステップS1509に進み、この条件を満たさない場合)(ステップS1508−NO)図34に示す処理1に進む。
【0219】
ステップS1509で、楕円検出部204は、yc0がyc1より小さいかを判定する。yc0がyc1より小さい場合(ステップS1509−YES)ステップS1510に進み、yc0がyc1以上の場合(ステップS1509−NO)ステップS1511に進む。
【0220】
ステップS1510で、楕円検出部204は、「iniPos」は、1であると判定する。
【0221】
ステップS1511で、楕円検出部204は、「iniPos」は、5であると判定する。これにより、垂直方向の弧を、分割された楕円のどの位置に相当するかを判定することができる。ステップS1510及びS1511の処理後は図36の処理に遷移する。
【0222】
図34は、実施例2における最初の方向抽出処理(その2)の一例を示すフローチャートである。図34に示すステップS1512で、楕円検出部204は、角度平均を次の式により算出する。
ave=(ang0+ang1)/2
【0223】
ステップS1513で、楕円検出部204は、aveが45より小さいかを判定する。aveが45より小さい場合(ステップS1513−YES)ステップS1514に進み、aveが45以上の場合(ステップ1513−NO)ステップS1521に進む。
【0224】
ステップS1514で、楕円検出部204は、yc0がyc1より小さいかを判定する。yc0がyc1より小さい場合(ステップS1514−YES)ステップS1515に進み、yc0がyc1以上の場合(ステップS1514−NO)ステップS1518に進む。
【0225】
ステップS1515で、楕円検出部204は、ang0が45より小さいかを判定する。ang0が45より小さい場合(ステップS1515−YES)ステップS1516に進み、ang0が45以上の場合(ステップS1515−NO)ステップS1517に進む。
【0226】
ステップS1516で、楕円検出部204は、「iniPos」は、2であると判定する。
【0227】
ステップS1517で、楕円検出部204は、「iniPos」は、3であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1516及びS1517の処理後は図36に遷移する。
【0228】
ステップS1518で、楕円検出部204は、ang0が45より小さいかを判定する。ang0が45より小さい場合(ステップS1518−YES)ステップS1519に進み、ang0が45以上の場合(ステップS1518−NO)ステップS1520に進む。
【0229】
ステップS1519で、楕円検出部204は、「iniPos」は、6であると判定する。
【0230】
ステップS1520で、楕円検出部204は、「iniPos」は、7であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1519及びS1520の処理後は図36に遷移する。
【0231】
ステップS1521で、楕円検出部204は、aveが90より小さいかを判定する。aveが90より小さい場合(ステップS1521−YES)ステップS1522に進み、aveが90以上の場合(ステップ1521−NO)図35に示す処理2に進む。
【0232】
ステップS1522で、楕円検出部204は、xc0がxc1より小さいかを判定する。xc0がxc1より小さい場合(ステップS1522−YES)ステップS1523に進み、xc0がxc1以上の場合(ステップS1522−NO)ステップS1526に進む。
【0233】
ステップS1523で、楕円検出部204は、ang0が45より小さいかを判定する。ang0が45より小さい場合(ステップS1523−YES)ステップS1524に進み、ang0が45以上の場合(ステップS1523−NO)ステップS1525に進む。
【0234】
ステップS1524で、楕円検出部204は、「iniPos」は、6であると判定する。
【0235】
ステップS1525で、楕円検出部204は、「iniPos」は、7であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1524及びS1525の処理後は図36に遷移する。
【0236】
ステップS1526で、楕円検出部204は、ang0が45より小さいかを判定する。ang0が45より小さい場合(ステップS1526−YES)ステップS1527に進み、ang0が45以上の場合(ステップS1526−NO)ステップS1528に進む。
【0237】
ステップS1527で、楕円検出部204は、「iniPos」は、2であると判定する。
【0238】
ステップS1528で、楕円検出部204は、「iniPos」は、3であると判定する。これにより、右上がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1527及びS1528の処理後は図36に遷移する。
【0239】
図35は、実施例2における最初の方向抽出処理(その3)の一例を示すフローチャートである。図35に示すステップS1529で、楕円検出部204は、aveが135より小さいかを判定する。aveが135より小さい場合(ステップS1529−YES)ステップS1520に進み、aveが135以上の場合(ステップS1529−NO)ステップS1527に進む。
【0240】
ステップS1530で、楕円検出部204は、xc0がxc1より小さいかを判定する。xc0がxc1より小さい場合(ステップS1530−YES)ステップS1531に進み、xc0がxc1以上の場合(ステップS1530−NO)ステップS1534に進む。
【0241】
ステップS1531で、楕円検出部204は、ang0が135より小さいかを判定する。ang0が135より小さい場合(ステップS1531−YES)ステップS1532に進み、ang0が135以上の場合(ステップS1531−NO)ステップS1533に進む。
【0242】
ステップS1532で、楕円検出部204は、「iniPos」は、0であると判定する。
【0243】
ステップS1533で、楕円検出部204は、「iniPos」は、1であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1532及びS1533の処理後は図36に遷移する。
【0244】
ステップS1534で、楕円検出部204は、ang0が135より小さいかを判定する。ang0が135より小さい場合(ステップS1534−YES)ステップS1535に進み、ang0が135以上の場合(ステップS1534−NO)ステップS1536に進む。
【0245】
ステップS1535で、楕円検出部204は、「iniPos」は、4であると判定する。
【0246】
ステップS1536で、楕円検出部204は、「iniPos」は、5であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1535及びS1536の処理後は図36に遷移する。
【0247】
ステップS1537で、楕円検出部204は、yc0がyc1より小さいかを判定する。yc0がyc1より小さい場合(ステップS1537−YES)ステップS1538に進み、yc0がyc1以上の場合(ステップS1537−NO)ステップS1541に進む。
【0248】
ステップS1538で、楕円検出部204は、ang0が135より小さいかを判定する。ang0が135より小さい場合(ステップS1538−YES)ステップS1539に進み、ang0が135以上の場合(ステップS1538−NO)ステップS1540に進む。
【0249】
ステップS1539で、楕円検出部204は、「iniPos」は、0であると判定する。
【0250】
ステップS1540で、楕円検出部204は、「iniPos」は、1であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1539及びS1540の処理後は図36に遷移する。
【0251】
ステップS1541で、楕円検出部204は、ang0が135より小さいかを判定する。ang0が135より小さい場合(ステップS1541−YES)ステップS1542に進み、ang0が135以上の場合(ステップS1541−NO)ステップS1543に進む。
【0252】
ステップS1542で、楕円検出部204は、「iniPos」は、4であると判定する。
【0253】
ステップS1543で、楕円検出部204は、「iniPos」は、5であると判定する。これにより、右下がりの弧が、分割された楕円のどの位置に相当するかを判定することができる。ステップS1542及びS1543の処理後は図36に遷移する。
【0254】
以上の処理を行うことで、線分連鎖の最初の線分が、楕円のどの部分に相当するかを判定することができる。
【0255】
(6−3)最後の方向等抽出処理
図36は、最後の方向等抽出処理の一例を示すフローチャートである。図36に示すステップS1601で、楕円検出部204は、次の式により基準角度baseを算出する。
base=ang0−(ang0を45で割った余り)
baseは、次の方向に該当するまでの角度を表す。1つの方向に相当するのは45(360/8)度である。ang0は、図33に示すステップS1502のang0である。
【0256】
ステップS1602で、楕円検出部204は、次の設定を行う。
finPos=iniPos
方向数=1
方向数は、検出された弧に相当する、分割された楕円の一部の数を表す。
【0257】
ステップS1603で、楕円検出部204は、cnt=1とする。ステップS1604で、楕円検出部204は、cntが線分連鎖[idx]の長さ(要素数)より小さいかを判定する。cntが線分連鎖[idx]の長さより小さい場合(ステップS1604−YES)ステップS1605に進み、cntが線分連鎖[idx]の長さ以上の場合(ステップS1604−NO)この処理を終了する。
【0258】
ステップS1605で、楕円検出部204は、以下の式により角度差を算出する。
角度差=線分[cnt]の角度−base
ステップS1606で、楕円検出部204は、次の条件を満たすかを判定する。
0≦角度差<45
この条件を満たす場合(ステップS1606−YES)ステップS1607に進み、この条件を満たさない場合(ステップS1606−NO)ステップS1608に進む。この条件を満たす場合は、次の線分を連鎖しても次の方向に到達していないことを表す。この条件を満たさない場合は、次の線分を連鎖したら次の方向に到達することを表す。
【0259】
ステップS1607で、楕円検出部204は、cntに1を加算する。ステップS1607の処理後は、ステップS1604に戻る。
【0260】
ステップS1608で、楕円検出部204は、方向数に1を加算する。ステップS1609で、楕円検出部204は、finPosに1を加算する。ステップS1608及びS1609は、順不同である。
【0261】
ステップS1610で、楕円検出部204は、finPosが7より大きいかを判定する。finPosが7より大きい場合(ステップS1610−YES)ステップS1611に進み、finPosが7以下の場合(ステップS1610−NO)ステップS1612に進む。
【0262】
ステップS1611で、楕円検出部204は、finPosを0に設定する。ステップS1612で、楕円検出部204は、baseに45を加算する。
【0263】
ステップS1613で、楕円検出部204は、baseが180以上になるかを判定する。baseが180以上である場合(ステップS1613−YES)ステップS1614に進み、baseが180未満の場合(ステップS1613−NO)ステップS1615に進む。
【0264】
ステップS1614で、楕円検出部204は、基準角度のbaseを0に設定する。ステップS1615で、楕円検出部204は、finPosが0であるかを判定する。finPosが0である場合(ステップS1615−YES)ステップS1616に進み、finPosが0でない場合(ステップS1615−NO)ステップS1617に進む。
【0265】
ステップS1616で、楕円検出部204は、上端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【0266】
ステップS1617で、楕円検出部204は、finPosが2であるかを判定する。finPosが2である場合(ステップS1617−YES)ステップS1618に進み、finPosが0でない場合(ステップS1617−NO)ステップS1619に進む。
【0267】
ステップS1618で、楕円検出部204は、右端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【0268】
ステップS1619で、楕円検出部204は、finPosが4であるかを判定する。finPosが4である場合(ステップS1619−YES)ステップS1620に進み、finPosが4でない場合(ステップS1619−NO)ステップS1621に進む。
【0269】
ステップS1620で、楕円検出部204は、下端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【0270】
ステップS1621で、楕円検出部204は、finPosが6であるかを判定する。finPosが6である場合(ステップS1621−YES)ステップS1622に進み、finPosが6でない場合(ステップS1621−NO)ステップS1607に進む。
【0271】
ステップS1622で、楕円検出部204は、左端の交点座標を求め、記録する。交点座標は、一つ前の線分との交点により求められる。
【0272】
以上の処理を行うことで、弧検出部203により検出された弧が、分割された楕円のどの位置に相当するかを判定でき、相当すると判定された楕円の一部の数や、楕円の端の座標を求めることができる。
【0273】
(7)楕円検出処理
図37、38は、実施例2における楕円検出処理の一例を示すフローチャートである。図37に示すステップS1701で、楕円検出部204は、idx1に0を設定する。
【0274】
ステップS1702で、楕円検出部204は、idx1が(楕円の一部数−1)より小さいかを判定する。楕円の一部数は、相当すると判定した楕円の一部の数(方向数)である。idx1が(楕円の一部数−1)より小さい場合(ステップS1702−YES)ステップS1703に進む。idx1が(楕円の一部数−1)以上である場合(ステップS1702−NO)この処理を終了する。
【0275】
ステップS1703で、楕円検出部204は、次の設定を行う。
idx2=idx1+1
【0276】
ステップS1704で、楕円検出部204は、idx2が楕円の一部数より小さいかを判定する。idx2が楕円の一部数より小さい場合(ステップS1704−YES)ステプS1706に進み、idx2が楕円の一部数以上の場合(ステップS1704−NO)ステップS1705に進む。
【0277】
ステップS1705で、楕円検出部204は、idx1に1を加算する。ステップS1705の処理後、ステップS1702に戻る。
【0278】
ステップS1706で、楕円検出部204は、次の設定を行う。
e1=idx1番目の線分連鎖
e2=idx2番目の線分連鎖
【0279】
ステップS1707で、楕円検出部204は、次の条件を満たすかを判定する。
(e1の方向数+e2の方向数)≧6
閾値の値(6)は、楕円検出の厳しさの度合いを示し、適宜設定変更可能である。e1とe2の方向数の和が閾値以上の場合(ステップS1707−YES)ステップS1709に進み、e1とe2の方向数の和が閾値未満の場合(ステップS1707−NO)ステップS1708に進む。
【0280】
ステップS1708で、楕円検出部204は、idx2に1を加算する。ステップS1708の処理後にステップS1704に戻る。
【0281】
ステップS1709で、楕円検出部204は、次の条件を満たすかを判定する。
e1の方向数==3 かつ
e2の方向数==3
この条件を満たす場合(ステップS1709−YES)ステップS1711に進み、この条件を満たさない場合(ステップS1709−NO)ステップS1710に進む。
【0282】
ステップS1710で、楕円検出部204は、処理Aを行う。処理Aについては、後述する。
【0283】
ステップS1711で、楕円検出部204は、次の条件を満たすかを判定する。
e1のiniPos==0 かつ
e2のiniPos==4又は5
この条件を満たす場合(ステップS1711−YES)ステップS1713に進み、この条件を満たさない場合(ステップS1711−NO)ステップS1712に進む。
【0284】
ステップS1712で、楕円検出部204は、処理Bを行う。処理Bについては、後述する。
【0285】
ステップS1713で、楕円検出部204は、次の設定を行う。
R1=e1を囲む矩形
R2=e2を囲む矩形
【0286】
ステップS1714で、楕円検出部204は、次の条件を満たすかを判定する。
e1の右端交点Y座標とe2の左端交点Y座標の差分<(R1,R2の平均の高さ/3)
R1,R2の高さとは、Y方向の矩形の長さをいう。
この条件を満たす場合(ステップS1714−YES)ステップS1715に進み、この条件を満たさない場合(ステップS1714−NO)ステップS1708に戻る。
【0287】
ステップS1715で、楕円検出部204は、R1の幅がR2の幅より小さいかを判定する。R1の幅がR2の幅より小さい場合(ステップS1715−YES)ステップS1716に進み、R1の幅がR2の幅以上の場合(ステップS1715−NO)ステップS1717に進む。
【0288】
ステップS1716で、楕円検出部204は、(R1の幅×2)がR2の幅より大きいかを判定する。(R1の幅×2)がR2の幅よりも大きい場合(ステップS1716−YES)図39に示す処理Cに進み、(R1の幅×2)がR2の幅以下の場合(ステップS1716−NO)ステップS1708に戻る。
【0289】
ステップS1717で、楕円検出部204は、R1の幅が(R2の幅×2)より小さいかを判定する。R1の幅が(R2の幅×2)より小さい場合(ステップS1717−YES)処理Cに進み、R1の幅が(R2の幅×2)以上の場合(ステップS1717−NO)ステップS1708に戻る。
【0290】
図38は、実施例2における楕円検出処理(その2)の一例を示すフローチャートである。図38に示すステップS1718で、楕円検出部204は、次の設定を行う。
x1=R1の左辺のX座標
x2=R2の右辺のX座標
【0291】
ステップS1719で、楕円検出部204は、次の条件を満たすかを判定する。
(x1−x2)≧0
この条件を満たす場合(ステップS1719−YES)ステップS1721に進み、この条件を満たさない場合(ステップS1719−NO)ステップS1720に進む。
【0292】
ステップS1720で、楕円検出部204は、次の条件を満たすかを判定する。
(x2−x1)<(R1幅+R2幅)/4
この条件を満たす場合(ステップS1720−YES)ステップS1722に進み、この条件を満たさない場合(ステップS1720−NO)ステップS1708に戻る。図38に示す「D」は、図37に示す「D」に遷移することを表し、つまり、ステップS1708に戻ることを表す。
【0293】
ステップS1721で、楕円検出部204は、次の条件を満たすかを判定する。
(x1−x2)<(R1幅+R2幅)/2
この条件を満たす場合(ステップS1721−YES)ステップS1722に進み、この条件を満たさない場合(ステップS1721−NO)ステップS1708に戻る。
【0294】
ステップS1722で、楕円検出部204は、次の式によりY1を算出する。
Y1=e1右端交点Y座標−R1上辺Y座標
ステップS1723で、楕円検出部204は、e2のiniPosが4であるかを判定する。e2のiniPosが4である場合(ステップS1723−YES)ステップS1724に進み、e2のiniPosが4でない場合(ステップS1723−NO)ステップS1725に進む。
【0295】
ステップS1724で、楕円検出部204は、次の式によりY2を算出する。
Y2=R2下辺Y座標−e2左端交点Y座標
【0296】
ステップS1725で、楕円検出部204は、次の式によりY2を算出する。
Y2=e2左端交点Y座標−R2上辺Y座標
【0297】
図39は、e2のiniPosの違いによる図形を説明するための図である。図39(A)は、e2のiniPosが4である場合の例を示す。この場合、ステップS1723の判定でYESとなり、ステップS1724の処理がなされる。
【0298】
図39(B)は、e2のiniPosが5である場合の例を示す。この場合、ステップS1723の判定でNOとなり、ステップS1725の処理がなされる。
【0299】
ステップS1726で、楕円検出部204は、Y1がY2より小さいかを判定する。Y1がY2より小さい場合(ステップS1726−YES)ステップS1728に進み、Y1がY2以上の場合(ステップS1726−NO)ステップS1727に進む。
【0300】
ステップS1727で、楕円検出部204は、Y1が(Y2×2)より小さいかを判定する。Y1が(Y2×2)より小さい場合(ステップS1727−YES)ステップS1729に進み、Y1が(Y2×2)以上の場合(ステップS1727−NO)ステップS1708に戻る。
【0301】
ステップS1728で、楕円検出部204は、(Y1×2)がY2より大きいかを判定する。(Y1×2)がY2より大きい場合(ステップS1728−YES)ステップS1729に進み、(Y1×2)がY2以下の場合(ステップS1728−NO)ステップS1708に戻る。
【0302】
ステップS1729で、楕円検出部204は、e1とe2とで楕円であると検出する。以上の処理を行うことで、楕円一部が欠けている場合でも、楕円とみなして検出することができる。
【0303】
次に、ステップS1710の処理Aについて説明する。ステップS1709の判定でNOということは、e1の方向数とe2の方向数とが同じではなく、e1とe2とを囲むそれぞれの矩形の大きさが異なる。よって、楕円検出部204は、e1とe2とを囲むそれぞれの矩形の大きさを考慮して、これらの矩形が楕円と判断してもよいほど近い位置にあるかを判定すればよい。判定の基本的な処理はステップS1711以降に示す処理と同様である。
【0304】
例えば、図39(A)に示すR1に線分が4つ含まれる場合、R1の高さは、矩形に含まれる線分が一つ増えるためR2の高さよりも大きくなりやすい。そこで、楕円検出部204は、図38に示すステップS1726のY1に係数(例えば3/4)を乗算することで、R1、R2の矩形の大きさを考慮して楕円検出処理を行えばよい。
【0305】
次に、ステップS1712の処理Bについて説明する。図40は、ステップS1712の処理Bの一例を説明するための図である。処理Bでは、e1,e2のiniPos値に応じてそれぞれ図37、38で説明したような処理をしてもよいが、図40に示すように、e1,e2を回転/左右反転などの処理をして、図37,38で説明した処理を行うようにしてもよい。
【0306】
図40(A)は、元の線分連鎖を示す。図40(B)は、元の線分連鎖を45度回転させた例を示す。図40(C)は、元の線分連鎖を90度回転させた例を示す。図40(B)や図40(C)に示すように、元の線分連鎖を回転させた場合、その後の処理のために、各線分の始点、終点座標と角度変化量を変換する必要がある。楕円の一部に相当する方向については、回転に応じて45度で1ずつ増加させればよい(7を超えたら0に戻る)。座標の変換については、例えば90度単位の回転に限定すれば、X−Y座標の入れ替えですみ、45度単位でも角度が固定のため簡易な処理ですむ。よって、この変換処理は、大きな処理負荷にはならない。
【0307】
以上、実施例2によれば、楕円の一部が欠けている場合でも楕円とみなして楕円を検出することができる。
【0308】
[変形例]
図41は、実施例1、2における弧検出装置10を含む携帯端末装置300のハードウェア構成の一例を示す図である。図41に示す携帯端末装置300は、アンテナ301、無線部302、ベースバンド処理部303、制御部304、出力部305、入力部306、メモリ307、電源308、カメラ309を有する。
【0309】
アンテナ301は、送信アンプで増幅された無線信号を送信し、また、基地局から無線信号を受信する。無線部302は、ベースバンド処理部303で拡散された送信信号をD/A変換し、直交変調により高周波信号に変換し、その信号を電力増幅器により増幅する。無線部302は、受信した無線信号を増幅し、その信号をA/D変換してベースバンド処理部303に伝送する。
【0310】
ベースバンド処理部303は、送信データの誤り訂正符号の追加、データ変調、拡散変調、受信信号の逆拡散、受信環境の判定、各チャネル信号の閾値判定、誤り訂正復号などのベースバンド処理を行う。
【0311】
制御部304は、制御信号の送受信などの無線制御を行う。また、制御部304は、各部を制御し、各種処理を実行する。出力部305は、例えばLCD(Liquid Crystal Display)に対し、制御部304からの指示に基づき、データを出力する。入力部306は、例えばマイクやキーボードなどからデータを受け付ける。
【0312】
メモリ307は、例えばROM(Read Only Memory)やRAM(Random Access Memory)などである。メモリ307は、各種データや携帯端末装置300で実行されるプログラムを格納する。電源308は、携帯端末装置300の電源を制御する。カメラ309は、撮像素子を有し、撮像画像を制御部304に出力する。
【0313】
なお、実施例1、2における制御部102、検出部103は、例えば制御部304やワークメモリとしてのメモリ307により実現され、入力部101は、カメラ309により、出力部104は、出力部305によりそれぞれ実現されうる。
【0314】
図42は、実施例1、2における弧検出装置10を含む画像処理装置400のハードウェア構成の一例を示す図である。図42に示す画像処理装置400は、CPU401、記憶装置402、メモリ403、読み取り装置404、通信インタフェース406、入出力装置407を含む。
【0315】
CPU401は、各装置の制御やデータの演算、加工を行う。CPU401は、メモリ403を利用して前述した弧検出処理を実行するためのプログラムを実行する。
【0316】
記憶装置402は、HDD(Hard Disk Drive)などであり、アプリケーションソフトウェアなどに関連するデータを記憶する記憶装置である。記憶装置402は、例えば弧検出プログラムを格納する。なお、記憶装置402は、外部記録装置であってもよい。
【0317】
メモリ403は、例えばROM(Read Only Memory)やRAM(Random Access Memory)などである。メモリ403は、例えばCPU401が実行する基本ソフトウェアであるOSやアプリケーションソフトウェアなどのプログラムやデータを記憶又は一時保存する記憶装置である。
【0318】
読み取り装置404は、CPU401の指示に従って可搬型記録媒体405にアクセスする。可搬性記録媒体405は、例えば、半導体デバイス(PCカード等)、磁気的作用により情報が入出力される媒体、光学的作用により情報が入出力される媒体を含むものとする。
【0319】
通信インタフェース406は、CPU401の指示に従って、ネットワークを介してデータを送受信する。入出力装置407は、前述した各実施例では、カメラ、表示装置、ユーザからの指示を受け付けるデバイス等に相当する。
【0320】
なお、各実施例における構成で、制御部102、検出部103は、例えばCPU401やワークメモリとしてのメモリ403により実現され、入力部101、出力部104は、例えば入出力装置407により実現されうる。この画像処理装置400は、デジタルカメラなどにも適用することができる。
【0321】
各実施例に係わる弧検出プログラムは、例えば、下記の形態で提供される。
・記憶装置402に予めインストールされている。
・可搬型記録媒体405により提供される。
・プログラムサーバ410からダウンロードする。
上記構成の携帯端末装置300や画像処理装置400で弧検出プログラムを実行することにより、各実施例に係わる装置が実現される。
【0322】
前述した各実施例における弧検出処理は、例えば、撮像画像内の皿を楕円とみなして検出し、撮影モードを自動で料理モードに変更するなどの機能に用いることができる。また、各実施例における弧検出処理は、皿の一部が料理や画面サイズの影響で欠けていた場合でも、皿を楕円とみなして検出することができる。よって、各実施例における弧検出処理を行う携帯端末装置やデジタルカメラの撮像部は、楕円の検出結果に基づいて、撮影モードを自動的に切り替えることができる。
【0323】
また、各実施例における弧検出処理は、目を楕円とみなして検出したりすることもできる。この場合、目の部分を拡大して前述した処理を行うようにすればよい。また、各実施例における弧検出処理は、外にある撮像装置のレンズについた雨粒を楕円とみなして検出し、この撮像装置を自動で電源OFFにするなどの場合にも適用できる。
【0324】
以上、各実施例について詳述したが、特定の実施例に限定されるものではなく、特許請求の範囲に記載された範囲内において、上記変形例以外にも種々の変形及び変更が可能である。
【0325】
なお、以上の実施例に関し、さらに以下の付記を開示する。
(付記1)
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える弧検出装置。
(付記2)
前記判定部は、
前記2つの線分うちの第一の線分の位置及び第二の線分の位置と、該第一の線分の基準に対する角度と該第二の線分の基準に対する角度とが、予め定められた条件を満たす場合に、該第一の線分と該第二の線分とを関連付ける連結部と、
前記連結部により、前記第一の線分が、前記第二の線分とは異なる第三の線分とさらに関連付けられる場合、該第一の線分と前記第二の線分と該第三の線分とを関連付ける連鎖部と、
を備える付記1記載の弧検出装置。
(付記3)
前記弧検出部は、
前記連鎖部により関連付けられた線分数及び近接する線分の角度変化量に基づき、弧を検出する付記2記載の弧検出装置。
(付記4)
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部をさらに備える付記1乃至3何れか一項に記載の弧検出装置。
(付記5)
前記楕円検出部は、
前記弧検出部により検出された複数の弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上あれば、前記所定位置に相当する弧の組み合わせを楕円とみなす付記4記載の弧検出装置。
(付記6)
前記楕円検出部は、
前記連鎖部により関連付けられた線分が一巡する場合、近接する線分の角度変化量に基づいて楕円を検出する付記4記載の弧検出装置。
(付記7)
画像を取得し、
前記画像から複数の線分を検出し、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定し、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する、
処理をコンピュータに実行させる弧検出プログラム。
(付記8)
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える携帯端末装置。
(付記9)
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部と、
前記楕円検出部による検出結果に応じて撮像モードを制御する撮像部と、
をさらに備える付記8記載の携帯端末装置。
【符号の説明】
【0326】
10 弧検出装置
101 入力部
102 制御部
103 検出部
106 出力部
201 線分検出部
202 判定部
203 弧検出部
204 楕円検出部
【特許請求の範囲】
【請求項1】
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える弧検出装置。
【請求項2】
前記判定部は、
前記2つの線分うちの第一の線分の位置及び第二の線分の位置と、該第一の線分の基準に対する角度と該第二の線分の基準に対する角度とが、予め定められた条件を満たす場合に、該第一の線分と該第二の線分とを関連付ける連結部と、
前記連結部により、前記第一の線分が、前記第二の線分とは異なる第三の線分とさらに関連付けられる場合、該第一の線分と前記第二の線分と該第三の線分とを関連付ける連鎖部と、
を備える請求項1記載の弧検出装置。
【請求項3】
前記弧検出部は、
前記連鎖部により関連付けられた線分数及び近接する線分の角度変化量に基づき、弧を検出する請求項2記載の弧検出装置。
【請求項4】
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部をさらに備える請求項1乃至3何れか一項に記載の弧検出装置。
【請求項5】
前記楕円検出部は、
前記弧検出部により検出された複数の弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上あれば、前記所定位置に相当する弧の組み合わせを楕円とみなす請求項4記載の弧検出装置。
【請求項6】
前記楕円検出部は、
前記連鎖部により関連付けられた線分が一巡する場合、近接する線分の角度変化量に基づいて楕円を検出する請求項4記載の弧検出装置。
【請求項7】
画像を取得し、
前記画像から複数の線分を検出し、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定し、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する、
処理をコンピュータに実行させる弧検出プログラム。
【請求項8】
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える携帯端末装置。
【請求項1】
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える弧検出装置。
【請求項2】
前記判定部は、
前記2つの線分うちの第一の線分の位置及び第二の線分の位置と、該第一の線分の基準に対する角度と該第二の線分の基準に対する角度とが、予め定められた条件を満たす場合に、該第一の線分と該第二の線分とを関連付ける連結部と、
前記連結部により、前記第一の線分が、前記第二の線分とは異なる第三の線分とさらに関連付けられる場合、該第一の線分と前記第二の線分と該第三の線分とを関連付ける連鎖部と、
を備える請求項1記載の弧検出装置。
【請求項3】
前記弧検出部は、
前記連鎖部により関連付けられた線分数及び近接する線分の角度変化量に基づき、弧を検出する請求項2記載の弧検出装置。
【請求項4】
前記弧検出部により検出された複数の弧の位置に基づいて、検出された複数の弧を含む楕円を検出する楕円検出部をさらに備える請求項1乃至3何れか一項に記載の弧検出装置。
【請求項5】
前記楕円検出部は、
前記弧検出部により検出された複数の弧が、楕円を分割した一部のどの位置に相当するかを判定し、所定位置に相当すると判定された楕円の一部が閾値以上あれば、前記所定位置に相当する弧の組み合わせを楕円とみなす請求項4記載の弧検出装置。
【請求項6】
前記楕円検出部は、
前記連鎖部により関連付けられた線分が一巡する場合、近接する線分の角度変化量に基づいて楕円を検出する請求項4記載の弧検出装置。
【請求項7】
画像を取得し、
前記画像から複数の線分を検出し、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定し、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する、
処理をコンピュータに実行させる弧検出プログラム。
【請求項8】
画像を入力する入力部と、
前記画像から複数の線分を検出する線分検出部と、
前記複数の線分のうち、2つの線分のそれぞれの位置及び基準に対する角度に基づき、前記2つの線分が関連付けられるかを判定する判定部と、
前記判定部の判定結果に応じて関連付けられた2つの線分に基づき、前記複数の線分のうち、該2つの線分を含む線分で近似される弧を検出する弧検出部と、
を備える携帯端末装置。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図34】
【図35】
【図36】
【図37】
【図38】
【図39】
【図40】
【図41】
【図42】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図34】
【図35】
【図36】
【図37】
【図38】
【図39】
【図40】
【図41】
【図42】
【公開番号】特開2012−128666(P2012−128666A)
【公開日】平成24年7月5日(2012.7.5)
【国際特許分類】
【出願番号】特願2010−279576(P2010−279576)
【出願日】平成22年12月15日(2010.12.15)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】
【公開日】平成24年7月5日(2012.7.5)
【国際特許分類】
【出願日】平成22年12月15日(2010.12.15)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】
[ Back to top ]