以下、本発明の非接触入力装置を適用した実施形態について説明する。
<実施形態>
図1、図2、及び図3は、実施形態の非接触入力装置を含む電子機器100の構成の一例を示す図である。図4は、実施形態の非接触入力装置100Aの構成の一例を示す図である。図2及び図3には、電子機器100の利用者の手Hを示す。より具体的には手Hの指先FTと掌(手のひら)Pとを示す。指先FTは一例として人差し指であるが、人差し指以外の指であってもよい。
以下では、XYZ座標系を定義して説明する。X軸に平行な方向(X方向)、Y軸に平行な方向(Y方向)、Z軸に平行な方向(Z方向)は、互いに直交する。また、以下では、-Z方向を静電センサ120に近づく方向、+Z方向を静電センサ120から離れる方向として説明する。また、平面視とはXY面視することをいう。また、以下では構成が分かり易くなるように各部の長さ、太さ、厚さ等を誇張して示す場合がある。
電子機器100は、筐体101、表示装置110、静電センサ120、及び制御装置130を含む。図1乃至図3では制御装置130(図4参照)を省略するが、制御装置130は、一例として筐体101の内部で表示装置110及び静電センサ120の下側に設けられる。非接触入力装置100Aは、図4に示すように、静電センサ120及び制御装置130を含む。
筐体101は、表示装置110、静電センサ120、及び制御装置130を収容する樹脂製又は金属製等のケースである。表示装置110は、一例として透明な静電センサ120の下側に配置され、筐体101の上部にある開口部に設けられる透明パネル等の上面である操作面105を介して視認可能である。
電子機器100は、指先FT及び掌Pを電子機器100の操作面105に触れることなく、操作面105に対して指先FT及び掌Pを非接触で近づけた状態で操作可能である。図2及び図3には、一例として操作面105から距離D(図2参照)だけ離れた位置にある指先FTで操作部111に対して操作入力を行っている状態を示す。電子機器100は、操作面105に接触していない指先FTの位置を検出して、非接触での操作入力を受け付ける。非接触での操作入力とは、指先FTで操作面105に触れずに、指先FTで電子機器100を操作することである。
電子機器100は、例えば、店舗や施設等に配置され不特定多数の利用者が利用するタブレット型の入力装置やATM(Automatic Teller Machine)の入力部であってよい。また、電子機器100は、個人で利用するタブレットコンピュータ、スマートフォン、ゲーム機等であってもよい。
表示装置110は、一例として液晶ディスプレイや有機EL(Electroluminescence)ディスプレイ等である。表示装置110は、GUI(Graphic User Interface)で操作部111の画像を表示する。操作部111は、一例として平面視でマトリクス状に配置される。
図1乃至3には、一例として5行×6列の30個の操作部111を示す。30個の操作部111には(行,列)で(1,1)~(5,6)を記す。マトリクス状に配置される30個の操作部111について、5つの行はX方向に延在し、Y方向に平行に配列されている。6つの列は、Y方向に延在し、X方向に並列に配列されている。なお、電子機器100は、表示装置110を含まずに、操作面105に印刷等で表示された操作部を含む形態であってもよい。
静電センサ120は、表示装置110の上に重ねて配置され、図4に示すように、X方向に6個、Y方向に5個が配列される合計30個のセンサ電極121を有する。30個のセンサ電極121は、30本の配線122を介して制御装置130にそれぞれ接続されている。図4では配線122が1本あるように示すが、実際には30本の配線122をそれぞれ介して30個のセンサ電極121は独立的に制御装置130に接続されている。このような静電センサ120は、一例として透明ガラスの表面にITO(Indium Tin Oxide)等の透明導電膜を形成し、センサ電極121及び配線122にパターニングしたものを用いることができる。静電センサ120の静電容量は、制御装置130に入力される。
ここでは一例として、30個のセンサ電極121は、それぞれ30個の操作部111と重なるように配置される構成を示す。30個のセンサ電極121についての行と列の関係は、操作部111と同一である。このため、30個のセンサ電極121は5行6列で配列されており、30個の操作部111と同様に(行,列)で(1,1)~(5,6)を記す。30個のセンサ電極121の位置は、行番号と列番号で表される。
以下では行をi、列をjとして各センサ電極121の位置を(i,j)で示す。ここでは、一例として行iは1~5であり、列jは1~6である。一例として、1行目のセンサ電極121は+Y方向側の端に位置し、5行目のセンサ電極121は-Y方向側の端に位置する。1列目のセンサ電極121は-X方向側の端に位置し、6列目のセンサ電極121は+X方向側の端に位置する。
また、ある行iの-Y方向側に隣接する行は行i+1であり1行下の行である。また、ある行iの+Y方向側に隣接する行は行i-1であり1行上の行である。また、最も-X方向側にある列の列番号jが1(j=1)であり、一例として最も+X方向側にある列の列番号jは最も大きい列番号になる。ここでは最も大きい列番号jは6である。
以下では、センサ電極121(i,j)を特に区別しない場合には単にセンサ電極121と記す。また、ここではセンサ電極121と操作部111が1対1で対応する形態について説明するが、複数のセンサ電極121に対して1つの操作部111が対応していてもよい。
制御装置130は、CPU(Central Processing Unit)、RAM(Random Access Memory)、ROM(Read Only Memory)、入出力インターフェース、及び内部バス等を含むコンピュータによって実現される。
制御装置130は、主制御部131、AD(Analog to Digital)変換部132、カウンタ133、判定部134、動作制御部135、表示制御部136、及びメモリ137を有する。主制御部131、AD変換部132、カウンタ133、判定部134、動作制御部135、及び表示制御部136は、制御装置130が実行するプログラムの機能(ファンクション)を機能ブロックとして示したものである。また、メモリ137は、制御装置130のメモリを機能的に表したものである。
主制御部131は、制御装置130の処理を統括する処理部であり、AD変換部132、カウンタ133、判定部134、動作制御部135、及び表示制御部136が実行する処理以外の処理を実行する。例えば、主制御部131は、30個のセンサ電極121の走査を行う。
AD変換部132は、静電センサ120の出力をデジタル値に変換する。AD変換部132の出力は、静電センサ120の各センサ電極121と周辺の導体間の静電容量の検出値である。カウンタ133は、AD変換部132の出力の基準値に対する差分値をカウントして出力する。差分値は、出力の基準値に対する変化分のカウント値である。以下、差分値ΔADと記す。AD変換部132の出力は、各センサ電極121と周辺の導体間の静電容量である。基準値は、各センサ電極121の周辺に指が無い場合における各センサ電極121と周辺の導体間の静電容量である。差分値ΔADは、各センサ電極121と指の間の静電容量である。
差分値ΔADは、各センサ電極121について得られるため、静電センサ120の出力から30個の差分値ΔADが得られる。センサ電極121(i,j)の静電容量から得られる差分値を差分値ΔAD(i,j)と示す。AD変換部132は、センサ電極121(i,j)の静電容量をデジタル値に変換し、カウンタ133は、AD変換部132の出力の基準値に対する変化分をカウントし、30個のセンサ電極121(i,j)についての差分値ΔAD(i,j)を出力する。なお、差分値ΔAD(i,j)を特に区別しない場合には単に差分値ΔADと記す。
判定部134は、カウンタ133から出力される差分値ΔADに基づいて指先FTの位置と、掌Pの位置と、指先FT及び掌Pが存在しない位置とを判定する。電子機器100及び非接触入力装置100Aでは、判定部134は、指先FTの先端の位置を利用者が行う操作入力の位置として判定する。判定部134が実行する判定方法については、フローチャートを用いて後述する。
動作制御部135は、判定部134によって判定された操作入力の位置に基づいて、電子機器100の動作を制御する。表示制御部136は、判定部134によって判定された操作入力の位置に基づいて表示装置110の表示を制御する。メモリ137は、主制御部131、判定部134、動作制御部135、及び表示制御部136が処理を実行する際に用いるプログラムやデータ等を格納する。また、メモリ137は、センサ電極121の行数と列数とを表すデータを格納する。
図5は、手Hと静電センサ120の電極面との関係に対する差分値ΔAD及び逆数の分布の一例を示す図である。電極面は、30個のセンサ電極121の表面である。逆数は、差分値ΔADの逆数である。
図5の左側に示すように指先FT及び掌Pが電極面に近い場合と、図5の右側に示すように左側よりも少し指先FT及び掌Pが電極面から離れた場合とにおける差分値ΔADを比べると、左側のように指先FT及び掌Pが電極面に近い場合の方が右側のように少し離れている場合よりも差分値ΔADが大きくなる。差分値ΔADは静電センサ120で検出される静電容量の手による変化分であり、ΔADは電極面と指先FT及び掌Pとの間の距離に反比例した値になるからである。また、距離に反比例することから、手Hのポーズが同一であっても、電極面と指先FT及び掌Pとの間の距離が異なると、差分値ΔADの分布を表す波形が異なる。図5では、左側及び右側のどちらでも、人差し指の指先FTを延ばしたポーズを取っている。
これに対して、逆数の分布を表す波形は、差分値ΔADの分布を表す波形に比べて、電極面と指先FT及び掌Pとの間の距離の違いによる影響が少なく、比較的類似した波形が得られている。差分値ΔADの逆数は、電極面と指先FT及び掌Pとの間の距離の関数になるためである。
図6は、手Hの長さ方向及び幅方向における逆数の分布の一例を示す図である。手Hの長さ方向とは、手首から掌Pを通って指先FTに至る方向である。手Hの幅方向とは、平面視で手Hの長さ方向に直交する方向であり、親指と小指に向かう方向である。
図6には、手Hの左側の分布(A)に長さ方向における逆数の分布を示し、手Hの右側の上半分の分布(B)に指先FTの位置における逆数の幅方向の分布を示し、手Hの右側の下半分の分布(C)に掌Pの位置における逆数の幅方向の分布を示す。
分布(A)の手Hの長さ方向における逆数の分布では、手Hが存在する区間では逆数の分布は緩やかにカーブしているが、矢印FTで示すように、指先FTがある部分と、指先FTよりも先の手Hがない部分との境界で逆数が大きく変化している。このため、逆数が大きく変化する位置を特定すれば、逆数の分布に基づいて、長さ方向における指先FTの位置を判別可能である。
また、分布(B)の指先FTの位置における逆数の幅方向の分布では、指先FTが位置する区間だけV字型に逆数が小さくなっている。このため、V字型に逆数が変化する位置を特定すれば、逆数の分布に基づいて、幅方向における指先FTの位置を判別可能である。V字型に逆数が変化するカーブには、二次曲線をフィッティングさせることが可能である。
また、分布(C)の掌Pの位置における逆数の幅方向の分布では、掌Pが位置する区間は、掌Pが位置しない両端に比べて逆数が小さくなっており、指先FTよりも幅方向に広い区間にわたって小さな値を取っている。このため、指先FTよりも幅方向に広い区間にわたって小さな値を取る位置を特定すれば、逆数の分布に基づいて、幅方向における掌Pの位置を判別可能である。掌Pの形状に応じたカーブには、指先FTよりも緩やかな二次曲線や円をフィッティングさせることが可能である。指先FTにフィッティングする二次曲線と、掌Pにフィッティングする二次曲線とでは、二次の係数に大きな差が生じると考えられる。
図7は、指先FTと掌Pにフィッティングする二次曲線の例示的な二次の係数を説明する図である。図7の上側には人差し指を突き出した手Hを正面から示す。指先FTには破線で示す二次曲線10FTがフィットし、掌Pには実線で示す二次曲線10Pがフィットしている。
二次曲線10FT及び10Pは、図7の下半分に示すように、z=ax2における二次の係数aをそれぞれ1(a=1)及び8(a=8)に設定することによって得られる二次曲線である。このように、二次の係数aを適切な値に設定することによって、指先FT及び掌Pにフィットする二次曲線10FT及び10Pを求めることができる。二次曲線10FT及び10Pは、カーブフィッティングによって求めることができる。
また、指先FTと掌Pでは幅が大きく異なるため、カーブフィッティングによってフィットされる二次曲線の二次の係数aは大きく異なる。図7に示すように一例として、指先FTにフィットする二次曲線の二次の係数aは8であり、掌Pにフィットする二次曲線の二次の係数aは1である。このため、差分値ΔADの逆数の分布を求めてカーブフィッティングでフィットする二次曲線の二次の係数aを求めれば、指先FTと掌Pを判別することが可能である。指先FTの位置を求めることができれば、非接触での操作入力を実現することができる。
差分値ΔADの逆数の分布に対してカーブフィッティングを行うことで得られる二次曲線の二次の係数aが大きいほど、二次曲線はV字状に尖っていることになる。ここでは、二次の係数aを二次曲線の尖鋭度として求め、尖鋭度に基づいて指先FTの位置を特定する。尖鋭度とは、二次曲線のV字形状が尖っている度合である。
次に、図8乃至図13のフローチャートを用いて、指先FTの位置の求め方について説明する。図8乃至図13は、指先FTの位置の求める処理を表すフローチャートを示す図である。この処理は、判定部134によって実行される。図8は、メインのフローを示し、図9乃至図13は、それぞれ、図8におけるステップS3~S7のサブルーチン処理のフローを示す。なお、ここでは、一例として図3に示すように、電子機器100の-Y方向側でX方向に延在する端辺の側から+Y方向側に向けて操作面105の上方で手Hを電子機器100に翳して操作入力を行うルールがあるものとして説明する。
判定部134は、処理がスタートすると、メモリ137からセンサ電極121の行数と列数を読み込む(ステップS1)。AllRowsはセンサ電極121の行数を表し、AllColumnsはセンサ電極121の列数を表す。一例としてAllRowsは5行であり、AllColumnsは6列である。
次に、判定部134は、全センサ電極121についての差分値ΔAD(1,1)~ΔAD(AllRows,AllColumns)を取得する(ステップS2)。ステップS2の処理により、一例として30個のセンサ電極121についての30個の差分値ΔAD(1,1)~ΔAD(AllRows,AllColumns)が得られる。
次に、判定部134は、サブルーチン「sub逆数変換」を呼び出し、全ての差分値ΔAD(1,1)~ΔAD(AllRows,AllColumns)を逆数に変換する(ステップS3)。
次に、判定部134は、サブルーチン「sub最小値判定」を呼び出し、全ての行における逆数の最小値を判定し、逆数の最小値を示す列を求める処理を行う(ステップS4)。
次に、判定部134は、サブルーチン「sub除外行特定」を呼び出し、除外行を特定する処理を行う(ステップS5)。除外行とは、手Hが存在していない行であり、手が存在しない行を特定して除外することで、手が存在する行に絞り込む処理である。
次に、判定部134は、サブルーチン「sub尖鋭度算出」を呼び出し、手が存在する行について尖鋭度を算出する処理を行う(ステップS6)。
次に、判定部134は、サブルーチン「sub指先特定」を呼び出し、ステップS6で手が存在する全ての行について算出した尖鋭度に基づいて、指先FTの行を特定する処理を行う(ステップS7)。
最後に、判定部134は、ステップS7で特定された指先の行に基づいて、指先FTの先端の位置を表す座標を出力する(ステップS8)。ここで、rowは、指先FTが位置する行番号を表す。また、column(i)は、i行で逆数が最小の列番号を表すため、column(row)は、row行で、逆数が最小の列番号を表す。
次に、図9を用いて、図8のステップS3のサブルーチン「sub逆数変換」に基づき行われる逆数変換処理について説明する。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、全ての行iに含まれる全ての列jについての差分値ΔAD(i,j)の逆数を演算するループ処理を行う(ステップS11~S15)。i=1,AllRows,1は、逆数の演算を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、選択している行iについて、j=1からAllColumnsまで列jを1つずつ選択しながら、全ての列の差分値ΔAD(i,j)の逆数を演算するループ処理を行う(ステップS12~S14)。j=1,AllColumns,1は、逆数の演算を列数i=1からAllColumnsまで1列ずつ行うことを意味する。
判定部134は、選択している行iについて、列jを順番に選択して差分値ΔAD(i,j)の逆数Reciprocal(i,j)を演算する(ステップS13)。判定部134は、ステップS13での演算結果を行番号i及び列番号jを要素とする配列データとしてメモリ137に格納する。差分値ΔAD(i,j)の逆数Reciprocal(i,j)は、Reciprocal(i,j)=1/ΔAD(i,j)で求まる。
判定部134は、選択している行iについて、全ての列jの差分値ΔAD(i,j)の逆数を演算するまでステップS12~S14のループ処理を行う(ステップS14)。判定部134は、選択している行iについて、ステップS12~S14の処理を繰り返し行うことにより、選択している行iにおける全ての列jの差分値ΔAD(i,j)の逆数を演算する。
判定部134は、全ての行iに含まれる全ての列jについての差分値ΔAD(i,j)の逆数を演算するまでステップS11~S15のループ処理を行う。判定部134は、ステップS11~S15の処理を繰り返し行うことにより、全ての行を1行ずつ選択しながら、各行に含まれる全ての列について差分値ΔADの逆数を演算する。
次に、図10を用いて、図8のステップS4のサブルーチン「sub最小値判定」に基づき行われる全ての行における逆数の最小値を判定する処理について説明する。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、全ての行iに含まれる全ての列jの逆数の最小値と、その最小値を与えるセンサ電極121(i,j)を特定するループ処理を行う(ステップS21~S28)。i=1,AllRows,1は、センサ電極121(i,j)の特定を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、選択している行iにおける逆数の最小値Minimum(i)の初期値を近接判定閾値に設定する(ステップS22)。ステップS23からステップS27の処理を繰り返すことで、選択している行iにおける逆数の最小値Minimum(i)は、選択している行iに含まれる全ての列jについて求められた逆数の最小値になる。また、近接判定閾値は、指先FTが操作入力を行うために操作面105に近接しているかどうかを判定する閾値である。行iにおける差分値ΔAD(i,j)の逆数Reciprocal(i,j)が全ての列jにおいて、近接閾値以下の場合、行iにおける逆数の最小値Minimum(i)には、近接閾値が代入される。近接閾値が代入された行iは、後述する通り、除外行に特定される。尚、逆数の最小値Minimum(i)の初期値は、近接判定閾値以上の値に設定すればよい。例えば、プログラム言語の制約上、最小値Minimum(i)に代入できる最大の値に設定しても良い。この場合、常に、行iにおける逆数の最小値が、Minimum(i)に代入される。
判定部134は、選択した行iにおいて、全ての列jの逆数の最小値と、その最小値を与えるセンサ電極121(i,j)を特定するループ処理を行う(ステップS23~S27)。j=1,AllColumns,1は、最小値とセンサ電極121(i,j)の特定を列数j=1からAllColumnsまで1列ずつ行うことを意味する。
判定部134は、逆数Reciprocal(i,j)が最小値Minimum(i)よりも小さいかどうかを判定する(ステップS24)。
判定部134は、逆数Reciprocal(i,j)が最小値Minimum(i)よりも小さい(S24:Yes)と判定すると、最小値Minimum(i)を逆数Reciprocal(i,j)に置き換える(ステップS25)。i行目における最小値Minimum(i)を更新するためである。判定部134は、行番号iを要素とする配列データとして、ステップS25で更新した最小値Minimum(i)をメモリ137に格納する。
判定部134は、i行目で最小値Minimum(i)を与える列Column(i)にjを代入する(ステップS26)。すなわち、Column(i)=jとなる。Column(i)は、i行目において、逆数が最小になる列番号を表す。例えば、2行目において3列目が最小ならば、Reciprocal(2,3)<Minimum(2)が成り立つ。更に、Reciprocal(2,4)<Minimum(2)、Reciprocal(2,5)<Minimum(2)、Reciprocal(2,6)<Minimum(2)は成り立たない。よって、Column(2)=3となる。判定部134は、ステップS26で求められた値をメモリ137に格納する。
判定部134は、選択した行iについて、逆数の最小値と、その最小値を与えるセンサ電極121(i,j)を特定するためにステップS23~S27のループ処理を行う。
判定部134は、全ての行における逆数の最小値と、その最小値を与えセンサ電極121(i,j)を特定するまでステップS21~28のループ処理を行う。これにより、全ての行における逆数の最小値と、その最小値を与えるセンサ電極121(i,j)が特定される。
次に、図11を用いて、図8のステップS5のサブルーチン「sub除外行特定」に基づき行われる除外行を特定する処理について説明する。
判定部134は、i=1からAllRows-1までの全ての行iについて、行iにおける逆数の最小値が1行下の行i+1における逆数の最小値の2倍以上であれば行iを除外するループ処理を行うステップS31~S34)。
ここで、1行下の行i+1は、ある行iの-Y方向側に隣接する行である。i=1,AllRows-1,1は、除外する行の特定を行数i=1からAllRows-1まで1行ずつ選択しながら行うことを意味する。行数AllRows-1まで繰り返す処理にするのは、行AllRowsについては1行下の行が存在しないからである。
除外行を特定する処理において、行iにおける逆数の最小値が1行下の行i+1における逆数の最小値の2倍以上であれば行iを除外するのは、指先FTに近い空間を指と誤認識しないためである。センサ電極121(i,j)に対向する位置に指が無くても、センサ電極121(i,j)の近くに指があると、静電容量が大きくなる。この為、静電容量の逆数と閾値との比較のみでは、空間を指と誤認識することがある。センサ電極121に指が対向せず、センサ電極121の近くに指があると、センサ電極121(i,j)の静電容量値と、隣接するセンサ電極121(i+1、j)の静電容量値が大きく異なる。指先FTの先端と重なっている行は逆数の最小値が小さく、指先FTの先端と重なっている行よりも1行上の行は指先FTの先端と重なっていないため、逆数の最小値は大きくなる。このような指先FTの先端と重なる行と、1行上の行とでは逆数の最小値が大きく異なる。ここでは一例として、逆数の最小値が2倍以上になる位置を指先FTの先端の1行上の位置と捉えて、行iにおける逆数の最小値が1行下の行i+1における逆数の最小値の2倍以上であれば行iを除外することとする。この場合には、行i+1が指先FTの先端と重なっていて、行iは指先FTの先端と重なっていないため、除外されることになる。
判定部134は、選択した行iについて、行iにおける逆数の最小値Minimum(i)が1行下の行i+1における逆数の最小値Minimum(i+1)の2倍以上であるかどうかを判定する(ステップS32)。
判定部134は、最小値Minimum(i)が最小値Minimum(i+1)の2倍以上である(S32:Yes)と判定すると、Except1(i)に"除外"を代入する(ステップS33A)。Except1(i)に"除外"が代入された行iは、後述する尖鋭度の算出の対象外となる行である。判定部134は、Except1(i)を、行番号iを要素とする配列データとしてメモリ137に格納する。
一方、判定部134は、最小値Minimum(i)が最小値Minimum(i+1)の2倍以上ではない(S32:No)と判定すると、Except1(i)に"対象"を代入する(ステップS33B)。Except1(i)に"対象"が代入された行iは、後述する尖鋭度の算出の対象になり得る行である。判定部134は、Except1(i)を、行番号iを要素にする配列データとしてメモリ137に格納する。
判定部134は、全ての行iについて、行iにおける逆数の最小値が1行下の行i+1における逆数の最小値の2倍以上であれば行iを除外行として記憶する処理が完了するまでステップS31~S34のループ処理を行う。
次に、判定部134は、一番下の行であるAllRowsを対象の行に設定する(ステップS35)。すなわちExcept1(AllRows)="対象"となる。1番下の行であるAllRowsは、1行下の行が存在しないため、ここでは対象に設定することとしている。
次に、判定部134は、i=2からAllRowsまでの全ての行iについて、行iにおける逆数の最小値が1行上の行i-1における逆数の最小値の2倍以上であれば行iを除外するループ処理を行う(ステップS36~S39)。
ここで、1行上の行i-1は、ある行iの+Y方向側に隣接する行である。i=2,AllRows,1は、除外する行の特定を行数i=2からAllRowsまで1行ずつ選択しながら行うことを意味する。行数i=1を除外するのは、一番上の行については1行上の行が存在しないからである。
除外行を特定する処理において、行iにおける逆数の最小値が1行上の行i-1における逆数の最小値の2倍以上であれば行iを除外するのは、指先FTに近い空間を指と誤認識しないためである。2倍以上であれば行iを除外するのは、行iと1行上の行i-1との両方に指先FTが存在すれば、行iにおける逆数の最小値が1行上の行i-1における逆数の最小値の2倍以上になることはないからであり、また、ステップS31~S34のループ処理と揃えたものである。
判定部134は、選択した行iについて、行iにおける逆数の最小値Minimum(i)が1行上の行i-1における逆数の最小値Minimum(i-1)の2倍以上であるかどうかを判定する(ステップS37)。
判定部134は、最小値Minimum(i)が最小値Minimum(i-1)の2倍以上である(S37:Yes)と判定すると、Except2(i)に"除外"を代入する(ステップS38A)。Except2(i)に"除外"が代入された行iは、後述する尖鋭度の算出の対象外となる行である。判定部134は、Except2(i)を、行番号iを要素にする配列データとしてメモリ137に格納する。
一方、判定部134は、最小値Minimum(i)が最小値Minimum(i-1)の2倍以上ではない(S37:No)と判定すると、Except2(i)に"対象"を代入する(ステップS38B)。Except2(i)="対象"が代入された行iは、後述する尖鋭度の算出の対象になり得る行である。判定部134は、Except2(i)を、行番号iを要素とする配列データとしてメモリ137に格納する。
判定部134は、全ての行iについて、行iにおける逆数の最小値が1行上の行i-1における逆数の最小値の2倍以上であれば行iを除外行として記憶する処理が完了するまでステップS36~S39のループ処理を行う。
次に、判定部134は、一番上の行であるi=1を対象の行に設定する(ステップS40)。すなわちExcept2(1)="対象"となる。1番上の行は、1行上の行が存在しないため、ここでは対象に設定することとしている。
次に、判定部134は、i=1からAllRowsまでの全ての行iについて、行iにおける逆数の最小値が近接判定閾値以上であれば行iを除外するループ処理を行う(ステップS41~S44)。
i=1,AllRows,1は、除外する行の特定を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。また、行iにおける逆数の最小値が近接判定閾値以上であれば行iを除外するのは、行iに指先FTが存在しているかどうかを判定するためである。
判定部134は、選択した行iについて、行iにおける逆数の最小値Minimum(i)が近接判定閾値以上であるかどうかを判定する(ステップS42)。
判定部134は、最小値Minimum(i)が、近接判定閾値以上である(S42:Yes)と判定すると、Except3(i)に"除外"を代入する(ステップS43A)。近接判定閾値未満であれば、センサ電極121(i,j)の近くに導体が無い。Except3(i)に"除外"が代入される行iは、後述する尖鋭度の算出の対象外となる行である。判定部134は、Except3(i)を、行番号iを要素にする配列データとしてメモリ137に格納する。この実施形態では、行iにおける逆数の最小値が近接閾値以上だった場合、Minimun(i)=近接判定閾値が設定されている。この為、逆数の最小値が近接閾値以上だった行iは、Except3(i)に"除外"が代入される。
一方、判定部134は、近接判定閾値以上ではない(S42:No)と判定すると、Except3(i)に"対象"を代入する(ステップS43B)。Except3(i)に"対象"が代入された行iは、後述する尖鋭度の算出の対象になり得る行である。判定部134は、Except3(i)を、行番号iを要素にする配列データとして、メモリ137に格納する。
判定部134は、全ての行iについて、行iにおける逆数の最小値が近接判定閾値以上であれば行iを除外する処理が完了するまでステップS41~S44のループ処理を行う。
次に、判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、除外する行を決定するループ処理を行う(ステップS45~S48)。i=1,AllRows,1は、除外する行を決定するために選択する行をi=1からAllRowsまで1行ずつ選択することを意味する。
判定部134は、選択している行iについて、Except1(i)="対象"、Except2(i)="対象"、かつ、Except3(i)="対象"であるかどうかを判定する(ステップS46)。
判定部134は、ステップS46でYesと判定すると、Except(i)に"対象"を代入する(ステップS47A)。Except(i)に"対象"が代入される行iは、後述する尖鋭度の算出の対象になる行である。Except(i)に"対象"が代入される行iは、手に対向するセンサ電極121(i,j)が存在する。判定部134は、Except(i)を、行番号iを要素とする配列データとしてメモリ137に格納する。判定部134は、ステップS47Aの処理を終えるとステップS48に進行する。
一方、判定部134は、Except1(i)、Except2(i)、Except3(i)の少なくとも一つが"除外"であれば、ステップS46でNoと判定する。ステップS46でNoと判定すると、Except(i)に"除外"を代入する(ステップS47B)。Except(i)に"除外"が代入される行iは、後述する尖鋭度の算出の対象にならない行である。Except(i)に"除外"が代入される行iは、手に対向するセンサ電極121(i,j)が存在しない。つまり、Except(i)に"除外"が代入される行iのセンサ電極121(i,j)は、空間に対向する。判定部134は、Except(i)を、行番号iを要素とする配列データとしてメモリ137に格納する。
判定部134は、全ての行iについて、除外する行を決定する処理が完了するまでステップS45~S48のループ処理を行う。以上により、全ての行iの中から除外される行iが決定する。
次に、図12を用いて、図8のステップS6のサブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理について説明する。図12は、サブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理を表すフローチャートを示す図である。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、尖鋭度を算出するループ処理を行う(ステップS51~S57)。i=1,AllRows,1は、尖鋭度の算出を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、選択している行iについて、Except(i)="対象"であるかどうかを判定する(ステップS52)。対象でなければ尖鋭度を算出しない。
判定部134は、Except(i)="対象"である(S52:Yes)と判定すると、i行目で最小値Minimum(i)を与える列Column(i)が1列目であるかどうかを判定する(ステップS53)。すなわち、i行目についてColumn(i)=1であるかどうかを判定する。i行目で最小値Minimum(i)が1列目(-X方向側の端の列)で得られているかどうかを判定するためである。
判定部134は、Column(i)=1ではない(S53:No)と判定すると、Column(i)=AllColumnsであるかどうかを判定する(ステップS54)。すなわち、i行目についてColumn(i)=AllColumnsであるかどうかを判定する。i行目で最小値Minimum(i)がAllColumnsで表される+X方向側の端の列で得られているかどうかを判定するためである。
判定部134は、Column(i)=AllColumnsではない(S54:No)と判定すると、jにColumn(i)を代入する(ステップS55A)。即ち、Column(i)が、端以外を示す場合に、jにColumn(i)を代入する。Column(i)は、i行目で最小値Minimum(i)を示す列を表す(ステップS26参照)。
判定部134は、尖鋭度Apex(i)を算出する(ステップS56)。尖鋭度Apex(i)は、次式に従って求める。
Apex(i)=Reciprocal(i,j-1)-2Reciprocal(i,j)+Reciprocal(i,j+1)
判定部134は、ステップS52において、Except(i)="対象"ではない(S52:No)と判定すると、尖鋭度Apex(i)をゼロに設定する(ステップS52A)。すなわち、尖鋭度Apex(i)=0となる。尖鋭度の算出の対象にならない行であるため、尖鋭度Apex(i)をゼロに設定する。後述する通り、尖鋭度Apex(i)は、指先が位置する行を特定する際に用いられる。尖鋭度の算出の対象にならない行の尖鋭度Apex(i)に特定の数値(ゼロ)を設定することで、尖鋭度の算出の対象になる行と、尖鋭度の算出の対象にならない行を同一の手順で処理できる。後述する通り、この実施形態では、尖鋭度を算出すると正の値が算出される。後述する通り、尖鋭度が最も大きな行を指先がある行と判定する。よって、尖鋭度Apex(i)をゼロに設定することは、i行を指先ではないと設定することに等しい。判定部134は、ステップS52Aの処理を終えると、ステップS57に進行する。
また、判定部134は、ステップS53において、Column(i)=1である(S53:Yes)と判定すると、j=2に設定する(ステップS53A)。i行目で最小値Minimum(i)を与える列Column(i)が-X方向側の端の列(1列目)であるため、尖鋭度の算出に用いる3つの列の中央の列jを2列目に設定して、1列目から3列目の3つの逆数を用いて尖鋭度を算出するためである。判定部134は、ステップS53Aの処理を終えると、ステップS56に進行して尖鋭度を算出する。
また、判定部134は、ステップS54において、Column(i)=AllColumnsである(S54:Yes)と判定すると、j=AllColumns-1に設定する(ステップS55B)。i行目で最小値Minimum(i)を与える列Column(i)が+X方向側の端の列(AllColumnsで表される6列目)であるため、尖鋭度の算出に用いる3つの列の中央の列jをAllColumns-1(5列目)に設定して、4列目から6列目の3つの逆数を用いて尖鋭度を算出するためである。判定部134は、ステップS55Bの処理を終えると、ステップS56に進行して尖鋭度を算出する。
判定部134は、全ての行iについて、尖鋭度の算出が完了するまでステップS51~S57のループ処理を行う。
次に、図13を用いて、図8のステップS7のサブルーチン「sub指先特定」に基づき行われる指先FTの位置を特定する処理について説明する。指先FTの位置は、尖鋭度の最大値を表す最大尖鋭度MaxApexを含む行iにおけるColumn(i)が表す列jの位置として特定される。Column(i)は、各行について求められた逆数が最小の列を表す(ステップS26参照)。
判定部134は、最大尖鋭度MaxApexの初期値をゼロに設定する(ステップS61)。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、指先FTの位置を特定するループ処理を行う(ステップS62~S66)。i=1,AllRows,1は、指先FTの位置の特定を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、選択している行iについて、尖鋭度Apex(i)が最大尖鋭度MaxApexよりも大きいかどうかを判定する(ステップS63)。ステップS63の処理を繰り返すことによって最大尖鋭度MaxApexを更新し、最終的に最大尖鋭度MaxApexを与える行iを特定する。
判定部134は、尖鋭度Apex(i)が最大尖鋭度MaxApexよりも大きい(S63:Yes)と判定すると、最大尖鋭度MaxApexを尖鋭度Apex(i)に更新する(ステップS64)。
判定部134は、最大尖鋭度MaxApexを与える尖鋭度Apex(i)の行iを変数rowに代入する。(ステップS65)。
判定部134は、全ての行iについてステップS61~S66のループ処理を行うことにより、最大尖鋭度を示す行番号がrowに代入される。
ステップS61~S66のループ処理が終了すると、前述した図8のメインループのS8の処理が行われる。前述した通り、指の先端が位置する行の番号は、rowに代入されている。また、Column(i)に各行で逆数が最小になる列番号が代入されている。この為、(row、Column(Row))を、指の先端の座標として出力する(ステップS8)。
次に、図14及び図15を用いて、差分値ΔADが得られてから指先FTの位置を特定するまでの具体例について説明する。図14は、差分値ΔADの分布、逆数の分布、及び、Column(i)が表す逆数の最小値Minimum(i)を与える列jを示す図である。
図14(A)は、5行6列のセンサ電極121で得られた差分値ΔADの分布を示す図である。操作入力は、図2及び図3に示すように、2行目3列目のセンサ電極121(2,3)について行われていることとする。
図14(B)は、図14(A)に示す差分値ΔADの逆数を1000倍した値を示す。図14(C)は、ΔADの逆数を1000倍した値の各行における最小値Minimum(i)と、最小値Minimum(i)を示す電極の列番号Column(i)との関係を示す図である。但し、1行目は、最小値Minimum(1)に近接判定閾値の5が代入される。1行目は、差分値ΔADの逆数を1000倍した値が全て近接判定閾値の5を超えているので、最小値Minimum(1)の初期値に設定された近接判定閾値(5)が、最小値として代入される。また、1行目の最小値の列Column(i)は、値が定められず、図14(C)では、"-"と記載する。尚、最小値の列Column(i)が、定められなかった場合、前回の演算結果が維持される。いずれにせよ、最小値Minimum(1)は、近接判定閾値(5)が設定されているので、尖端度算出の対象にならない。尖端度算出の対象にならないi行のColumn(i)の値が何であっても、処理結果に影響を与えない。尚、最小値Minimum(i)の初期値を最小値Minimum(i)に代入できる最大の値に設定した場合は、常に、実際の最小値が、最小値Minimumu(i)に代入される。この場合も、尖端度算出の対象にならないので、その後の処理は同じになる。
図15は、尖鋭度を算出する対象、最小値Minimum(i)、尖鋭度算出の結果、最大の尖鋭度及び座標を示す図である。図15(A)は、最小値Minimum(i)の大きさと、隣接する行の最小値Minimum(i-1)、Minimum(i+1)との比較から、指先の位置の候補として尖鋭度を算出する対象になるかを示す図である。1行目は、「近接閾値以下」が成り立たない(FALSE)ので、対象外(対象がFALSE)になる。
図15(B)は、各行のおける最小値Minimum(i)と、その左右の差分値ΔADの逆数を1000倍した値を示す。1行目は尖鋭度算出の対象外であるため、図15(B)では、「-」を記載した。
図15(C)は、各行における尖鋭度算出の結果である。ここでは、一例として尖鋭度に二次関数の二次の係数を用いている。尖鋭度算出の対象外の行(1行目)は、0にする。
図15(D)は、最大の尖鋭度と、その最大の尖鋭度を示した座標を示す。ここでは、一例として尖鋭度に二次関数の二次の係数を用いている。図15(C)で最大の値は0.73なので、最大の二次係数は、0.73である。最大の二次係数(0.73)は、図15(C)の2行目に記されているので、最大の二次係数の行は2行目である。2行目で最小値の列Column(2)は、図14(C)より、3列目である。よって、2行目の3列目が、指先の位置である。
以上のように、指先FTの位置を特定できる。したがって、センサ電極121から離れた位置にある指先FTの位置を精度よく判定可能な非接触入力装置100Aを提供することができる。すなわち、非接触操作の有無と操作の位置を判定可能な非接触入力装置100Aを提供することができる。
<第1変形例による尖鋭度を算出する処理>
図16は、第1変形例によるサブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理を表すフローチャートを示す図である。図16に示す処理は、ステップS56の処理が図12に示すステップS56の処理と異なる。ここでは図12に示す処理との違いについて説明する。
図16に示す処理では、判定部134は、次の3つの点を通る円の曲率を尖鋭度Apex(i)として算出する(ステップS56)。3つの点は、(j-1,Reciprocal(i,j-1))、(j,Reciprocal(i,j))、(j+1,Reciprocal(i,j+1))で表される。
ここで、列jをx軸、逆数Reciprocalをz軸とするxz座標において、j-1、j、j+1をx1、x2、x3とし、Reciprocal(i,j-1)、Reciprocal(i,j)、Reciprocal(i,j+1)をz1、z2、z3とする。この状態を図17に示す。図17は、xz座標と指先FTとの関係を示す図である。
3つの点を通る円の中心の座標(xp、zp)は、次式(1)、(2)で表される。
また、3つの点を通る円の中心の座標(xp、zp)を用いると、円の半径rは次式(3)で求めることができる。
判定部134は、尖鋭度Apex(i)を曲率(半径の逆数1/r)として求める。すなわち、尖鋭度Apex(i)=1/rである。
<第2変形例による尖鋭度を算出する処理>
図18は、第2変形例によるサブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理を表すフローチャートを示す図である。図18に示す処理は、ステップS56の処理が図12に示すステップS56の処理と異なる。ここでは図12に示す処理との違いについて説明する。
図18に示す処理では、判定部134は、i行において隣り合う5つの点を用いて、最小二乗法によるカーブフィッティングで5つの点に近似する二次曲線を求め、曲線の二次の係数を尖鋭度Apex(i)として算出する(ステップS56)。
i行において隣り合う5つの点は、(j-2,Reciprocal(i,j-2))、(j-1,Reciprocal(i,j-1))、(j,Reciprocal(i,j))、(j+1,Reciprocal(i,j+1))、(j+2,Reciprocal(i,j+2))である。
<第3変形例による尖鋭度を算出する処理>
図19は、第3変形例によるサブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理を表すフローチャートを示す図である。図19に示す処理は、ステップS56の処理が図12に示すステップS56の処理と異なる。ここでは図12に示す処理との違いについて説明する。
図19に示す処理では、判定部134は、i行において隣り合う5つの点を用いて、カーブフィッティングにより最小二乗法で5つの点に近似する円周を求め、曲線の曲率を尖鋭度Apex(i)として算出する(ステップS56)。
i行において隣り合う5つの点は、(j-2,Reciprocal(i,j-2))、(j-1,Reciprocal(i,j-1))、(j,Reciprocal(i,j))、(j+1,Reciprocal(i,j+1))、(j+2,Reciprocal(i,j+2))である。
<第4変形例による指先を特定する処理>
図20は、第4変形例によるサブルーチン「sub指先特定」に基づき行われる指先を特定する処理を表すフローチャートを示す図である。図20に示す処理は、図13に示すフローの代わりに実行可能である。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、指、掌P、空間のいずれであるかを判定するループ処理を行う(ステップS71~S74)。i=1,AllRows,1は、指、掌P、空間の判定を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、ステップS6で算出した尖鋭度Apex(i)が掌閾値以上であるかどうかを判定する(ステップS72)。掌閾値は、尖鋭度Apex(i)が指のものであるか、掌Pのものであるかを区別する値であり、指先FTである場合の最小値である。
判定部134は、尖鋭度Apex(i)が掌判定値以上である(S71:YES)と判定すると、Palm(i)は指であると判定する(ステップS73A)。
判定部134は、ステップS72において、尖鋭度Apex(i)が掌判定値以上ではない(S71:NO)と判定すると、尖鋭度Apex(i)が正の値であるかどうかを(ステップS72A)。掌Pが存在するか、掌Pが存在せずに空間であるかを判定するためである。
判定部134は、尖鋭度Apex(i)が正の値である(S72A:YES)と判定すると、Palm(i)は掌であると判定する(ステップS73B)。
一方、判定部134は、ステップS72Aにおいて、尖鋭度Apex(i)が正の値ではない(S72A:NO)と判定すると、Palm(i)は空間であると判定する(ステップS73C)。図12のステップS52Aにおいて、空間の場合、Apex(i)に0が入力されている。
判定部134は、全ての行iについてステップS71~S74のループ処理を行うことにより、掌Pを示す行番号がPalm(i)に代入される。
判定部134は、i=AllRows-1から1行目まで行iを1つずつ選択しながら、下側の掌Pから出ている指を判定するループ処理を行う(ステップS75~S77)。i=AllRows-1,1,-1は、下側の掌Pから出ている指の判定を行数i=AllRows-1から1行目まで1行ずつ選択しながら行うことを意味する。なお、下側の掌Pから出ている指とは、-Y方向側に掌Pが位置し、指が+Y方向にでていることをいう。
判定部134は、Palm(i)が指で、かつ、Palm(i+1)が掌Pであるかどうかを判定する(ステップS76)。i行目に指があり、-X方向側のi+1行目に掌Pがあるかどうかを判定する処理である。
判定部134は、Palm(i)が指で、かつ、Palm(i+1)が掌Pである(S76:YES)と判定すると、フローをステップS78に進行させる。一方、判定部134は、Palm(i)が指で、かつ、Palm(i+1)が掌Pを満たす行iが存在しないと、「下側の掌から出ている指を判定」のループ処理(S75からS77)を終了し、フローをステップS83に進行させる。
判定部134は、全ての行iについてステップS75~S77のループ処理を行うことにより、下側の掌Pから出ている指であるかどうかを判定する。
判定部134は、i=AllRows-1から2行目まで行iを1行ずつ選択しながら、指先FTが位置する行iを判定する「指先を判定」のループ処理を行う(ステップS78からステップS80)。i=AllRows-1,2,-1は、下側の掌Pから出ている指の判定を行数i=AllRows-1から2行目まで1行ずつ選択しながら行うことを意味する。
判定部134は、Palm(i)が指で、かつ、Palm(i-1)が空間であるかどうかを判定する(ステップS79)。i行目に指があり、+X方向側のi-1行目に空間があるかどうかを判定する処理である。
判定部134は、Palm(i)が指で、かつ、Palm(i-1)が空間である(S79:YES)と判定すると、フローをステップS82に進行させる。一方、判定部134は、Palm(i)が指で、かつ、Palm(i-1)が空間を満たす行iが存在しないと、「指先を判定」のループ処理(S78からS80)を終了し、フローをステップS81に進行させる。
判定部134は、ステップS81において、iに1を代入する(ステップS81)。掌Pから延びる指が静電センサ120の端に達している場合、静電センサ120の端に指先FTがあると見なす。つまり、+X方向側に空間がない場合、1行目に指先FTが位置するとみなす。判定部134は、ステップS81の処理を終えるとフローをステップS82に進行させる。
判定部134は、ステップS81に続くステップS82において、ステップS81において決定したi行を変数rowに代入する(ステップS82)。すなわち、row=1である。指先FTが1行目に位置することになる。
判定部134は、ステップS82の処理を終えると、図20に示すサブルーチン「sub指先特定」の指先の位置を特定する処理を終了し(エンド)、前述したメインループS8の処理を行う。
また、ステップS79において、判定部134は、Palm(i)が指で、かつ、Palm(i-1)が空間である(S79:Yes)と判定すると、ステップS82に進行する。この場合には、Palm(i)が指で、かつ、Palm(i-1)が空間である(S79:YES)i行を変数rowに代入する(ステップS82)。指先FTは、ステップS79においてPalm(i)が指で、かつ、Palm(i-1)が空間である(S79:YES)と判定されたi行に位置する。
判定部134は、ステップS82の処理を終えると、図20に示すサブルーチン「sub指先特定」の尖鋭度を算出する処理を終了する(エンド)。
判定部134は、ステップS83において、i=2からAllRowsまで行iを1つずつ選択しながら、上側の掌Pから出ている指を判定するループ処理を行う(ステップS83~S85)。i=2,AllRows,1は、上側の掌Pから出ている指の判定を行数i=2からAllRowsまで1行ずつ選択しながら行うことを意味する。なお、上側の掌Pから出ている指とは、+Y方向側に掌Pが位置し、指が-Y方向にでていることをいう。
判定部134は、Palm(i)が指で、かつ、Palm(i-1)が掌Pであるかどうかを判定する(ステップS84)。i行目に指があり、+X方向側のi-1行目に掌Pがあるかどうかを判定する処理である。
判定部134は、Palm(i)が指で、かつ、Palm(i-1)が掌Pである(S84:YES)と判定すると、フローをステップS86に進行させる。一方、判定部134は、Palm(i)が指で、かつ、Palm(i-1)が掌Pを満たす行iが存在しないと「上側の掌から出ている指を判定」のループ処理(ステップS83~S85)を終了し、フローをステップS90に進行させる。掌Pが静電センサ120より外側にある場合、ステップS90に進行させる。
判定部134は、全ての行iについてステップS83~S85のループ処理を行うことにより、上側の掌Pから出ている指であるかどうかを判定する。
判定部134は、i=2からAllRowsまで行iを1行ずつ選択しながら、指先FTが位置する行iを判定する「指先を判定」のループ処理を行う(ステップS86からステップS89)。i=2,AllRows,1は、下側の掌Pから出ている指の判定を行数i=2からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、Palm(i)が指で、かつ、Palm(i+1)が空間であるかどうかを判定する(ステップS87)。i行目に指があり、-X方向側のi+1行目に空間があるかどうかを判定する処理である。
ステップS87において、判定部134は、Palm(i)が指で、かつ、Palm(i+1)が空間である(S87:YES)と判定すると、フローをステップS82に進行させる。この場合、判定部134は、Palm(i)が指で、かつ、Palm(i+1)が空間である(S87:YES)i行を変数rowに代入する(ステップS82)。指先FTは、ステップS87においてPalm(i)が指で、かつ、Palm(i+1)が空間である(S87:YES)と判定されたi行に位置することになる。
一方、判定部134は、Palm(i)が指で、かつ、Palm(i+1)が空間を満たす行iが存在しないと「指先を判定」のループ処理を終了し、フローをステップS89に進行させる。
判定部134は、iにAllrowsを代入する(ステップS89)。掌Pから延びる指が静電センサ120の端に達している場合、静電センサ120の端に指先FTがあると見なす。つまり、-X方向側に空間がない場合、静電センサ120の端の行のAllrowsに指先FTが位置するとみなす。
掌Pが静電センサ120より外側にある場合、判定部134は、最大尖鋭度MaxApexの初期値をゼロに設定する(ステップS90)。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、「指先位置特定」のループ処理を行う(ステップS91からステップS95)。i=1,AllRows,1は、指先FTの位置の特定を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、選択している行iについて、尖鋭度Apex(i)が最大尖鋭度MaxApexよりも大きいかどうかを判定する(ステップS92)。ステップS91~S95の処理を繰り返すことによって最大尖鋭度MaxApexを更新し、最終的に最大尖鋭度MaxApexを与える行iを特定する。
判定部134は、尖鋭度Apex(i)が最大尖鋭度MaxApexよりも大きい(S93:Yes)と判定すると、最大尖鋭度MaxApexを尖鋭度Apex(i)に更新する(ステップS93)。
判定部134は、最大尖鋭度MaxApexを与える尖鋭度Apex(i)の行iを変数rowに代入する。(ステップS94)。
判定部134は、全ての行iについてステップS91~S95のループ処理を行うことにより、最大尖鋭度を示す行番号がrowに代入される(ステップS95)。
判定部134は、ステップS91~S95のループ処理を終了すると、前述したメインループのS8の処理を行う。
<第5変形例による指先FTの位置の求める処理>
次に、図21乃至図23のフローチャートを用いて、第5変形例による指先FTの位置の求め方について説明する。図21乃至図23は、第5変形例による指先FTの位置の求める処理を表すフローチャートを示す図である。この処理は、判定部134によって実行される。図21は、メインのフローを示し、図22及び図23は、それぞれ、図21におけるステップS103及びS109のサブルーチン処理のフローを示す。また、図21におけるステップS104乃至S108のサブルーチン処理については、図9乃至図13の「sub逆数変換」、「sub最小値判定」、「sub除外行特定」、「sub尖鋭度算出」、「sub指先特定」を援用し、ここでは説明を省略する。なお、ここでは、一例として図3に示す電子機器100の-Y方向側、+Y方向側、-X方向側、+X方向側のすべての方向から操作面105に向けて手Hを電子機器100に翳して操作入力を行うことが可能であるものとして説明する。
判定部134は、処理がスタートすると、メモリ137からセンサ電極121の行数と列数を読み込む(ステップS101)。TemporalAllRowsはセンサ電極121の行数を表し、TemporalAllColumnsはセンサ電極121の列数を表す。一例としてTemporalAllRowsは5行であり、TemporalAllColumnsは6列である。
次に、判定部134は、全センサ電極121についての差分値ΔAD(1,1)~ΔAD(AllRows,AllColumns)を取得し、TemporalCapa(1,1)~TemporalCapa(AllRows,AllColumns)に入力する(ステップS102)。ステップS102の処理により、一例として30個のセンサ電極121についての30個の差分値TemporalCapa(1,1)~TemporalCapa(AllRows,AllColumns)が得られる。
次に、判定部134は、サブルーチン「sub縦横変換」を呼び出し、縦横変換が必要な場合、行iと列jを入れ替えて、TemporalCapa(i,j)をCapacitance(j,i)に入力する。判定部134は、縦横変換が必要ない場合、TemporalCapa(i,j)をCapacitanceに入力する(ステップS103)。
次に、判定部134は、サブルーチン「sub逆数変換」を呼び出し、全ての差分値ΔAD(1,1)~ΔAD(AllRows,AllColumns)を逆数に変換する(ステップS104)。
次に、判定部134は、サブルーチン「sub最小値判定」を呼び出し、全ての行における逆数の最小値を判定し、逆数の最小値を示す列を求める処理を行う(ステップS105)。
次に、判定部134は、サブルーチン「sub除外行特定」を呼び出し、除外行を特定する処理を行う(ステップS106)。除外行とは、手Hが存在していない行であり、手が存在しない行を特定して除外することで、手が存在する行に絞り込む処理である。
次に、判定部134は、サブルーチン「sub尖鋭度算出」を呼び出し、手が存在する行について尖鋭度を算出する処理を行う(ステップS107)。
次に、判定部134は、サブルーチン「sub指先の行の特定」を呼び出し、ステップS107で手が存在する全ての行について算出した尖鋭度に基づいて、指先FTの行を特定する処理を行う(ステップS108)。
次に、判定部134は、サブルーチン「sub縦横戻し」を呼び出し、縦横戻し処理を行う(ステップS109)。
最後に、判定部134は、指先FTの先端の位置を表す座標を出力する(ステップS110)。ここで、rowは、指先FTが位置する行番号を表す。また、column(i)は、i行で逆数が最小の列番号を表すため、column(row)は、row行で、逆数が最小の列番号を表す。
次に、図22を用いて、図21のステップS103のサブルーチン「sub縦横変換」に基づき行われる縦横変換処理について説明する。
判定部134は、ステップS102の処理で得られたTemporalCapa(1,1)~TemporalCapa(AllRows,AllColumns)の中から、BigX(1)=最も静電容量値が大きいセンサ電極121のX座標、BigY(1)=最も静電容量値が大きいセンサ電極121のY座標、BigX(2)=2番目に静電容量値が大きいセンサ電極121のX座標、BigY(2)=2番目に静電容量値が大きいセンサ電極121のY座標、BigX(3)=3番目に静電容量値が大きいセンサ電極121のX座標、BigY(3)=3番目に静電容量値が大きいセンサ電極121のY座標、BigX(4)=4番目に静電容量値が大きいセンサ電極121のX座標、BigY(4)=4番目に静電容量値が大きいセンサ電極121のY座標、BigX(5)=5番目に静電容量値が大きいセンサ電極121のX座標、及び、BigY(5)=5番目に静電容量値が大きいセンサ電極121のY座標を取得する(ステップS111)。なお、X座標は、センサ電極121の行iの番号であり、Y座標は列jの番号である。
判定部134は、(BigX(1),BigY(1)),(BigX(2),BigY(2)),(BigX(3),BigY(3)),(BigX(4),BigY(4)),(BigX(5),BigY(5))から、BigX(i)とBigY(i)の共分散の絶対値及びBigX(i)の分散の絶対値を算出する(ステップS112)。
判定部134は、「BigX(i)とBigY(i)の共分散の絶対値」が「BigX(i)の分散の絶対値」以下かどうかを判定する(ステップS113)。
判定部134は、「BigX(i)とBigY(i)の共分散の絶対値」が「BigX(i)の分散の絶対値」以下である(S113:Yes)の場合は、行と列を入れ替えるために、AllRowsにTemporalAllColumnsを代入し、AllColumnsにTemporalAllRowsを代入する(ステップS114A)。すなわち、AllRows=TemporalAllColumns、AllColumns=TemporalAllRowsとなる。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、全ての行iを入れ替えるループ処理を行う(ステップS115A~S119A)。i=1,AllRows,1は、行iを入れ替える処理を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、j=1からAllColumnsまで列jを1つずつ選択しながら、全ての列jを入れ替えるループ処理を行う(ステップS116A~S118A)。j=1,AllColumns,1は、列jを入れ替える処理を列数j=1からAllColumnsまで1列ずつ選択しながら行うことを意味する。
判定部134は、位置(j,i)の静電容量Capacitance(j,i)にTemporalCapa(i,j)を代入する(ステップS117A)。これにより列と行が変換される。
判定部134は、全ての列jを入れ替えるまでステップS116A~S118Aのループ処理を行う(ステップS118A)。
判定部134は、全ての行iを入れ替えるまでステップS115A~S119Aのループ処理を行う。以上でサブルーチン「sub縦横変換」の処理が終了する(エンド)。
判定部134は、ステップS113において、「BigX(i)とBigY(i)の共分散の絶対値」が「BigX(i)の分散の絶対値」より大きい(S113:No)場合は、AllRowsにTemporalAllRowsを代入し、AllColumnsにTemporalAllColumnsを代入する(ステップS114B)。すなわち、AllRows=TemporalAllRows、AllColumns=TemporalAllColumnsとなる。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、全ての行iの差分値ΔADをコピーするループ処理を行う(ステップS115B~S119B)。i=1,AllRows,1は、コピーする処理を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、j=1からAllColumnsまで列jを1つずつ選択しながら、全ての列jの差分値ΔADをコピーするループ処理を行う(ステップS116B~S118B)。j=1,AllColumns,1は、コピーする処理を列数j=1からAllColumnsまで1列ずつ選択しながら行うことを意味する。
判定部134は、位置(i,j)の静電容量Capacitance(i,j)にTemporalCapa(i,j)を代入する(ステップS117B)。この場合は列と行は変換されない。
判定部134は、全ての列jをコピーするまでステップS116B~S118Bのループ処理を行う。
判定部134は、全ての行iをコピーするまでステップS115B~S119Bのループ処理を行う。以上でサブルーチン「sub縦横変換」の処理が終了する(エンド)。
次に、図23を用いて、図21のステップS109のサブルーチン「sub縦横戻し」に基づき行われる処理について説明する。
判定部134は、「BigX(i)とBigY(i)の共分散の絶対値」が「BigX(i)の分散の絶対値」以下であるかどうかを判定する(ステップS121)。縦横戻しを行うかどうかを判定するためである。ステップS121の分岐条件は、ステップS113と同一である。縦横を入れ替えて、一連の処理をした場合、出力する座標の縦横を入れ替えることで、指先の位置を正しく出力する。
判定部134は、「BigX(i)とBigY(i)の共分散の絶対値」が「BigX(i)の分散の絶対値」以下である(S121:Yes)と判定すると、変数rowの値と、変数column(Row)の値を入れ替える。この為、変数jに変数rowの値を保存してから、変数rowにcolumn(Row)を代入し、変数column(Row)に変数jの値を代入する(ステップS122)。判定部134は、ステップS122の処理を終えると、サブルーチン「sub縦横戻し」の処理を終了する(エンド)。
判定部134は、ステップS121において、「BigX(i)とBigY(i)の共分散の絶対値」が「BigX(i)の分散の絶対値」より大きい(S121:No)と判定すると、サブルーチン「sub縦横戻し」の処理を終了する(エンド)。
次に、図24及び図25を用いて、差分値ΔADが得られてから指先FTの位置を特定するまでの具体例について説明する。操作入力は、図2及び図3に示すように、2行3列のセンサ電極121(2,3)について行われていることとする。また、ここでは、ステップS104の「sub逆数変換」の処理において図14(A)に示す差分値ΔADと同一の結果が得られているとともに、ステップS107の「sub尖鋭度算出」において図15(C)の尖鋭度が得られているものとして説明する。
図24は、5行6列のセンサ電極121で得られた差分値ΔADの順位と、BigX(i)の分散の絶対値と、BigX(i)とBigY(i)の共分散の絶対値とを示す図である。図24(A)には、5行6列のセンサ電極121で得られた差分値ΔADの順位を示す。30個の差分値ΔADのうちの最も大きいセンサ電極121(3,2)が1位であり、最も小さいセンサ電極121(6,1)が30位である。
図24(B)には、図24(A)に示す差分値ΔADのうち、1位から5位のセンサ電極121のX座標(行i)とY座標(列j)を示す。1位から5位のセンサ電極121は、1番目から5番目に静電容量値が大きいセンサ電極121である。
図24(C)には、1番目から5番目に静電容量値が大きいセンサ電極121のX座標から求まる「BigX(i)の分散の絶対値」(0.16)と、「X座標及びY座標から求まるBigX(i)及びBigY(i)の共分散の絶対値」(0.24)とを示す。『「X座標及びY座標から求まるBigX(i)及びBigY(i)の共分散の絶対値」(0.24)≦「BigX(i)の分散の絶対値」(0.16)』が成り立たない。よって、この例では、縦横を入れ替えない。
図25は、図20に示す第4変形例による指先を特定する処理での判定結果を示す図である。図25(A)には、図15(C)の尖鋭度に基づいて、図20に示す指先を特定する処理での「空間、「指」、「掌」の判定結果を示す、図15(C)に上から下にかけて示すように、尖鋭度が0.00、0.73、0.41、0.34、0.03である場合に、「空間、「指」、「指」、「指」、「掌」と判定される。
図25(B)は、下側の掌Pから出ている指を判定するループ処理の判定結果であり、図25(A)の5つの判定結果を上から順番に2つずつ組み合わせた結果として、FALSE又はTRUEと判定されている。ここでは上側から判定を行う。図25(B)における一番上は、「空間、「指」であるためFALSEであり、上から2番目は「指」、「指」であるためFALSEであり、上から3番目は「指」、「指」であるためFALSEであり、上から4番目(一番下)は「指」、「掌」であるためTRUEである。TRUEが存在したので、下側の掌Pから上側に指が出ていると判断する。
図25(C)には、i行に指先FTがあるかどうかを判定するループ処理の判定結果を示す。下側の掌Pから指が出ていると判断したので、ここでは下側から判定を行う。図25(A)の判定結果から、図25(C)に示すように、上から4番目(一番下)は、i行が「指」でi-1行が「指」であるためFALSEであり、上から3番目はi行が「指」でi-1行も「指」であるためFALSEであり、上から2番目はi行が「指」でi-1行が「空間」であるためTRUEであり、一番上はi-1行が存在しないので判定を行っておらず、「-」で示す。TRUEになった上から2行目に、指先FTが存在する。
図25(D)には、指先の位置の特定結果を示す。2行目で最小値の列Column(2)は、図14(C)より、3列目である。よって、2行目の3列目が、指先の位置である。
以上のように、指先FTの位置を特定できる。したがって、センサ電極121から離れた位置にある指先FTの位置を精度よく判定可能な非接触入力装置100Aを提供することができる。
<第6変形例による指先FTの位置の求める処理>
次に、図26乃至図29のフローチャートを用いて、第6変形例による指先FTの位置の求め方について説明する。図26乃至図29は、第6変形例による指先FTの位置の求める処理を表すフローチャートを示す図である。この処理は、判定部134によって実行される。図26は、メインのフローを示し、図27乃至図29は、それぞれ、図26におけるステップS134乃至S136のサブルーチン処理のフローを示す。また、図26におけるステップS133、S137、及びS138のサブルーチン処理については、図22,図13、及び図23「sub縦横変換」、「sub指先の行の特定」、「sub縦横戻し」を援用し、ここでは説明を省略する。なお、ここでは、一例として図3に示す電子機器100の-Y方向側、+Y方向側、-X方向側、+X方向側のすべての方向から操作面105に向けて手Hを電子機器100に翳して操作入力を行うことが可能であるものとして説明する。
判定部134は、処理がスタートすると、メモリ137からセンサ電極121の行数と列数を読み込む(ステップS131)。TemporalAllRowsはセンサ電極121の行数を表し、TemporalAllColumnsはセンサ電極121の列数を表す。一例としてTemporalAllRowsは5行であり、TemporalAllColumnsは6列である。
次に、判定部134は、全センサ電極121についての差分値ΔAD(1,1)~ΔAD(AllRows,AllColumns)を取得し、TemporalCapa(1,1)~TemporalCapa(AllRows,AllColumns)に入力する(ステップS132)。ステップS102の処理により、一例として30個のセンサ電極121についての30個の差分値TemporalCapa(1,1)~TemporalCapa(AllRows,AllColumns)が得られる。
次に、判定部134は、サブルーチン「sub縦横変換」(図22参照)を呼び出す。サブルーチン「sub縦横変換」(図22参照)は、別の例で説明済みの為、説明を省略する。
次に、判定部134は、サブルーチン「sub最大値判定」(図27参照)を呼び出し、各行のCapacitance(i,j)の最大値を判定する(ステップS134)。
次に、判定部134は、サブルーチン「sub除外行特定」(図28参照)を呼び出し、除外行を特定する処理を行う(ステップS135)。除外行とは、手Hが存在していない行であり、手が存在しない行を特定して除外することで、手が存在する行に絞り込む処理である。
次に、判定部134は、サブルーチン「sub尖鋭度算出」(図29参照)を呼び出し、手が存在する行について尖鋭度を算出する処理を行う(ステップS136)。
次に、判定部134は、サブルーチン「sub指先特定」(図13参照)を呼び出し、ステップS136で手が存在する全ての行について算出した尖鋭度に基づいて、指先FTの行を特定する処理を行う(ステップS137)。
次に、判定部134は、サブルーチン「sub縦横戻し」(図23参照)を呼び出し、縦横戻し処理を行う(ステップS138)。
最後に、判定部134は、指先FTの先端の位置を表す座標を出力する(ステップS139)。ここで、rowは、指先FTが位置する行番号を表す。また、column(i)は、i行で静電容量値が最大の列番号を表すため、column(Row)は、row行で、静電容量値が最大の列番号を表す。
次に、図27を用いて、図26のステップS134のサブルーチン「sub最大値判定」に基づき行われる最大値判定処理について説明する。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、各行iの静電容量値の最大値とその電極を特定するループ処理を開始する(ステップS141~S148)。i=1,AllRows,1は、最大値とその電極を特定する処理を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、行iの静電容量値の最大値Maximum(i)の初期値を0に設定する(ステップS142)。すなわち、Maximum(i)=0となる。
判定部134は、j=1からAllColumnsまで列jを1つずつ選択しながら、i行の静電容量値の最大値とその電極を特定するループ処理を開始する(ステップS143~S147)。j=1,AllColumns,1は、最大値とその電極を特定する処理を列数j=1からAllColumnsまで1列ずつ選択しながら行うことを意味する。
判定部134は、静電容量値Capacitance(i)が最大値Maximum(i)よりも大きいかどうかを判定する(ステップS144)。
判定部134は、静電容量値Capacitance(i)が最大値Maximum(i)よりも大きい(S144:Yes)と判定すると、最大値Maximum(i)を静電容量値Capacitance(i,j)に置き換える(ステップS145)。i行目における最大値Maximum(i)を更新するためである。判定部134は、ステップS145で更新したi行目における最大値Maximum(i)をメモリ137に格納する。
判定部134は、i行目で最大値Maximum(i)を与える列Column(i)にjを代入する(ステップS146)。すなわち、Column(i)=jとなる。Column(i)は、i行目において、静電容量値が最大になる列番号を表す。判定部134は、ステップS146で求められた値をメモリ137に格納する。
判定部134は、選択した行iについて、静電容量値の最大値と、その最大値を与えるセンサ電極121(i,j)を特定するためにステップS143~S147のループ処理を行う。
判定部134は、全ての行における静電容量値の最大値と、その最大値を与えセンサ電極121(i,j)を特定するまでステップS141~148のループ処理を行う。これにより、全ての行における静電容量値の最大値と、その最大値を与えるセンサ電極121(i,j)が特定される。
次に、図28を用いて、図26のステップS135のサブルーチン「sub除外行特定」に基づき行われる除外行を特定する処理について説明する。
判定部134は、i=1からAllRows-1までの全ての行iについて、行iにおける静電容量値の最大値が1行下の行i+1における静電容量値の最大値の1/2未満であれば行iを除外するループ処理を行う(ステップS151~S154)。
ここで、1行下の行i+1は、ある行iの-Y方向側に隣接する行である。i=1,AllRows-1,1は、除外する行の特定を行数i=1からAllRows-1まで1行ずつ選択しながら行うことを意味する。行数AllRows-1まで繰り返す処理にするのは、行AllRowsについては1行下の行が存在しないからである。
除外行を特定する処理において、行iにおける静電容量値の最大値が1行下の行i+1における静電容量値の最大値の1/2未満であれば行iを除外するのは、指先FTの先端を見つけるためである。指先FTの先端と重なっている行は静電容量値の最大値が大きく、指先FTの先端と重なっている行よりも1行上の行は指先FTの先端と重なっていないため、静電容量値の最大値は小さくなる。このような指先FTの先端と重なる行と、1行上の行とでは静電容量値の最大値が大きく異なる。ここでは一例として、静電容量値の最大値が1/2未満になる位置を指先FTの先端の1行上の位置と捉えて、行iにおける静電容量値の最大値が1行下の行i+1における静電容量値の最大値の1/2未満であれば行iを除外することとする。この場合には、行i+1が指先FTの先端と重なっていて、行iは指先FTの先端と重なっていないため、除外されることになる。
判定部134は、選択した行iについて、行iにおける静電容量値の最大値Maximum(i)が1行下の行i+1における静電容量値の最大値Maximum(i+1)の1/2未満であるかどうかを判定する(ステップS152)。
判定部134は、1/2未満である(S152:Yes)と判定すると、Except1(i)に"除外"を代入する(ステップS153A)。Except1(i)に"除外"が代入された行iは、後述する尖鋭度の算出の対象外となる行である。判定部134は、Except1(i)を、行番号iを要素にする配列データとしてメモリ137に格納する。
一方、判定部134は、1/2未満ではない(S152:No)と判定すると、Except1(i)に"対象"を代入する(ステップS153B)。Except1(i)に"対象"が代入された行iは、後述する尖鋭度の算出の対象になり得る行である。判定部134は、Except1(i)を、行番号iを要素にする配列データとしてメモリ137に格納する。
判定部134は、全ての行iについて、行iにおける静電容量値の最大値が1行下の行i+1における静電容量値の最大値の1/2未満であれば行iを除外する処理が完了するまでステップS151~S154のループ処理を行う。
次に、判定部134は、一番下の行であるAllRowsを対象の行に設定する(ステップS155)。すなわちExcept1(AllRows)="対象"となる。1番下の行であるAllRowsは、1行下の行が存在しないため、ここでは対象に設定することとしている。
次に、判定部134は、i=2からAllRowsまでの全ての行iについて、行iにおける静電容量値の最大値が1行上の行i-1における静電容量値の最大値の1/2未満であれば行iを除外するループ処理を行う(ステップS156~S159)。
ここで、1行上の行i-1は、行iの+Y方向側に隣接する行である。i=2,AllRows,1は、除外する行の特定を行数i=2からAllRowsまで1行ずつ選択しながら行うことを意味する。行数i=1を除外するのは、一番上の行については1行上の行が存在しないからである。
除外行を特定する処理において、行iにおける静電容量値の最大値が1行上の行i-1における静電容量値の最大値の1/2未満であれば行iを除外するのは、指先FTに近い空間を指と誤認識しないためである。1/2未満であれば行iを除外するのは、行iと1行上の行i-1との両方に指先FTが存在すれば、行iにおける静電容量値の最大値が1行上の行i-1における静電容量値の最大値の1/2未満になることはないからであり、また、ステップS151~S154のループ処理と揃えたものである。
判定部134は、選択した行iについて、行iにおける静電容量値の最大値Maximum(i)が1行上の行i-1における静電容量値の最大値Maximum(i-1)の1/2未満であるかどうかを判定する(ステップS157)。
判定部134は、1/2未満である(S157:Yes)と判定すると、行iを除外行(Except2(i)="除外")であると判定する(ステップS158A)。Except2(i)="除外"と判定される行iは、後述する尖鋭度の算出の対象外となる行である。判定部134は、行番号iを要素にするデータとしてステップS158Aでの判定結果をメモリ137に格納する。
一方、判定部134は、1/2未満ではない(S157:No)と判定すると、Except2(i)に"対象"を代入する(ステップS158B)。Except2(i)に"対象"が代入された行iは、後述する尖鋭度の算出の対象になり得る行である。判定部134は、Except2(i)を、行番号iを要素にする配列データとしてステップS158Bでの判定結果をメモリ137に格納する。
判定部134は、全ての行iについて、行iにおける静電容量値の最大値が1行上の行i-1における静電容量値の最大値の1/2未満であれば行iを除外する処理が完了するまでステップS156~S159のループ処理を行う。
次に、判定部134は、一番上の行であるi=1を対象の行に設定する(ステップS160)。すなわちExcept2(1)に"対象"を代入する。1番上の行は、1行上の行が存在しないため、ここでは対象に設定することとしている。
次に、判定部134は、i=1からAllRowsまでの全ての行iについて、行iにおける静電容量値の最大値が近接判定閾値未満であれば行iを除外するループ処理を開始する(ステップS161~S164)。
i=1,AllRows,1は、除外する行の特定を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。また、行iにおける静電容量値の最大値が近接判定閾値未満であれば行iを除外するのは、行iに指先FTが存在しているかどうかを判定するためである。
判定部134は、選択した行iについて、行iにおける静電容量値の最大値Maximum(i)が近接判定閾値未満であるかどうかを判定する(ステップS162)。
判定部134は、静電容量値の最大値Maximum(i)が近接判定閾値未満である(S162:Yes)と判定すると、Except3(i)に"除外"を代入する(ステップS163A)。Except3(i)に"除外"が代入される行iは、後述する尖鋭度の算出の対象外となる行である。判定部134は、行番号iを要素にする配列データとしてExcept3(i)をメモリ137に格納する。
一方、判定部134は、静電容量値の最大値Maximum(i)が近接判定閾値未満ではない(S162:No)と判定すると、Except3(i)に"対象"を代入する(ステップS163B)。Except3(i)に"対象"が代入される行iは、後述する尖鋭度の算出の対象になり得る行である。判定部134は、Except3(i)を、行番号iを配列要素にする配列データとしてメモリ137に格納する。
判定部134は、全ての行iについて、行iにおける静電容量値の最大値が近接判定閾値未満であれば行iを除外する処理が完了するまでステップS161~S164のループ処理を行う。
次に、判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、除外する行を決定するループ処理を行う(ステップS165~S168)。i=1,AllRows,1は、除外する行を決定するために選択する行をi=1からAllRowsまで1行ずつ選択することを意味する。
判定部134は、選択している行iについて、Except1(i)="対象"、Except2(i)="対象"、かつ、Except3(i)="対象"であるかどうかを判定する(ステップS166)。
判定部134は、ステップS166でYesと判定すると、Except(i)に"対象"を代入する(ステップS167A)。Except(i)="対象"が代入される行iは、後述する尖鋭度の算出の対象になる行である。判定部134は、Except(i)を、行番号iを要素にする配列データとしてメモリ137に格納する。
一方、判定部134は、Except1(i)、Except2(i)、Except3(i)の少なくとも一つが"除外"であれば、ステップS166でNoと判定する。ステップS166でNoと判定すると、Except(i)に"除外"を代入する(ステップS167B)。Except(i)に"除外"が代入される行iは、後述する尖鋭度の算出の対象にならない行である。判定部134は、Except(i)を、行番号iを要素にする配列データとしてメモリ137に格納する。
判定部134は、全ての行iについて、除外する行を決定する処理が完了するまでステップS165~S168のループ処理を行う。以上により、全ての行iの中から除外される行iが決定する。
次に、図29を用いて、図26のステップS136のサブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理について説明する。図29は、サブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理を表すフローチャートを示す図である。
判定部134は、i=1からAllRowsまで行iを1つずつ選択しながら、尖鋭度を算出するループ処理を行う(ステップS171~S177)。i=1,AllRows,1は、尖鋭度の算出を行数i=1からAllRowsまで1行ずつ選択しながら行うことを意味する。
判定部134は、選択している行iについて、Except(i)="対象"であるかどうかを判定する(ステップS172)。対象でなければ尖鋭度を算出しないからである。
判定部134は、Except(i)="対象"である(S172:Yes)と判定すると、i行目で最大値Maximum(i)を与える列Column(i)が1列目であるかどうかを判定する(ステップS173)。すなわち、i行目についてColumn(i)=1であるかどうかを判定する。i行目で最大値Maximum(i)が1列目(-X方向側の端の列)で得られているかどうかを判定するためである。
判定部134は、Column(i)=1ではない(S173:No)と判定すると、Column(i)=AllColumnsであるかどうかを判定する(ステップS174)。すなわち、i行目についてColumn(i)=AllColumnsであるかどうかを判定する。i行目で最大値Maximum(i)がAllColumnsで表される+X方向側の端の列で得られているかどうかを判定するためである。
判定部134は、Column(i)=AllColumnsではない(S174:No)と判定すると、jにColumn(i)を代入する(ステップS175A)。即ち、Column(i)が、端以外を示す場合に、jにColumn(i)を代入する。Column(i)は、i行目で最大値Maximum(i)を示す列を表す(ステップS26参照)。
判定部134は、尖鋭度Apex(i)を算出する(ステップS176)。尖鋭度Apex(i)は、次式に従って求めることができる。判定部134は、尖鋭度Apex(i)を算出すると、ステップS177に進行する。
Apex(i)=-Capacitance(i,j-1)+2Capacitance(i,j)+Capacitance(i,j+1)
判定部134は、ステップS172において、Except(i)="対象"ではない(S172:No)と判定すると、尖鋭度Apex(i)をゼロに設定する(ステップS172A)。すなわち、尖鋭度Apex(i)に0を代入する。尖鋭度の算出の対象にならない行であるため、尖鋭度Apex(i)をゼロに設定することとしたものである。後述する通り、尖鋭度Apex(i)は、指先が位置する行を特定する際に用いられる。尖鋭度の算出の対象にならない行の尖鋭度Apex(i)に特定の数値(ゼロ)を設定することで、尖鋭度の算出の対象になる行と、尖鋭度の算出の対象にならない行を同一の手順で処理できる。後述する通り、この実施形態では、尖鋭度を算出すると正の値が算出される。後述する通り、尖鋭度が最も大きな行を指先がある行と判定する。よって、尖鋭度Apex(i)をゼロに設定することは、i行を指先ではないと設定することに等しい。
また、判定部134は、ステップS173において、Column(i)=1である(S173:Yes)と判定すると、j=2に設定する(ステップS173A)。i行目で最大値Maximum(i)を与える列Column(i)が-X方向側の端の列(1列目)であるため、尖鋭度の算出に用いる3つの列の中央の列jを2列目に設定して、1列目から3列目の3つの逆数を用いて尖鋭度を算出するためである。判定部134は、ステップS173Aの処理を終えると、ステップS176に進行して尖鋭度を算出する。
また、判定部134は、ステップS174において、Column(i)=AllColumnsである(S174:Yes)と判定すると、j=AllColumns-1に設定する(ステップS175B)。i行目で最大値Maximum(i)を与える列Column(i)が+X方向側の端の列(AllColumnsで表される6列目)であるため、尖鋭度の算出に用いる3つの列の中央の列jをAllColumns-1(5列目)に設定して、4列目から6列目の3つの逆数を用いて尖鋭度を算出するためである。判定部134は、ステップS175Bの処理を終えると、ステップS176に進行して尖鋭度を算出する。
判定部134は、全ての行iについて、尖鋭度の算出が完了するまでステップS171~S177のループ処理を行う。
<第7変形例による尖鋭度を算出する処理>
図30は、第7変形例によるサブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理を表すフローチャートを示す図である。図30に示す処理は、ステップS176の処理が図29に示すステップS176の処理と異なる。ここでは図29に示す処理との違いについて説明する。
図30に示す処理では、判定部134は、次の3つの点を通る円の曲率を尖鋭度Apex(i)として算出する(ステップS176)。3つの点は、(j-1,Capacitance(i,j-1))、(j,Capacitance(i,j))、(j+1,Capacitance(i,j+1))で表される。
ここで、列jをx軸、静電容量値Capacitanceをy軸とするxy座標において、j-1、j、j+1をx1、x2、x3とし、Capacitance(i,j-1)、Capacitance(i,j)、Capacitance(i,j+1)をy1、y2、y3とする。これは、図17においてy軸にした逆数Reciprocalの代わりに静電容量値Capacitanceをy軸にしたものである。ここでは図示を省略する。
判定部134は、3つの点を通る円の半径rを同様に求めることにより、尖鋭度Apex(i)に曲率(半径の逆数1/r)を入力する。すなわち、尖鋭度Apex(i)=1/rである。
<第8変形例による尖鋭度を算出する処理>
図31は、第8変形例によるサブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理を表すフローチャートを示す図である。図31に示す処理は、ステップS176の処理が図29に示すステップS176の処理と異なる。ここでは図29に示す処理との違いについて説明する。
図31に示す処理では、判定部134は、i行において隣り合う5つの点を用いて、カーブフィッティングにより最小二乗法で5つの点に近似する二次曲線を求め、曲線の二次の係数を尖鋭度Apex(i)として算出する(ステップS176)。
i行において隣り合う5つの点は、(j-2,Capacitance(i,j-2))、(j-1,Capacitance(i,j-1))、(j,Capacitance(i,j))、(j+1,Capacitance(i,j+1))、(j+2,Capacitance(i,j+2))である。判定部134は、尖鋭度Apex(i)を算出すると、ステップS177に進行する。
<第9変形例による尖鋭度を算出する処理>
図32は、第9変形例によるサブルーチン「sub尖鋭度算出」に基づき行われる尖鋭度を算出する処理を表すフローチャートを示す図である。図32に示す処理は、ステップS176の処理が図29に示すステップS176の処理と異なる。ここでは図29に示す処理との違いについて説明する。
図32に示す処理では、判定部134は、i行において隣り合う5つの点を用いて、最小二乗法でカーブフィッティングして5つの点に近似する円周を求め、円周の曲率を尖鋭度Apex(i)として算出する(ステップS176)。
i行において隣り合う5つの点は、(j-2,Capacitance(i,j-2))、(j-1,Capacitance(i,j-1))、(j,Capacitance(i,j))、(j+1,Capacitance(i,j+1))、(j+2,Capacitance(i,j+2))である。判定部134は、尖鋭度Apex(i)を算出すると、ステップS177に進行する。
<静電センサ120の構成>
図33は、非接触入力装置100Aの静電センサ120の具体的な構成を示す図である。
静電センサ120は、表示装置110の上に重ねて配置され、図33に示すように、X方向に延在する複数のセンサ電極121Xと、Y方向に延在する複数のセンサ電極121Yとを有する。センサ電極121X、121Yは配線122X、122Yを介して制御装置130にそれぞれ接続されている。このような静電センサ120は、一例として透明ガラスの表面にITO(Indium Tin Oxide)等の透明導電膜を形成し、センサ電極121X、121Y及び配線122X、122Yにパターニングしたものを用いることができる。静電センサ120の静電容量は、制御装置130に入力される。
図33には、一例として12本のセンサ電極121X及び20本のセンサ電極121Yを示す。12本のセンサ電極121X及び20本のセンサ電極121Yについての行と列の関係は、操作部111と同一である。このため、12行のセンサ電極121X及び20列のセンサ電極121Yが配列されていることになる。なお、センサ電極121Xの行数とセンサ電極121Yの列数とは一例である。
12行のセンサ電極121Xは1行ずつ走査されるとともに、20列のセンサ電極121Yは1列ずつ走査され、AD変換部132は、12行のセンサ電極121Xと20列のセンサ電極121Yとの240個の交点における静電容量をデジタル値に変換し、カウンタ133は、AD変換部132の出力の変化分をカウントし、240個の交点における差分値ΔADを出力する。以下では交点の座標を(i,j)で示す。ここでは、行iは1~12であり、列jは1~20である。
以上、本発明の例示的な実施形態の非接触入力装置について説明したが、本発明は、具体的に開示された実施形態に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。