以下、本発明を実施するための形態について図面を参照して説明する。
[実施形態1]
図1は、一実施形態に係るカメラスキャナ101が含まれるネットワーク構成を示す図である。図1に示すように、カメラスキャナ101はイーサネット(登録商標)等のネットワーク104にてホストコンピュータ102およびプリンタ103に接続されている。図1のネットワーク構成において、ホストコンピュータ102からの指示により、カメラスキャナ101から画像を読み取るスキャン機能や、スキャンデータをプリンタ103により出力するプリント機能の実行が可能である。また、ホストコンピュータ102を介さず、カメラスキャナ101への直接の指示により、スキャン機能、プリント機能の実行も可能である。
<カメラスキャナの構成>
図2は、一実施形態に係るカメラスキャナ101の構成例を示す図である。図2(a)に示すように、カメラスキャナ101は、コントローラ部201、カメラ部202、腕部203、プロジェクタ207、距離画像センサ部208を含む。カメラスキャナの本体であるコントローラ部201と、撮像を行うためのカメラ部202、プロジェクタ207および距離画像センサ部208は、腕部203により連結されている。腕部203は関節を用いて曲げ伸ばしが可能である。図2(a)には、カメラスキャナ101が設置されている書画台204も示している。カメラ部202および距離画像センサ部208のレンズは書画台204方向に向けられており、破線で囲まれた読み取り領域205内の画像を読み取り可能である。図2(a)の例では、原稿206は読み取り領域205内に置かれているので、カメラスキャナ101に読み取り可能となっている。カメラ部202は単一解像度で画像を撮像するものとしてもよいが、高解像度画像撮像と低解像度画像撮像が可能なものとすることが好ましい。書画台204内にはターンテーブル209を設けてもよい。ターンテーブル209はコントローラ部201からの指示によって回転することが可能であり、ターンテーブル209上に置かれた物体とカメラ部202との角度を変えることができる。また、図2に示されていないが、カメラスキャナ101は、LCDタッチパネル330およびスピーカ340をさらに含むこともできる。さらに、周囲の環境情報を収集するための人感センサ、照度センサ、加速度センサなどの各種センサデバイスを含むこともできる。距離画像とは、画像データの各画素に、距離画像センサ部208からの距離を関連付けた画像データである。
図2(b)は、カメラスキャナ101における座標系について表している。カメラスキャナ101では各ハードウェアデバイスに対して、カメラ座標系、距離画像座標系、プロジェクタ座標系という座標系が定義される。これらはカメラ部202および距離画像センサ部208が撮像する画像平面、あるいはプロジェクタ207が投影する画像平面をそれぞれXY平面とし、各画像平面に直交した方向をZ方向として定義したものである。さらに、これらの独立した座標系の3次元画像のデータ(3次元データ)を統一的に扱えるようにするために、書画台204を含む平面をXY平面とし、このXY平面から上方に垂直な向きをZ軸とする直交座標系を定義する。すなわちXY平面は底面ということもできる。
座標系を変換する場合の例として、図2(c)に直交座標系と、カメラ部202を中心としたカメラ座標系を用いて表現された空間と、カメラ部202が撮像する画像平面との関係を示す。直交座標系における3次元点P[X,Y,Z]は、(1)式によって、カメラ座標系における3次元点Pc[Xc,Yc,Zc]へ変換できる。
[Xc,Yc,Zc]T = [Rc|tc][X,Y,Z,1]T ... (1)
ここで、Rcおよびtcは、直交座標系に対するカメラの姿勢(回転)と位置(並進)によって求まる外部パラメータによって構成され、Rcを3×3の回転行列、tcを並進ベクトルと呼ぶ。逆に、カメラ座標系で定義された3次元点は(2)式によって、直交座標系への変換することができる。
[X,Y,Z]T = [Rc -1|-Rc -1tc] [Xc,Yc,Zc,1]T ... (2)
さらに、カメラ部202で撮影される2次元のカメラ画像平面は、カメラ部202によって3次元空間中の3次元情報が2次元情報に変換されたものである。すなわち、カメラ座標系上での3次元点Pc[Xc,Yc,Zc]を、(3)式によってカメラ画像平面での2次元座標pc[xp,yp]に透視投影変換することによって変換することが出来る。
λ[xp,yp,1]T =A [Xc,Yc,Zc]T ... (3)
ここで、Aは、カメラの内部パラメータと呼ばれ、焦点距離と画像中心などで表現される3×3の行列である。
以上のように、(1)式と(3)式を用いることで、直交座標系で表された3次元点群を、カメラ座標系での3次元点群座標やカメラ画像平面に変換することが出来る。なお、各ハードウェアデバイスの内部パラメータおよび直交座標系に対する位置姿勢(外部パラメータ)は、公知のキャリブレーション手法によりあらかじめキャリブレーションされているものとする。以後、特に断りがなく3次元点群と表記した場合は、直交座標系における3次元データを表しているものとする。
<カメラスキャナのコントローラのハードウェア構成>
図3は、カメラスキャナ101の本体であるコントローラ部201のハードウェア構成例を示す図である。図3に示すように、コントローラ部201は、システムバス301に接続されたCPU302、RAM303、ROM304、HDD305、ネットワークI/F306、画像処理プロセッサ307、カメラI/F308、ディスプレイコントローラ309、シリアルI/F310、オーディオコントローラ311およびUSBコントローラ312を含む。
CPU302はコントローラ部201全体の動作を制御する中央演算装置である。RAM303は揮発性メモリである。ROM304は不揮発性メモリであり、CPU302の起動用プログラムが格納されている。HDD305はRAM303と比較して大容量なハードディスクドライブ(HDD)である。HDD305にはコントローラ部201の実行する、カメラスキャナ101の制御用プログラムが格納されている。
CPU302は電源ON等の起動時、ROM304に格納されている起動用プログラムを実行する。この起動用プログラムは、HDD305に格納されている制御用プログラムを読み出し、RAM303上に展開するためのものである。CPU302は起動用プログラムを実行すると、続けてRAM303上に展開した制御用プログラムを実行し、制御を行う。また、CPU302は制御用プログラムによる動作に用いるデータもRAM303上に格納して読み書きを行う。HDD305上にはさらに、制御用プログラムによる動作に必要な各種設定や、また、カメラ入力によって生成した画像データを格納することができ、CPU302によって読み書きされる。CPU302はネットワークI/F306を介してネットワーク104上の他の機器との通信を行う。
画像処理プロセッサ307はRAM303に格納された画像データを読み出して処理し、またRAM303へ書き戻す。なお、画像処理プロセッサ307が実行する画像処理は、回転、変倍、色変換等である。
カメラI/F308はカメラ部202および距離画像センサ208と接続され、CPU302からの指示に応じてカメラ部202から画像データを、距離画像センサ部208から距離画像データを取得してRAM303へ書き込む。また、CPU302からの制御コマンドをカメラ部202および距離画像センサ208へ送信し、カメラ部202および距離画像センサ208の設定を行う。距離画像センサ208には赤外線パターン投射部361、赤外線カメラ362、RGBカメラ363が含まれる。これについては後述する。
また、コントローラ部202は、ディスプレイコントローラ309、シリアルI/F310、オーディオコントローラ311およびUSBコントローラ312のうち少なくとも1つをさらに含むことができる。
ディスプレイコントローラ309はCPU302の指示に応じてディスプレイへの画像データの表示を制御する。ここでは、ディスプレイコントローラ309は短焦点プロジェクタ207およびLCDタッチパネル330に接続されている。
シリアルI/F310はシリアル信号の入出力を行う。ここでは、シリアルI/F310はターンテーブル210に接続され、CPU302の回転開始・終了および回転角度の指示をターンテーブル209へ送信する。また、シリアルI/F310はLCDタッチパネル330に接続され、CPU302はLCDタッチパネル330が押下されたときに、シリアルI/F310を介して押下された座標を取得する。
オーディオコントローラ311はスピーカ340に接続され、CPU302の指示に応じて音声データをアナログ音声信号に変換し、スピーカ340を通じて音声を出力する。
USBコントローラ312はCPU302の指示に応じて外付けのUSBデバイスの制御を行う。ここでは、USBコントローラ312はUSBメモリやSDカードなどの外部メモリ350に接続され、外部メモリ350へのデータの読み書きを行う。
<カメラスキャナの制御用プログラムの機能構成>
図4は、CPU302が実行するカメラスキャナ101の制御用プログラムの機能構成401を示す図である。カメラスキャナ101の制御用プログラムは前述のようにHDD305に格納され、CPU302が起動時にRAM303上に展開して実行する。メイン制御部402は制御の中心であり、機能構成401内の他の各モジュールを制御する。画像取得部416は画像入力処理を行うモジュールであり、カメラ画像取得部407、距離画像取得部408から構成される。カメラ画像取得部407はカメラI/F308を介してカメラ部202が出力する画像データを取得し、RAM303へ格納する。距離画像取得部408はカメラI/F308を介して距離画像センサ部208が出力する距離画像データを取得し、RAM303へ格納する。距離画像取得部408の処理の詳細は図5を用いて後述する。
ジェスチャー認識部409は、画像取得部416から書画台204上の画像を取得し続け、タッチなどのジェスチャーを検知するとメイン制御部402へ通知する。処理の詳細は図6Aのフローチャートを用いて後述する。画像処理部411は、カメラ部202および距離画像センサ部208から取得した画像を画像処理プロセッサ307で解析するために用いられる。前述のジェスチャー認識部409も画像処理部411の機能を利用して実行される。
ユーザーインターフェイス部403は、メイン制御部402からの要求を受け、メッセージやボタン等のGUI部品を生成する。そして、表示部406へ生成したGUI部品の表示を要求する。表示部406はディスプレイコントローラ309を介して、プロジェクタ207もしくはLCDタッチパネル330へ要求されたGUI部品の表示を行う。プロジェクタ207は書画台204に向けて設置されているため、書画台204上にGUI部品を投射することが可能となっている。また、ユーザーインターフェイス部403は、ジェスチャー認識部409が認識したタッチ等のジェスチャー操作、あるいはシリアルI/F310を介したLCDタッチパネル330からの入力操作、そしてさらにそれらの座標を受信する。そして、ユーザーインターフェイス部403は描画中の操作画面の内容と操作座標を対応させて操作内容(押下されたボタン等)を判定する。この操作内容をメイン制御部402へ通知することにより、操作者の操作を受け付ける。
ネットワーク通信部404は、ネットワークI/F306を介して、ネットワーク104上の他の機器とTCP/IPによる通信を行う。データ管理部405は、制御用プログラム401の実行において生成した作業データなど様々なデータをHDD305上の所定の領域へ保存し、管理する。例えば平面原稿画像撮影部411、書籍画像撮影部412、立体形状測定部413が生成したスキャンデータなどである。
<距離画像センサおよび距離画像取得部の説明>
図5に距離画像センサ208の構成を示している。距離画像センサ208は赤外線によるパターン投射方式の距離画像センサである。赤外線パターン投射部361は対象物に、人の目には不可視である赤外線によって3次元測定パターンを投射する。赤外線カメラ362は対象物に投射した3次元測定パターンを読み取るカメラである。RGBカメラ363は人の目に見える可視光をRGB信号で撮影するカメラである。
距離画像取得部408の処理を図5(a)のフローチャートを用いて説明する。また、図5(b)〜(d)はパターン投射方式による距離画像の計測原理を説明するための図面である。距離画像取得部408が処理を開始すると、ステップS501では、図5(b)に示すように赤外線パターン投射部361を用いて赤外線による3次元形状測定パターン522を対象物521に投射する。ステップS502では、RGBカメラ363を用いて対象物を撮影したRGB画像523および、赤外線カメラ362を用いてステップS501で投射した3次元測定パターン522を撮影した赤外線カメラ画像524を取得する。なお、赤外線カメラ362とRGBカメラ363とでは設置位置が異なるため、図5(c)に示すようにそれぞれで撮影される2つのRGBカメラ画像523および赤外線カメラ画像524の撮影領域が異なる。そこでステップS503では、赤外線カメラ362の座標系からRGBカメラ363の座標系への座標系変換を用いて赤外線カメラ画像524をRGBカメラ画像523の座標系に合わせる。なお、赤外線カメラ362とRGBカメラ363の相対位置や、それぞれの内部パラメータは事前のキャリブレーション処理により既知であるとする。
ステップS504では、図5(d)に示すように、3次元測定パターン522とステップS503で座標変換を行った赤外線カメラ画像524間での対応点を抽出する。例えば、赤外線カメラ画像524上の1点を3次元形状測定パターン522上から探索して、同一の点が検出された場合に対応付けを行う。あるいは、赤外線カメラ画像524の画素の周辺のパターンを3次元形状測定パターン522上から探索し、一番類似度が高い部分と対応付けてもよい。ステップS505では、赤外線パターン投射部361と赤外線カメラ362を結ぶ直線を基線525として三角測量の原理を用いて計算を行うことにより、赤外線カメラ362からの距離を算出する。ステップS504で対応付けが出来た画素については、赤外線カメラ362からの距離を算出して画素値として保存し、対応付けが出来なかった画素については、距離の計測が出来なかった部分として無効値を保存する。これをステップS503で座標変換を行った赤外線カメラ画像524の全画素に対して行うことで、各画素に距離値が入った距離画像を生成する。ステップS506では、距離画像の各画素にRGBカメラ画像525のRGB値すなわち色情報を保存することにより、1画素につきR、G、B、距離の4つの値を持つ距離画像を生成する。ここで取得した距離画像は距離画像センサ208のRGBカメラ363で定義された距離画像センサ座標系が基準となっている。そこでステップS507では、図2(b)を用いて上述したように、距離画像センサ座標系として得られた距離データを直交座標系における3次元点群に変換する。(前述したように、特に指定がなく3次元点群と表記した場合は、直交座標系における3次元点群を示すものとする。)このようにして、測定した物体の形状を示す3次元点群を取得できる。
なお、本実施例では上述したように、距離画像センサ208として赤外線パターン投射方式を採用しているが、他の方式の距離画像センサを用いることも可能である。例えば、2つのRGBカメラでステレオ立体視を行うステレオ方式や、レーザー光の飛行時間を検出することで距離を測定するTOF(Time of Flight)方式など、他の計測手段を用いても構わない。
<ジェスチャー認識部の説明>
ジェスチャー認識部409の処理の詳細を、図6Aのフローチャートを用いて説明する。図6Aにおいて、ジェスチャー認識部409が処理を開始すると、ステップS601で初期化処理を行う。初期化処理では、ジェスチャー認識部409は距離画像取得部408から距離画像を1フレーム取得する。ここで、ジェスチャー認識部の開始時は書画台204上に対象物が置かれていない状態であるため、初期状態として書画台204の平面の認識を行う。つまり、取得した距離画像から最も広い平面を抽出し、その位置と法線ベクトル(以降、書画台204の平面パラメータと呼ぶ)を算出し、RAM303に保存する。
続いてステップS602では、ステップS621〜622に示す、書画台204上に存在する物体の3次元点群を取得する。その際、ステップS621では距離画像取得部408から距離画像と3次元点群を1フレーム取得する。ステップS622では書画台204の平面パラメータを用いて、取得した3次元点群から書画台204を含む平面にある点群を除去する。
ステップS603では、ステップS631〜S634に示す、取得した3次元点群からユーザーの手の形状および指先を検出する処理を行う。ここで、図6B(b)〜(e)に示す、指先検出処理の方法を模式的に表した図を用いて説明する。ステップS631では、ステップS602で取得した3次元点群から、書画台204を含む平面から所定の高さ(距離)以上にある、肌色(手の色)の3次元点群を抽出することで、手の3次元点群を得る。図6B(b)の3次元点群661は抽出した手の3次元点群すなわち手領域を表している。なおここでいう肌色とは特定の色を指すものではなく、様々な肌の色をカバーした総称である。肌色は予め定めておいてもよいし、操作者に応じて選択できるようにしてもよい。
また、肌色を使わず、距離画像の背景差分をとることで手の領域を発見してもよい。発見した手の領域は上述した方法で3次元点群に変換することが可能である。
ステップS632では、抽出した手の3次元点群を、書画台204の平面に射影した2次元画像を生成して、その手の外形を検出する。図6B(b)の2次元点群662は、書画台204の平面に投影した3次元点群を表している。投影は、点群の各座標を、書画台204の平面パラメータを用いて投影すればよい。また、図6B(c)に示すように、投影した3次元点群から、xy座標の値だけを取り出せば、z軸方向から見た2次元画像663として扱うことができる。このとき、手の3次元点群の各点が、書画台204の平面に投影した2次元画像の各座標のどれに対応するかを、記憶しておくものとする。
ステップS633では、指先の検出を行う。以下に指先を発見する方法についていくつか方法を述べる。まず、手の外形(すなわち輪郭)の曲率を用いる方法を説明する。
検出した手の外形上の各点について、その点での外形の曲率を算出し、算出した曲率が所定値より大きい点を指先として検出する。曲率の計算の仕方を次に説明する。図6B(e)の輪郭点664は、書画台204の平面に投影された2次元画像663の外形を表す点の一部を表している。ここで、輪郭点664のような外形を表す点のうち、隣り合う有限個の輪郭点に関して、最小二乗法を用いた円フィッティングを行うことで、手の外形の曲率を計算する。これを、全ての外形の輪郭点に対して行い、曲率が所定の値よりも大きく、かつフィットした円の中心が手の外形の内側にある場合に、隣り合う有限個の輪郭点の真ん中の点を指先として決定する。前に述べたように、RAM303が、手の外形の輪郭点に関する3次元点群との対応関係を記憶しているので、ジェスチャー認識部409は指先点の3次元情報を利用することができる。円の中心が手の外形の内側にあるか外側にあるかは、たとえば円の中心を通り座標軸と平行なライン上にある輪郭点を見出し、その輪郭点と円の中心との位置関係により判定できる。輪郭点と円の中心との中で、円の中心がそのラインの端から奇数番目にあれば円の中心は手の外形の外側にあり、偶数番目にあれば内側に在ると判定できる。
図6B(e)の円669、670は、フィットした円の例を表している。円669は曲率が所定値より小さく、かつ円の中心が外形の外にあるので指先としては検出されず、円670は曲率が所定値より大きく、かつ円の中心が外形の内側にあるので指先として検出される。
また、ここでは最小二乗法を用いた円フィッティングを用いて曲率を計算し、指先を発見する方法を用いたが、隣り合う有限個の輪郭点を囲む円の半径が最小になるようにして指先を発見してもよい。次にその例を説明する。
図6B(d)は、有限個の輪郭点を囲む円から指先を検出する方法を模式的に表したものである。例として、隣り合う5個の輪郭点を含むように円を描くことを考える。円665、667が、その例である。この円を、全ての外形の輪郭点に対して順に描き、その直径(例えば666、668)が所定の値より小さいことを以て、隣り合う5個の輪郭点の真ん中(中央)の点を指先とする。この例では隣り合う5個の点としたが、その数は限定されるものではない。また、上記は円をフィッティングして指先を発見する方法について述べたが、楕円フィッティングにより指先を発見するようにしてもよい。楕円フィッティングによる指先発見の方法は、非特許文献1に書かれているので、その方法を用いればよい。
上記のような、円フィッティングや楕円フィッティングは、OpenCVなどのオープンソースのコンピュータライブラリを用いることで簡単に実現可能である。
その他、腕から最も遠くにある点を指先として発見してもよい。図7(b)は、読み取り領域205中に腕704がある状態を表している。これは、前述した、手の領域の3次元点群を書画台204の平面に投影したものと考えることができる。この投影画像の画素数は、距離センサ208で得る距離画像と同じである。領域703は、投影画像の外枠から、所定の数画素内側の領域である。領域705は、読み取り領域205と領域703の間にある薄い領域と腕704の領域のアンドをとった領域である。領域705により、腕703が読み取り領域205に侵入している点709と710とが発見できる。これらの処理のために、距離センサ208で取得した距離画像を直接処理してもよい。その際、腕704の領域は、RAM303に保存された距離画像の背景画像と、現在の距離画像の差分をとり、所定の閾値で二値化することで求められる。
図7(e)の線分706は、点709と点710を結んだ線分である。線分706の中点を711とし、この点を腕の付け根の点とする。この腕の付け根の点711から、腕の外形の画素で一番遠くにある画素を指先点712とすれば指先を決定することができる。また、ここでは腕の付け根の点を求めるために、腕の侵入位置の中点をとったが、腕704自体を細線化することで、付根と指先を求めてもよい。細線化に関しては、一般的な画像処理の細線化アルゴリズムを用いれば可能である。細線化された腕のうち、領域705と交わっている方を腕の付け根とし、反対の端を指先として検出すればよい。
ステップS633では以上の方法で指先を検出することが可能となる。
ステップS634では、検出した指先の個数および各指先の座標を算出する。このとき、前述したように、書画台204に投影した2次元画像の各点と、手の3次元点群の各点の対応関係を記憶しているため、各指先の3次元座標を得ることができる。今回は、3次元点群から2次元画像に投影した画像から指先を検出する方法を説明したが、指先検出の対象とする画像は、これに限定されるものではない。例えば、距離画像の背景差分や、RGB画像の肌色領域から手の領域を抽出し、上に述べたのと同様の方法(外形の曲率計算等)で、手領域のうちの指先を検出してもよい。この場合、検出した指先の座標はRGB画像や距離画像といった、2次元画像上の座標であるため、その座標における距離画像の距離情報を用いて、直交座標系の3次元座標に変換する必要がある。
ステップS606では、タッチジェスチャー判定処理を行う。このとき、ジェスチャー認識部409は、直前のステップで検出した指先と書画台204を含む平面との距離を計算する。この計算には、検出した指先の3次元座標と、前述した書画台204の平面パラメータを用いる。距離が、所定の微小な値以下の場合は「タッチジェスチャーあり」であり、所定の微小な値より大きい場合は「タッチジェスチャーなし」である。
また、直行座標系の所定の高さ(Z方向)に仮想的な閾値平面(不図示)を設け、指先座標のZの値が閾値平面のZの値より小さくなることでタッチ検出を行ってもよい。
次にステップS607では、直前のステップで「タッチジェスチャーあり」だった場合にステップS608へ移行し、「タッチジェスチャーなし」だった場合はステップS602へ戻る。
ステップS608では、指先方向の特定処理を行う。指先方向とは、図7(a)でいえば、矢印702の方向である。つまり、手701の指が、書画台204の平面の中で指し示す方向と同じである。指先方向を特定するには、指部分の特定を行う。そのためにまず、腕が読み取り領域205に侵入している部分を特定する。前述したように、図7(b)の点709と点710とを、腕704が読み取り領域205に侵入している点として発見することができる。
次に指部分を特定する。図7(c)の線分706は、点709と点710を結んだ線分である。線分706と平行に、線分群707を、所定の微小な間隔で、腕704の領域(これを腕領域704とも呼ぶ)に引いていく。この長さが、所定の閾値よりも短くなっている部分を指先として特定する。図7(c)では、線分708の位置から、所定の閾値以下となる。
次に指先方向を特定する。線分708の中点の座標から、ステップS633で発見した、xy平面上の指先座標に向けてベクトル709を定義する。ベクトル709の向きが指先の方向であり、長さが指の長さを表す。ベクトル709はたとえば、線分708の中点を始点とし、ステップS634で特定した指先位置を終点とするベクトルとして特定することができる。また、図7(e)を用いて説明した方法で指先座標を求めた場合は、腕の付け根の点711から指先点712までを結んだベクトル713を指の方向ベクトルとして決めてもよい。この場合は、指の長さは上述の方法で求める必要がある。ただし、この場合にはベクトル709を求めるには及ばない。そこでたとえば長さが上述した所定の閾値(すなわち指の幅の上限)よりも短い線分群707のうち、腕の付け根の点711に最も近い線分またはその延長線がベクトル713と交差する点を求め、その点を指の付け根の位置とする。その点から指先点712までの距離を指の長さとして決めることができる。もちろん上述した方法でベクトル709を求め、それに基づいて指の長さを決めることもできる。
また、図7(f)に示したように、掌(手の甲)の中心点714から指先点715までを結んだベクトルを指の方向ベクトル716として定めてもよい。このとき掌(手の甲)の中心点714は、手領域のうち、手領域の輪郭717を構成するそれぞれの画素からの距離が最大となる点として求めることができる。
更に、指先に対して楕円フィッティングを行った場合は、楕円の二つの焦点を結ぶ方向を指の方向ベクトルとしてもよい。このとき、ベクトルの方向は、上述の方法で求めた、腕が読み取り領域に侵入している点の中点を起点に決めればよい。この場合も、指の長さは上述の方法を用いて求める必要がある。
上記処理は、指さし姿勢に限定した例を書いたが、五指が開かれた状態でも、各指について得られるであろう複数の線分708それぞれについて上記処理を施すことで、全ての指についてその方向と長さを求めることができる。
ステップS608が終了すると、ステップS609へと進む。ステップS609では、タッチ位置の決定処理を行う。これは、ユーザーが実際にタッチしていると感じている、指の腹の位置を推定する処理である。図8(a)の二次元点群801は、書画台204に投影されたxy平面上の手の領域の画像を表している。このうち、部分802の拡大図が拡大部分803である。指804に対して、ベクトル805は、ステップS608で求めた、指先方向のベクトル709である。ここで、xy平面上の指先点806をベクトル805と反対向きに所定量シフト(すなわち所定距離807だけシフト)させた点のxy座標を、タッチ点808として決定し、RAM303の所定の領域に保存する。シフトさせる所定距離は、設定可能なものとする。この場合のタッチ点のz座標は、0としてもよいし、3次元点群の対応する点からz座標を定めてもよい。なお、指先806の位置は、ステップS634で特定した指先位置であってよい。
また、タッチ位置(指の腹)を決める方法は、上述のように所定距離だけシフトする方法に限られるものではない。たとえば、図8(b)に示すように、指先発見の際に、円フィッティングに用いた円809の中心810をタッチ位置として決定してもよい。
また、図8(c)に示すように、指先に楕円フィッティングした楕円811の焦点(812、813)のうち指先側の点812をタッチ位置として決定してもよい。このとき、焦点が指先側かどうかを決定するためには、前述した腕の付け根から遠い方を採用するようにすればよい。
更に、指先の外形を構成する画素の重心点をタッチ位置として決定するようにしてもよい。図8(d)は、指先の外形を構成する画素と重心点との関係を模式的にあらわしたものである。指先の外形を構成する画素群814は、前述した指先の発見の際に用いた、腕の外形を構成する輪郭点の画素のうち、隣り合う複数の画素を表している。画素群814は、そのうちで指先として発見された際の9個の画素であり、真ん中の画素806が指先として発見されたと仮定する。指先点806を含めた画素群814の重心点を815としこの重心点815をタッチ位置として決定すればよい。
また、図8(i)に示すように、指先点806の所定の周辺領域825に含まれる指の画素の重心826をタッチ位置として決定してもよい。このとき、所定の周辺領域は、図8(i)のように円に限定されるものではない。また、重心826から指先点806までを結んだベクトルを、指先の方向ベクトルとしてもよい。
また、指先の外形を構成する画素に対して、多角形近似を行って、その多角形の重心をタッチ位置として決定してもよい。図8(e)は、指先の外形に対して多角形近似を行う様子を模式的に表したものである。五角形816が指先の外形に対して近似された多角形を表している。その重心が点817で表現されているので、点817をタッチ位置として決定すればよい。多角形近似は、OpenCVなどのオープンソースで公開されているAPIを用いれば簡単に実行することが可能である。
更に、指先発見時にフィッティングに用いた円と指先方向ベクトルを用いて、タッチ位置を決定するようにしてもよい。図8(f)は、指先発見時にフィッティングに用いた円と指先方向ベクトルを用いて、タッチ位置を決定する方法を模式的にあらわした図である。ベクトル818は指先方向ベクトルを延長したベクトルを表している。このベクトル818と指先にフィッティングさせた円809の交点のうち、ベクトルの先端に近い方の点819を仮想的な指先として求める。この仮想的な指先点は、タッチを検出する際に用いた指先点とは異なる。仮想的な指先点819を、所定距離807だけ、指先方向ベクトルと反対向きにシフトさせた点をタッチ位置820として決めてもよい。
同様にして、指先にフィッティングした楕円と指先方向ベクトルを用いて、タッチ位置を決定するようにしてもよい。図8(g)は、指先にフィッティングした楕円と指先方向ベクトルを用いて、タッチ位置を決定する方法を模式的に表している。指先方向ベクトルを延長したベクトル818と楕円811の交点のうち、指先側の点821を仮想的な指先として設定する。仮想的な指先821を、指先方向ベクトルと反対向きに所定距離だけシフトさせた点822を指先点として決定すればよい。
上記の処理は、手の3次元点群を書画台204の平面に射影した2次元画像、もしくは、距離画像センサ208から取得した距離画像を用いれば可能である。
加えて、RGB画像を用いてタッチ位置を決定するようにしてもよい。更に、RGB画像を用いる場合、爪を発見することにより、タッチ位置を決定するようにしてもよい。図8(h)は、指先805の拡大図であり、RGB画像で爪の領域からタッチ位置を決定する様子を模式的に表したものである。爪823が、RGB画像から発見した爪の領域を表している。爪の領域は、周辺の指の領域との輝度値の違いを見れば発見出来る。発見した爪の領域の重心点を求めて、それをタッチ位置として決定すればよい。この時、前述したようにRGB画像と距離画像との位置合わせがなされているので、爪領域の重心点を、距離画像もしくは手の3次元点群を書画台204の平面に射影した2次元画像の相当する位置に変換することは、容易に可能である。
以上のような方法を用いれば、平面にタッチしているタッチ位置(指の腹の位置)を推定することが可能である。
ステップS609が終了すると、ステップS605に移行する。ステップS605では判定したタッチジェスチャーとタッチ位置の3次元座標をメイン制御部402へ通知し、ステップS602へ戻ってジェスチャー認識処理を繰り返す。
なお、本実施形態では一本指でのジェスチャー認識について説明を行ったが、複数の指あるいは複数の手でのジェスチャー認識に応用することも可能である。たとえば、図6Aの手順を繰り返してタッチ位置を定期的に取得すれば、タッチの有無やタッチ位置の変化などから様々なジェスチャーを特定することができる。メイン制御部402は、アプリケーションを実行する部分である。メイン制御部402はタッチジェスチャーを受信すると、アプリケーションで定義された対応する処理を実行する。
本実施例により、上面から距離画像センサにより指先と平面とを撮影し、距離画像を用いて、正確な平面へのタッチ位置を特定することが可能となる。
[実施形態2]
実施形態1では、上面のセンサから指先と平面を撮影する場合の、タッチ位置の決定方法の基本的な部分を説明した。タッチ位置を決定する為に、距離画像センサで取得した距離画像から指先を発見し、指先方向と逆方向に指先位置の座標を所定距離シフトさせることで、タッチ位置の座標を決定する方法をとった。本実施形態では、ユーザーがもう少し細かいタッチ指示を行いたい場合に、タッチ位置の補正を行い、補正後の位置をタッチ位置として特定あるいは推定することで操作性を向上させる方法を、図9のジェスチャー認識部409が実行するフローチャートに沿って説明する。図10(a)は、タッチ位置の補正が必要な場合を模式的に表している。図10(a)の上の図は、書画台204の一部である平面1003に指1001がタッチしている様子を横から見た図である。この場合、実施形態1で説明した方法と同じやり方で発見した指先の3次元点が、指先位置1005で表される。実施形態1で説明した方法で、ユーザー定義の所定の値1007だけ指先の位置を示す指先座標をシフトさせて決めたタッチ位置の点は、タッチ位置1006で表される。図10(a)の下の図は、上の図よりも指1002の、平面1004に対する角度が大きい場合を表している。この場合、実施形態1と同じ方法で求めたタッチ位置の点は、位置1008となるが、実際に平面に接触している点は位置1009である。このように、タッチ点を求めるために、所定の固定値だけシフトさせただけでは、指先の平面に対する角度に応じて、実際にタッチしている、もしくはタッチしているとユーザーが感じる点と、タッチ位置の点として求めた点がずれてしまうことがあり得る。そこで本実施形態では、タッチ位置の点を求めるために指先位置をシフトさせる量を求めるのに、指先の角度を用いる。
図9のフローチャートのステップS6xxと記載されたステップは、実施形態1において、図6A,図6Bの説明時に説明済みである。ここでは、差分であるステップS9xxと記載されたステップを中心に説明する。
ステップS608で指先方向ベクトル709を特定した後、ジェスチャー認識部409は、ステップS901において、手指と書画台204の平面がなす角度を求める。この時、ステップS608で求めた、指先方向のベクトル709を用いる。指先方向のベクトル709は、書画台204の平面、つまりxy平面上の2次元ベクトルである。このベクトルは、横から見た図では、図10(b)のベクトル1010、1012のように表される。これらのベクトル1010、1012の始点と終点を、前述した手の3次元点群内の点と対応づける。この対応づけは、前述したステップS603において3次元点群を平面に投影した際に既になされている。図10(b)上の例では、ベクトル1010の始点は、3次元点1018に、終点は3次元点1005に対応づけることができる。たとえば、ベクトルのそれぞれの端点を通りz軸に平行な直線と、手の3次元点群で構成される面との交点を、求める三次元ベクトルのそれぞれの端点とする。手の3次元点群は手の表面を形成しているので交点は直線ごとに2つずつ存在する可能性があるが、それぞれの端点で同じ側(すなわちz成分がより小さい方か、又はより大きい方のいずれか)の交点を採用すれば、いずれを用いてもよい。図10の例では、z成分がより大きい方の交点を用いている。もちろんこれは一例に過ぎない。このようにして3次元点1018、1005をそれぞれ、始点、終点とするベクトル1011を得れば、これが指の3次元ベクトルとなる。同様にして、指の3次元ベクトル1013を得ることができる。ベクトル1010とベクトル1011のなす角1020、および、ベクトル1012とベクトル1013のなす角1022が、指と平面のなす角として求められる。
次に、ステップS902では、タッチ位置を求めるために指先位置をシフトさせる量を求める。図10(c)は、ステップS901で求めた平面に対する指の角度を利用してシフトする量を決めている様子を模式的に表した図である。まず、図10(c)の上の図で説明する。ベクトル1014は、指先の3次元点1005を始点とし、指の3次元ベクトル1018と逆方向の単位ベクトルを持ち、ユーザー指定の所定の長さを持っているものとする。このベクトル1014の終点をxy平面1003にz軸に沿って投影した点が点1016であり、この点を求めたいタッチ位置とする。同じ方法で図10(c)の下の図でもタッチ位置1017を求めることができる。このように指の先端から三次元の指先方向ベクトルの逆方向に所定距離ずらした位置をxy平面(すなわち操作面)に投影すれば、平面に対する指の角度に応じてタッチ位置を前後させることができるため、ユーザーのタッチ感覚を損なわないタッチ位置を提供することができる。
このタッチ位置1016、1017を求める作業は、書画台204のxy平面上にあり、指先点を始点とするベクトル1021、1023を求める作業に他ならない。図10(d)に示したように、ベクトル1010、ベクトル1012と逆向きのベクトルをそれぞれ、ベクトル1024、ベクトル1025とする。ベクトル1014、1015をベクトルv、ベクトル1024、1025をベクトルw、求めたいベクトル1021、1023をベクトルxと定義すれば、ベクトルxはベクトルvをベクトルwに正射影したものである。ベクトルvをベクトルwに正射影したベクトルv'は、角度1020、1022をθと定義すると、角度θを用いて次式で表される。
v'=(|v||w|cosθ/|w|)×w/|w| ・・・(4)
この(4)式のうちw/|w|はベクトルwと同方向の単位べクトルであるから、定数"|v||w|cosθ/|w|"=|v|cosθが、求めたいベクトルv'の大きさ、すなわち指先の位置をタッチ位置までxy平面内でシフトさせるシフト量である。なお、ベクトルwがxy平面上にあるのなら、ベクトルvのベクトルwに対する正射影v'は、ベクトルvの始点及び終点のz成分をいずれも0に置換することで求めることができる。
ジェスチャー認識部409は、ステップS903では、指先位置を始点とするステップS902で求めたベクトルv'の終点をタッチ位置として決定する。すなわち、xy平面内の指先方向の2次元ベクトルに沿ってステップS902で求めたシフト量だけ指先位置をシフトさせ、その座標をタッチ位置として決定し、RAM303に保存する。
上記処理を行うことにより、指先方向と操作平面との角度に応じてタッチ位置を変化させ、より正確にタッチ位置を特定することができる。
また、図10(c)を見てもわかるように、指1002が平面に対して立っている場合(図10(c)の下の図)の補正量1023は、指1001が平面に対して寝ている場合(図10(c)の上の図)の補正量1021よりも補正量が小さい。この前提のもと、ユーザーがタッチした位置を用いて補正量を決定するようにしてもよい。ユーザーは、自分から見て遠い位置をタッチする時の方が、近い位置をタッチする時よりも指先が寝る傾向がある。したがって、遠い位置では大きい補正量、近い位置では少ない補正量を指先からシフトすることによって、タッチ位置を決定するようにすればよい。ユーザーからタッチ位置までの距離は、実施形態1で述べた腕の付け根の点から指先点までの距離により計測できる。
図10(e)は、ユーザーからタッチ位置までの距離と補正量との関係の一例を模式的にグラフで表したものである。横軸はユーザーからの距離を、縦軸は補正量を表している。図10(e)では線形のグラフを描いたが、線形に限定されるものではない。上記処理を用いても、指先と平面の角度に応じたタッチ位置の補正を、簡易的に行うことが可能となる。
[実施形態3]
実施形態1および2では、上面のセンサから指先と平面を撮影する場合の、タッチ位置の決定方法の基本的な部分と、平面に対する指の角度に応じてタッチ位置を決定する方法を説明した。これらの方法は距離画像センサ208のノイズが少ない場合に成立する。
ここで距離画像センサ208のノイズが、平面へのタッチ位置の検出に及ぼす影響について説明する。図12(a)の上側の図は、平面1202に、指1201がタッチしている様子と、実際に距離画像センサにより取得した平面の距離情報1203を横から見た状態を、模式的に表している。距離画像センサ208と書画台204の位置関係は固定であるため、理想的には、距離画像センサ208で取得した平面の距離情報は一定である。しかし、実際にはある程度のノイズが乗るため、書画台204の平面の距離情報には時間軸方向での揺らぎがある。距離画像センサから得られる平面の距離情報は、距離情報として取得した段階では、図12(a)の距離情報1203のように、ノイズを含み、凹凸をもった状態で取得される。前述の平面パラメータを求める際は、これらの凹凸の平均をとるようにして求める。この凹凸が時間軸方向の揺らぎによって、距離画像センサ208で取得する距離画像のフレーム毎に変化する。書画台204の平面、乃至前述の平面パラメータの平面は、図12(a)の平面1202で表されている。これに対し、現在一般的な距離画像センサでは、取得した距離画像の距離情報1203は、±3mm程度上下する凹凸を示す。そのため、前述の図6AのステップS631で、所定の高さ以上の3次元点群を指先として抽出する際は、上記のような平面に乗ったノイズの時間方向の揺らぎを誤って検出してしまわないようにしなければならない。そのために、距離画像に表れた、本来は平面であるはずの面の凹凸を吸収するマージンとして、所定の高さ1205が、5mm程度必要となる。図12(a)では、平面1202から、所定の高さ1205(5mm程度)に設定された平面を1204で表している。前述したように、手の領域を検出する際、平面1204より下にある部分は、平面と共に除去する必要があるため、指先の3次元点1206が、平面1204より下にある場合は、除去されてしまう。この時、除去されずに残った点の中で、指先として検出できる、仮想的な指先点が、平面1204上の点1207である。図12(a)の下側の図は、上側の図を上から見た様子(xy平面上の状態)を模式的に表している。指先点1206は点1212に、仮想的な指先点1207は点1211に対応している。指1209のうち、点線1210より左側の領域は、検出できない。図12(b)でいえば、点線1213で囲まれた部分が、手の領域から除去されてしまう。実線で囲まれた部分のみが、手の領域として抽出される。この場合、真の指先の3次元点1206と、仮想的な指先点1207(1211)との差分の距離1208は、5mm〜10mmになる。
実施形態1や実施形態2で行った方法では、指先位置を正確に取得することを前提として、タッチ位置を決定する。そのため、上記のように距離画像にノイズがある場合は、正確なタッチ位置の決定が難しい。仮想的な指先点1207を用いてタッチ位置を検出した場合、上述したように、5mm〜10mm程度実際のタッチ位置とずれが生じる。そこで本実施形態では、同時に取得している、距離画像よりノイズの少ないRGB画像を用いて、正確なタッチ位置を決定する。この方法を、図11の、ジェスチャー認識部409が実行するフローチャートを用いて説明する。図11のステップS6xx、ステップS9xxと書かれた部分は、図6A、図9でそれぞれ説明した部分なので、説明を割愛する。
ステップS608で指先方向ベクトル709を特定した後、ジェスチャー認識部409は、ステップS1101において、画像取得部416より、距離画像センサ208がRGBカメラ363で取得したカラー画像、すなわちRGB画像を取得する。
ステップS1102において、ジェスチャー認識部409は、取得したRGB画像から指先検出を行う。これにはまず、距離画像で行ったのと同様に、RGB画像中の手の領域を検出する必要がある。そのため、起動時に予めRAM303に保存しておいた背景画像(何も置かれていない書画台204の画像)と、ステップS1101で取得したRGB画像の差分画像を求める。もしくは、ステップS1101で取得したRGB画像から肌色の領域を検出する。その後、図6AのステップS633、S634と同様の処理を施せば、xy平面上の2次元の指先位置を発見することができる。図12(c)は、xy平面の画像上で、距離画像で得られた指1209にRGB画像の指が重ねて表示されている様子を表している。この時、距離画像を用いて求めた指先が1211で表されている。また、点線で囲まれ部分1214は、指のうち、RGB画像と距離画像の差分の領域である。点1215は、RGB画像を用いて発見した指先を表している。
ステップS1103において、ジェスチャー認識部409は、手指と平面のなす角度を取得する。この処理は、図9のステップS901の処理と同様の処理である。このとき、ステップS1103で、指先の座標として、距離画像を用いて取得した指先点1211を用いる。
ステップS1104において、ジェスチャー認識部409は、真の3次元の指先位置を推定する。真の3次元の指先位置とは、前述したように、ノイズと共に除去された指先の3次元座標である。図12(d)のベクトル1216は、直前のステップS1103で求めた指先方向を示す3次元ベクトル(指のベクトルとも呼べる)である。この指の3次元ベクトルは、仮想的な3次元の指先位置1207を先端として求められている。点線1219は、RGB画像から求めた2次元の指先位置1212を通り、かつ、平面1202への指ベクトル1216の正射影に直交する平面1219を横から見たものである。ベクトル1216を終点側に延長し、平面1219と交わった点1220を真の3次元の指先位置として推定する。点1210のx、y成分は点1212のx、y成分とそれぞれ一致するので、点1207のz成分およびベクトル1216の傾きに応じて点1210のz成分を求めれば、点1220を特定できる。ベクトル1218は、延長した分のベクトルを表現している。ベクトル1216とベクトル1218を足したベクトルを、真の指の3次元ベクトルとして、以後の処理で利用する。ステップS1104が終了すると、ステップS902へ移行する。ここからの処理は、図9で説明した処理と同様の処理である。すなわち、指先位置1220から指ベクトルの逆方向へ所定距離戻した点をxy平面へと投影し、その点をタッチ位置として推定する。その際、指の3次元ベクトルとしては、上記真の指の3次元ベクトルを用いて処理を行う。
上記処理により、距離画像センサの精度がよくない場合でも、3次元の指先位置を推定し、タッチ位置を決定することが可能となる。
[実施形態4]
実施形態3では、距離画像にノイズがある場合に、RGB画像を用いて3次元の指先位置を発見し、タッチ位置を決定する方法を説明した。本実施形態では、RGB画像を用いず、距離画像のみで真の3次元の指先位置を発見し、タッチ位置の決定に用いる方法を説明する。
図14(a)は、平面1408にタッチする寸前の指1401が、矢印1404の方向に降下して、タッチしている状態の指1402に変化する様子を模式的に表している。実施形態3でも述べたように、距離画像にノイズがある場合、所定の高さ1406の位置に平面の閾値(あるいは平面度の閾値)を設定しなければならなくなる。そのため、タッチしている状態の指1402は、先端部分1405が、平面と共に除去され、指先が欠けた状態になるので、真の3次元の指先位置を直接発見することが難しい。しかし、タッチする寸前の指1401は所定の高さ1406より高い位置にあるため、指先が欠けることはない。この状態の指の長さを保存しておき、タッチ後の指先位置の推定に用いる。
この方法を図13の、ジェスチャー認識部409が実行するフローチャートを用いて詳細に説明する。図13のステップのうち、ステップS6xx、S9xx、S11xxと記載されているものは、図6A、図9、図11のフローチャートで説明したステップと同様であるため、詳しい説明を割愛する。
ステップS603で指先検出を行った後、ステップS1301において、ジェスチャー認識部409は、後述するタッチカウントが所定値以下かどうかを確かめる。ここでタッチカウントとは、ジェスチャー認識部409の処理が開始された後、何回平面へのタッチが行われたかを表す数値である。ステップS607でタッチジェスチャーありと判定された場合に、インクリメントされ、RAM303に保存されているものとする。所定値以下であった場合は、ステップS1302へ進み、所定値以上であった場合は、ステップS606へ進む。
ステップS1302において、ジェスチャー認識部409は、指先位置が所定の高さ以下かどうかを確認する。ここでいう所定の高さとは、図14(a)の1412の高さである。これは、ノイズを回避するための高さ1406より大きく設定される必要がある。高さ1412は平面1407よりも十分離れた位置に指があることを保証するためのものなので、高さ1412は高さ1406よりも大きく、かつ、通常の操作における指の高さよりも低い範囲で、たとえば高さ1406の倍程度に設定される。高さ1406が5mm程度に設定されている場合、高さ1412は10〜20mmに設定しておけばよい。ここで所定の高さ以下だった場合はステップS1303へ移行し、所定の高さより高かった場合はステップS606へ移行する。
ステップS1303において、ジェスチャー認識部409は、指の長さを保存する処理を実行する。この時、ジェスチャー認識部409は、実施形態2で説明したステップS901と同じ方法で、指の3次元ベクトル1411を得る。この指の3次元ベクトル1411の長さを、RAM303の所定領域に保存しておく。
上記ステップS1301〜S1303の処理は、タッチカウントが所定の回数を超えるまで実行されるが、その回数分、指の3次元ベクトルを取得し、長さの平均値をとるようにしてもよい。
さてステップS608で操作面にタッチした指先方向の特定が済むと、ステップS1305において、ジェスチャー認識部409は、手指と平面のなす角度から、3次元指先位置を推定する処理を行う。この時、ステップS1103で求めた、仮想的な指の3次元ベクトル1414を、その始点位置を維持したままステップS1301〜S1303で求めた指の長さまで延長する。延長された指の3次元ベクトルが、ベクトル1416である。この先端1417を真の3次元の指先点とする。この真の3次元の指先点を用いれば、以降のステップにおいて、実施形態1,2と同様にしてタッチ位置を決定することができる。
本実施形態は前述の平面の閾値が平面に対して一定で、所定以上の場合を対象にしている。しかし、環境によっては、平面の場所ごとにセンサの感度が変わるため、場所ごとに平面の閾値(図14の高さ1406)を変えられる場合がある。その場合、場所ごとに真の3次元の指先位置を推定する必要がある場合とそうでない場合がある。そのようなときは、予め平面の場所ごとの閾値を保存しておく。場所とは、操作平面上における領域区分等で特定する。そして図15のフローチャートのステップS1501に示すように、タッチされた位置の平面の閾値が所定値以下かどうかを判定して、所定値を超えていればステップS1103、S1305、S902を行うものと決めるようにしてもよい。同様にして、RGB画像から真の指先の3次元位置を推定する場合も、平面の場所ごとの閾値に応じて処理を切り替えるようにしてもよい。
尚、上記処理では、所定の高さ1412より指先が低くなったら指の長さを保存するようにしたが、初回起動時に指先を距離画像センサにかざす等して、指の長さを保存するようにしてもよい。
また、フローチャートでは、ステップS1305で真の3次元の指先位置を推定した後、ステップS902、S609でタッチ位置を決定したが、この順序を逆にしてもよい。まず指先がタッチされていないうちに、ステップS902、S609と同様の処理を用いて補正量、つまりは指の腹の位置を算出しておく。ステップS1303では、求めた指の長さに加えて、指の付け根から指の腹までの長さを保存する。タッチジェスチャーが検出されたのちに、先に保存した指の腹までの長さを用いて、ステップS1305と同様の処理を行い、正確なタッチ位置を推定するようにしてもよい。
また、上記処理では、指の角度と長さを用いて、正確なタッチ位置を推定する方法を説明したが、指先の軌跡を保存することにより、正確なタッチ位置を推定するようにしてもよい。図14(c)は指先の位置の軌跡を用いてタッチ時の指先位置を推定する様子を模式的に表した図である。位置1421、1422、1423は、タッチする直前の、時系列に連続した指の位置を表している。
位置1424は予測されるタッチ位置での指の位置を表しており、この時の指先はノイズを回避するための高さ1406より下になっているため、そのままでは正しい指先位置が発見出来ない。軌跡1425は、指先の軌跡を表している。軌跡1426は予測される指先の軌跡を表している。ここで、ノイズを回避するための高さ1406より高い所定の位置1420に、閾値を設けて置く。図14(c)の高さ方向の座標値がこの閾値1420以下となるまで、指先の軌跡をRAM303に保存し、その後の指先の軌跡を予測するのに用いる。軌跡の保存は、現在の指先位置と直前の指先位置を用いて、2点間を結ぶ3次元的な直線を保存していくようにすればよい。この場合、直線の方向に軌跡の方向ベクトルをとれば、その方向ベクトルと、書画台の平面1408(もしくは書画台の平面から所定の高さに設けた仮想的な平面)が交わる点が予測される指先点となる。
また、現在と直前の2点だけではなく、直近の指先位置を所定個数だけRAM303に保存しておき、所定個数の指先位置を通る近似曲線を3次元的に求めるようにしてもよい。この場合、3次元的な曲線と書画台の平面1408(もしくは書画台の平面から所定の高さに設けた仮想的な平面)が交わる点が予測される指先点となる。上記の書画台の平面1408から所定の高さに設けた仮想的な平面は不図示である。この仮想的な平面は、指の厚みを考慮して、指の厚み分実際の書画台の平面1408より上に設定された平面である。指先位置が推定されれば、これまでに述べてきた方法を用いて、タッチ位置(指の腹の位置)を求めることができる。
また、上記の方法は、まず指先の軌跡を用いて、タッチ時の指先位置を推定してから、指の腹の位置を求める順序で説明したが、これを逆にしてもよい。つまり、毎フレーム、指の腹の位置の推定処理を、これまで述べてきた方法を使って行っておき、指の腹の位置の軌跡を求めることで、タッチ位置を推定するようにしてもよい。
また、上記は、常に指の軌跡を保存しておく方法を述べたが、CPUパフォーマンスを低下させない観点から、指が所定の高さ以下になった時点で軌跡を保存し始めるようにしてもよい。図14(c)でいえば、高さ1412に閾値を設け、指先がその閾値以下になった時点で指の軌跡をとり始めればよい。
更に、指の軌跡を簡易的に求める方法として、所定の高さの2点間を結ぶ直線を求めることで指先位置を予測するようにしてもよい。たとえば、図14(c)の閾値1403、1420を、指が上から順番に横切った時の指先の座標を保存しておき、それぞれの座標を3次元的に結んだ直線を求める。
この直線と書画台の平面1408が交わる点を予測される指先点としてもよい。
上記処理により、正確なタッチ位置を推定することが可能となる。
[その他の実施例]
なお本発明は以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。