(57)【特許請求の範囲】
【請求項１】
操作面で行われた操作を特定するための装置であって、
前記装置が有するセンサから前記操作面の上方にある対象オブジェクトまでの距離を示す距離画像を取得する距離画像取得手段と、
前記距離画像に基づいて前記対象オブジェクトの先端部を特定する特定手段と、
前記距離画像取得手段よって取得された距離画像を用いて、前記操作面上での前記対象オブジェクトによるタッチジェスチャーを検出する検出手段と、
前記距離画像を用いて、前記対象オブジェクトの前記操作面上における向きを特定する方向特定手段と、
前記操作面に対して前記対象オブジェクトがなす角度を取得する角度取得手段と、
前記角度取得手段によって取得された角度に応じたシフト量を求めるシフト量決定手段と、
前記特定手段で特定した前記対象オブジェクトの先端部の位置を、前記方向特定手段で特定された前記対象オブジェクトの前記操作面上における向きと逆方向に、前記シフト量決定手段で求めたシフト量にしたがってシフトすることによって、前記タッチジェスチャーによる前記対象オブジェクトの前記操作面上でのタッチ位置を決定する決定手段と
を有することを特徴とする装置。
【請求項２】
前記操作面を含む領域を撮像することによりカラー画像を取得する撮像手段と、
前記特定手段は、前記距離画像と前記カラー画像に含まれる手領域の色とに基づいて、前記操作面上の前記対象オブジェクトの前記先端部の位置を特定することを特徴する請求項１に記載の装置。
【請求項３】
前記対象オブジェクトは手の指であることを特徴する請求項１または２に記載の装置。
【請求項４】
前記距離画像取得手段は前記センサとして距離センサを含み、前記距離センサにより測定された距離を画素ごとに有する前記距離画像を取得することを特徴とする請求項１乃至３のいずれか一項に記載の装置。
【請求項５】
前記特定手段は、前記対象オブジェクトの領域の外形から曲率を算出し、前記曲率が所定値より大きい点を前記対象オブジェクトの前記先端部の位置として特定することを特徴とする請求項１に記載の装置。
【請求項６】
前記特定手段は、前記対象オブジェクトの領域の外形にフィットする円に基づいて前記外形の曲率を算出し、前記曲率が所定値より大きく、かつ前記円の中心が前記対象オブジェクトの領域の内側にある場合に、前記円にフィットする輪郭点の中央の点を前記対象オブジェクトの前記先端部の位置として特定することを特徴とする請求項１に記載の装置。
【請求項７】
前記特定手段は、前記対象オブジェクトの領域の外形の輪郭点のうち、隣り合う有限個の輪郭点を囲む最小の円の半径が所定値より小さい場合に、前記有限個の輪郭点の中央の点を前記対象オブジェクトの前記先端部の位置として特定することを特徴とする請求項１に記載の装置。
【請求項８】
前記特定手段は、前記対象オブジェクトの領域が前記操作面に侵入している場所を特定し、該場所からもっとも遠い前記対象オブジェクトの領域の位置を前記対象オブジェクトの前記先端部の位置として特定することを特徴とする請求項１に記載の装置。
【請求項９】
装置により、操作面で行われた操作を特定するための方法であって、
前記装置が有するセンサから前記操作面の上方にある対象オブジェクトまでの距離を示す距離画像を取得し、
前記距離画像に基づいて前記対象オブジェクトの先端部を特定し、
取得された距離画像を用いて、前記操作面上での前記対象オブジェクトによるタッチジェスチャーを検出し、
前記距離画像を用いて、前記対象オブジェクトの前記操作面上における向きを特定し、
前記操作面に対して前記対象オブジェクトがなす角度を取得し、
前記取得された角度に応じたシフト量を求め、
前記特定した前記対象オブジェクトの先端部の位置を、前記特定された前記対象オブジェクトの前記操作面上における向きと逆方向に、前記求めたシフト量にしたがってシフトすることによって、前記タッチジェスチャーによる前記対象オブジェクトの前記操作面上のタッチ位置を決定する
ことを特徴とする方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば手や指先等の位置を遠隔から検出し、特定の面上に表示された表示部品の操作を行うユーザーインターフェイス装置、方法およびプログラムに関する。
【背景技術】
【０００２】
プロジェクタとカメラや距離センサを用いたユーザーインターフェイスでは、プロジェクタによりユーザーインターフェイスを投影することで、紙等の現実の物体上に重畳して表示を行うことができる。このため、ユーザーは現実の物体を電子的データとのインターフェイスとして扱うことが可能となる。特許文献１で開示されているユーザーインターフェイスシステムでは、プロジェクタでコンピュータ画面を机上に投射し、指先でそのコンピュータ画面を操作する。指先による平面へのタッチの検出には赤外線カメラを用いている。特許文献１では、テーブルや紙といった物体をユーザーインターフェイスとして、指やペンによるタッチ指示を行う。このとき、指を用いて５ｍｍ四方程度の大きさの文字を選択したり、文字の下に線を引いたりする操作を行う場合、正確なタッチ位置を決定することが必要になる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１３−３４１６８号公報
【非特許文献】
【０００４】
【非特許文献１】T. Lee and T. Hollerer, Handy AR: Markerless Inspection of Augmented Reality Objects Using Fingertip Tracking. In Proc. IEEE International Symposium on Wearable Computers (ISWC), Boston, MA, Oct. 2007
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、特許文献１では、指と平面のタッチ検出を行う際に、指と平面がなす角度を考慮していなかった。指先の角度を考慮しないと、正しく平面や指先の位置が取得できず、指と操作面との接触位置が正確に認識されないという問題がある。この場合、前述したような細かい文字を選択したり、文字の下に線を引いたりする操作は困難となる。
【０００６】
本発明は上記課題を鑑みてなされたものであり、画像解析によりタッチ検出を行う技術において、接触位置の検出精度を向上させ、ひいてはユーザーの操作性を向上させることができるユーザーインターフェイス装置および方法を提供することを目的としている。
【課題を解決するための手段】
【０００７】
上記目的を達成するため本発明は、その一側面によれば以下の構成を有する。
【０００８】
操作面で行われた操作を特定するための装置であって、
前記装置が有するセンサから前記操作面の上方にある対象オブジェクトまでの距離を示す距離画像を取得する距離画像取得手段と、
前記距離画像に基づいて前記対象オブジェクトの先端部を特定する特定手段と、
前記距離画像取得手段よって取得された距離画像を用いて、前記操作面上での前記対象オブジェクトによるタッチジェスチャーを検出する検出手段と、
前記距離画像を用いて、前記対象オブジェクトの前記操作面上における向きを特定する方向特定手段と、
前記操作面に対して前記対象オブジェクトがなす角度を取得する角度取得手段と、
がなす角度を取得する角度取得手段と、
前記角度取得手段によって取得された角度に応じたシフト量を求めるシフト量決定手段と、
前記特定手段で特定した前記対象オブジェクトの先端部の位置を、前記方向特定手段で特定された前記対象オブジェクトの前記操作面上における向きと逆方向に、前記シフト量決定手段で求めたシフト量にしたがってシフトすることによって、前記タッチジェスチャーによる前記対象オブジェクトの前記操作面上でのタッチ位置を決定する決定手段とを有することを特徴とする装置が提供される。
【０００９】
また他の側面によれば以下の構成を有する。
【発明の効果】
【００１１】
本発明によれば、画像に基づいて操作面へのタッチ検出を行う際に、触位置の検出精度を向上させ、ユーザーの操作性を向上させることができる。
【図面の簡単な説明】
【００１２】
【図１】カメラスキャナ１０１のネットワーク構成の一例を示す図である。
【図２】カメラスキャナ１０１の外観の一例を示す図である。
【図３】コントローラ部２０１のハードウェア構成の一例の図である。
【図４】カメラスキャナ１０１の制御用プログラムの機能構成の一例の図である。
【図５】距離画像取得部４０８が実行する処理のフローチャートおよび説明図である。
【図６Ａ】実施形態１においてジェスチャー認識部４０９が実行する処理のフローチャートである。
【図６Ｂ】実施形態１においてジェスチャー認識部４０９が実行する処理の説明図である。
【図７】実施形態１において、指先位置を推定する方法を模式的に表した図である。
【図８】実施形態１において、指先位置からタッチ位置を推定する方法を模式的に表した図である。
【図９】実施形態２においてジェスチャー認識部４０９が実行する処理のフローチャートである。
【図１０】実施形態２において、平面に対する指の角度情報からタッチ位置を推定する方法を模式的に説明した図である。
【図１１】実施形態３において、ジェスチャー認識部４０９が実行する処理のフローチャートである。
【図１２】実施形態４において、ＲＧＢ画像の情報と平面の角度情報からタッチ位置を推定する方法を模式的に表した図である。
【図１３】実施形態３において、ジェスチャー認識部４０９が実行する処理のフローチャートである。
【図１４】実施形態４において、タッチ位置を推定する方法を模式的に表した図である。
【図１５】実施形態４において、ジェスチャー認識部４０９が実行するフローチャートである。
【発明を実施するための形態】
【００１３】
以下、本発明を実施するための形態について図面を参照して説明する。
［実施形態１］
図１は、一実施形態に係るカメラスキャナ１０１が含まれるネットワーク構成を示す図である。図１に示すように、カメラスキャナ１０１はイーサネット（登録商標）等のネットワーク１０４にてホストコンピュータ１０２およびプリンタ１０３に接続されている。図１のネットワーク構成において、ホストコンピュータ１０２からの指示により、カメラスキャナ１０１から画像を読み取るスキャン機能や、スキャンデータをプリンタ１０３により出力するプリント機能の実行が可能である。また、ホストコンピュータ１０２を介さず、カメラスキャナ１０１への直接の指示により、スキャン機能、プリント機能の実行も可能である。
【００１４】
＜カメラスキャナの構成＞
図２は、一実施形態に係るカメラスキャナ１０１の構成例を示す図である。図２（ａ）に示すように、カメラスキャナ１０１は、コントローラ部２０１、カメラ部２０２、腕部２０３、プロジェクタ２０７、距離画像センサ部２０８を含む。カメラスキャナの本体であるコントローラ部２０１と、撮像を行うためのカメラ部２０２、プロジェクタ２０７および距離画像センサ部２０８は、腕部２０３により連結されている。腕部２０３は関節を用いて曲げ伸ばしが可能である。図２（ａ）には、カメラスキャナ１０１が設置されている書画台２０４も示している。カメラ部２０２および距離画像センサ部２０８のレンズは書画台２０４方向に向けられており、破線で囲まれた読み取り領域２０５内の画像を読み取り可能である。図２（ａ）の例では、原稿２０６は読み取り領域２０５内に置かれているので、カメラスキャナ１０１に読み取り可能となっている。カメラ部２０２は単一解像度で画像を撮像するものとしてもよいが、高解像度画像撮像と低解像度画像撮像が可能なものとすることが好ましい。書画台２０４内にはターンテーブル２０９を設けてもよい。ターンテーブル２０９はコントローラ部２０１からの指示によって回転することが可能であり、ターンテーブル２０９上に置かれた物体とカメラ部２０２との角度を変えることができる。また、図２に示されていないが、カメラスキャナ１０１は、ＬＣＤタッチパネル３３０およびスピーカ３４０をさらに含むこともできる。さらに、周囲の環境情報を収集するための人感センサ、照度センサ、加速度センサなどの各種センサデバイスを含むこともできる。距離画像とは、画像データの各画素に、距離画像センサ部２０８からの距離を関連付けた画像データである。
【００１５】
図２（ｂ）は、カメラスキャナ１０１における座標系について表している。カメラスキャナ１０１では各ハードウェアデバイスに対して、カメラ座標系、距離画像座標系、プロジェクタ座標系という座標系が定義される。これらはカメラ部２０２および距離画像センサ部２０８が撮像する画像平面、あるいはプロジェクタ２０７が投影する画像平面をそれぞれＸＹ平面とし、各画像平面に直交した方向をＺ方向として定義したものである。さらに、これらの独立した座標系の３次元画像のデータ（３次元データ）を統一的に扱えるようにするために、書画台２０４を含む平面をＸＹ平面とし、このＸＹ平面から上方に垂直な向きをＺ軸とする直交座標系を定義する。すなわちＸＹ平面は底面ということもできる。
【００１６】
座標系を変換する場合の例として、図２（ｃ）に直交座標系と、カメラ部２０２を中心としたカメラ座標系を用いて表現された空間と、カメラ部２０２が撮像する画像平面との関係を示す。直交座標系における３次元点Ｐ［Ｘ，Ｙ，Ｚ］は、（１）式によって、カメラ座標系における３次元点Ｐｃ［Ｘｃ，Ｙｃ，Ｚｃ］へ変換できる。
[Xc,Yc,Zc]T = [Rc|tc][X,Y,Z,1]T    ...  （１）
ここで、Ｒｃおよびｔｃは、直交座標系に対するカメラの姿勢（回転）と位置（並進）によって求まる外部パラメータによって構成され、Ｒｃを３×３の回転行列、ｔｃを並進ベクトルと呼ぶ。逆に、カメラ座標系で定義された３次元点は（２）式によって、直交座標系への変換することができる。
[X,Y,Z]T = [Rc-1|-Rc-1tc] [Xc,Yc,Zc,1]T    ...  （２）
さらに、カメラ部２０２で撮影される２次元のカメラ画像平面は、カメラ部２０２によって３次元空間中の３次元情報が２次元情報に変換されたものである。すなわち、カメラ座標系上での３次元点Ｐｃ［Ｘｃ，Ｙｃ，Ｚｃ］を、（３）式によってカメラ画像平面での２次元座標ｐｃ［ｘｐ，ｙｐ］に透視投影変換することによって変換することが出来る。
λ[xp,yp,1]T =A [Xc,Yc,Zc]T    ...  （３）
ここで、Ａは、カメラの内部パラメータと呼ばれ、焦点距離と画像中心などで表現される３×３の行列である。
【００１７】
以上のように、（１）式と（３）式を用いることで、直交座標系で表された３次元点群を、カメラ座標系での３次元点群座標やカメラ画像平面に変換することが出来る。なお、各ハードウェアデバイスの内部パラメータおよび直交座標系に対する位置姿勢（外部パラメータ）は、公知のキャリブレーション手法によりあらかじめキャリブレーションされているものとする。以後、特に断りがなく３次元点群と表記した場合は、直交座標系における３次元データを表しているものとする。
【００１８】
＜カメラスキャナのコントローラのハードウェア構成＞
図３は、カメラスキャナ１０１の本体であるコントローラ部２０１のハードウェア構成例を示す図である。図３に示すように、コントローラ部２０１は、システムバス３０１に接続されたＣＰＵ３０２、ＲＡＭ３０３、ＲＯＭ３０４、ＨＤＤ３０５、ネットワークＩ／Ｆ３０６、画像処理プロセッサ３０７、カメラＩ／Ｆ３０８、ディスプレイコントローラ３０９、シリアルＩ／Ｆ３１０、オーディオコントローラ３１１およびＵＳＢコントローラ３１２を含む。
【００１９】
ＣＰＵ３０２はコントローラ部２０１全体の動作を制御する中央演算装置である。ＲＡＭ３０３は揮発性メモリである。ＲＯＭ３０４は不揮発性メモリであり、ＣＰＵ３０２の起動用プログラムが格納されている。ＨＤＤ３０５はＲＡＭ３０３と比較して大容量なハードディスクドライブ（ＨＤＤ）である。ＨＤＤ３０５にはコントローラ部２０１の実行する、カメラスキャナ１０１の制御用プログラムが格納されている。
【００２０】
ＣＰＵ３０２は電源ＯＮ等の起動時、ＲＯＭ３０４に格納されている起動用プログラムを実行する。この起動用プログラムは、ＨＤＤ３０５に格納されている制御用プログラムを読み出し、ＲＡＭ３０３上に展開するためのものである。ＣＰＵ３０２は起動用プログラムを実行すると、続けてＲＡＭ３０３上に展開した制御用プログラムを実行し、制御を行う。また、ＣＰＵ３０２は制御用プログラムによる動作に用いるデータもＲＡＭ３０３上に格納して読み書きを行う。ＨＤＤ３０５上にはさらに、制御用プログラムによる動作に必要な各種設定や、また、カメラ入力によって生成した画像データを格納することができ、ＣＰＵ３０２によって読み書きされる。ＣＰＵ３０２はネットワークＩ／Ｆ３０６を介してネットワーク１０４上の他の機器との通信を行う。
【００２１】
画像処理プロセッサ３０７はＲＡＭ３０３に格納された画像データを読み出して処理し、またＲＡＭ３０３へ書き戻す。なお、画像処理プロセッサ３０７が実行する画像処理は、回転、変倍、色変換等である。
【００２２】
カメラＩ／Ｆ３０８はカメラ部２０２および距離画像センサ２０８と接続され、ＣＰＵ３０２からの指示に応じてカメラ部２０２から画像データを、距離画像センサ部２０８から距離画像データを取得してＲＡＭ３０３へ書き込む。また、ＣＰＵ３０２からの制御コマンドをカメラ部２０２および距離画像センサ２０８へ送信し、カメラ部２０２および距離画像センサ２０８の設定を行う。距離画像センサ２０８には赤外線パターン投射部３６１、赤外線カメラ３６２、ＲＧＢカメラ３６３が含まれる。これについては後述する。
【００２３】
また、コントローラ部２０２は、ディスプレイコントローラ３０９、シリアルＩ／Ｆ３１０、オーディオコントローラ３１１およびＵＳＢコントローラ３１２のうち少なくとも１つをさらに含むことができる。
【００２４】
ディスプレイコントローラ３０９はＣＰＵ３０２の指示に応じてディスプレイへの画像データの表示を制御する。ここでは、ディスプレイコントローラ３０９は短焦点プロジェクタ２０７およびＬＣＤタッチパネル３３０に接続されている。
【００２５】
シリアルＩ／Ｆ３１０はシリアル信号の入出力を行う。ここでは、シリアルＩ／Ｆ３１０はターンテーブル２１０に接続され、ＣＰＵ３０２の回転開始・終了および回転角度の指示をターンテーブル２０９へ送信する。また、シリアルＩ／Ｆ３１０はＬＣＤタッチパネル３３０に接続され、ＣＰＵ３０２はＬＣＤタッチパネル３３０が押下されたときに、シリアルＩ／Ｆ３１０を介して押下された座標を取得する。
【００２６】
オーディオコントローラ３１１はスピーカ３４０に接続され、ＣＰＵ３０２の指示に応じて音声データをアナログ音声信号に変換し、スピーカ３４０を通じて音声を出力する。
【００２７】
ＵＳＢコントローラ３１２はＣＰＵ３０２の指示に応じて外付けのＵＳＢデバイスの制御を行う。ここでは、ＵＳＢコントローラ３１２はＵＳＢメモリやＳＤカードなどの外部メモリ３５０に接続され、外部メモリ３５０へのデータの読み書きを行う。
【００２８】
＜カメラスキャナの制御用プログラムの機能構成＞
図４は、ＣＰＵ３０２が実行するカメラスキャナ１０１の制御用プログラムの機能構成４０１を示す図である。カメラスキャナ１０１の制御用プログラムは前述のようにＨＤＤ３０５に格納され、ＣＰＵ３０２が起動時にＲＡＭ３０３上に展開して実行する。メイン制御部４０２は制御の中心であり、機能構成４０１内の他の各モジュールを制御する。画像取得部４１６は画像入力処理を行うモジュールであり、カメラ画像取得部４０７、距離画像取得部４０８から構成される。カメラ画像取得部４０７はカメラＩ／Ｆ３０８を介してカメラ部２０２が出力する画像データを取得し、ＲＡＭ３０３へ格納する。距離画像取得部４０８はカメラＩ／Ｆ３０８を介して距離画像センサ部２０８が出力する距離画像データを取得し、ＲＡＭ３０３へ格納する。距離画像取得部４０８の処理の詳細は図５を用いて後述する。
【００２９】
ジェスチャー認識部４０９は、画像取得部４１６から書画台２０４上の画像を取得し続け、タッチなどのジェスチャーを検知するとメイン制御部４０２へ通知する。処理の詳細は図６Ａのフローチャートを用いて後述する。画像処理部４１１は、カメラ部２０２および距離画像センサ部２０８から取得した画像を画像処理プロセッサ３０７で解析するために用いられる。前述のジェスチャー認識部４０９も画像処理部４１１の機能を利用して実行される。
【００３０】
ユーザーインターフェイス部４０３は、メイン制御部４０２からの要求を受け、メッセージやボタン等のＧＵＩ部品を生成する。そして、表示部４０６へ生成したＧＵＩ部品の表示を要求する。表示部４０６はディスプレイコントローラ３０９を介して、プロジェクタ２０７もしくはＬＣＤタッチパネル３３０へ要求されたＧＵＩ部品の表示を行う。プロジェクタ２０７は書画台２０４に向けて設置されているため、書画台２０４上にＧＵＩ部品を投射することが可能となっている。また、ユーザーインターフェイス部４０３は、ジェスチャー認識部４０９が認識したタッチ等のジェスチャー操作、あるいはシリアルＩ／Ｆ３１０を介したＬＣＤタッチパネル３３０からの入力操作、そしてさらにそれらの座標を受信する。そして、ユーザーインターフェイス部４０３は描画中の操作画面の内容と操作座標を対応させて操作内容（押下されたボタン等）を判定する。この操作内容をメイン制御部４０２へ通知することにより、操作者の操作を受け付ける。
【００３１】
ネットワーク通信部４０４は、ネットワークＩ／Ｆ３０６を介して、ネットワーク１０４上の他の機器とＴＣＰ／ＩＰによる通信を行う。データ管理部４０５は、制御用プログラム４０１の実行において生成した作業データなど様々なデータをＨＤＤ３０５上の所定の領域へ保存し、管理する。例えば平面原稿画像撮影部４１１、書籍画像撮影部４１２、立体形状測定部４１３が生成したスキャンデータなどである。
【００３２】
＜距離画像センサおよび距離画像取得部の説明＞
図５に距離画像センサ２０８の構成を示している。距離画像センサ２０８は赤外線によるパターン投射方式の距離画像センサである。赤外線パターン投射部３６１は対象物に、人の目には不可視である赤外線によって３次元測定パターンを投射する。赤外線カメラ３６２は対象物に投射した３次元測定パターンを読み取るカメラである。ＲＧＢカメラ３６３は人の目に見える可視光をＲＧＢ信号で撮影するカメラである。
【００３３】
距離画像取得部４０８の処理を図５（ａ）のフローチャートを用いて説明する。また、図５（ｂ）〜（ｄ）はパターン投射方式による距離画像の計測原理を説明するための図面である。距離画像取得部４０８が処理を開始すると、ステップＳ５０１では、図５（ｂ）に示すように赤外線パターン投射部３６１を用いて赤外線による３次元形状測定パターン５２２を対象物５２１に投射する。ステップＳ５０２では、ＲＧＢカメラ３６３を用いて対象物を撮影したＲＧＢ画像５２３および、赤外線カメラ３６２を用いてステップＳ５０１で投射した３次元測定パターン５２２を撮影した赤外線カメラ画像５２４を取得する。なお、赤外線カメラ３６２とＲＧＢカメラ３６３とでは設置位置が異なるため、図５（ｃ）に示すようにそれぞれで撮影される２つのＲＧＢカメラ画像５２３および赤外線カメラ画像５２４の撮影領域が異なる。そこでステップＳ５０３では、赤外線カメラ３６２の座標系からＲＧＢカメラ３６３の座標系への座標系変換を用いて赤外線カメラ画像５２４をＲＧＢカメラ画像５２３の座標系に合わせる。なお、赤外線カメラ３６２とＲＧＢカメラ３６３の相対位置や、それぞれの内部パラメータは事前のキャリブレーション処理により既知であるとする。
【００３４】
ステップＳ５０４では、図５（ｄ）に示すように、３次元測定パターン５２２とステップＳ５０３で座標変換を行った赤外線カメラ画像５２４間での対応点を抽出する。例えば、赤外線カメラ画像５２４上の１点を３次元形状測定パターン５２２上から探索して、同一の点が検出された場合に対応付けを行う。あるいは、赤外線カメラ画像５２４の画素の周辺のパターンを３次元形状測定パターン５２２上から探索し、一番類似度が高い部分と対応付けてもよい。ステップＳ５０５では、赤外線パターン投射部３６１と赤外線カメラ３６２を結ぶ直線を基線５２５として三角測量の原理を用いて計算を行うことにより、赤外線カメラ３６２からの距離を算出する。ステップＳ５０４で対応付けが出来た画素については、赤外線カメラ３６２からの距離を算出して画素値として保存し、対応付けが出来なかった画素については、距離の計測が出来なかった部分として無効値を保存する。これをステップＳ５０３で座標変換を行った赤外線カメラ画像５２４の全画素に対して行うことで、各画素に距離値が入った距離画像を生成する。ステップＳ５０６では、距離画像の各画素にＲＧＢカメラ画像５２５のＲＧＢ値すなわち色情報を保存することにより、１画素につきＲ、Ｇ、Ｂ、距離の４つの値を持つ距離画像を生成する。ここで取得した距離画像は距離画像センサ２０８のＲＧＢカメラ３６３で定義された距離画像センサ座標系が基準となっている。そこでステップＳ５０７では、図２（ｂ）を用いて上述したように、距離画像センサ座標系として得られた距離データを直交座標系における３次元点群に変換する。（前述したように、特に指定がなく３次元点群と表記した場合は、直交座標系における３次元点群を示すものとする。）このようにして、測定した物体の形状を示す３次元点群を取得できる。
【００３５】
なお、本実施例では上述したように、距離画像センサ２０８として赤外線パターン投射方式を採用しているが、他の方式の距離画像センサを用いることも可能である。例えば、２つのＲＧＢカメラでステレオ立体視を行うステレオ方式や、レーザー光の飛行時間を検出することで距離を測定するＴＯＦ（Ｔｉｍe  ｏｆ  Ｆｌｉｇｈｔ）方式など、他の計測手段を用いても構わない。
【００３６】
＜ジェスチャー認識部の説明＞
ジェスチャー認識部４０９の処理の詳細を、図６Ａのフローチャートを用いて説明する。図６Ａにおいて、ジェスチャー認識部４０９が処理を開始すると、ステップＳ６０１で初期化処理を行う。初期化処理では、ジェスチャー認識部４０９は距離画像取得部４０８から距離画像を１フレーム取得する。ここで、ジェスチャー認識部の開始時は書画台２０４上に対象物が置かれていない状態であるため、初期状態として書画台２０４の平面の認識を行う。つまり、取得した距離画像から最も広い平面を抽出し、その位置と法線ベクトル（以降、書画台２０４の平面パラメータと呼ぶ）を算出し、ＲＡＭ３０３に保存する。
【００３７】
続いてステップＳ６０２では、ステップＳ６２１〜６２２に示す、書画台２０４上に存在する物体の３次元点群を取得する。その際、ステップＳ６２１では距離画像取得部４０８から距離画像と３次元点群を１フレーム取得する。ステップＳ６２２では書画台２０４の平面パラメータを用いて、取得した３次元点群から書画台２０４を含む平面にある点群を除去する。
【００３８】
ステップＳ６０３では、ステップＳ６３１〜Ｓ６３４に示す、取得した３次元点群からユーザーの手の形状および指先を検出する処理を行う。ここで、図６Ｂ（ｂ）〜（ｅ）に示す、指先検出処理の方法を模式的に表した図を用いて説明する。ステップＳ６３１では、ステップＳ６０２で取得した３次元点群から、書画台２０４を含む平面から所定の高さ（距離）以上にある、肌色（手の色）の３次元点群を抽出することで、手の３次元点群を得る。図６Ｂ（ｂ）の３次元点群６６１は抽出した手の３次元点群すなわち手領域を表している。なおここでいう肌色とは特定の色を指すものではなく、様々な肌の色をカバーした総称である。肌色は予め定めておいてもよいし、操作者に応じて選択できるようにしてもよい。
【００３９】
また、肌色を使わず、距離画像の背景差分をとることで手の領域を発見してもよい。発見した手の領域は上述した方法で３次元点群に変換することが可能である。
【００４０】
ステップＳ６３２では、抽出した手の３次元点群を、書画台２０４の平面に射影した２次元画像を生成して、その手の外形を検出する。図６Ｂ（ｂ）の２次元点群６６２は、書画台２０４の平面に投影した３次元点群を表している。投影は、点群の各座標を、書画台２０４の平面パラメータを用いて投影すればよい。また、図６Ｂ（ｃ）に示すように、投影した３次元点群から、ｘｙ座標の値だけを取り出せば、ｚ軸方向から見た２次元画像６６３として扱うことができる。このとき、手の３次元点群の各点が、書画台２０４の平面に投影した２次元画像の各座標のどれに対応するかを、記憶しておくものとする。
【００４１】
ステップＳ６３３では、指先の検出を行う。以下に指先を発見する方法についていくつか方法を述べる。まず、手の外形（すなわち輪郭）の曲率を用いる方法を説明する。
【００４２】
検出した手の外形上の各点について、その点での外形の曲率を算出し、算出した曲率が所定値より大きい点を指先として検出する。曲率の計算の仕方を次に説明する。図６Ｂ（ｅ）の輪郭点６６４は、書画台２０４の平面に投影された２次元画像６６３の外形を表す点の一部を表している。ここで、輪郭点６６４のような外形を表す点のうち、隣り合う有限個の輪郭点に関して、最小二乗法を用いた円フィッティングを行うことで、手の外形の曲率を計算する。これを、全ての外形の輪郭点に対して行い、曲率が所定の値よりも大きく、かつフィットした円の中心が手の外形の内側にある場合に、隣り合う有限個の輪郭点の真ん中の点を指先として決定する。前に述べたように、ＲＡＭ３０３が、手の外形の輪郭点に関する３次元点群との対応関係を記憶しているので、ジェスチャー認識部４０９は指先点の３次元情報を利用することができる。円の中心が手の外形の内側にあるか外側にあるかは、たとえば円の中心を通り座標軸と平行なライン上にある輪郭点を見出し、その輪郭点と円の中心との位置関係により判定できる。輪郭点と円の中心との中で、円の中心がそのラインの端から奇数番目にあれば円の中心は手の外形の外側にあり、偶数番目にあれば内側に在ると判定できる。
【００４３】
図６Ｂ（ｅ）の円６６９、６７０は、フィットした円の例を表している。円６６９は曲率が所定値より小さく、かつ円の中心が外形の外にあるので指先としては検出されず、円６７０は曲率が所定値より大きく、かつ円の中心が外形の内側にあるので指先として検出される。
【００４４】
また、ここでは最小二乗法を用いた円フィッティングを用いて曲率を計算し、指先を発見する方法を用いたが、隣り合う有限個の輪郭点を囲む円の半径が最小になるようにして指先を発見してもよい。次にその例を説明する。
【００４５】
図６Ｂ（ｄ）は、有限個の輪郭点を囲む円から指先を検出する方法を模式的に表したものである。例として、隣り合う５個の輪郭点を含むように円を描くことを考える。円６６５、６６７が、その例である。この円を、全ての外形の輪郭点に対して順に描き、その直径（例えば６６６、６６８）が所定の値より小さいことを以て、隣り合う５個の輪郭点の真ん中（中央）の点を指先とする。この例では隣り合う５個の点としたが、その数は限定されるものではない。また、上記は円をフィッティングして指先を発見する方法について述べたが、楕円フィッティングにより指先を発見するようにしてもよい。楕円フィッティングによる指先発見の方法は、非特許文献１に書かれているので、その方法を用いればよい。
【００４６】
上記のような、円フィッティングや楕円フィッティングは、ＯｐｅnＣＶなどのオープンソースのコンピュータライブラリを用いることで簡単に実現可能である。
【００４７】
その他、腕から最も遠くにある点を指先として発見してもよい。図７（ｂ）は、読み取り領域２０５中に腕７０４がある状態を表している。これは、前述した、手の領域の３次元点群を書画台２０４の平面に投影したものと考えることができる。この投影画像の画素数は、距離センサ２０８で得る距離画像と同じである。領域７０３は、投影画像の外枠から、所定の数画素内側の領域である。領域７０５は、読み取り領域２０５と領域７０３の間にある薄い領域と腕７０４の領域のアンドをとった領域である。領域７０５により、腕７０３が読み取り領域２０５に侵入している点７０９と７１０とが発見できる。これらの処理のために、距離センサ２０８で取得した距離画像を直接処理してもよい。その際、腕７０４の領域は、ＲＡＭ３０３に保存された距離画像の背景画像と、現在の距離画像の差分をとり、所定の閾値で二値化することで求められる。
【００４８】
図７（ｅ）の線分７０６は、点７０９と点７１０を結んだ線分である。線分７０６の中点を７１１とし、この点を腕の付け根の点とする。この腕の付け根の点７１１から、腕の外形の画素で一番遠くにある画素を指先点７１２とすれば指先を決定することができる。また、ここでは腕の付け根の点を求めるために、腕の侵入位置の中点をとったが、腕７０４自体を細線化することで、付根と指先を求めてもよい。細線化に関しては、一般的な画像処理の細線化アルゴリズムを用いれば可能である。細線化された腕のうち、領域７０５と交わっている方を腕の付け根とし、反対の端を指先として検出すればよい。
ステップＳ６３３では以上の方法で指先を検出することが可能となる。
【００４９】
ステップＳ６３４では、検出した指先の個数および各指先の座標を算出する。このとき、前述したように、書画台２０４に投影した２次元画像の各点と、手の３次元点群の各点の対応関係を記憶しているため、各指先の３次元座標を得ることができる。今回は、３次元点群から２次元画像に投影した画像から指先を検出する方法を説明したが、指先検出の対象とする画像は、これに限定されるものではない。例えば、距離画像の背景差分や、ＲＧＢ画像の肌色領域から手の領域を抽出し、上に述べたのと同様の方法（外形の曲率計算等）で、手領域のうちの指先を検出してもよい。この場合、検出した指先の座標はＲＧＢ画像や距離画像といった、２次元画像上の座標であるため、その座標における距離画像の距離情報を用いて、直交座標系の３次元座標に変換する必要がある。
【００５０】
ステップＳ６０６では、タッチジェスチャー判定処理を行う。このとき、ジェスチャー認識部４０９は、直前のステップで検出した指先と書画台２０４を含む平面との距離を計算する。この計算には、検出した指先の３次元座標と、前述した書画台２０４の平面パラメータを用いる。距離が、所定の微小な値以下の場合は「タッチジェスチャーあり」であり、所定の微小な値より大きい場合は「タッチジェスチャーなし」である。
【００５１】
また、直行座標系の所定の高さ（Ｚ方向）に仮想的な閾値平面（不図示）を設け、指先座標のＺの値が閾値平面のＺの値より小さくなることでタッチ検出を行ってもよい。
【００５２】
次にステップＳ６０７では、直前のステップで「タッチジェスチャーあり」だった場合にステップＳ６０８へ移行し、「タッチジェスチャーなし」だった場合はステップS６０２へ戻る。
【００５３】
ステップＳ６０８では、指先方向の特定処理を行う。指先方向とは、図７（ａ）でいえば、矢印７０２の方向である。つまり、手７０１の指が、書画台２０４の平面の中で指し示す方向と同じである。指先方向を特定するには、指部分の特定を行う。そのためにまず、腕が読み取り領域２０５に侵入している部分を特定する。前述したように、図７（ｂ）の点７０９と点７１０とを、腕７０４が読み取り領域２０５に侵入している点として発見することができる。
【００５４】
次に指部分を特定する。図７（ｃ）の線分７０６は、点７０９と点７１０を結んだ線分である。線分７０６と平行に、線分群７０７を、所定の微小な間隔で、腕７０４の領域（これを腕領域７０４とも呼ぶ）に引いていく。この長さが、所定の閾値よりも短くなっている部分を指先として特定する。図７（ｃ）では、線分７０８の位置から、所定の閾値以下となる。
【００５５】
次に指先方向を特定する。線分７０８の中点の座標から、ステップＳ６３３で発見した、ｘｙ平面上の指先座標に向けてベクトル７０９を定義する。ベクトル７０９の向きが指先の方向であり、長さが指の長さを表す。ベクトル７０９はたとえば、線分７０８の中点を始点とし、ステップＳ６３４で特定した指先位置を終点とするベクトルとして特定することができる。また、図７（ｅ）を用いて説明した方法で指先座標を求めた場合は、腕の付け根の点７１１から指先点７１２までを結んだベクトル７１３を指の方向ベクトルとして決めてもよい。この場合は、指の長さは上述の方法で求める必要がある。ただし、この場合にはベクトル７０９を求めるには及ばない。そこでたとえば長さが上述した所定の閾値（すなわち指の幅の上限）よりも短い線分群７０７のうち、腕の付け根の点７１１に最も近い線分またはその延長線がベクトル７１３と交差する点を求め、その点を指の付け根の位置とする。その点から指先点７１２までの距離を指の長さとして決めることができる。もちろん上述した方法でベクトル７０９を求め、それに基づいて指の長さを決めることもできる。
【００５６】
また、図７（ｆ）に示したように、掌（手の甲）の中心点７１４から指先点７１５までを結んだベクトルを指の方向ベクトル７１６として定めてもよい。このとき掌（手の甲）の中心点７１４は、手領域のうち、手領域の輪郭７１７を構成するそれぞれの画素からの距離が最大となる点として求めることができる。
【００５７】
更に、指先に対して楕円フィッティングを行った場合は、楕円の二つの焦点を結ぶ方向を指の方向ベクトルとしてもよい。このとき、ベクトルの方向は、上述の方法で求めた、腕が読み取り領域に侵入している点の中点を起点に決めればよい。この場合も、指の長さは上述の方法を用いて求める必要がある。
【００５８】
上記処理は、指さし姿勢に限定した例を書いたが、五指が開かれた状態でも、各指について得られるであろう複数の線分７０８それぞれについて上記処理を施すことで、全ての指についてその方向と長さを求めることができる。
【００５９】
ステップＳ６０８が終了すると、ステップＳ６０９へと進む。ステップＳ６０９では、タッチ位置の決定処理を行う。これは、ユーザーが実際にタッチしていると感じている、指の腹の位置を推定する処理である。図８（ａ）の二次元点群８０１は、書画台２０４に投影されたｘｙ平面上の手の領域の画像を表している。このうち、部分８０２の拡大図が拡大部分８０３である。指８０４に対して、ベクトル８０５は、ステップＳ６０８で求めた、指先方向のベクトル７０９である。ここで、ｘｙ平面上の指先点８０６をベクトル８０５と反対向きに所定量シフト（すなわち所定距離８０７だけシフト）させた点のｘｙ座標を、タッチ点８０８として決定し、ＲＡＭ３０３の所定の領域に保存する。シフトさせる所定距離は、設定可能なものとする。この場合のタッチ点のｚ座標は、０としてもよいし、３次元点群の対応する点からｚ座標を定めてもよい。なお、指先８０６の位置は、ステップＳ６３４で特定した指先位置であってよい。
【００６０】
また、タッチ位置（指の腹）を決める方法は、上述のように所定距離だけシフトする方法に限られるものではない。たとえば、図８（ｂ）に示すように、指先発見の際に、円フィッティングに用いた円８０９の中心８１０をタッチ位置として決定してもよい。
【００６１】
また、図８（ｃ）に示すように、指先に楕円フィッティングした楕円８１１の焦点（８１２、８１３）のうち指先側の点８１２をタッチ位置として決定してもよい。このとき、焦点が指先側かどうかを決定するためには、前述した腕の付け根から遠い方を採用するようにすればよい。
【００６２】
更に、指先の外形を構成する画素の重心点をタッチ位置として決定するようにしてもよい。図８（ｄ）は、指先の外形を構成する画素と重心点との関係を模式的にあらわしたものである。指先の外形を構成する画素群８１４は、前述した指先の発見の際に用いた、腕の外形を構成する輪郭点の画素のうち、隣り合う複数の画素を表している。画素群８１４は、そのうちで指先として発見された際の９個の画素であり、真ん中の画素８０６が指先として発見されたと仮定する。指先点８０６を含めた画素群８１４の重心点を８１５としこの重心点８１５をタッチ位置として決定すればよい。
【００６３】
また、図８（ｉ）に示すように、指先点８０６の所定の周辺領域８２５に含まれる指の画素の重心８２６をタッチ位置として決定してもよい。このとき、所定の周辺領域は、図８（ｉ）のように円に限定されるものではない。また、重心８２６から指先点８０６までを結んだベクトルを、指先の方向ベクトルとしてもよい。
【００６４】
また、指先の外形を構成する画素に対して、多角形近似を行って、その多角形の重心をタッチ位置として決定してもよい。図８（ｅ）は、指先の外形に対して多角形近似を行う様子を模式的に表したものである。五角形８１６が指先の外形に対して近似された多角形を表している。その重心が点８１７で表現されているので、点８１７をタッチ位置として決定すればよい。多角形近似は、ＯｐｅｎＣＶなどのオープンソースで公開されているＡＰＩを用いれば簡単に実行することが可能である。
【００６５】
更に、指先発見時にフィッティングに用いた円と指先方向ベクトルを用いて、タッチ位置を決定するようにしてもよい。図８（ｆ）は、指先発見時にフィッティングに用いた円と指先方向ベクトルを用いて、タッチ位置を決定する方法を模式的にあらわした図である。ベクトル８１８は指先方向ベクトルを延長したベクトルを表している。このベクトル８１８と指先にフィッティングさせた円８０９の交点のうち、ベクトルの先端に近い方の点８１９を仮想的な指先として求める。この仮想的な指先点は、タッチを検出する際に用いた指先点とは異なる。仮想的な指先点８１９を、所定距離８０７だけ、指先方向ベクトルと反対向きにシフトさせた点をタッチ位置８２０として決めてもよい。
【００６６】
同様にして、指先にフィッティングした楕円と指先方向ベクトルを用いて、タッチ位置を決定するようにしてもよい。図８（ｇ）は、指先にフィッティングした楕円と指先方向ベクトルを用いて、タッチ位置を決定する方法を模式的に表している。指先方向ベクトルを延長したベクトル８１８と楕円８１１の交点のうち、指先側の点８２１を仮想的な指先として設定する。仮想的な指先８２１を、指先方向ベクトルと反対向きに所定距離だけシフトさせた点８２２を指先点として決定すればよい。
【００６７】
上記の処理は、手の３次元点群を書画台２０４の平面に射影した２次元画像、もしくは、距離画像センサ２０８から取得した距離画像を用いれば可能である。
【００６８】
加えて、ＲＧＢ画像を用いてタッチ位置を決定するようにしてもよい。更に、ＲＧＢ画像を用いる場合、爪を発見することにより、タッチ位置を決定するようにしてもよい。図８（ｈ）は、指先８０５の拡大図であり、ＲＧＢ画像で爪の領域からタッチ位置を決定する様子を模式的に表したものである。爪８２３が、ＲＧＢ画像から発見した爪の領域を表している。爪の領域は、周辺の指の領域との輝度値の違いを見れば発見出来る。発見した爪の領域の重心点を求めて、それをタッチ位置として決定すればよい。この時、前述したようにＲＧＢ画像と距離画像との位置合わせがなされているので、爪領域の重心点を、距離画像もしくは手の３次元点群を書画台２０４の平面に射影した２次元画像の相当する位置に変換することは、容易に可能である。
【００６９】
以上のような方法を用いれば、平面にタッチしているタッチ位置（指の腹の位置）を推定することが可能である。
【００７０】
ステップＳ６０９が終了すると、ステップＳ６０５に移行する。ステップＳ６０５では判定したタッチジェスチャーとタッチ位置の３次元座標をメイン制御部４０２へ通知し、ステップＳ６０２へ戻ってジェスチャー認識処理を繰り返す。
【００７１】
なお、本実施形態では一本指でのジェスチャー認識について説明を行ったが、複数の指あるいは複数の手でのジェスチャー認識に応用することも可能である。たとえば、図６Ａの手順を繰り返してタッチ位置を定期的に取得すれば、タッチの有無やタッチ位置の変化などから様々なジェスチャーを特定することができる。メイン制御部４０２は、アプリケーションを実行する部分である。メイン制御部４０２はタッチジェスチャーを受信すると、アプリケーションで定義された対応する処理を実行する。
【００７２】
本実施例により、上面から距離画像センサにより指先と平面とを撮影し、距離画像を用いて、正確な平面へのタッチ位置を特定することが可能となる。
【００７３】
［実施形態２］
実施形態１では、上面のセンサから指先と平面を撮影する場合の、タッチ位置の決定方法の基本的な部分を説明した。タッチ位置を決定する為に、距離画像センサで取得した距離画像から指先を発見し、指先方向と逆方向に指先位置の座標を所定距離シフトさせることで、タッチ位置の座標を決定する方法をとった。本実施形態では、ユーザーがもう少し細かいタッチ指示を行いたい場合に、タッチ位置の補正を行い、補正後の位置をタッチ位置として特定あるいは推定することで操作性を向上させる方法を、図９のジェスチャー認識部４０９が実行するフローチャートに沿って説明する。図１０（ａ）は、タッチ位置の補正が必要な場合を模式的に表している。図１０（ａ）の上の図は、書画台２０４の一部である平面１００３に指１００１がタッチしている様子を横から見た図である。この場合、実施形態１で説明した方法と同じやり方で発見した指先の３次元点が、指先位置１００５で表される。実施形態１で説明した方法で、ユーザー定義の所定の値１００７だけ指先の位置を示す指先座標をシフトさせて決めたタッチ位置の点は、タッチ位置１００６で表される。図１０（ａ）の下の図は、上の図よりも指１００２の、平面１００４に対する角度が大きい場合を表している。この場合、実施形態１と同じ方法で求めたタッチ位置の点は、位置１００８となるが、実際に平面に接触している点は位置１００９である。このように、タッチ点を求めるために、所定の固定値だけシフトさせただけでは、指先の平面に対する角度に応じて、実際にタッチしている、もしくはタッチしているとユーザーが感じる点と、タッチ位置の点として求めた点がずれてしまうことがあり得る。そこで本実施形態では、タッチ位置の点を求めるために指先位置をシフトさせる量を求めるのに、指先の角度を用いる。
【００７４】
図９のフローチャートのステップＳ６ｘｘと記載されたステップは、実施形態１において、図６Ａ，図６Ｂの説明時に説明済みである。ここでは、差分であるステップＳ９ｘｘと記載されたステップを中心に説明する。
【００７５】
ステップＳ６０８で指先方向ベクトル７０９を特定した後、ジェスチャー認識部４０９は、ステップＳ９０１において、手指と書画台２０４の平面がなす角度を求める。この時、ステップＳ６０８で求めた、指先方向のベクトル７０９を用いる。指先方向のベクトル７０９は、書画台２０４の平面、つまりｘｙ平面上の２次元ベクトルである。このベクトルは、横から見た図では、図１０（ｂ）のベクトル１０１０、１０１２のように表される。これらのベクトル１０１０、１０１２の始点と終点を、前述した手の３次元点群内の点と対応づける。この対応づけは、前述したステップＳ６０３において３次元点群を平面に投影した際に既になされている。図１０（ｂ）上の例では、ベクトル１０１０の始点は、３次元点１０１８に、終点は３次元点１００５に対応づけることができる。たとえば、ベクトルのそれぞれの端点を通りｚ軸に平行な直線と、手の３次元点群で構成される面との交点を、求める三次元ベクトルのそれぞれの端点とする。手の３次元点群は手の表面を形成しているので交点は直線ごとに２つずつ存在する可能性があるが、それぞれの端点で同じ側（すなわちｚ成分がより小さい方か、又はより大きい方のいずれか）の交点を採用すれば、いずれを用いてもよい。図１０の例では、ｚ成分がより大きい方の交点を用いている。もちろんこれは一例に過ぎない。このようにして３次元点１０１８、１００５をそれぞれ、始点、終点とするベクトル１０１１を得れば、これが指の３次元ベクトルとなる。同様にして、指の３次元ベクトル１０１３を得ることができる。ベクトル１０１０とベクトル１０１１のなす角１０２０、および、ベクトル１０１２とベクトル１０１３のなす角１０２２が、指と平面のなす角として求められる。
【００７６】
次に、ステップＳ９０２では、タッチ位置を求めるために指先位置をシフトさせる量を求める。図１０（ｃ）は、ステップＳ９０１で求めた平面に対する指の角度を利用してシフトする量を決めている様子を模式的に表した図である。まず、図１０（ｃ）の上の図で説明する。ベクトル１０１４は、指先の３次元点１００５を始点とし、指の３次元ベクトル１０１８と逆方向の単位ベクトルを持ち、ユーザー指定の所定の長さを持っているものとする。このベクトル１０１４の終点をｘｙ平面１００３にｚ軸に沿って投影した点が点１０１６であり、この点を求めたいタッチ位置とする。同じ方法で図１０（ｃ）の下の図でもタッチ位置１０１７を求めることができる。このように指の先端から三次元の指先方向ベクトルの逆方向に所定距離ずらした位置をｘｙ平面（すなわち操作面）に投影すれば、平面に対する指の角度に応じてタッチ位置を前後させることができるため、ユーザーのタッチ感覚を損なわないタッチ位置を提供することができる。
【００７７】
このタッチ位置１０１６、１０１７を求める作業は、書画台２０４のｘｙ平面上にあり、指先点を始点とするベクトル１０２１、１０２３を求める作業に他ならない。図１０（ｄ）に示したように、ベクトル１０１０、ベクトル１０１２と逆向きのベクトルをそれぞれ、ベクトル１０２４、ベクトル１０２５とする。ベクトル１０１４、１０１５をベクトルｖ、ベクトル１０２４、１０２５をベクトルｗ、求めたいベクトル１０２１、１０２３をベクトルｘと定義すれば、ベクトルｘはベクトルｖをベクトルｗに正射影したものである。ベクトルｖをベクトルｗに正射影したベクトルｖ'は、角度１０２０、１０２２をθと定義すると、角度θを用いて次式で表される。
ｖ'＝（｜ｖ｜｜ｗ｜ｃｏｓθ／｜ｗ｜）×ｗ／｜ｗ｜  ・・・（４）
この（４）式のうちｗ／｜ｗ｜はベクトルｗと同方向の単位べクトルであるから、定数"｜ｖ｜｜ｗ｜ｃｏｓθ／｜ｗ｜"＝｜ｖ｜ｃｏｓθが、求めたいベクトルｖ'の大きさ、すなわち指先の位置をタッチ位置までｘｙ平面内でシフトさせるシフト量である。なお、ベクトルｗがｘｙ平面上にあるのなら、ベクトルｖのベクトルｗに対する正射影ｖ'は、ベクトルｖの始点及び終点のｚ成分をいずれも０に置換することで求めることができる。
【００７８】
ジェスチャー認識部４０９は、ステップＳ９０３では、指先位置を始点とするステップＳ９０２で求めたベクトルｖ'の終点をタッチ位置として決定する。すなわち、ｘｙ平面内の指先方向の２次元ベクトルに沿ってステップＳ９０２で求めたシフト量だけ指先位置をシフトさせ、その座標をタッチ位置として決定し、ＲＡＭ３０３に保存する。
【００７９】
上記処理を行うことにより、指先方向と操作平面との角度に応じてタッチ位置を変化させ、より正確にタッチ位置を特定することができる。
【００８０】
また、図１０（ｃ）を見てもわかるように、指１００２が平面に対して立っている場合（図１０（ｃ）の下の図）の補正量１０２３は、指１００１が平面に対して寝ている場合（図１０（ｃ）の上の図）の補正量１０２１よりも補正量が小さい。この前提のもと、ユーザーがタッチした位置を用いて補正量を決定するようにしてもよい。ユーザーは、自分から見て遠い位置をタッチする時の方が、近い位置をタッチする時よりも指先が寝る傾向がある。したがって、遠い位置では大きい補正量、近い位置では少ない補正量を指先からシフトすることによって、タッチ位置を決定するようにすればよい。ユーザーからタッチ位置までの距離は、実施形態１で述べた腕の付け根の点から指先点までの距離により計測できる。
【００８１】
図１０（ｅ）は、ユーザーからタッチ位置までの距離と補正量との関係の一例を模式的にグラフで表したものである。横軸はユーザーからの距離を、縦軸は補正量を表している。図１０（ｅ）では線形のグラフを描いたが、線形に限定されるものではない。上記処理を用いても、指先と平面の角度に応じたタッチ位置の補正を、簡易的に行うことが可能となる。
【００８２】
［実施形態３］
実施形態１および２では、上面のセンサから指先と平面を撮影する場合の、タッチ位置の決定方法の基本的な部分と、平面に対する指の角度に応じてタッチ位置を決定する方法を説明した。これらの方法は距離画像センサ２０８のノイズが少ない場合に成立する。
【００８３】
ここで距離画像センサ２０８のノイズが、平面へのタッチ位置の検出に及ぼす影響について説明する。図１２（ａ）の上側の図は、平面１２０２に、指１２０１がタッチしている様子と、実際に距離画像センサにより取得した平面の距離情報１２０３を横から見た状態を、模式的に表している。距離画像センサ２０８と書画台２０４の位置関係は固定であるため、理想的には、距離画像センサ２０８で取得した平面の距離情報は一定である。しかし、実際にはある程度のノイズが乗るため、書画台２０４の平面の距離情報には時間軸方向での揺らぎがある。距離画像センサから得られる平面の距離情報は、距離情報として取得した段階では、図１２（ａ）の距離情報１２０３のように、ノイズを含み、凹凸をもった状態で取得される。前述の平面パラメータを求める際は、これらの凹凸の平均をとるようにして求める。この凹凸が時間軸方向の揺らぎによって、距離画像センサ２０８で取得する距離画像のフレーム毎に変化する。書画台２０４の平面、乃至前述の平面パラメータの平面は、図１２（ａ）の平面１２０２で表されている。これに対し、現在一般的な距離画像センサでは、取得した距離画像の距離情報１２０３は、±３ｍｍ程度上下する凹凸を示す。そのため、前述の図６ＡのステップＳ６３１で、所定の高さ以上の３次元点群を指先として抽出する際は、上記のような平面に乗ったノイズの時間方向の揺らぎを誤って検出してしまわないようにしなければならない。そのために、距離画像に表れた、本来は平面であるはずの面の凹凸を吸収するマージンとして、所定の高さ１２０５が、５ｍｍ程度必要となる。図１２（ａ）では、平面１２０２から、所定の高さ１２０５（５ｍｍ程度）に設定された平面を１２０４で表している。前述したように、手の領域を検出する際、平面１２０４より下にある部分は、平面と共に除去する必要があるため、指先の３次元点１２０６が、平面１２０４より下にある場合は、除去されてしまう。この時、除去されずに残った点の中で、指先として検出できる、仮想的な指先点が、平面１２０４上の点１２０７である。図１２（ａ）の下側の図は、上側の図を上から見た様子（ｘｙ平面上の状態）を模式的に表している。指先点１２０６は点１２１２に、仮想的な指先点１２０７は点１２１１に対応している。指１２０９のうち、点線１２１０より左側の領域は、検出できない。図１２（ｂ）でいえば、点線１２１３で囲まれた部分が、手の領域から除去されてしまう。実線で囲まれた部分のみが、手の領域として抽出される。この場合、真の指先の３次元点１２０６と、仮想的な指先点１２０７（１２１１）との差分の距離１２０８は、５ｍｍ〜１０ｍｍになる。
【００８４】
実施形態１や実施形態２で行った方法では、指先位置を正確に取得することを前提として、タッチ位置を決定する。そのため、上記のように距離画像にノイズがある場合は、正確なタッチ位置の決定が難しい。仮想的な指先点１２０７を用いてタッチ位置を検出した場合、上述したように、５ｍｍ〜１０ｍｍ程度実際のタッチ位置とずれが生じる。そこで本実施形態では、同時に取得している、距離画像よりノイズの少ないＲＧＢ画像を用いて、正確なタッチ位置を決定する。この方法を、図１１の、ジェスチャー認識部４０９が実行するフローチャートを用いて説明する。図１１のステップＳ６ｘｘ、ステップＳ９ｘｘと書かれた部分は、図６Ａ、図９でそれぞれ説明した部分なので、説明を割愛する。
【００８５】
ステップＳ６０８で指先方向ベクトル７０９を特定した後、ジェスチャー認識部４０９は、ステップＳ１１０１において、画像取得部４１６より、距離画像センサ２０８がＲＧＢカメラ３６３で取得したカラー画像、すなわちＲＧＢ画像を取得する。
【００８６】
ステップＳ１１０２において、ジェスチャー認識部４０９は、取得したＲＧＢ画像から指先検出を行う。これにはまず、距離画像で行ったのと同様に、ＲＧＢ画像中の手の領域を検出する必要がある。そのため、起動時に予めＲＡＭ３０３に保存しておいた背景画像（何も置かれていない書画台２０４の画像）と、ステップＳ１１０１で取得したＲＧＢ画像の差分画像を求める。もしくは、ステップＳ１１０１で取得したＲＧＢ画像から肌色の領域を検出する。その後、図６ＡのステップＳ６３３、Ｓ６３４と同様の処理を施せば、ｘｙ平面上の２次元の指先位置を発見することができる。図１２（ｃ）は、ｘｙ平面の画像上で、距離画像で得られた指１２０９にＲＧＢ画像の指が重ねて表示されている様子を表している。この時、距離画像を用いて求めた指先が１２１１で表されている。また、点線で囲まれ部分１２１４は、指のうち、ＲＧＢ画像と距離画像の差分の領域である。点１２１５は、ＲＧＢ画像を用いて発見した指先を表している。
【００８７】
ステップＳ１１０３において、ジェスチャー認識部４０９は、手指と平面のなす角度を取得する。この処理は、図９のステップＳ９０１の処理と同様の処理である。このとき、ステップＳ１１０３で、指先の座標として、距離画像を用いて取得した指先点１２１１を用いる。
【００８８】
ステップＳ１１０４において、ジェスチャー認識部４０９は、真の３次元の指先位置を推定する。真の３次元の指先位置とは、前述したように、ノイズと共に除去された指先の３次元座標である。図１２（ｄ）のベクトル１２１６は、直前のステップＳ１１０３で求めた指先方向を示す３次元ベクトル（指のベクトルとも呼べる）である。この指の３次元ベクトルは、仮想的な３次元の指先位置１２０７を先端として求められている。点線１２１９は、ＲＧＢ画像から求めた２次元の指先位置１２１２を通り、かつ、平面１２０２への指ベクトル１２１６の正射影に直交する平面１２１９を横から見たものである。ベクトル１２１６を終点側に延長し、平面１２１９と交わった点１２２０を真の３次元の指先位置として推定する。点１２１０のｘ、ｙ成分は点１２１２のｘ、ｙ成分とそれぞれ一致するので、点１２０７のｚ成分およびベクトル１２１６の傾きに応じて点１２１０のｚ成分を求めれば、点１２２０を特定できる。ベクトル１２１８は、延長した分のベクトルを表現している。ベクトル１２１６とベクトル１２１８を足したベクトルを、真の指の３次元ベクトルとして、以後の処理で利用する。ステップＳ１１０４が終了すると、ステップＳ９０２へ移行する。ここからの処理は、図９で説明した処理と同様の処理である。すなわち、指先位置１２２０から指ベクトルの逆方向へ所定距離戻した点をｘｙ平面へと投影し、その点をタッチ位置として推定する。その際、指の３次元ベクトルとしては、上記真の指の３次元ベクトルを用いて処理を行う。
【００８９】
上記処理により、距離画像センサの精度がよくない場合でも、３次元の指先位置を推定し、タッチ位置を決定することが可能となる。
【００９０】
［実施形態４］
実施形態３では、距離画像にノイズがある場合に、ＲＧＢ画像を用いて３次元の指先位置を発見し、タッチ位置を決定する方法を説明した。本実施形態では、ＲＧＢ画像を用いず、距離画像のみで真の３次元の指先位置を発見し、タッチ位置の決定に用いる方法を説明する。
【００９１】
図１４（ａ）は、平面１４０８にタッチする寸前の指１４０１が、矢印１４０４の方向に降下して、タッチしている状態の指１４０２に変化する様子を模式的に表している。実施形態３でも述べたように、距離画像にノイズがある場合、所定の高さ１４０６の位置に平面の閾値（あるいは平面度の閾値）を設定しなければならなくなる。そのため、タッチしている状態の指１４０２は、先端部分１４０５が、平面と共に除去され、指先が欠けた状態になるので、真の３次元の指先位置を直接発見することが難しい。しかし、タッチする寸前の指１４０１は所定の高さ１４０６より高い位置にあるため、指先が欠けることはない。この状態の指の長さを保存しておき、タッチ後の指先位置の推定に用いる。
【００９２】
この方法を図１３の、ジェスチャー認識部４０９が実行するフローチャートを用いて詳細に説明する。図１３のステップのうち、ステップＳ６ｘｘ、Ｓ９ｘｘ、Ｓ１１ｘｘと記載されているものは、図６Ａ、図９、図１１のフローチャートで説明したステップと同様であるため、詳しい説明を割愛する。
【００９３】
ステップＳ６０３で指先検出を行った後、ステップＳ１３０１において、ジェスチャー認識部４０９は、後述するタッチカウントが所定値以下かどうかを確かめる。ここでタッチカウントとは、ジェスチャー認識部４０９の処理が開始された後、何回平面へのタッチが行われたかを表す数値である。ステップＳ６０７でタッチジェスチャーありと判定された場合に、インクリメントされ、ＲＡＭ３０３に保存されているものとする。所定値以下であった場合は、ステップＳ１３０２へ進み、所定値以上であった場合は、ステップＳ６０６へ進む。
【００９４】
ステップＳ１３０２において、ジェスチャー認識部４０９は、指先位置が所定の高さ以下かどうかを確認する。ここでいう所定の高さとは、図１４（ａ）の１４１２の高さである。これは、ノイズを回避するための高さ１４０６より大きく設定される必要がある。高さ１４１２は平面１４０７よりも十分離れた位置に指があることを保証するためのものなので、高さ１４１２は高さ１４０６よりも大きく、かつ、通常の操作における指の高さよりも低い範囲で、たとえば高さ１４０６の倍程度に設定される。高さ１４０６が５ｍｍ程度に設定されている場合、高さ１４１２は１０〜２０ｍｍに設定しておけばよい。ここで所定の高さ以下だった場合はステップＳ１３０３へ移行し、所定の高さより高かった場合はステップＳ６０６へ移行する。
【００９５】
ステップＳ１３０３において、ジェスチャー認識部４０９は、指の長さを保存する処理を実行する。この時、ジェスチャー認識部４０９は、実施形態２で説明したステップＳ９０１と同じ方法で、指の３次元ベクトル１４１１を得る。この指の３次元ベクトル１４１１の長さを、ＲＡＭ３０３の所定領域に保存しておく。
【００９６】
上記ステップＳ１３０１〜Ｓ１３０３の処理は、タッチカウントが所定の回数を超えるまで実行されるが、その回数分、指の３次元ベクトルを取得し、長さの平均値をとるようにしてもよい。
【００９７】
さてステップＳ６０８で操作面にタッチした指先方向の特定が済むと、ステップＳ１３０５において、ジェスチャー認識部４０９は、手指と平面のなす角度から、３次元指先位置を推定する処理を行う。この時、ステップＳ１１０３で求めた、仮想的な指の３次元ベクトル１４１４を、その始点位置を維持したままステップＳ１３０１〜Ｓ１３０３で求めた指の長さまで延長する。延長された指の３次元ベクトルが、ベクトル１４１６である。この先端１４１７を真の３次元の指先点とする。この真の３次元の指先点を用いれば、以降のステップにおいて、実施形態１，２と同様にしてタッチ位置を決定することができる。
【００９８】
本実施形態は前述の平面の閾値が平面に対して一定で、所定以上の場合を対象にしている。しかし、環境によっては、平面の場所ごとにセンサの感度が変わるため、場所ごとに平面の閾値（図１４の高さ１４０６）を変えられる場合がある。その場合、場所ごとに真の３次元の指先位置を推定する必要がある場合とそうでない場合がある。そのようなときは、予め平面の場所ごとの閾値を保存しておく。場所とは、操作平面上における領域区分等で特定する。そして図１５のフローチャートのステップＳ１５０１に示すように、タッチされた位置の平面の閾値が所定値以下かどうかを判定して、所定値を超えていればステップＳ１１０３、Ｓ１３０５、Ｓ９０２を行うものと決めるようにしてもよい。同様にして、ＲＧＢ画像から真の指先の３次元位置を推定する場合も、平面の場所ごとの閾値に応じて処理を切り替えるようにしてもよい。
【００９９】
尚、上記処理では、所定の高さ１４１２より指先が低くなったら指の長さを保存するようにしたが、初回起動時に指先を距離画像センサにかざす等して、指の長さを保存するようにしてもよい。
【０１００】
また、フローチャートでは、ステップＳ１３０５で真の３次元の指先位置を推定した後、ステップＳ９０２、Ｓ６０９でタッチ位置を決定したが、この順序を逆にしてもよい。まず指先がタッチされていないうちに、ステップＳ９０２、Ｓ６０９と同様の処理を用いて補正量、つまりは指の腹の位置を算出しておく。ステップＳ１３０３では、求めた指の長さに加えて、指の付け根から指の腹までの長さを保存する。タッチジェスチャーが検出されたのちに、先に保存した指の腹までの長さを用いて、ステップＳ１３０５と同様の処理を行い、正確なタッチ位置を推定するようにしてもよい。
【０１０１】
また、上記処理では、指の角度と長さを用いて、正確なタッチ位置を推定する方法を説明したが、指先の軌跡を保存することにより、正確なタッチ位置を推定するようにしてもよい。図１４（ｃ）は指先の位置の軌跡を用いてタッチ時の指先位置を推定する様子を模式的に表した図である。位置１４２１、１４２２、１４２３は、タッチする直前の、時系列に連続した指の位置を表している。
【０１０２】
位置１４２４は予測されるタッチ位置での指の位置を表しており、この時の指先はノイズを回避するための高さ１４０６より下になっているため、そのままでは正しい指先位置が発見出来ない。軌跡１４２５は、指先の軌跡を表している。軌跡１４２６は予測される指先の軌跡を表している。ここで、ノイズを回避するための高さ１４０６より高い所定の位置１４２０に、閾値を設けて置く。図１４（ｃ）の高さ方向の座標値がこの閾値１４２０以下となるまで、指先の軌跡をＲＡＭ３０３に保存し、その後の指先の軌跡を予測するのに用いる。軌跡の保存は、現在の指先位置と直前の指先位置を用いて、２点間を結ぶ３次元的な直線を保存していくようにすればよい。この場合、直線の方向に軌跡の方向ベクトルをとれば、その方向ベクトルと、書画台の平面１４０８（もしくは書画台の平面から所定の高さに設けた仮想的な平面）が交わる点が予測される指先点となる。
【０１０３】
また、現在と直前の２点だけではなく、直近の指先位置を所定個数だけＲＡＭ３０３に保存しておき、所定個数の指先位置を通る近似曲線を３次元的に求めるようにしてもよい。この場合、３次元的な曲線と書画台の平面１４０８（もしくは書画台の平面から所定の高さに設けた仮想的な平面）が交わる点が予測される指先点となる。上記の書画台の平面１４０８から所定の高さに設けた仮想的な平面は不図示である。この仮想的な平面は、指の厚みを考慮して、指の厚み分実際の書画台の平面１４０８より上に設定された平面である。指先位置が推定されれば、これまでに述べてきた方法を用いて、タッチ位置（指の腹の位置）を求めることができる。
【０１０４】
また、上記の方法は、まず指先の軌跡を用いて、タッチ時の指先位置を推定してから、指の腹の位置を求める順序で説明したが、これを逆にしてもよい。つまり、毎フレーム、指の腹の位置の推定処理を、これまで述べてきた方法を使って行っておき、指の腹の位置の軌跡を求めることで、タッチ位置を推定するようにしてもよい。
【０１０５】
また、上記は、常に指の軌跡を保存しておく方法を述べたが、ＣＰＵパフォーマンスを低下させない観点から、指が所定の高さ以下になった時点で軌跡を保存し始めるようにしてもよい。図１４（ｃ）でいえば、高さ１４１２に閾値を設け、指先がその閾値以下になった時点で指の軌跡をとり始めればよい。
【０１０６】
更に、指の軌跡を簡易的に求める方法として、所定の高さの２点間を結ぶ直線を求めることで指先位置を予測するようにしてもよい。たとえば、図１４（ｃ）の閾値１４０３、１４２０を、指が上から順番に横切った時の指先の座標を保存しておき、それぞれの座標を３次元的に結んだ直線を求める。
この直線と書画台の平面１４０８が交わる点を予測される指先点としてもよい。
上記処理により、正確なタッチ位置を推定することが可能となる。
【０１０７】
［その他の実施例］
なお本発明は以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア（プログラム）を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ（またはＣＰＵやＭＰＵ等）がプログラムを読み出して実行する処理である。
【符号の説明】
【０１０８】
１０１  カメラスキャナ、２０１  コントローラ部、２０２  カメラ部、２０４  書画台、２０７  プロジェクタ、２０８  距離画像センサ部
【図１】
0006643825.tif 000002
【図２】
0006643825.tif 000003
【図３】
0006643825.tif 000004
【図４】
0006643825.tif 000005
【図５】
0006643825.tif 000006
【図６Ａ】
0006643825.tif 000007
【図６Ｂ】
0006643825.tif 000008
【図７】
0006643825.tif 000009
【図８】
0006643825.tif 000010
【図９】
0006643825.tif 000011
【図１０】
0006643825.tif 000012
【図１１】
0006643825.tif 000013
【図１２】
0006643825.tif 000014
【図１３】
0006643825.tif 000015
【図１４】
0006643825.tif 000016
【図１５】
0006643825.tif 000017