(57)【要約】  【課題】  マルチウィンドウの操作において、ユーザに快適な操作性を提供できるコンピュータシステムを提供することである。  【解決手段】  ウィンドウシステム４００は、並行して動作する複数のアプリケーションプログラム１００にそれぞれ固有のウィンドウを割り当て制御する。ポインティングデバイスとしてのモーションセンサ６００は、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、照射時に得られた画像と非照射時に得られた画像との差分画像を解析し、ユーザの手を検出する。ウィンドウシステム４００は、モーションセンサ６００が検出したユーザの手の情報に基づきウィンドウを制御するための機能を各アプリケーションプログラム１００に提供する。【選択図】  図１
2012073658.tif 000002
【特許請求の範囲】
【請求項１】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、を備え、
前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する、コンピュータシステム。
【請求項２】
複数のアプリケーションが並行して動作可能なコンピュータシステムであって、
前記コンピュータシステム全体を管理するオペレーティングシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、
前記モーションセンサを制御し、前記モーションセンサから解析結果である前記ユーザの手の情報を受け取って、前記オペレーティングシステムに渡すデバイスドライバと、
前記デバイスドライバから受け取った前記ユーザの手の情報に基づく前記オペレーティングシステムの所定機能を前記各アプリケーションプログラムに提供するアプリケーションプログラムインタフェースと、を備え、
前記オペレーティングシステムは、並行して動作する前記複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムを含み、
前記所定機能は、前記ウィンドウを前記モーションセンサが検出した前記ユーザの手の情報に基づき制御するための前記ウィンドウシステムの機能である、コンピュータシステム。
【請求項３】
前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、画面上のカーソルを制御する、請求項１又は２記載のコンピュータシステム。
【請求項４】
前記ウィンドウシステムは、
前記モーションセンサが検出した前記ユーザの手の情報に基づいて、前記アプリケーションプログラムから依頼されたイベントが発生したか否かを監視し、前記イベントが発生した場合に、依頼主である前記アプリケーションプログラムに、前記イベントの発生を通知するイベント監視手段を含む請求項１から３のいずれかに記載のコンピュータシステム。
【請求項５】
前記モーションセンサによって検出される前記ユーザの手の情報は、前記ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度の情報の一部または全部である、請求項１から４のいずれかに記載のコンピュータシステム。
【請求項６】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、
前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供するミドルウェアと、を備えたコンピュータシステム。
【請求項７】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を生成する撮影手段と、
前記差分画像を解析して、前記ユーザの手の情報を取得する解析手段と、を備え、
前記ウィンドウシステムは、前記解析手段が取得した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する、コンピュータシステム。
【請求項８】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を生成する撮影手段と、
前記差分画像を解析して、前記ユーザの手の情報を取得するミドルウェアと、を備え、
前記ミドルウェアは、前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供する、コンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、三次元空間中の人の手の動きを撮影し、撮影画像を解析して、解析結果をポインティングに利用するコンピュータシステム及びその関連技術に関する。
【背景技術】
【０００２】
特許文献１は、非接触型ポインティングデバイスであるカーソル操作装置を開示する。このカーソル操作装置は、カメラにより三次元空間中のユーザの指先の動きを検出して、その動きにカーソルを追従させ、非接触で機器を操作する。そして、カーソル操作装置は、画面に表示されたボタンの上にカーソルが一定時間滞在すると、クリック操作がなされたと判断し、そのボタンが押下されたとみなす。
【０００３】
なお、マウスやタッチパッド等、ユーザが接触して操作するポインティングデバイスを、非接触型に対して、接触型ポインティングデバイスと呼ぶ。
【０００４】
ところで、マイクロソフトコーポレーションが提供するオペレーティングシステムであるＷｉｎｄｏｗｓ（登録商標）は、並行して動作する複数のアプリケーションそれぞれに固有のウィンドウを割り当て画面出力を多重化するウィンドウシステムを搭載する。各アプリケーションプログラムは、ウィンドウシステムの機能を利用して、それぞれに割り当てられたウィンドウを制御する。
【０００５】
ユーザは、マウス等のポインティングデバイスを操作し、ウィンドウシステムを介して、同一画面に表示された複数のウィンドウ（マルチウィンドウ）を操作する。つまり、ウィンドウシステムは、ユーザが操作するポインティングデバイスの情報に基づいて、ユーザによるウィンドウの操作を検出し、依頼先のアプリケーションに通知する。アプリケーションプログラムは、その通知を受けて、自分に割り当てられたウィンドウを制御する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００４−２５８８３７
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、マウス等の接触型ポインティングデバイスにより、マルチウィンドウを操作することは、ユーザに対して、必ずしも快適な操作性を提供しない。なぜなら、接触型ポインティングデバイスでは、ユーザの操作が限定的だからである。例えば、マウスの場合、マウスの移動とマウスボタンの操作しかできない。
【０００８】
そこで、本発明は、マルチウィンドウの操作において、ユーザに快適な操作性を提供できるコンピュータシステム及びその関連技術を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の第１の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、を備え、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する。
【００１０】
この構成によれば、各アプリケーションプログラムは、モーションセンサにより検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手をモーションセンサにより撮影し、撮影画像からの検出結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【００１１】
「多彩な入力」とは、例えば、手の形状（グー、チョキ、パー、一本指、）、手の形状の変化、手の面積（モーションセンサと手との間の距離に相関）、手の動き（例えば、手の回転、指先の動き）、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度、などである。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本発明では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、手の形状の所定の変化により、擬似的にボタン操作が行なわれたとみなすことにより、マウスと同等の機能を包含できる。
【００１２】
このように、モーションセンサは、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【００１３】
また、モーションセンサが差分画像を解析して手を検出するので、このような処理をウィンドウシステムは行なう必要がなく、その処理負荷を軽減でき、また、ウィンドウシステムのプログラマは、手を検出するためのプログラムを作成する必要がなく、その負担を軽減できる。つまり、コンピュータシステムに簡易にモーションセンサを搭載できる。
【００１４】
本発明の第２の観点によれば、コンピュータシステムは、複数のアプリケーションが並行して動作可能なコンピュータシステムであって、前記コンピュータシステム全体を管理するオペレーティングシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、前記モーションセンサを制御し、前記モーションセンサから解析結果である前記ユーザの手の情報を受け取って、前記オペレーティングシステムに渡すデバイスドライバと、前記デバイスドライバから受け取った前記ユーザの手の情報に基づく前記オペレーティングシステムの所定機能を前記各アプリケーションプログラムに提供するアプリケーションプログラムインタフェースと、を備え、前記オペレーティングシステムは、並行して動作する前記複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムを含み、前記所定機能は、前記ウィンドウを前記モーションセンサが検出した前記ユーザの手の情報に基づき制御するための前記ウィンドウシステムの機能である。
【００１５】
この構成によれば、上記第１の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第１の観点によるコンピュータシステムと同様の効果を奏する。
【００１６】
上記第１及び第２の観点によるコンピュータシステムにおいて、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、画面上のカーソルを制御する。
【００１７】
この構成によれば、ユーザは、三次元空間中で手を動かしながら、非接触で、カーソルを操作できる。
【００１８】
上記第１及び第２の観点によるコンピュータシステムにおいて、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、前記アプリケーションプログラムから依頼されたイベントが発生したか否かを監視し、前記イベントが発生した場合に、依頼主である前記アプリケーションプログラムに、前記イベントの発生を通知するイベント監視手段を含む。
【００１９】
この構成によれば、アプリケーションプログラムをイベント駆動型プログラムとして作成することができ、ウィンドウの制御に好適である。
【００２０】
上記第１及び第２の観点によるコンピュータシステムにおいて、前記モーションセンサによって検出される前記ユーザの手の情報は、前記ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度の情報の一部または全部である。
【００２１】
この構成によれば、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができる。
【００２２】
ここで、本明細書及び特許請求の範囲において、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、手自体の動き、位置、移動、移動軌跡、速度、および、加速度のみを意味するのではなく、手の指先の動き、位置、移動、移動軌跡、速度、および、加速度を含む概念である。また、この場合、指先は、一本の指に限らず、複数本の指の指先を含んでよい。さらに、手は、片手であってもよいし、両手であってもよい。
【００２３】
本発明の第３の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供するミドルウェアと、を備える。
【００２４】
この構成によれば、上記第１の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第１の観点によるコンピュータシステムと同様の効果を奏する。
【００２５】
本発明の第４の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を生成する撮影手段と、前記差分画像を解析して、前記ユーザの手の情報を取得する解析手段と、を備え、前記ウィンドウシステムは、前記解析手段が取得した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する。
【００２６】
この構成によれば、各アプリケーションプログラムは、撮影手段及び解析手段により検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手を撮影手段により撮影し、解析手段による撮影画像の解析結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【００２７】
「多彩な入力」とは、例えば、手の形状（グー、チョキ、パー、一本指、）、手の形状の変化、手の面積（モーションセンサと手との間の距離に相関）、手の動き（例えば、手の回転、指先の動き）、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度、などである。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本発明では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、手の形状の所定の変化により、擬似的にボタン操作が行なわれたとみなすことにより、マウスと同等の機能を包含できる。
【００２８】
このように、モーションセンサは、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【００２９】
本発明の第５の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を生成する撮影手段と、前記差分画像を解析して、前記ユーザの手の情報を取得するミドルウェアと、を備え、前記ミドルウェアは、前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供する。
【００３０】
この構成によれば、上記第４の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第４の観点によるコンピュータシステムと同様の効果を奏する。
【図面の簡単な説明】
【００３１】
【図１】本発明の実施の形態によるコンピュータシステム７００の階層図である。
【図２】（ａ）本発明の実施の形態によるコンピュータシステム７００の電気的構成を示す図である。（ｂ）図２（ａ）のモーションセンサ６００の電気的構成を示す図である。
【図３】（ａ）本発明の実施の形態による擬似ボタン操作の説明図である。（ｂ）本発明の実施の形態による擬似ボタン操作の第１〜第３の例の説明図である。
【図４】図２のＭＣＵ３による画像解析処理の流れの一例を示すフローチャートである。
【図５】図４のステップＳ１の２値化処理の流れの一例を示すフローチャートである。
【図６】図４のステップＳ７の変曲点の検出処理の流れの一例を示すフローチャートである。
【図７】図４のステップＳ９の輪郭画像の形状を判定する処理の流れの一例を示すフローチャートである。
【図８】図７のステップＳ１６１の輪郭情報を算出する処理の流れの一例を示すフローチャートである。
【図９】図７のステップＳ１６３の指先を検出する処理の流れの一例を示すフローチャートである。
【図１０】図７のステップＳ１６５の「パー」を判定する処理の流れの一例を示すフローチャートである。
【図１１】図７のステップＳ１６７の「チョキ」を判定する処理の流れの一例を示すフローチャートである。
【図１２】図７のステップＳ１６９の「グー」を判定する処理の流れの一例を示すフローチャートである。
【図１３】図７のステップＳ１７１の一本指を判定する処理の流れの一例を示すフローチャートである。
【図１４】（ａ）図１１のステップＳ３７７及び図１３のステップＳ４４７の指先補正値計算処理の第１の例の流れを示すフローチャートである。（ｂ）図１１のステップＳ３７７及び図１３のステップＳ４４７の指先補正値計算処理の第２の例の流れを示すフローチャートである。（ｃ）図１１のステップＳ３７７及び図１３のステップＳ４４７の指先補正値計算処理の第３の例の流れを示すフローチャートである。（ｄ）図１１のステップＳ３７７及び図１３のステップＳ４４７の指先補正値計算処理の第４の例の流れを示すフローチャートである。
【図１５】（ａ）図４のステップＳ１１の擬似ボタン操作判定処理の第１の例の流れを示すフローチャートである。（ｂ）図４のステップＳ１１の擬似ボタン操作判定処理の第２の例の流れを示すフローチャートである。（ｃ）図４のステップＳ１１の擬似ボタン操作判定処理の第３の例の流れを示すフローチャートである。
【図１６】図４のステップＳ５で検出される偏角θｊの説明図である。
【図１７】図４のステップＳ７で検出される変曲点及び図７のステップＳ１６３で検出される指先の説明図である。
【図１８】（ａ）図１４（ａ）及び図１４（ｃ）の指先補正値計算処理の説明図である。（ｂ）図１４（ｂ）及び図１４（ｄ）の指先補正値計算処理の説明図である。
【図１９】指先補正値計算処理における除数の説明図である。
【図２０】図１のウィンドウシステム４００によるイベント監視処理の流れの一例を示すフローチャートである。
【図２１】図１のウィンドウシステム４００によるカーソル制御処理の流れの一例を示すフローチャートである。
【図２２】（ａ）図４のステップＳ１１の擬似ボタン操作判定処理の第４の例の流れを示すフローチャートである。（ｂ）図４のステップＳ１１の擬似ボタン操作判定処理の第５の例の流れを示すフローチャートである。（ｃ）図４のステップＳ１１の擬似ボタン操作判定処理の第６の例の流れを示すフローチャートである。
【図２３】（ａ）本発明の実施の形態による擬似ボタン操作の第４の例（シングルクリック）の説明図である。（ｂ）本発明の実施の形態による擬似ボタン操作の第４の例（ダブルクリック）の説明図である。
【図２４】図４のステップＳ１１の擬似ボタン操作判定処理の第７の例の流れの一部を示すフローチャートである。
【図２５】図４のステップＳ１１の擬似ボタン操作判定処理の第７の例の流れの他の一部を示すフローチャートである。
【図２６】図１のウィンドウシステム４００が受け付け可能なジェスチャの例示図である。
【図２７】図１のウィンドウシステム４００によるジェスチャ判定処理の流れの一例を示すフローチャートである。
【図２８】図２７のステップＳ１０２のジェスチャ１〜４の判定処理の流れの一部の一例を示すフローチャートである。
【図２９】図２７のステップＳ１０２のジェスチャ１〜４の判定処理の流れの他の一部の一例を示すフローチャートである。
【図３０】本発明の実施の形態の変形例によるコンピュータシステムの階層図である。
【発明を実施するための形態】
【００３２】
以下、本発明の実施の形態について、図面を参照しながら説明する。なお、図中、同一または相当部分については同一の参照符号を付してその説明を援用する。また、本明細書において、数字の後尾に付した「ｈ」は、１６進数であることを示す。
【００３３】
図１は、本発明の実施の形態によるコンピュータシステム７００の階層図である。図１を参照して、このコンピュータシステム７００は、オペレーティングシステム３００により管理される。オペレーティングシステム３００は、ハードウェアを抽象化したインタフェースをアプリケーションプログラム１００に提供するソフトウェアである。ハードウェアの抽象化とは、ハードウェアの統一的で単純化された利用方法を提供することである。また、オペレーティングシステム３００は、プロセス管理やメモリ管理を行い、ファイルシステムを有し、グラフィカルユーザインタフェース（ＧＵＩ）や通信機能等を提供する。
【００３４】
オペレーティングシステム３００は、その機能の一つとしてウィンドウシステム４００を含む。ウィンドウシステム４００は、オペレーティングシステム３００上で並行して動作する複数のアプリケーションプログラム１００にそれぞれ固有のウィンドウを割り当て制御する。これらの複数のウィンドウ（マルチウィンドウ）は、後述するモニタ６７の画面上に表示される。また、ウィンドウシステム４００は、モニタ６７の画面に表示するカーソルを制御する。
【００３５】
アプリケーションプログラム１００は、オペレーティングシステム３００上で動作し、コンピュータシステム７００の利用者がコンピュータシステム７００上で実行したい作業を実施する機能を直接的に有するソフトウェアである。
【００３６】
アプリケーションプログラムインタフェース（ＡＰＩ）２００は、各アプリケーションプログラム１００からオペレーティングシステムの各種機能を呼び出すためのインタフェースである。ＡＰＩ２００は、アプリケーションプログラム１００から呼び出すことができるオペレーティングシステム３００の機能と定義することもできる。なお、ＡＰＩはシステムコールと呼ばれることもある。
【００３７】
従って、各アプリケーションプログラム１００は、ＡＰＩ２００を介して、オペレーティングシステム３００の各種機能を利用することができる。例えば、各アプリケーションプログラム１００は、ＡＰＩ２００を介して、ウィンドウシステム４００を利用することができる。
【００３８】
一方、ポインティングデバイスとしてのモーションセンサ６００は、デバイスドライバ５００により制御される。モーションセンサ６００は、後述するイメージセンサ５を備えており、イメージセンサ５により、ユーザの手を撮影し、その画像を解析して、解析結果をデバイスドライバ５００に出力する。
【００３９】
デバイスドライバ５００は、オペレーティングシステム３００の環境下で動作し、モーションセンサ６００から受け取った解析結果を、オペレーティングシステム３００に渡す。
【００４０】
オペレーティングシステム３００は、モーションセンサ６００の解析結果に基づく各種機能を、ＡＰＩ２００を介して、各アプリケーションプログラム１００に提供することができる。例えば、各アプリケーションプログラム１００は、ＡＰＩ２００を介して、モーションセンサ６００の解析結果に基づくウィンドウシステム４００の機能を利用することができる。
【００４１】
図２（ａ）は、本発明の実施の形態によるコンピュータシステム７００の電気的構成を示す図である。図２（ａ）を参照して、コンピュータシステム７００は、コンピュータ５０、モニタ６７、スピーカ６９、及び、キーボード７１を含む。コンピュータ５０は、ＣＰＵ（中央演算処理装置）５１、メインメモリ５３、チップセット５５、ＧＰＵ（グラフィックスプロセシングユニット）５７、ＳＰＵ（サウンドプロセシングユニット）５９、ＨＤＤ（ハードディスクドライブ）６１、ドライブ６３、通信部６５、及びモーションセンサ６００を含む。
【００４２】
ＣＰＵ５１は、ＨＤＤ６１に格納されたコンピュータプログラムを実行して各種演算を行う。メインメモリ５３は、ＣＰＵ５１から直接読み書きが行われる高速のメモリである。ＧＰＵ５７は、グラフィックス処理を実行し、モニタ６７に映像信号を与える。モニタ６７は与えられた映像信号に応じて映像を表示する。ＳＰＵ５９は、サウンド処理を実行し、スピーカ６９に音声信号を与える。スピーカ６９は与えられた音声信号に応じて音声を出力する。ＨＤＤ６１は、コンピュータプログラム及びデータを格納するための補助記憶装置である。ドライブ６３は、リムーバブル記録媒体７５からデータを読み込んだり、書き込んだりする装置である。通信部６５は、ネットワークへの接続を司るＬＡＮカードやＵＳＢコントローラなどを含み（図示せず）、通信を制御する。
【００４３】
ＣＰＵ５１、ＧＰＵ５７、ＳＰＵ５９、ＨＤＤ６１、ドライブ６３、通信部６５、キーボード７１、及びモーションセンサ６００といった機能ユニットは、チップセット５５に接続される。チップセット５５は、これに接続される機能ユニット間のデータの受け渡しを管理する。
【００４４】
ＨＤＤ６１は、図１のアプリケーションプログラム１００、ＡＰＩ２００、オペレーティングシステム３００、ウィンドウシステム４００、及び、デバイスドライバ５００を格納する。ＣＰＵ５１は、これらのプログラムを、メインメモリ５３にロードし、実行する。そして、ＣＰＵ５１は、実行結果を、モニタ６７やスピーカ６９に出力し、あるいは、ＨＤＤ６１やメインメモリ５３に格納する。
【００４５】
なお、図１のアプリケーションプログラム１００、ＡＰＩ２００、オペレーティングシステム３００、ウィンドウシステム４００、及び、デバイスドライバ５００は、リムーバブル記録媒体７５からＨＤＤ６１に格納されてもよいし、あるいは、ネットワーク経由でＨＤＤ６１に格納されてもよい。リムーバブル記録媒体７５は、例えば、ＣＤ（ＣＤ−ＲＯＭ、Ｖｉｄｅｏ−ＣＤを含む）やＤＶＤ（ＤＶＤ−Ｖｉｄｅｏ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭを含む）等の光ディスク、半導体メモリを搭載したメモリカード・メモリカートリッジ・ＵＳＢメモリ、光磁気ディスク、磁気テープ、及び／又は、フレキシブルディスク等である。
【００４６】
図２（ｂ）は、図２（ａ）のモーションセンサ６００の電気的構成を示す図である。図２（ｂ）を参照して、このモーションセンサ６００は、ＭＣＵ（Ｍｉｃｒｏ  Ｃｏｎｔｒｏｌｅｒ  Ｕｎｉｔ）３、イメージセンサ５、及び赤外発光ダイオード９を含む。ＭＣＵ３は、メモリ７を含む。イメージセンサ５は、カラー及びグレースケールのいずれでも使用でき、また、その画素数も任意にものを使用できるが、本実施の形態では、グレースケールで、６４×６４画素の比較的低解像度のものを使用する。赤外発光ダイオード９は、赤外光を発光する。また、イメージセンサ５としては、ＣＭＯＳイメージセンサやＣＣＤイメージセンサ等を採用できる。
【００４７】
ＭＣＵ３のメモリ７は、ＲＡＭ、ＲＯＭ、及びフラッシュメモリ等の半導体メモリであり、プログラム格納領域、データ格納領域、作業領域、及び一時格納領域等として利用される。ＭＣＵ３は、メモリ７に格納されたプログラムに従って、後述のフローチャートで示される各種処理を実行する。なお、仕様に応じて、記録媒体として、メモリ７の他、ＣＤ（ＣＤ−ＲＯＭ、Ｖｉｄｅｏ−ＣＤを含む）やＤＶＤ（ＤＶＤ−Ｖｉｄｅｏ、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭを含む）等の光ディスク、半導体メモリを搭載したメモリカード・メモリカートリッジ・ＵＳＢメモリ、ハードディスク、光磁気ディスク、磁気テープ、及び、フレキシブルディスク等を、ＭＣＵ３に接続することもできる。そして、これらにプログラムやデータなどを格納することもできる。
【００４８】
ＭＣＵ３は、メモリ７に格納されたプログラムに従って、イメージセンサ５を制御する。イメージセンサ５は、ＭＣＵ３の制御の下、赤外発光ダイオード９を間欠的に駆動し、三次元空間中で動かされる被写体（本実施の形態では人の手）に赤外光を間欠的に照射する。イメージセンサ５は、赤外光照射時及び非照射時の双方において、撮影処理を実行し、赤外光照射時画像と非照射時画像との差分画像を生成して、ＭＣＵ３に出力する。差分をとることにより、背景等のノイズを簡易に除去でき、簡易に被写体の像のみを抽出できる。
【００４９】
ＭＣＵ３は、メモリ７に格納されたプログラムに従って、イメージセンサ５から受け取った差分画像を解析して、ユーザの手を検出して、その形状、面積、重心位置、及び、指先位置、並びに、擬似的なボタン操作の有無の情報等を、チップセット５５を介して、ＣＰＵ５１に与える。すると、ＣＰＵ５１は、モーションセンサ６００の解析結果である手の情報に基づき、各種処理を実行する。
【００５０】
図３（ａ）及び図３（ｂ）は、本発明の実施の形態による擬似ボタン操作の説明図である。図３（ａ）を参照して、モーションセンサ６００は、ユーザ（人）の手を撮影し、得られた画像を解析することによって、指先ａ及びｂの位置を求める。この例では、指先ａは、人差し指の指先であり、指先ｂは、親指の指先である。
【００５１】
図３（ｂ）を参照して、第１の例では、ＣＰＵ５１は、モーションセンサ６００から指先ａの位置を受け取って、モニタ６７の画面上の対応する位置にカーソルを表示する。また、モーションセンサ６００は、撮影画像中に指先ａと指先ｂとが存在する状態から、撮影画像中に指先ａのみが存在する状態へ遷移したことを検出すると、例えば、二本の指（親指及び人差し指）が写っている状態から、カーソルの位置に関係ない一本の指（親指）が折り曲げられ、カーソルの位置を制御する他の一本の指（人差し指）のみが写っている状態に遷移したことを検出すると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをＣＰＵ５１に通知する。すると、ＣＰＵ５１は、ボタン操作に応じた処理を実行する。
【００５２】
第２の例では、ＣＰＵ５１は、モーションセンサ６００から指先ａの位置を受け取って、モニタ６７の画面上の対応する位置にカーソルを表示する。また、モーションセンサ６００は、撮影画像中に指先ａのみが存在する状態から、撮影画像中に指先ａと指先ｂとが存在する状態へ遷移したことを検出すると、例えば、カーソルの位置に関係ない一本の指（親指）が折り曲げられ、カーソルの位置を制御する他の一本の指（人差し指）のみが写っている状態から、二本の指（親指及び人差し指）が写っている状態に遷移したことを検出すると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをＣＰＵ５１に通知する。すると、ＣＰＵ５１は、ボタン操作に応じた処理を実行する。
【００５３】
第３の例では、ＣＰＵ５１は、モーションセンサ６００から指先ａの位置と指先ｂの位置との中点の位置を受け取って、モニタ６７の画面上の対応する位置にカーソルを表示する。また、モーションセンサ６００は、指先ａと指先ｂとの間の距離を算出して、その距離が一定値以下になったことを検出すると、つまり、指先ａと指先ｂとが近づいて、その距離が一定値以下になると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをＣＰＵ５１に通知する。すると、ＣＰＵ５１は、ボタン操作に応じた処理を実行する。
【００５４】
ここで、上記第１〜第３の例において、擬似的にボタン操作が行われたと判定されたことを、ボタンのプレス操作（ボタンを押したままの状態）が行なわれたとみなすこともできるし、あるいは、クリック操作（ボタンを押下して放す操作）が行なわれたとみなすこともできる。
【００５５】
なお、擬似的にボタン操作が行われたと判定されたことを、ボタンのプレス操作が行なわれたとみなす場合、ボタンを放したとみなす操作は、次のようにして判定される。
【００５６】
第１の例では、モーションセンサ６００は、撮影画像中に指先ａのみが存在する状態から、撮影画像中に指先ａと指先ｂとが存在する状態へ遷移したことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを話す操作が行なわれたことをＣＰＵ５１に通知する。
【００５７】
第２の例では、モーションセンサ６００は、撮影画像中に指先ａと指先ｂとが存在する状態から、撮影画像中に指先ａのみが存在する状態へ遷移したことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを放す操作が行なわれたことをＣＰＵ５１に通知する。
【００５８】
第３の例では、モーションセンサ６００は、指先ａと指先ｂとの間の距離を算出して、その距離が一定値以下になった後、再び、その距離が一定値を超えたことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを放す操作が行なわれたことをＣＰＵ５１に通知する。
【００５９】
ここで、「擬似的なボタン操作」とは、ポインティングデバイス等のデバイスの実際のボタンの操作ではないが、実際のボタンを操作する場合と同等の情報ないしは命令を、三次元空間中のジェスチャにより、コンピュータに与えることを意味する。
【００６０】
次に、フローチャートを用いてモーションセンサ６００のＭＣＵ３の処理の詳細を説明する。
【００６１】
図４は、図２のＭＣＵ３による画像解析処理の流れの一例を示すフローチャートである。図４を参照して、ステップＳ１にて、ＭＣＵ３は、イメージセンサ５が出力した差分画像を２値化する。ステップＳ３にて、ＭＣＵ３は、２値化された差分画像から被写体（本実施の形態では手）の像の輪郭線を抽出する。この処理では、輪郭線上の各画素Ｐｊ（ｊ＝０〜Ｊ−１）の座標（ＸＯ［ｊ］，ＹＯ［ｊ］）を求める。
【００６２】
ここで、本実施の形態では、値Ｊは、輪郭線上の画素Ｐｊの総数を示す。また、反時計回りに輪郭線の抽出処理が実行されるものとする。
【００６３】
輪郭線を抽出するためのアルゴリズムは、周知のものを使用できる。例えば、３×３の小画素領域からなるマスクを用いる方法で、このマスクの中心を輪郭線上にたえずおきならが、順次、マスクを移動して、輪郭線を抽出する。
【００６４】
ステップＳ５にて、ＭＣＵ３は、抽出した輪郭線上の各画素ＰｊのベクトルＶｊの偏角θｊを算出する。
【００６５】
図１６は、図４のステップＳ５で検出される偏角θｊの説明図である。図６を参照して、今、被写体の輪郭線上の３つの画素Ｐｊ−１，Ｐｊ，及びＰｊ＋１に注目する。また、輪郭線を反時計回りにスキャンするものとする。画素ＰｊのベクトルＶｊは、画素Ｐｊから次の画素Ｐｊ＋１に向かうベクトルとして定義される。画素ＰｊのベクトルＶｊの偏角θｊは、画素Ｐｊの１つ前の画素Ｐｊ−１のベクトルＶｊ−１に対してベクトルＶｊがなす角度として定義される。反時計回りの偏角θｊの符号は正であり、時計回りの偏角θｊの符号は負である。
【００６６】
図４に戻って、ステップＳ７にて、ＭＣＵ３は、抽出した輪郭線の変曲点を検出する。変曲点は、輪郭線の向きが変化する点であり、凸点と凹点とが定義される。
【００６７】
図１７は、図４のステップＳ７で検出される変曲点の説明図である。図１７を参照して、抽出した輪郭線２１の向きが変化する点として、変曲点Ｉ０〜Ｉ８が挙げられる。変曲点Ｉ０，Ｉ２，Ｉ４，Ｉ６及びＩ８は凸点である。変曲点Ｉ１，Ｉ３，Ｉ５及びＩ７は凹点である。
【００６８】
図４に戻って、ステップＳ９にて、ＭＣＵ３は、抽出した輪郭線（輪郭画像）の形状（グー、チョキ、パー、一本指、不定）を判定する。ステップＳ１１にて、ＭＣＵ３は、擬似的なボタン操作が行なわれたか否かを判定する。ステップＳ１３にて、ＭＣＵ３は、ステップＳ１の結果（後述の掩蔽フラグ）、ステップＳ９の結果（輪郭画像の重心座標、面積、形状の情報（後述のフラグＳＨ）、補正後の指先の座標、並びに、二つの指先の中点座標）、及びステップＳ１１の結果（後述の擬似ボタンフラグないしはシングルクリックフラグ及びダブルクリックフラグ）をＣＰＵ５１に送信する。なお、ＭＣＵ３は、イメージセンサ５から１フレームの差分画像を受け取るたびに、ステップＳ１〜Ｓ１３を繰り返す。
【００６９】
図５は、図４のステップＳ１の２値化処理の流れの一例を示すフローチャートである。図５を参照して、ステップＳ５０にて、ＭＣＵ３は、差分画像の各画素Ｄの２値化後の値を代入する配列ＰＤ［］［］並びに変数Ｘ，Ｙ及びＮＡに０を代入する。ステップＳ５１にて、ＭＣＵ３は、イメージセンサ５から、差分画像の画素データＤをリードする。なお、イメージセンサ５の解像度は６４×６４画素とする。また、イメージセンサ５からの差分画像の左上を原点とし、水平右方向をＸ座標の正、垂直下方向をＹ座標の正とする。そして、イメージセンサ５は、Ｙ＝０の行から、Ｘをインクリメントしながら、Ｘ＝６３まで、順次画素データＤを出力する。そして、Ｘ＝６３の画素データＤを出力した後、Ｙを１つインクリメントし、Ｙ＝１の行から、Ｘをインクリメントしながら、Ｘ＝６３まで、順次画素データＤを出力する。イメージセンサ５は、このような処理をＹ＝６３まで行ない、差分画像の全画素Ｄを出力する。
【００７０】
ステップＳ５２にて、ＭＣＵ３は、画素データ（輝度値）Ｄと所定の閾値ＴＨＦとを比較する。そして、ステップＳ５４にて、ＭＣＵ３は、画素データＤが閾値ＴＨＦより大きい場合、その画素Ｄは手の像の一部であるとみなしステップＳ５６に進み、それ以外はその画素Ｄは背景とみなしてステップＳ６０に進む。ステップＳ５６では、ＭＣＵ３は、配列［Ｘ］［Ｙ］に１を代入する。そして、ステップＳ５８にて、ＭＣＵ３は、カウンタＮＡを１つインクリメントする。すなわち、カウンタＮＡは、１が代入された配列［Ｘ］［Ｙ］の数、つまり、手の像の一部とみなされた画素Ｄの数を示す。さらに言い換えると、カウンタＮＡは、手の像を構成する画素Ｄの数を示す。一方、ステップＳ６０では、ＭＣＵ３は、配列［Ｘ］［Ｙ］に０を代入する。
【００７１】
ステップＳ６２では、ＭＣＵ３は、変数Ｘを１つインクリメントする。ステップＳ６４にて、ＭＣＵ３は、変数Ｘの値が６４か否かを判断し、６４の場合ステップＳ６６に進み、それ以外はステップＳ５１に戻る。ステップＳ６６にて、ＭＣＵ３は、変数Ｙを１つインクリメントする。ステップＳ６８にて、ＭＣＵ３は、変数Ｙの値が６４になったか否かを判断し、６４の場合ステップＳ７０に進み、それ以外はステップＳ５１に戻る。
【００７２】
ステップＳ７０にて、ＭＣＵ３は、カウンタＮＡの値（つまり手の像の大きさ）が、所定値Ａｒより大きいか否かを判断し、大きい場合イメージセンサ５がユーザの手で覆われた（掩蔽された）とみなしてステップＳ７２に進み、それ以外はステップＳ７６に進む。例えば、全画素数が、４０９６であるので、その約９０％である３６８６を所定値Ａｒとする。
【００７３】
ステップＳ７０で肯定判断の後、ステップＳ７２にて、ＭＣＵ３は、カウンタｐを１つインクリメントする。カウンタｐは、ステップＳ７０の肯定判断の連続回数を示す。なお、カウンタｐはシステム初期化時に０にセットされる。ステップＳ７４にて、ＭＣＵ３は、カウンタｐの値が所定値Ｔａより大きいか否かを判断し、大きい場合、所定時間連続してイメージセンサ５が手で覆われたことを意味するのでステップＳ７８に進み、それ以外はステップＳ８０に進む。ステップＳ７８にて、ＭＣＵ３は、所定時間連続してイメージセンサ５が手で覆われたこと示す掩蔽フラグをオンにする。一方、ステップＳ８０では、ＭＣＵ３は、掩蔽フラグをオフにする。
【００７４】
ステップＳ７０で否定判断の後、ステップＳ７６にて、ＭＣＵ３は、カウンタｐに０を代入して、ステップＳ８０に進む。
【００７５】
以上のように、ＭＣＵ３は、イメージセンサ５が出力する各画素Ｄを順次２値化して配列ＰＤ［］［］に代入する。このように、差分画像（グレースケール）をメモリ７に持つことなく順次２値化することによりメモリ容量を削減できる。もちろん、ＭＣＵ３は、イメージセンサ５が出力した差分画像（グレースケール）を一旦メモリ７に格納した後に、２値化することもできるし、あるいは、２値化せずにそのまま処理することもできる。
【００７６】
図６は、図４のステップＳ７の変曲点の検出処理の流れの一例を示すフローチャートである。図６を参照して、ステップＳ２１にて、ＭＣＵ３は、変数ＤＡ，ＡＤＡ，ｊ，及びＣＦ［］に０を代入する。ステップＳ２３にて、ＭＣＵ３は、図４のステップＳ３で検出された輪郭線上の画素Ｐｊの偏角θｊをメモリ７から取得する。ステップＳ２５にて、ＭＣＵ３は、変数ＤＡの現在の値に偏角θｊを加算して、変数ＤＡに代入する。ステップＳ２７にて、ＭＣＵ３は、変数ＤＡの絶対値を求めて、変数ＡＤＡに代入する。
【００７７】
ステップＳ２９にて、ＭＣＵ３は、変数ＡＤＡの値が１３５度になったか否かを判断し、１３５度の場合輪郭線の向きが変わったと判断して、画素Ｐｊを変曲点とみなしてステップＳ３１に進み、それ以外はステップＳ３９に進む。ステップＳ３１では、ＭＣＵ３は、変数ＤＡの符号が正か否かを判断し、正の場合ステップＳ３３に進み、負の場合ステップＳ３５に進む。ステップＳ３３では、ＭＣＵ３は、凸凹フラグＣＦ［ｊ］に、変曲点が凸点であることを示す０１を代入する。一方、ステップＳ３５では、ＭＣＵ３は、凸凹フラグＣＦ［ｊ］に、変曲点が凹点であることを示す１０を代入する。
【００７８】
ステップＳ３７にて、ＭＣＵ３は、変数ＤＡに０を代入する。ステップＳ３９にて、ＭＣＵ３は、変数ｊを１つインクリメントする。ステップＳ４１にて、ＭＣＵ３は、変数ｊの値が、値Ｊと等しくなったか否かを判断し、ｊ＝Ｊの場合リターンし、それ以外はステップＳ２３に進む。
【００７９】
図７は、図４のステップＳ９の輪郭画像の形状を判定する処理の流れの一例を示すフローチャートである。図７を参照して、ステップＳ１６１にて、ＭＣＵ３は、輪郭線に関する情報を算出する。ステップＳ１６３にて、ＭＣＵ３は、輪郭画像から手の指先に相当する画素を検出する。
【００８０】
再び、図１７を参照して、凸点Ｉ０，Ｉ２，Ｉ４，Ｉ６及びＩ８を総称して、凸点Ａｓ（ｓ＝０，１，…，Ｓ）と表記し、凹点Ｉ１，Ｉ３，Ｉ５及びＩ７を総称して、凹点Ｂｔ（ｔ＝０，１，…，Ｔ）と表記する。ＭＣＵ３は、凸点Ａｓから一定画素数Ｎｐだけ離れて位置する２つの画素を結ぶ線分２３を求め、凸点Ａｓから線分２３に下ろした垂線２５の長さＬｖを算出する。ＭＣＵ３は、長さＬｖが、所定値ＣＬを超えている場合に、その凸点Ａｓを指先の候補とする。
【００８１】
そして、ＭＣＵ３は、指先の候補とした凸点Ａｓの両側又は一方側に凹点Ｂｔが存在するか否かを判断し、存在する場合、その凸点Ａｓを指先とみなす。
【００８２】
また、ＭＣＵ３は、「パー」及び「グー」を判定するのに必要な傾角θｖを算出する。傾角θｖは、指先とみなされた凸点Ａｓから線分２３に下ろした垂線２５が、差分画像のＸ軸と平行な線２７となす角である。
【００８３】
図７に戻って、ステップＳ１６５にて、ＭＣＵ３は、輪郭画像の形状が「パー」をした手の形状であるか否かを判定する。ステップＳ１６７にて、ＭＣＵ３は、輪郭画像の形状が「チョキ」をした手の形状であるか否かを判定する。ステップＳ１６９にて、ＭＣＵ３は、輪郭画像の形状が「グー」をした手の形状であるか否かを判定する。ステップＳ１７１にて、ＭＣＵ３は、輪郭画像の形状が一本指を立てた手の形状であるか否かを判定してリターンする。
【００８４】
図８は、図７のステップＳ１６１の輪郭情報を算出する処理の流れの一例を示すフローチャートである。図８を参照して、ステップＳ１９１にて、ＭＣＵ３は、変数ＸＧ，ＹＧ及びｊに０を代入する。ステップＳ１９３にて、ＭＣＵ３は、変数ＸＧの現在の値に輪郭線上の画素ＰｊのＸ座標ＸＯ［ｊ］を加算したものを、変数ＸＧに代入する。また、ＭＣＵ３は、変数ＹＧの現在の値に輪郭線上の画素ＰｊのＹ座標ＹＯ［ｊ］を加算したものを、変数ＸＧに代入する。ステップＳ１９５にて、ＭＣＵ３は、変数ｊを１つインクリメントする。ステップＳ１９７にて、ＭＣＵ３は、変数ｊの値が値Ｊになったか否かを判断し、値Ｊになった場合ステップＳ１９９に進み、それ以外はステップＳ１９３に進む。
【００８５】
ステップＳ１９９にて、ＭＣＵ３は、変数ＸＧの値を値Ｊで除したものを、変数Ｘｇに代入する。また、ＭＣＵ３は、変数ＹＧの値を値Ｊで除したものを、変数Ｙｇに代入する。座標（Ｘｇ，Ｙｇ）は、輪郭画像の重心座標を示す。
【００８６】
ステップＳ２０１にて、ＭＣＵ３は、変数ｊ，ＬＳ及びＬ［］に０を代入する。ステップＳ２０３にて、ＭＣＵ３は、次式により、重心座標（Ｘｇ，Ｙｇ）と輪郭線上の各画素Ｐｊの座標（ＸＯ［ｊ］，ＹＯ［ｊ］）との間の距離Ｌ［ｊ］を算出する。
【００８７】
Ｌ［ｊ］←√（（Ｘｇ−ＸＯ［ｊ］）２＋（Ｙｇ−ＹＯ［ｊ］）２）
【００８８】
ステップＳ２０５にて、ＭＣＵ３は、変数ＬＳの現在の値に変数Ｌ［ｊ］の値を加算したものを、変数ＬＳに代入する。ステップＳ２０７にて、ＭＣＵ３は、変数ｊを１つインクリメントする。ステップＳ２０９にて、ＭＣＵ３は、変数ｊの値が値Ｊになったか否かを判断し、値Ｊになった場合ステップＳ２１１に進み、それ以外はステップＳ２０３に進む。
【００８９】
ステップＳ２１１にて、ＭＣＵ３は、変数ＬＳの値を値Ｊで除することにより、距離Ｌ［ｊ］の平均値ＡＶＬを算出する。ステップＳ２１３にて、ＭＣＵ３は、輪郭線及び輪郭線内の画素を計数して、輪郭画像の面積を算出してリターンする。
【００９０】
図９は、図７のステップＳ１６３の指先を検出する処理の流れの一例を示すフローチャートである。図９を参照して、ステップＳ２４１にて、ＭＣＵ３は、変数ｊ及びＦＰ［］に０を代入する。ステップＳ２４３にて、ＭＣＵ３は、フラグＣＦ［ｊ］が凸点を示す０１にセットされているか否かを判断し、肯定的判断の場合ステップＳ２４５に進み、否定的判断の場合ステップＳ２４９に進む。
【００９１】
ステップＳ２４５にて、ＭＣＵ３は、凸点である画素Ｐｊの両側又は一方側に、フラグＣＦ［ｊ］に凹点を示す１０がセットされている画素が存在するか否かを判断し、存在する場合画素Ｐｊを指先候補とみなしてステップＳ２４７に進み、存在しない場合ステップＳ２４９に進む。ステップＳ２４７にて、ＭＣＵ３は、フラグＦＰ［ｊ］に画素Ｐｊが指先候補であることを示す１をセットする。
【００９２】
ステップＳ２４９にて、ＭＣＵ３は、変数ｊを１つインクリメントする。ステップＳ２５１にて、ＭＣＵ３は、変数ｊの値が値Ｊになったか否かを判断し、値Ｊになった場合ステップＳ２５３に進み、それ以外はステップＳ２４３に進む。
【００９３】
ステップＳ２５３にて、ＭＣＵ３は、変数ｊ，ｑ，ＴＦ［］，θｖ［］，ＸＴ，ＹＴ，Ｑ及びθｖに０を代入する。ステップＳ２５５にて、ＭＣＵ３は、フラグＦＰ［ｊ］に指先候補を示す１がセットされているか否かを判断し、肯定的判断の場合ステップＳ２５７に進み、それ以外はステップＳ２７１に進む。
【００９４】
ステップＳ２５７にて、ＭＣＵ３は、画素Ｐｊ＋Ｎｐと画素Ｐｊ−Ｎｐとを結ぶ線分２３に画素Ｐｊから下ろした垂線２５の長さＬｖを算出する（図１７参照）。ステップＳ２５９にて、ＭＣＵ３は、長さＬｖが所定値ＣＬを超えているか否かを判断し、超えている場合画素Ｐｊを指先とみなしてステップＳ２６１に進み、それ以外はステップＳ２７１に進む。
【００９５】
ステップＳ２６１にて、ＭＣＵ３は、指先フラグＴＦ［ｊ］に画素Ｐｊが指先であることを示す１をセットする。ステップＳ２６３にて、ＭＣＵ３は、変数ＸＴ［ｑ］に画素ＰｊのＸ座標を代入する。また、ＭＣＵ３は、変数ＹＴ［ｑ］に画素ＰｊのＹ座標を代入する。座標（ＸＴ［ｑ］，ＹＴ［ｑ］）は、指先の座標である。ステップＳ２６５にて、ＭＣＵ３は、垂線２５の傾角θｖを算出する（図１７参照）。ステップＳ２６７にて、ＭＣＵ３は、変数θｖ［ｑ］に傾角θｖを代入する。傾角θｖ［ｑ］は、座標（ＸＴ［ｑ］，ＹＴ［ｑ］）で示される指先に対応する指の傾角である。ステップＳ２６９にて、ＭＣＵ３は、変数ｑを１つインクリメントする。
【００９６】
ステップＳ２７１にて、ＭＣＵ３は、変数ｊを１つインクリメントする。ステップＳ２７３にて、ＭＣＵ３は、変数ｊの値が値Ｊになったか否かを判断し、値Ｊになった場合ステップＳ２７５に進み、それ以外はステップＳ２５５に進む。ステップＳ２７５にて、ＭＣＵ３は、変数Ｑに変数ｑの値を代入してリターンする。変数Ｑの値は、検出された指先の数を表す。
【００９７】
図１０は、図７のステップＳ１６５の「パー」を判定する処理の流れの一例を示すフローチャートである。図４を参照して、ステップＳ３０１にて、ＭＣＵ３は、変数Ｑの値（指先の数）が３以上か否かを判断し、３以上の場合ステップＳ３０３に進み、それ以外はリターンする。ステップＳ３０３にて、ＭＣＵ３は、変数ｑ及びｍに０を代入する。ステップＳ３０５にて、ＭＣＵ３は、配列θｖ［ｑ］と配列θｖ［ｑ＋１］との差の絶対値を算出し、変数θｄに代入する。変数θｄは、隣り合う指と指とがなす角度を表す。
【００９８】
ステップＳ３０７にて、ＭＣＵ３は、変数θｄの値が１００度未満か否かを判断し、肯定的判断の場合ステップＳ３０９に進み、否定的判断の場合ステップＳ３１１に進む。ステップＳ３０９にて、ＭＣＵ３は、変数ｍを１つインクリメントする。ステップＳ３１１にて、ＭＣＵ３は、変数ｑを１つインクリメントする。
【００９９】
ステップＳ３１３にて、ＭＣＵ３は、変数ｑの値が値Ｑになったか否かを判断し、値Ｑになった場合ステップＳ３１５に進み、それ以外はステップＳ３０５に進む。
【０１００】
ステップＳ３１５では、ＭＣＵ３は、変数ｍの値が、６以下３以上であるか否かを判断し、肯定的判断の場合手の形状が「パー」であると判断してステップＳ３１７に進み、否定的判断の場合リターンする。変数ｍの値は、隣り合う指と指とがなす角度θｄが１００度未満のケースの発生回数である。ステップＳ３１７では、ＭＣＵ３は、フラグＳＨを「パー」を示す１０ｈにセットして、図４のステップＳ１１に進む。
【０１０１】
図１１は、図７のステップＳ１６７の「チョキ」を判定する処理の流れの一例を示すフローチャートである。図１１を参照して、ステップＳ３４１にて、ＭＣＵ３は、変数Ｑの値（指先の数）が２又は３の場合ステップＳ３４３に進み、それ以外はリターンする。
【０１０２】
ステップＳ３４３にて、ＭＣＵ３は、変数ｑ，ｐ，ＳＨ，ＸＬ，ＹＬ，ＸＳ及びＹＳに０を代入する。ステップＳ３４５にて、ＭＣＵ３は、輪郭画像の重心座標（Ｘｇ，Ｙｇ）と指先の座標（ＸＴ［ｑ］，ＹＴ［ｑ］）との間の距離Ｌｇｔ０を算出する。ステップＳ３４７にて、ＭＣＵ３は、距離Ｌｇｔ０が平均値ＡＶＬ（図８のステップＳ２１１参照）に１．１を乗じたもの以上か否かを判断し、つまり、距離Ｌｇｔ０が平均値ＡＶＬの１１０％以上か否かを判断し、肯定的判断の場合ステップＳ３４９に進み、否定的判断の場合ステップＳ３５９に進む。
【０１０３】
ステップＳ３４９にて、ＭＣＵ３は、輪郭画像の重心座標（Ｘｇ，Ｙｇ）と指先の座標（ＸＴ［ｑ＋１］，ＹＴ［ｑ＋１］）との間の距離Ｌｇｔ１を算出する。座標（ＸＴ［ｑ＋１］，ＹＴ［ｑ＋１］）の指先は、座標（ＸＴ［ｑ］，ＹＴ［ｑ］）の指先の隣の指先である。ステップＳ３５１にて、ＭＣＵ３は、距離Ｌｇｔ１が値ＡＶＬに１．１を乗じたもの以上か否かを判断し、つまり、距離Ｌｇｔ１が平均値ＡＶＬの１１０％以上か否かを判断し、肯定的判断の場合ステップＳ３５３に進み、否定的判断の場合ステップＳ３５９に進む。
【０１０４】
ステップＳ３５３では、ＭＣＵ３は、配列θｖ［ｑ］と配列θｖ［ｑ＋１］との差の絶対値（つまり、隣あう指と指とがなす角度）を算出し、変数θｄに代入する。ステップＳ３５５にて、ＭＣＵ３は、変数θｄの値が９０度未満か否かを判断し、肯定的判断の場合ステップＳ３５７に進み、否定的判断の場合ステップＳ３５９に進む。ステップＳ３５７にて、ＭＣＵ３は、変数ｐを１つインクリメントする。
【０１０５】
ステップＳ３５９にて、ＭＣＵ３は、変数ｑを１つインクリメントする。ステップＳ３６１にて、ＭＣＵ３は、変数ｑの値が値Ｑになったか否かを判断し、値Ｑになった場合ステップＳ３６３に進み、それ以外はステップＳ３４５に進む。ステップＳ３６３にて、ＭＣＵ３は、変数ｐの値が１又は２の場合手の形状が「チョキ」と判断してステップＳ３６５に進み、それ以外はリターンする。
【０１０６】
ステップＳ３６５にて、ＭＣＵ３は、変数Ｑの値が２か否かを判断し、２の場合、つまり、検出された指が２本の場合、ステップＳ３６９に進み、それ以外はステップＳ３６７に進む。ステップＳ３６７では、ＭＣＵ３は、フラグＳＨを「チョキ」を示す２１ｈにセットして、図４のステップＳ１１に進む。なお、値２１ｈは、３本の指が検出されたことになっているが、そのうち１本は指ではないノイズであることを示している。
【０１０７】
ステップＳ３６９では、ＭＣＵ３は、フラグＳＨを「チョキ」を示す２０ｈにセットする。なお、値２０ｈは、２本の指が検出され、ステップＳ３６７のようなノイズを含まないことを示している。ステップＳ３７１にて、ＭＣＵ３は、距離Ｌｇｔ０が距離Ｌｇｔ１より大きいか否かを判断し、つまり、検出された２本の指のどちらが長いか否かを判断し、距離Ｌｔｇ０が大きい場合ステップＳ３７３に進み、それ以外はステップＳ３７５に進む。
【０１０８】
ステップＳ３７３では、ＭＣＵ３は、座標ＸＬ及びＹＬにそれぞれ座標ＸＴ［０］及びＹＴ［０］を代入する。また、ＭＣＵ３は、座標ＸＳ及びＹＳにそれぞれ座標ＸＴ［１］及びＹＴ［１］を代入する。一方、ステップＳ３７５では、ＭＣＵ３は、座標ＸＬ及びＹＬにそれぞれ座標ＸＴ［１］及びＹＴ［１］を代入する。また、ＭＣＵ３は、座標ＸＳ及びＹＳにそれぞれ座標ＸＴ［０］及びＹＴ［０］を代入する。ここで、座標（ＸＬ，ＹＬ）は、長い指の指先の座標であり、座標（ＸＳ，ＹＳ）は、短い指の指先の座標である。
【０１０９】
ステップＳ３７７にて、ＭＣＵ３は、座標（ＸＬ，ＹＬ）及び座標（ＸＳ，ＹＳ）のそれぞれに対して、補正値を算出する。ステップＳ３７９にて、ＭＣＵ３は、座標（ＸＬ，ＹＬ）に、その補正値を加算して、補正後座標を求める。また、ＭＣＵ３は、座標（ＸＳ，ＹＳ）に、その補正値を加算して、補正後座標を求める。ステップＳ３８１にて、ＭＣＵ３は、座標（ＸＬ，ＹＬ）の補正後座標と座標（ＸＳ，ＹＳ）の補正後座標との中点座標を算出する。そして、ＭＣＵ３は、図４のステップＳ１１に進む。
【０１１０】
図１２は、図７のステップＳ１６９の「グー」を判定する処理の流れの一例を示すフローチャートである。図１２を参照して、ステップＳ３９１にて、ＭＣＵ３は、変数Ｑの値（指先の数）が２以上か否かを判断して、肯定的判断の場合ステップＳ３９３に進み、否定的判断の場合リターンする。
【０１１１】
ステップＳ３９３にて、ＭＣＵ３は、変数ｊに０を代入する。ステップＳ３９５にて、ＭＣＵ３は、距離Ｌ［ｊ］（図８のステップＳ２０３参照）が、平均値ＡＶＬ（図８のステップＳ２１１参照）に０．６を乗じたもの以上であり、かつ、値ＡＶＬに１．４を乗じたもの以下であるか否かを判断し、つまり、距離Ｌ［ｊ］が、平均値ＡＶＬの６０％以上であり、かつ、平均値ＡＶＬの１４０％以下であるか否かを判断し、肯定的判断の場合ステップＳ３９７に進み、否定的判断の場合リターンする。
【０１１２】
ステップＳ３９７にて、ＭＣＵ３は、変数ｊを１つインクリメントする。ステップＳ３９９にて、ＭＣＵ３は、変数ｊの値が値Ｊになったか否かを判断し、値Ｊになった場合手の形状が「グー」と判断しステップＳ４０１に進み、それ以外はステップＳ３９５に進む。ステップＳ４０１にて、ＭＣＵ３は、フラグＳＨを「グー」を示す３０ｈにセットして、図４のステップＳ１１に進む。
【０１１３】
図１３は、図７のステップＳ１７１の一本指を判定する処理の流れの一例を示すフローチャートである。図１３を参照して、ステップＳ４２１にて、ＭＣＵ３は、変数Ｑの値（指先の数）が１以下か否かを判断して、肯定的判断の場合ステップＳ４２３に進み、否定的判断の場合ステップＳ４４７に進む。ステップＳ４４７では、ＭＣＵ３は、フラグＳＨを「不定」を示す００ｈにセットしてリターンする。
【０１１４】
一方、ステップＳ４２３では、ＭＣＵ３は、変数ｊ，ｓ，Ｄｃ［］，Ｄｃａ及びＤｃｍに０を代入する。ステップＳ４２５にて、ＭＣＵ３は、フラグＦＰ［ｊ］に指先候補（つまり凸点）を示す１がセットされているか否かを判断し、肯定的判断の場合ステップＳ４２７に進み、それ以外はステップＳ４３３に進む。
【０１１５】
ステップＳ４２７では、ＭＣＵ３は、重心座標（Ｘｇ，Ｙｇ）と凸点の画素Ｐｊとの間の距離Ｄを算出する。ステップＳ４２９にて、ＭＣＵ３は、配列Ｄｃ［ｓ］に距離Ｄを代入する。ステップＳ４３１にて、ＭＣＵ３は、変数ｓを１つインクリメントする。ステップＳ４３３にて、ＭＣＵ３は、変数ｊを１つインクリメントする。ステップＳ４３５にて、ＭＣＵ３は、変数ｊの値が値Ｊになったか否かを判断し、値Ｊになった場合ステップＳ４３７に進み、それ以外はステップＳ４２５に進む。
【０１１６】
ステップＳ４３７にて、距離Ｄｃ［ｓ］の平均値Ｄｃａを算出する。つまり、平均値Ｄｃａは、重心から各凸点までの距離の平均値である。ステップＳ４３９にて、距離Ｄｃ［ｓ］から、最大値Ｄｃｍを検出する。つまり、最大値Ｄｃｍは、重心から各凸点までの距離のうち、最大のものである。ステップＳ４４１にて、ＭＣＵ３は、最大値Ｄｃｍが、平均値Ｄｃａに１．３を乗じた値以上か否かを判断し、肯定判断の場合一本の指が立った状態であるとみなしてステップＳ４４３に進み、否定判断の場合ステップＳ４４７に進む。
【０１１７】
ステップＳ４４３では、ＭＣＵ３は、フラグＳＨを「１本の指が立った状態」を示す４０ｈにセットする。ステップＳ４４５では、ＭＣＵ３は、座標ＸＨに、最大値Ｄｃｍに対応する凸点の画素ＰｊのＸ座標を代入する。また、ＭＣＵ３は、座標ＹＨに、最大値Ｄｃｍに対応する凸点の画素ＰｊのＹ座標を代入する。座標（ＸＨ，ＹＨ）は、立った状態の１本指の指先の座標である。ステップＳ４４７にて、ＭＣＵ３は、座標（ＸＨ，ＹＨ）の補正値を計算する。ステップＳ４４７にて、ＭＣＵ３は、座標（ＸＨ，ＹＨ）に、その補正値を加算し、補正後座標を求める。そして、ＭＣＵ３は、リターンする。
【０１１８】
さて、次に、図１１のステップＳ３７３及びＳ３７５で求めた指先を示す画素の座標（ＸＬ，ＹＬ）及び（ＸＳ，ＹＳ）、並びに、図１３のステップＳ４４５で求めた指先を示す画素の座標（ＸＨ，ＹＨ）を、イメージセンサ５の解像度を超える高精度で再計算する方法を説明する。以下では、再計算前の指先を示す画素Ｐ４の座標を、座標（Ｘｂ，Ｙｂ）と表記する。そして、下記のようにして、座標（Ｘｂ，Ｙｂ）の補正値（Ｘｃ，Ｙｃ）を求める。本実施の形態では、補正値の算出方法として、第１〜第４の例を挙げる。
【０１１９】
図１４（ａ）は、図１１のステップＳ３７７及び図１３のステップＳ４４７の指先補正値計算処理の第１の例の流れを示すフローチャートである。図１４（ｂ）は、図１１のステップＳ３７７及び図１３のステップＳ４４７の指先補正値計算処理の第２の例の流れを示すフローチャートである。図１４（ｃ）は、図１１のステップＳ３７７及び図１３のステップＳ４４７の指先補正値計算処理の第３の例の流れを示すフローチャートである。図１４（ｄ）は、図１１のステップＳ３７７及び図１３のステップＳ４４７の指先補正値計算処理の第４の例の流れを示すフローチャートである。
【０１２０】
図１８（ａ）は、図１４（ａ）及び図１４（ｃ）の指先補正値計算処理の説明図である。図１８（ｂ）は、図１４（ｂ）及び図１４（ｄ）の指先補正値計算処理の説明図である。
【０１２１】
図１８（ａ）及び図１８（ｂ）を参照して、補正前（再計算前）の指先画素Ｐ４の座標（Ｘｂ，Ｙｂ）を原点（０，０）とする。図中、水平右方向をｘ軸の正とし、垂直下方向をｙ軸の正とする。そして、補正前の指先画素Ｐ４を取り囲む８個の画素Ｐ０，Ｐ１，Ｐ２，Ｐ５，Ｐ６，Ｐ７及びＰ８を利用する。また、画素Ｐ０〜Ｐ８は、それぞれ、画素値（つまり輝度値）ｐ０〜ｐ８を有する。
【０１２２】
図１８（ａ）に示すように、第１及び第３の例では、原点（０，０）の指先画素Ｐ４の上下左右の画素Ｐ１，Ｐ７，Ｐ３及びＰ５の座標は、それぞれ、座標（０，−１），（０，１），（−１，０）及び（１，０）である。また、指先画素Ｐ４の左上画素Ｐ０、右上画素Ｐ２、左下画素Ｐ６及び右下画素Ｐ８の座標は、それぞれ、座標（−√２／２，−√２／２），（√２／２，−√２／２），（−√２／２，√２／２）及び（√２／２，√２／２）である。
【０１２３】
一方、図１８（ｂ）に示すように、第２及び第４の例では、原点（０，０）の指先画素Ｐ４の周囲画素Ｐ０，Ｐ１，Ｐ２，Ｐ５，Ｐ６，Ｐ７及びＰ８の座標は、それぞれ、座標（−１，−１）、（０，−１）、（１，−１）、（−１，０）、（１，０）、（−１，１）、（０，１）及び（１，１）である。
【０１２４】
なお、下記の数式中シンボル“＊”及び“／”は、それぞれ、乗算及び除算を示す。
【０１２５】
図１４（ａ）を参照して、第１の例では、ステップＳ３６１及びＳ３６３にて、ＭＣＵ３は、次式により、Ｘ座標Ｘｂの補正値Ｘｃ及びＹ座標Ｙｂの補正値Ｙｃを算出する。値Ｃｓは定数である。定数Ｃｓは１より大きい値である。
【０１２６】
Ｘｃ＝（Ａ／Ｃ）＊Ｃｓ
Ｙｃ＝（Ｂ／Ｃ）＊Ｃｓ
【０１２７】
Ａ＝−Ｒ＊ｐ０＋０＊ｐ１＋Ｒ＊ｐ２＋（−１）＊ｐ３＋０＊ｐ４＋１＊ｐ５＋（−Ｒ）＊ｐ６＋０＊ｐ７＋Ｒ＊ｐ８
Ｂ＝−Ｒ＊ｐ０＋（−１）＊ｐ１＋（−Ｒ）＊ｐ２＋０＊ｐ３＋０＊ｐ４＋０＊ｐ５＋Ｒ＊ｐ６＋１＊ｐ７＋Ｒ＊ｐ８
Ｃ＝ｐ０＋ｐ１＋ｐ２＋Ｐ３+ｐ４＋ｐ５＋ｐ６＋ｐ７＋ｐ８
Ｒ＝√２／２
【０１２８】
よって、補正後の指先のＸ座標Ｘｆ及びＹ座標Ｙｆは、次のようになる。
【０１２９】
Ｘｆ＝Ｘｂ＋Ｘｃ
Ｙｆ＝Ｙｂ＋Ｙｃ
【０１３０】
図１４（ｂ）を参照して、第２の例では、ステップＳ３７１及びＳ３７３にて、ＭＣＵ３は、次式により、Ｘ座標Ｘｂの補正値Ｘｃ及びＹ座標Ｙｂの補正値Ｙｃを算出する。値Ｃｓは定数である。
【０１３１】
Ｘｃ＝（Ｄ／Ｃ）＊Ｃｓ
Ｙｃ＝（Ｅ／Ｃ）＊Ｃｓ
【０１３２】
Ｄ＝−１＊ｐ０＋０＊ｐ１＋１＊ｐ２＋（−１）＊ｐ３＋０＊ｐ４＋１＊ｐ５＋（−１）＊ｐ６＋０＊ｐ７＋１＊ｐ８
Ｅ＝−１＊ｐ０＋（−１）＊ｐ１＋（−１）＊ｐ２＋０＊ｐ３＋０＊ｐ４＋０＊ｐ５＋１＊ｐ６＋１＊ｐ７＋１＊ｐ８
Ｃ＝ｐ０＋ｐ１＋ｐ２＋Ｐ３+ｐ４＋ｐ５＋ｐ６＋ｐ７＋ｐ８
【０１３３】
よって、補正後の指先のＸ座標Ｘｆ及びＹ座標Ｙｆは、次のようになる。
【０１３４】
Ｘｆ＝Ｘｂ＋Ｘｃ
Ｙｆ＝Ｙｂ＋Ｙｃ
【０１３５】
図１４（ｃ）を参照して、第３の例では、ステップＳ３８１及びＳ３８３にて、ＭＣＵ３は、次式により、Ｘ座標Ｘｂの補正値Ｘｃ及びＹ座標Ｙｂの補正値Ｙｃを算出する。値ｐｍａｘは、画素値ｐ０〜ｐ８のうちの最大値を示す。
【０１３６】
Ｘｃ＝Ａ／ｐｍａｘ
Ｙｃ＝Ｂ／ｐｍａｘ
【０１３７】
Ａ＝−Ｒ＊ｐ０＋０＊ｐ１＋Ｒ＊ｐ２＋（−１）＊ｐ３＋０＊ｐ４＋１＊ｐ５＋（−Ｒ）＊ｐ６＋０＊ｐ７＋Ｒ＊ｐ８
Ｂ＝−Ｒ＊ｐ０＋（−１）＊ｐ１＋（−Ｒ）＊ｐ２＋０＊ｐ３＋０＊ｐ４＋０＊ｐ５＋Ｒ＊ｐ６＋１＊ｐ７＋Ｒ＊ｐ８
Ｒ＝√２／２
【０１３８】
よって、補正後の指先のＸ座標Ｘｆ及びＹ座標Ｙｆは、次のようになる。
【０１３９】
Ｘｆ＝Ｘｂ＋Ｘｃ
Ｙｆ＝Ｙｂ＋Ｙｃ
【０１４０】
図１４（ｄ）を参照して、第４の例では、ステップＳ３９１及びＳ３９３にて、ＭＣＵ３は、次式により、Ｘ座標Ｘｂの補正値Ｘｃ及びＹ座標Ｙｂの補正値Ｙｃを算出する。値ｐｍａｘは、画素値ｐ０〜ｐ８のうちの最大値を示す。
【０１４１】
Ｘｃ＝Ｄ／ｐｍａｘ
Ｙｃ＝Ｅ／ｐｍａｘ
【０１４２】
Ｄ＝−１＊ｐ０＋０＊ｐ１＋１＊ｐ２＋（−１）＊ｐ３＋０＊ｐ４＋１＊ｐ５＋（−１）＊ｐ６＋０＊ｐ７＋１＊ｐ８
Ｅ＝−１＊ｐ０＋（−１）＊ｐ１＋（−１）＊ｐ２＋０＊ｐ３＋０＊ｐ４＋０＊ｐ５＋１＊ｐ６＋１＊ｐ７＋１＊ｐ８
【０１４３】
よって、補正後の指先のＸ座標Ｘｆ及びＹ座標Ｙｆは、次のようになる。
【０１４４】
Ｘｆ＝Ｘｂ＋Ｘｃ
Ｙｆ＝Ｙｂ＋Ｙｃ
【０１４５】
ここで、図１１のステップＳ３７７の指先補正値算出処理では、ＭＣＵ３は、座標（ＸＬ，ＹＬ）及び（ＸＳ，ＹＳ）のそれぞれを指先Ｐ４の座標（Ｘｂ，Ｙｂ）として、それぞれの補正値を算出する。また、図１３のステップＳ４４７の指先補正値算出処理では、座標（ＸＨ，ＹＨ）を指先Ｐ４の座標（Ｘｂ，Ｙｂ）として、その補正値を算出する。
【０１４６】
図１８（ｂ）を参照しながら、上記第４の例について補足説明する。
【０１４７】
第４の例の上記式では、指先画素Ｐ４並びに周囲画素Ｐ０，Ｐ１，Ｐ２，Ｐ５，Ｐ６，Ｐ７及びＰ８の座標（０，０）、（−１，−１）、（０，−１）、（１，−１）、（−１，０）、（１，０）、（−１，１）、（０，１）及び（１，１）に、対応する画素値ｐ４，ｐ０，ｐ１，ｐ２，Ｐ３，ｐ５，ｐ６，ｐ７及びｐ８で重み付けをし、それらの和Ｄが算出される。そして、和Ｄを値ｐｍａｘで除することにより、補正値Ｘｃを求める。
【０１４８】
このようにして、小数点を持った精度の補正値Ｘｃが得られる。なお、座標Ｘｂは、画素単位で求められるので、整数値である。従って、座標Ｘｂに補正値Ｘｃを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にＹ座標についても言える。
【０１４９】
また、画素値による重み付けを行うことにより得られた補正値Ｘｃを、補正前のＸ座標Ｘｂに加えることにより、画素値（輝度値）の大きい側に、Ｘ座標Ｘｂを補正できる（画素値による重み付け）。このことは同様にＹ座標についても言える。つまり、偏角θｊから変曲点を求めることによって、手の輪郭線上の画素から、指先に相当する画素を特定し（図１１のステップＳ３７３及びＳ３７５並びに図１３のステップＳ４４５）、さらに、画素値を加味することによって、輪郭線上で特定された画素の周囲で、より画素値の大きい位置に、指先の座標を補正している。なぜなら、画像に写り込んだ指の像のうち、その先端部分であって、さらに、画素値（輝度値）の大きい位置を、指先とみなすことにより、より適切に指先を特定できるからである。
【０１５０】
さらに、和Ｄを、画素値ｐ０〜ｐ８のうちの最大値ｐｍａｘで除している。つまり、除数を、固定値とするのではなく、変動値としている。これは、イメージセンサ５から手までの距離は、一定ではないからである。つまり、イメージセンサ５から手までの距離が近い場合は、画像に指は大きく写り込み、一方、イメージセンサ５から手までの距離が遠い場合は、画像には指は小さく写り込むので、補正値Ｘｃを、イメージセンサ５から手までの遠近に応じて、適切な値に設定するためである。補正値Ｙｃについても同様である。
【０１５１】
例えば、除数を固定値とする場合、その固定値が小さすぎると、イメージセンサ５から手までの距離が遠い場合は比較的妥当な値になるかもしれないが、近い場合は、補正値が大きくなりすぎてしまう。また、逆に、除数を固定値とする場合、その固定値が大きすぎると、イメージセンサ５から手までの距離が近い場合は比較的妥当な値になるかもしれないが、遠い場合は、補正値が小さくなりすぎてしまう。また、イメージセンサ５から手までの距離が遠い場合と近い場合の双方に適切な除数を、固定値として設定することは困難である。なぜなら、同じ距離で同じ指を撮影する場合であっても、イメージセンサ５が設置される環境（照明や外光など）によって、画素値（輝度値）は異なってくるし、また、指の色彩、輪郭、及び表面の形状等も人によって異なるからである。
【０１５２】
また、値Ｃ（＝ｐ０＋ｐ１＋ｐ２＋Ｐ３+ｐ４＋ｐ５＋ｐ６＋ｐ７＋ｐ８）で除することにより、加重平均をとることもできる。しかし、次の理由により、除数は、値Ｃではなく、最大値ｐｍａｘとするほうが好ましい。
【０１５３】
図１９を参照して、一般的に、実際の人間の指先３０は、平面視において、ある点を頂点（「実頂点」と呼ぶ。）３２として、円弧状となっている。一方、本実施の形態のように、比較的低解像度の画像から指の輪郭を検出し、指先を決定する場合、常に実頂点３２を指先として検出することは困難である。従って、検出される指先は、実頂点３２であったり、実頂点３２の左の点３４になったり、右の点３６になったりする。
【０１５４】
この場合、和Ｄを値Ｃで除して補正値とすると、その補正値は、図１８（ｂ）の画素Ｐ４を中心とした９×９画素の範囲を超えることができない。和Ｅについても同様である。このため、例えば、図１９の実頂点３２の補正後の位置は点３８、点３４の補正後の位置は点４０、点３６の補正後の位置は点４２となる。このように、補正後の指先の位置は、これら３つの点で異なっている。同じ指先を検出するのに、異なった部分を指先と認識したのでは、検出された指先位置に配置されるカーソルが安定しない。
【０１５５】
そこで、輪郭から求めた指先が、一定していな場合でも、補正後の位置を極力一定させるため、あるいは、指先の位置の相違を極力小さい範囲に収めるため、最大値ｐｍａｘで和Ｄ及びＥを除して、補正値を、９×９画素の範囲を越えるようにし、補正後の位置が、図１９の点４４、つまり、指先端部３０の腹の中心付近に集まるようにした。
【０１５６】
図１８（ａ）を参照しながら、上記第１の例について補足説明する。この例では、第４の例と異なり、画素Ｐ０，Ｐ２，Ｐ６及びＰ８の重み付けの対象を、それぞれ、座標（−√２／２，−√２／２），（√２／２，−√２／２），（−√２／２，√２／２）及び（√２／２，√２／２）とした。これは次の理由による。
【０１５７】
補正前の指先画素Ｐ４の中心からの距離を、全周囲画素で同じ値として、画素値を重みとするに当って、全画素値を均等に扱うためである。例えば、画素Ｐ４と画素Ｐ５との間の距離は「１」であるが、画素Ｐ２の座標を（１，−１）として計算すると、画素Ｐ４と画素Ｐ２との間の距離は、「√２」となってしまい、周囲画素の位置によって不均衡が発生する。補正前の指先画素Ｐ４の中心からの距離を、全周囲画素で同じ値とすることにより、補正値を方向によって偏りのないものとすることができる。
【０１５８】
また、この例では、Ａ／Ｃ及びＢ／Ｃに定数Ｃｓを乗じている。これは、第４の例で、除数を値Ｃとせず、加重平均をとらなかった理由と同じである。つまり、輪郭から求めた指先が、一定していな場合でも、補正後の位置を極力一定させるため、あるいは、指先の位置の相違を極力小さい範囲に収めるため、定数Ｃｓを乗じて、補正値を、９×９画素の範囲を越えるようにし、補正後の位置が、図１９の点４４に集まるようにしたのである。なお、定数Ｃｓを乗ずることなしにＡ／Ｃ及びＢ／Ｃを補正値とすることもできる。
【０１５９】
ここで、定数Ｃｓは、実験及び試行錯誤等により決定される。また、定数Ｃｓを、検出された指の幅に応じて動的に変更することもできる。例えば、画像から指の幅を算出し、その幅に所定数（小数値）を乗じることにより、定数Ｃｓを決定する。この所定数は、実験及び試行錯誤等により決定される。例えばこの所定数は２／３である。なお、例えば、補正前の指先画素の左右それぞれに一定画素数離れた左右の画素間の距離を求め、それを指の幅とする。
【０１６０】
また、和Ａ及びＢをそれぞれ値Ｃで除して加重平均をとるのは、小数点を持った精度の補正値Ｘｃ及びＹｃを得るためである。なお、座標Ｘｂは、画素単位で求められるので、整数値である。従って、座標Ｘｂに補正値Ｘｃを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にＹ座標についても言える。
【０１６１】
さらに、画素値による重み付けを行う理由は、第４の例と同様である。
【０１６２】
上記第２の例について補足説明する。定数Ｃｓを乗じる理由、加重平均をとる理由、及び、画素値による重み付けを行なう理由は、第１の例と同じである。
【０１６３】
上記第３の例について補足説明する。和Ａ及びＢをそれぞれ最大値ｐｍａｘで除して加重平均をとるのは、小数点を持った精度の補正値Ｘｃ及びＹｃを得るためである。なお、座標Ｘｂは、画素単位で求められるので、整数値である。従って、座標Ｘｂに補正値Ｘｃを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にＹ座標についても言える。
【０１６４】
また、画素Ｐ０，Ｐ２，Ｐ６及びＰ８の重み付けの対象を、それぞれ、座標（−√２／２，−√２／２），（√２／２，−√２／２），（−√２／２，√２／２）及び（√２／２，√２／２）とした理由は、第１の例と同じである。
【０１６５】
さらに、画素値による重み付けを行う理由、除数を変動値とした理由、及び、最大値ｐｍａｘで除し加重平均をとらない理由は、第４の例と同様である。
【０１６６】
ここで、図１４（ａ）〜図１４（ｄ）に示す指先補正値計算処理を実行する場合は、ＭＣＵ３は、画素値ｐ０〜ｐ８を、イメージセンサ５から順次取得し、計算式に代入して、補正値（Ｘｃ，Ｙｃ）を算出する。なお、イメージセンサ５は、ＭＣＵ３による２値化のために差分画像を出力した後でも、一定時間は（次の撮影処理までは）、差分画像データを保持しているので、指先補正値計算処理では、そこから必要な画素を取得することができる。このように、３×３画素（グレースケール）を一旦メモリ７に格納するのではなく、イメージセンサ５からの出力画素を順次処理しており、これにより、メモリ容量を削減できる。もちろん、イメージセンサ５が出力した差分画像をそのままメモリ７に格納して処理したり、あるいは、３×３画素（グレースケール）を一旦メモリ７に格納して処理することもできる。
【０１６７】
図１５（ａ）は、図４のステップＳ１１の擬似ボタン操作判定処理の第１の例の流れを示すフローチャートである（図３（ｂ）の第１の例に対応）。図１５（ａ）を参照して、ステップＳ６２１にて、ＭＣＵ３は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップＳ６２３にて、ＭＣＵ３は、手の形状を示す今回のフラグＳＨに４０ｈがセットされているか否かを判断し、４０ｈがセットされている場合（つまり、「１本指」の状態）、ステップＳ６２７に進み、それ以外はリターンする。
【０１６８】
ステップＳ６２７では、ＭＣＵ３は、手の形状を示す前回のフラグＳＨに２０ｈがセットされているか否かを判断し、２０ｈがセットされている場合（つまり、「チョキ」の状態）、ステップＳ６２９に進み、それ以外はリターンする。ステップＳ６２９では、ＭＣＵ３は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【０１６９】
図１５（ｂ）は、図４のステップＳ１１の擬似ボタン操作判定処理の第２の例の流れを示すフローチャートである（図３（ｂ）の第２の例に対応）。図１５（ｂ）を参照して、ステップＳ６０１にて、ＭＣＵ３は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップＳ６０３にて、ＭＣＵ３は、手の形状を示す今回のフラグＳＨに２０ｈがセットされているか否かを判断し、２０ｈがセットされている場合（つまり、「チョキ」の状態）、ステップＳ６０７に進み、それ以外はリターンする。
【０１７０】
ステップＳ６０７では、ＭＣＵ３は、手の形状を示す前回のフラグＳＨに４０ｈがセットされているか否かを判断し、４０ｈがセットされている場合（つまり、「１本指」の状態）、ステップＳ６０９に進み、それ以外はリターンする。ステップＳ６０９では、ＭＣＵ３は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【０１７１】
図１５（ｃ）は、図４のステップＳ１１の擬似ボタン操作判定処理の第３の例の流れを示すフローチャートである（図３（ｂ）の第３の例に対応）。図１５（ｃ）を参照して、ステップＳ６４１にて、ＭＣＵ３は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップＳ６４３にて、ＭＣＵ３は、手の形状を示す今回のフラグＳＨに２０ｈがセットされているか否かを判断し、２０ｈがセットされている場合（つまり、「チョキ」の状態）、ステップＳ６４５に進み、それ以外はリターンする。
【０１７２】
ステップＳ６４５では、ＭＣＵ３は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離ＤＣを算出する。ステップＳ６４７にて、ＭＣＵ３は、距離ＤＣが一定値ＣＣより小さいか否かを判断し、小さい場合一方指先が他方指先に近づいたと判断してステップＳ６４９に進み、それ以外はリターンする。ステップＳ６４９にて、ＭＣＵ３は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【０１７３】
ここで、図１５（ａ）〜図１５（ｃ）及び後述の図２２（ａ）〜図２２（ｃ）において、今回のフラグＳＨとは、イメージセンサ５から今回受け取った１フレームの画像データに基づき設定されたフラグを意味する。また、前回のフラグＳＨとは、イメージセンサ５から前回受け取った１フレームの画像データに基づき設定されたフラグを意味する。
【０１７４】
また、図１５（ａ）〜図１５（ｃ）は、擬似的にボタン操作が行われたと判定されたこと（つまり、擬似ボタンフラグのオン）を、クリック操作（ボタンを押下して放す操作）が行なわれたとみなす場合の処理例を示している。
【０１７５】
次に、図２２（ａ）〜図２２（ｃ）を参照して、擬似的にボタン操作が行われたと判定されたこと（つまり、擬似ボタンフラグのオン）を、ボタンのプレス操作（ボタンを押したままの状態）が行なわれたとみなす処理例を説明する。なお、擬似ボタンフラグのオフは、ボタンを放した状態とみなされる。
【０１７６】
図２２（ａ）は、図４のステップＳ１１の擬似ボタン操作判定処理の第４の例の流れを示すフローチャートである（図３（ｂ）の第１の例に対応）。図２２（ａ）を参照して、ステップＳ７０１にて、ＭＣＵ３は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップＳ７０９に進み、オフの場合ステップＳ７０３に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【０１７７】
ステップＳ７０３にて、ＭＣＵ３は、手の形状を示す今回のフラグＳＨに４０ｈがセットされているか否かを判断し、４０ｈがセットされている場合（つまり、「１本指」の状態）、ステップＳ７０５に進み、それ以外はリターンする。
【０１７８】
ステップＳ７０５では、ＭＣＵ３は、手の形状を示す前回のフラグＳＨに２０ｈがセットされているか否かを判断し、２０ｈがセットされている場合（つまり、「チョキ」の状態）、ステップＳ７０７に進み、それ以外はリターンする。ステップＳ７０７では、ＭＣＵ３は、擬似的にボタンがプレスされたことを示すため、擬似ボタンフラグをオンにする。
【０１７９】
一方、ステップＳ７０９では、ＭＣＵ３は、今回のフラグＳＨに２０ｈがセットされているか否かを判断し、２０ｈがセットされている場合（つまり、「チョキ」の状態）、ステップＳ７１１に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップＳ７１１では、ＭＣＵ３は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【０１８０】
図２２（ｂ）は、図４のステップＳ１１の擬似ボタン操作判定処理の第５の例の流れを示すフローチャートである（図３（ｂ）の第２の例に対応）。図２２（ｂ）を参照して、ステップＳ７３１にて、ＭＣＵ３は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップＳ７３９に進み、オフの場合ステップＳ７３３に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【０１８１】
ステップＳ７３３にて、ＭＣＵ３は、手の形状を示す今回のフラグＳＨに２０ｈがセットされているか否かを判断し、２０ｈがセットされている場合（つまり、「チョキ」の状態）、ステップＳ７３５に進み、それ以外はリターンする。
【０１８２】
ステップＳ７３５では、ＭＣＵ３は、手の形状を示す前回のフラグＳＨに４０ｈがセットされているか否かを判断し、４０ｈがセットされている場合（つまり、「１本指」の状態）、ステップＳ７３７に進み、それ以外はリターンする。ステップＳ７３７では、ＭＣＵ３は、擬似的にボタンがプレスされたことを示すため、擬似ボタンフラグをオンにする。
【０１８３】
一方、ステップＳ７３９では、ＭＣＵ３は、今回のフラグＳＨに４０ｈがセットされているか否かを判断し、４０ｈがセットされている場合（つまり、「一本指」の状態）、ステップＳ７４１に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップＳ７４１では、ＭＣＵ３は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【０１８４】
図２２（ｃ）は、図４のステップＳ１１の擬似ボタン操作判定処理の第６の例の流れを示すフローチャートである（図３（ｂ）の第３の例に対応）。図２２（ｃ）を参照して、ステップＳ７６１にて、ＭＣＵ３は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップＳ７７１に進み、オフの場合ステップＳ７６３に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【０１８５】
ステップＳ７６３にて、ＭＣＵ３は、手の形状を示す今回のフラグＳＨに２０ｈがセットされているか否かを判断し、２０ｈがセットされている場合（つまり、「チョキ」の状態）、ステップＳ７６５に進み、それ以外はリターンする。
【０１８６】
ステップＳ７６５では、ＭＣＵ３は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離ＤＣを算出する。ステップＳ７６７にて、ＭＣＵ３は、距離ＤＣが一定値ＣＣより小さいか否かを判断し、小さい場合一方指先が他方指先に近づいたと判断してステップＳ７６９に進み、それ以外はリターンする。ステップＳ７６９にて、ＭＣＵ３は、擬似的にボタンのプレスが行なわれたことを示すため、擬似ボタンフラグをオンにする。
【０１８７】
一方、ステップＳ７７１にて、ＭＣＵ３は、今回のフラグＳＨに２０ｈがセットされているか否かを判断し、２０ｈがセットされている場合（つまり、「チョキ」の状態）、ステップＳ７７３に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。
【０１８８】
ステップＳ７７３では、ＭＣＵ３は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離ＤＣを算出する。ステップＳ７７５にて、ＭＣＵ３は、距離ＤＣが一定値ＣＣ以上か否かを判断し、ＣＣ以上の場合擬似的にボタンが放されたとみなしてステップＳ７７７に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップＳ７７７にて、ＭＣＵ３は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【０１８９】
ところで、上記では、図３（ｂ）を参照して、擬似ボタン操作の第１〜第３の例を説明した。以下では、擬似ボタン操作の第４の例を説明する。この第４の例では、シングルクリック及びダブルクリックの判定を行なう。
【０１９０】
図２３（ａ）は、本発明の実施の形態による擬似ボタン操作の第４の例（シングルクリック）の説明図である。図２３（ａ）を参照して、一定時間ＴＣ以内に、ステップＳ２０００〜Ｓ２００４の変化が検出された場合に、シングルクリックが行なわれたとみなす。
【０１９１】
具体的には、指先５０が大体静止した状態になった場合に、最新の指先５０を中心とした矩形範囲（例えば３画素×３画素）５２を設定する（ステップＳ２０００）。例えば、最新の指先５０から一定距離ＲＤ内に過去所定数分の指先５０が存在する場合に、指先５０が大体静止した状態であると判断される。
【０１９２】
この矩形範囲５２の設定から一定時間ＴＣ以内に、矩形範囲５２から指先５０が消失し（出て）、矩形範囲５２に指先５０が存在しない状態になり（ステップＳ２００２）、そして、再び、矩形範囲５２に指先５０が出現し（入って）、矩形範囲５２に指先５０が存在する状態になった時に（ステップＳ２００４）、シングルクリックが行なわれたとみなす。例えば、矩形範囲５２内の画素値（輝度値）の合計値を、所定の閾値と比較して、合計値が閾値を超えていれば矩形範囲５２に指先５０が存在すると判断し、一方、合計値が閾値以下の場合に矩形範囲５２に指先５０が存在しないと判断する。
【０１９３】
なお、例えば、ユーザが、一定時間ＴＣ以内に、人差し指を伸ばした状態から、人差し指の第３関節（付け根の関節）を曲げて指を折り、再び、元の状態（人差し指を伸ばした状態）に戻すというジェスチャを行なった時に、シングルクリックが行なわれたとみなされる。この場合、第１及び第２関節の状態は任意である。また、例えば、ユーザが、一定時間ＴＣ以内に、人差し指を伸ばした状態から、人差し指の第２関節を曲げて指を折り（第３関節は固定）、再び、元の状態（人差し指を伸ばした状態）に戻すというジェスチャを行なった時に、シングルクリックが行なわれたとみなされる。この場合、第１関節の状態は任意である。ここで、指先に一番近い関節を第１関節、その次の関節を第２関節、さらにその次の関節を第３関節と呼んでいる。
【０１９４】
この例のような人のジェスチャでは、指が曲げられた後、指先が、ほぼ元の位置に戻ることが、本願発明者の実験により検証されている。このため、図２３（ａ）で説明した手法により、シングルクリックが行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できるのである。
【０１９５】
図２３（ｂ）は、本発明の実施の形態による擬似ボタン操作の第４の例（ダブルクリック）の説明図である。図２３（ｂ）を参照して、一定時間ＴＣ以内に、ステップＳ２１００〜Ｓ２１０８の変化が検出された場合に、ダブルクリックが行なわれたとみなす。この場合の一定時間ＴＣは、シングルクリックを判定するときの一定時間ＴＣと同じである。
【０１９６】
具体的には、指先５０が大体静止した状態になった場合に、最新の指先５０を中心とした矩形範囲（例えば３画素×３画素）５２を設定する（ステップＳ２１００）。指先５０が大体静止した状態の判断方法は、シングルクリックの場合と同じである。
【０１９７】
この矩形範囲５２の設定から一定時間ＴＣ以内に、矩形範囲５２から指先５０が消失し（出て）、矩形範囲５２に指先５０が存在しない状態になり（ステップＳ２１０２）、そして、再び、矩形範囲５２に指先５０が出現し（入って）、矩形範囲５２に指先５０が存在する状態になり（ステップＳ２１０４）、再び、矩形範囲５２から指先５０が消失し（出て）、矩形範囲５２に指先５０が存在しない状態になり（ステップＳ２１０６）、そして、再び、矩形範囲５２に指先５０が出現し（入って）、矩形範囲５２に指先５０が存在する状態になった時に（ステップＳ２１０８）、ダブルクリックが行なわれたとみなす。矩形範囲５２に指先５０が存在するか否かの判断は、シングルクリックの場合と同じである。
【０１９８】
なお、ダブルクリックは、上記のシングルクリックのジェスチャをユーザが２回行なうことで実行される。また、ダブルクリックは、シングルクリックを２回行なうものであり、それ故、折り曲げられた指先は、２回とも、ほぼ同じ位置に戻ってくる。この点も本願発明者により検証されている。このため、図２３（ｂ）で説明した手法により、ダブルクリックが行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できるのである。
【０１９９】
図２４及び図２５は、図４のステップＳ１１の擬似ボタン操作判定処理の第７の例の流れを示すフローチャートである（図２３（ａ）及び図２３（ｂ）の第４の例に対応）。図２４を参照して、ステップＳ１２００にて、ＭＣＵ３は、シングルクリックが行なわれたとみなす時にオンにセットされるシングルクリックフラグと、ダブルクリックが行なわれたとみなす時にオンにセットされるダブルクリックフラグと、をオフにする。
【０２００】
ステップＳ１２０２にて、ＭＣＵ３は、滞在フラグがオンか否かを判断し、オンの場合図２５のステップＳ１２５０に進み、オフの場合ステップＳ１２０４に進む。滞在フラグは、指先５０が大体静止した状態になったと判断された時に、つまり、図２３（ａ）及び図２３（ｂ）の矩形範囲５２が設定された時にオンにセットされるフラグである。従って、ステップＳ１２０２で否定判断がされた後のステップＳ１２０４〜Ｓ１２２０の処理は、矩形範囲５２を設定するための処理である。一方、ステップＳ１２０２で肯定判断がされた後のステップＳ１２５０〜Ｓ１２８４の処理は、図２３（ａ）及び図２３（ｂ）のステップＳ２００２，Ｓ２００４，Ｓ２１０２〜Ｓ２１０８の状態を判断するための処理である。
【０２０１】
ステップＳ１２０４にて、ＭＣＵ３は、変数ｋに０をセットする。ステップＳ１２０６にて、ＭＣＵ３は、最新の指先５０と、過去の指先５０と、の間の距離ＤＩＳを算出する。距離ＤＩＳは次式により算出される。
【０２０２】
ＤＩＳ＝√（ＸＤ２＋ＹＤ２）
ＸＤ＝Ｘｆ［０］−Ｘｆ［ｋ＋１］
ＹＤ＝Ｙｆ［０］−Ｙｆ［ｋ＋１］
【０２０３】
ここで、図１３のステップＳ４４９では、補正後の指先５０の座標（Ｘｆ，Ｙｆ）を計算する。この場合、補正後の指先５０の座標（Ｘｆ，Ｙｆ）は、キューに格納され、現在及び過去の計Ｎ個のデータが保存される（Ｎは２以上の整数。本実施の形態ではＮ＝１０）。キューは、Ｘ座標Ｘｆを代入する配列Ｘｆ［０］〜Ｘｆ［９］及びＹ座標Ｙｆを代入する配列Ｙｆ［０］〜Ｙｆ［９］により構成される。配列Ｘｆ［０］及びＹｆ［０］に常に最新の座標（Ｘｆ，Ｙｆ）が格納される。
【０２０４】
従って、ステップＳ１２０６では、最新の指先５０の座標（Ｘｆ［０］，Ｙｆ［０］）と、それより（ｋ＋１）個だけ過去の指先５０の座標（Ｘｆ［ｋ＋１］，Ｙｆ［ｋ＋１］）と、の間の距離ＤＩＳが計算される。
【０２０５】
そして、ステップＳ１２０８にて、ＭＣＵ３は、距離ＤＩＳが、一定距離ＲＤより小さいか否かを判断し、小さい場合ステップＳ１２１０に進み、それ以外は指先５０が静止した状態にないと判断してステップＳ１２２０に進む。ステップＳ１２１０にて、ＭＣＵ３は、変数ｋを１つインクリメントする。ステップＳ１２１２にて、ＭＣＵ３は、変数ｋの値が９になったか否かを判断し、９になった場合ステップＳ１２１４に進み、それ以外はステップＳ１２０６に戻る。
【０２０６】
ステップＳ１２１２でｋ＝９が判断されたことは、最新の指先５０と過去９個の指先５０それぞれとの間の距離全てが、一定距離ＲＤ内に存在することを意味する。つまり、指先５０が大体静止した状態にあることを意味する。このため、ステップＳ１２１４では、ＭＣＵ３は、滞在フラグをオンにする。一方、距離ＤＩＳが一定距離ＲＤ内にない過去の指先５０が１つでも存在する場合は、指先５０が静止した状態にないと判断する。このため、ステップＳ１２２０では、ＭＣＵ３は、滞在フラグをオフにしてリターンする。
【０２０７】
ステップＳ１２１４の次のステップＳ１２１６にて、ＭＣＵ３は、最新の指先５０の座標（Ｘｆ［０］，Ｙｆ［０］）を中心とした矩形範囲５２を設定する（図２３（ａ）のステップＳ２０００及び図２３（ｂ）のステップＳ２１００に相当）。そして、ステップＳ１２１８にて、ＭＣＵ３は、タイマＴＭをセットしてリターンする。このタイマＴＭは、上記一定時間ＴＣ（図２３（ａ）及び図２３（ｂ）参照）を計測するためのものである。この一定時間ＴＣは、実験及び試行錯誤等により、決定される。
【０２０８】
図２５を参照して、ステップＳ１２５０にて、ＭＣＵ３は、タイマＴＭの値が一定時間ＴＣになったか否かを判断し、一定時間ＴＣになった場合ステップＳ１２７８に進み、一定時間になっていない場合ステップＳ１２５２に進む。
【０２０９】
ステップＳ１２５２にて、ＭＣＵ３は、消失フラグがオンか否かを判断し、オンの場合ステップＳ１２６２に進み、オフの場合ステップＳ１２５４に進む。消失フラグは、矩形範囲５２に指先５０が存在する状態から存在しない状態に変化したときにオンにされるフラグである。
【０２１０】
ステップＳ１２５４では、ＭＣＵ３は、矩形範囲５２に指先５０が不存在か否かを判断し、存在する場合リターンし、不存在の場合ステップＳ１２５６に進む。ステップＳ１２５６にて、ＭＣＵ３は、消失フラグをオンにしてリターンする（図２３（ａ）のステップＳ２００２並びに図２３（ｂ）のステップＳ２１０２及びＳ２１０６に相当）。
【０２１１】
消失フラグがオンの場合、ステップＳ１２６２にて、ＭＣＵ３は、矩形範囲５２に指先５０が存在するか否かを判断し、存在しない場合リターンし、存在する場合ステップＳ１２６４に進む（図２３（ａ）のステップＳ２００４並びに図２３（ｂ）のステップＳ２１０４及びＳ２１０８に相当）。
【０２１２】
ステップＳ１２６４では、ＭＣＵ３は、仮クリックフラグがオンか否かを判断し、オンの場合ステップＳ１２７２に進み、オフの場合ステップＳ１２６６に進む。仮クリックフラグは、ユーザのジェスチャがシングルクリックの条件（図２３（ａ）のステップＳ２０００〜Ｓ２００４）を満たしたときにオンにされるフラグである。ただし、ダブルクリックはシングルクリックの動作を含むので（図２３（ｂ）のステップＳ２１００〜Ｓ２１０４）、一定時間ＴＣが経過するまでは、ダブルクリックが行なわれる可能性もある。このため、一定時間ＴＣの経過後に、シングルクリックかダブルクリックかを最終決定する必要がある。それ故、シングルクリックの条件が満たされた時、仮クリックフラグにより、最終決定まで、その事実を保持しておくのである。
【０２１３】
ステップＳ１２６６では、ＭＣＵ３は、シングルクリックの条件が満足されたので、仮クリックフラグをオンにする。そして、ステップＳ１２６８にて、ＭＣＵ３は、消失フラグをオフにしてリターンする。なぜなら、ステップＳ１２６２で肯定判断がされているからである。
【０２１４】
一方、ステップＳ１２７２にて、ＭＣＵ３は、ダブルクリックフラグをオンにする。なぜなら、仮クリックフラグがオンである状態において、さらに、図２３（ｂ）のステップＳ２１０６，Ｓ２１０８の変化が検出されたからである（ステップＳ１２６４にて肯定判断、ステップＳ１２５２にて肯定判断、ステップＳ１２６２にて肯定判断）。ステップＳ１２７４にて、ＭＣＵ３は、タイマＴＭを解除する。ステップＳ１２７６にて、ＭＣＵ３は、滞在フラグ、消失フラグ及び仮クリックフラグをオフにしてリターンする。なぜなら、ダブルクリックが決定されているため、これが最終決定だからである。なお、滞在フラグのオフは、矩形範囲５２の解除、つまり、クリック操作判定のリセットに相当する。
【０２１５】
さて、ステップＳ１２５０にて肯定判断がされた後、ＭＣＵ３は、最終決定を行なうべく、ステップＳ１２７８に進む。ステップＳ１２７８にて、ＭＣＵ３は、仮クリックフラグがオンか否かを判断し、オンの場合ステップＳ１２８０に進み、オフの場合シングルクリックもダブルクリックも行なわれていないためステップＳ１２８２に進む。ステップＳ１２８０では、ＭＣＵ３は、シングルクリックフラグをオンにしてステップＳ１２８２に進む。
【０２１６】
ステップＳ１２８２にて、ＭＣＵ３は、タイマＴＭを解除する。ステップＳ１２８４にて、ＭＣＵ３は、滞在フラグ、消失フラグ及び仮クリックフラグをオフにしてリターンする。なお、滞在フラグのオフは、矩形範囲５２の解除、つまり、クリック操作判定のリセットに相当する。
【０２１７】
なお、シングルクリックフラグ及びダブルクリックフラグは、図４のステップＳ１３にて、コンピュータ１１に送信される。
【０２１８】
図２０は、図１のウィンドウシステム４００によるイベント監視処理の流れの一例を示すフローチャートである。図２０を参照して、ステップＳ８００にて、ウィンドウシステム４００は、第１アプリケーションプログラム１００から依頼されたイベントが発生したか否かをチェックし、発生した場合ステップＳ８０２に進み、発生していない場合ステップＳ８００に戻る。ステップＳ８０２では、ウィンドウシステム４００は、イベントの発生を第１アプリケーションプログラム１００に通知する。
【０２１９】
一方、ステップＳ９００にて、第１アプリケーションプログラム１００は、ウィンドウシステム４００からイベント発生の通知を受けたか否かをチェックし、通知を受けた場合ステップＳ９０２に進み、通知を受けていない場合ステップＳ９００に戻る。ステップＳ９０２では、第１アプリケーションプログラム１００は、発生したイベントに応じた処理（ウィンドウの制御を含む。）を実行する。
【０２２０】
また、ステップＳ８０４にて、ウィンドウシステム４００は、第２アプリケーションプログラム１００から依頼されたイベントが発生したか否かをチェックし、発生した場合ステップＳ８０６に進み、発生していない場合ステップＳ８０４に戻る。ステップＳ８０６では、ウィンドウシステム４００は、イベントの発生を第２アプリケーションプログラム１００に通知する。
【０２２１】
一方、ステップＳ１０００にて、第２アプリケーションプログラム１００は、ウィンドウシステム４００からイベント発生の通知を受けたか否かをチェックし、通知を受けた場合ステップＳ１００２に進み、通知を受けていない場合ステップＳ１０００に戻る。ステップＳ１００２では、第２アプリケーションプログラム１００は、発生したイベントに応じた処理（ウィンドウの制御を含む。）を実行する。
【０２２２】
なお、ステップＳ８０２及びＳ８０６の通知は、第１及び第２アプリケーションプログラム１００に対して、ＡＰＩ２００を介して行なわれる。
【０２２３】
ここで、イベントの例を幾つか挙げる。例えば、アプリケーションプログラム１００が制御するウィンドウに設けられたボタン上にカーソルが位置し、かつ、擬似的にボタン操作が行なわれた場合に、つまり、ウィンドウ中のボタンが押下された場合に、イベントが発生する。ＣＰＵ５１は、ボタン押下に応じた処理を実行する。
【０２２４】
例えば、後述する図２６に示すジェスチャ１〜１３のそれぞれの発生に対して、イベントが発生する。この場合、例えば、ジェスチャ１によりイベントが発生した場合、ＣＰＵ５１は、手の移動方向である水平左方向に、モニタ６７に表示された画面をスクロールする。
【０２２５】
例えば、所定の手の形状（例えば、「グー」）が検出された場合にイベントが発生する。例えば、手の面積が一定値以上になったらイベントが発生する。例えば、手又は指先の移動軌跡が所定軌跡になった場合にイベントが発生する。例えば、手の一定角度の回転が発生したらイベントが発生する。例えば、手の速度が一定値以上になったらイベントが発生する。例えば、手の加速度が一定値以上になったらイベントが発生する。
【０２２６】
以上のように、本実施の形態では、マウス等の接触型ポインティングデバイスで生成できるイベントはもちろん、接触型ポインティングデバイスでは生成することができないイベントをも生成できる。従って、各アプリケーションプログラム１００は、多彩なイベントに応じた処理（ウィンドウの制御を含む。）を実行することができる。
【０２２７】
図２１は、図１のウィンドウシステム４００によるカーソル制御処理の流れの一例を示すフローチャートである。図２１を参照して、ステップＳ１１００にて、ウィンドウシステム４００は、デバイスドライバ５００からユーザの指先の座標を取得する。ステップＳ１１０２にて、ウィンドウシステム４００は、受け取った指先の座標を、モニタ６７に応じたスクリーン座標に変換する。ステップＳ１１０４にて、ウィンドウシステム４００は、スクリーン座標に変換された指先の座標上にカーソルを表示し、ステップＳ１１００に進む。
【０２２８】
図２６は、図１のウィンドウシステム４００が受け付け可能なジェスチャの例示図である。図２６を参照して、ジェスチャ１は、手を「パー」にした後、水平左方向へスイングする動作である。ジェスチャ２は、手を「パー」にした後、水平右方向へスイングする動作である。ジェスチャ３は、手を「パー」にした後、垂直上方向へスイングする動作である。ジェスチャ４は、手を「パー」にした後、垂直下方向へスイングする動作である。
【０２２９】
ジェスチャ５は、手を「グー」から「チョキ」に変化させる動作である。ジェスチャ６は、手を「グー」から「パー」に変化させる動作である。ジェスチャ７は、手を「チョキ」から「グー」に変化させる動作である。ジェスチャ８は、手を「チョキ」から「パー」に変化させる動作である。ジェスチャ９は、手を「パー」から「グー」に変化させる動作である。ジェスチャ１０は、手を「パー」から「チョキ」に変化させる動作である。
【０２３０】
ジェスチャ１１は、手でイメージセンサ５、つまり、カメラを覆う（掩蔽する）動作である。ジェスチャ１２は、時計回りに、手で円を描く動作である。ジェスチャ１３は、反時計回りに、手で円を描く動作である。
【０２３１】
ウィンドウシステム４００は、各ジェスチャ１〜１３を検出し、それぞれをイベントの発生として認識し、依頼先のアプリケーションプログラム１００に通知することができる。
【０２３２】
ここで、各ジェスチャ１〜１３を、キーボード７１の各種キー（例えば、タブキー、左方向キー、右方向キー、上方向キー、下方向キー、スペースキー、ページアップキー、ページダウンキー、エスケープキー、及び、Ｗｉｎｄｏｗｓ（登録商標）キーなど）に割り当てることもできる。
【０２３３】
また、各ジェスチャ１〜１３を、キーボード７１のショートカットキー（例えば、Ａｌｔキー＋Ｆ４キー（ウィンドウを閉じる）、Ａｌｔキー＋Ｅｓｃキー（複数のアプリケーションの切り替え）、Ｈｏｍｅキー（先頭にジャンプ）、Ｅｎｄキー（末行にジャンプ）、Ｆ１キー（ヘルプを呼び出す）、Ｃｔｒｌキー＋Ｓキー（上書き保存）、Ｗｉｎｄｏｗｓキー＋Ｒキー（ファイル名を指定して実行）、Ｗｉｎｄｏｗｓキー＋Ｍキー（すべてのウィンドウを最小化）、及び、Ｗｉｎｄｏｗｓキー＋Ｄキー（すべてのウィンドウを元のサイズに戻す）など）に割り当てることもできる。
【０２３４】
なお、オペレーティングシステム３００のために用意されたキー及びショートカットキーを、ジェスチャ１〜１３に割り当てることができる。また、アプリケーションプログラム１００ごとに用意されたキー及びショートカットキーを、アプリケーションプログラム１００ごとにジェスチャ１〜１３に割り当てることもできる。つまり、アプリケーションプログラム１００ごとにジェスチャ１〜１３を割り当てることができ、ジェスチャ１〜１３により実行される機能は、アプリケーションプログラム１００ごとに異なってもよい。
【０２３５】
また、複数のアプリケーションプログラム１００が起動している場合に、フォアグラウンド（最前面）のウィンドウに対応するアプリケーションプログラム１００を認識して、そのアプリケーションプログラム１００のために用意されたキー及びショートカットキーが割り当てられたジェスチャ１〜１３を有効とすることもできる。
【０２３６】
なお、ジェスチャ１〜１３にキーやショートカットキーが割り当てられる場合は、ジェスチャの検出が、それに割り当てられたキーないしはショートカットキーの押下に相当する。アプリケーションプログラム１００が、あるキーないしはショートカットキーの押下というイベントの発生通知をウィンドウシステム４００に依頼している場合、例えば、ウィンドウシステム４００は、変換テーブルを参照して、検出されたジェスチャが、依頼されたキーないしはショートカットキーが割り当てられたものか否かを判断し、イベントの発生をアプリケーションプログラム１００に通知する。変換テーブルは、ジェスチャ１〜１３と、キーないしはショートカットキーと、を関連付けたテーブルである。
【０２３７】
また、各ジェスチャ１〜１３を、各種システムコールないしはＡＰＩ（例えば、ブラウザの起動、ウィンドウの最大化、及び、ウィンドウの最小化など）に割り当て、対応するシステムコールないしはＡＰＩを呼び出すために利用することもできる。
【０２３８】
さらに、各ジェスチャ１〜１３を各種実行ファイルないしはアプリケーションに割り当て、対応する実行ファイルないしはアプリケーションを実行するために利用することもできる。
【０２３９】
ここで、各ジェスチャ１〜１３に割り当てるキー、ショートカットキー、システムコールないしはＡＰＩ、及び、実行ファイルは、固定的に設定されていてもよいし、コンピュータシステム７００のユーザによって登録（動的に変更）できるようにすることもできる。
【０２４０】
図２７は、図１のウィンドウシステム４００によるジェスチャ判定処理の流れの一例を示すフローチャートである。図２７を参照して、ステップＳ１００にて、ウィンドウシステム４００は、ジェスチャ判定処理で必要な変数等（後述の変数ＣＰ，ＴＬ、及び、受付フラグ等）を初期化する。
【０２４１】
ステップＳ１０１にて、ウィンドウシステム４００は、ステップＳ１０２〜Ｓ１０５で検出されたジェスチャを示すフラグＪＦに００ｈ（不定を意味）を代入する。ステップＳ１０２にて、ウィンドウシステム４００は、ジェスチャ１〜４のいずれかが実行されたか否かを判断する。この場合、ウィンドウシステム４００は、ジェスチャ１が検出されたとき、フラグＪＦに１０ｈを代入し、ジェスチャ２が検出されたとき、フラグＪＦに２０ｈを代入し、ジェスチャ３が検出されたとき、フラグＪＦに３０ｈを代入し、ジェスチャ４が検出されたとき、フラグＪＦに４０ｈを代入する。
【０２４２】
ステップＳ１０３にて、ウィンドウシステム４００は、今回のフラグＳＨ及び前回のフラグＳＨを参照して（図１０〜図１２参照）、ジェスチャ５〜１０のいずれかが実行されたか否かを判断する。この場合、ウィンドウシステム４００は、ジェスチャ５が検出されたとき、フラグＪＦに５０ｈを代入し、ジェスチャ６が検出されたとき、フラグＪＦに６０ｈを代入し、ジェスチャ７が検出されたとき、フラグＪＦに７０ｈを代入し、ジェスチャ８が検出されたとき、フラグＪＦに８０ｈを代入し、ジェスチャ９が検出されたとき、フラグＪＦに９０ｈを代入し、ジェスチャ１０が検出されたとき、フラグＪＦにＡ０ｈを代入する。
【０２４３】
ステップＳ１０４にて、ウィンドウシステム４００は、掩蔽フラグを参照して（図５参照）、ジェスチャ１１が実行されたか否かを判断する。この場合、ウィンドウシステム４００は、ジェスチャ１１が検出されたとき、フラグＪＦにＢ０ｈを代入する。
【０２４４】
ステップＳ１０５にて、ウィンドウシステム４００は、現在及び過去の手の重心座標（Ｘｇ，Ｙｇ）に基づいて、手の移動軌跡を算出し、ジェスチャ１２が実行されたと判断したときはフラグＪＦにＣ０ｈを代入し、ジェスチャ１３が実行されたと判断したときはフラグＪＦにＤ０ｈを代入する。
【０２４５】
ステップＳ１０６にて、ウィンドウシステム４００は、フラグＪＦの値を、ジェスチャフラグＦＦに代入して、ステップＳ１０１に進む。ウィンドウシステム４００は、イメージセンサ５が１フレームの差分画像を出力するたびに、ジェスチャフラグＦＦを見て、アプリケーションプログラム１００から依頼されたイベントの発生の有無を確認する。なお、ウィンドウシステム４００は、イメージセンサ５が１フレームの差分画像を出力するたびに、ステップＳ１０１〜Ｓ１０６を繰り返す。
【０２４６】
なお、図２７の処理は、ウィンドウシステム４００以外のプログラムが行ってもよい。
【０２４７】
図２８及び図２９は、図２７のステップＳ１０２のジェスチャ１〜４の判定処理の流れの一例を示すフローチャートである。図２８を参照して、ステップＳ１１０にて、ウィンドウシステム４００は、受付フラグがオンか否かを判断し、オフの場合ステップＳ１１１に進み、オンの場合図２９のステップＳ１２０に進む。受付フラグは、手の形状が一定時間連続して「パー」であるときにオンにされるフラグである。
【０２４８】
ステップＳ１１１にて、ウィンドウシステム４００は、フラグＳＨを取得する。ステップＳ１１２にて、ウィンドウシステム４００は、フラグＳＨの値が１０ｈ（手の形状がパー）か否かを判断し、１０ｈの場合ステップＳ１１３に進み、それ以外はステップＳ１１６に進む。ステップＳ１１６では、ウィンドウシステム４００は、カウンタＣＰに０を代入する。カウンタＣＰは、フラグＳＨの値が１０ｈである状態（パーの状態）が連続して発生した回数を示す。
【０２４９】
一方、ステップＳ１１３では、ウィンドウシステム４００は、カウンタＣＰを１つインクリメントする。ステップＳ１１４にて、ウィンドウシステム４００は、カウンタＣＰの値が所定値ＰＴより大きいか否かを判断し、大きい場合ステップＳ１１５に進み、それ以外はステップＳ１１７に進む。ステップＳ１１５では、ウィンドウシステム４００は受付フラグをオンにする。一方、ステップＳ１１７では、ウィンドウシステム４００は、受付フラグをオフにする。
【０２５０】
図２９を参照して、図２８のステップＳ１１０での肯定判断の後、ステップＳ１２０では、ウィンドウシステム４００は、カウンタＴＬを１つインクリメントする。カウンタＴＬは、受付フラグがオンになってからの経過時間を示す。ステップＳ１２２にて、ウィンドウシステム４００は、カウンタＴＬの値が所定値ＬＬより大きいか否かを判断し、大きい場合ステップＳ１２４に進み、それ以外はステップＳ１２８に進む。ステップＳ１２４では、ウィンドウシステム４００は、受付フラグをオフにする。ステップＳ１２６にて、ウィンドウシステム４００は、カウンタＴＬに０を代入してリターンする。
【０２５１】
一方、ステップＳ１２２で否定判断の後、ステップＳ１２８にて、ウィンドウシステム４００は、手の重心（Ｘｇ，Ｙｇ）のＸ方向の速度Ｖｘを算出する。ステップＳ１３０にて、ウィンドウシステム４００は、速度Ｖｘが所定値ＮＳより小さいか否かを判断し、小さい場合Ｘ方向の動きはノイズ（ユーザが意図しない、手の小さなぶれ等）とみなしステップＳ１４２に進み、それ以外はステップＳ１３２に進む。ステップＳ１３２にて、ウィンドウシステム４００は、所定フレーム数ｆｎにおける速度Ｖｘの平均値ＶｘＡを算出する。なお、この場合のフレームは、イメージセンサ５が差分画像を出力する周期を示す。
【０２５２】
ステップＳ１３４にて、ウィンドウシステム４００は、平均値ＶｘＡが所定値ＴＨＶより大きいか否かを判断し、大きい場合ステップＳ１３６に進み、それ以外はＸ方向の動きはノイズとみなし（つまりユーザが意図しない動きとみなし）ステップＳ１４２に進む。ステップＳ１３４によって、ユーザが意図しない比較的大きな動きをノイズとして排除できる。つまり、大きな動きの後、小さな動きが続く場合、このような動きはノイズと判断するほうが適切であるところ、このような場合は、平均値ＶｘＡが小さくなるので、このような動きをノイズとして排除できる。
【０２５３】
ステップＳ１３６では、ウィンドウシステム４００は、速度Ｖｘの方向を判断し、水平左方向を向いている場合ステップＳ１３８に進み、水平右方向を向いている場合ステップＳ１４０に進む。
【０２５４】
ステップＳ１３８では、ウィンドウシステム４００は、フラグＪＦに、ジェスチャ１を示す１０ｈを代入してリターンする。一方、ステップＳ１４０では、ウィンドウシステム４００は、フラグＪＦに、ジェスチャ２を示す２０ｈを代入してリターンする。
【０２５５】
さて、ステップＳ１４２にて、ウィンドウシステム４００は、手の重心（Ｘｇ，Ｙｇ）のＹ方向の速度Ｖｙを算出する。ステップＳ１４４にて、ウィンドウシステム４００は、速度Ｖｙが所定値ＮＳより小さいか否かを判断し、小さい場合Ｙ方向の動きはノイズ（ユーザが意図しない、手の小さなぶれ等）とみなしリターンし、それ以外はステップＳ１４６に進む。ステップＳ１４６にて、ウィンドウシステム４００は、所定フレーム数ｆｎにおける速度Ｖｙの平均値ＶｙＡを算出する。なお、この場合のフレームは、イメージセンサ５が差分画像を出力する周期を示す。
【０２５６】
ステップＳ１４８にて、ウィンドウシステム４００は、平均値ＶｙＡが所定値ＴＨＶより大きいか否かを判断し、大きい場合ステップＳ１５０に進み、それ以外はＹ方向の動きはノイズとみなし（つまりユーザが意図しない動きとみなし）リターンする。ステップＳ１４８によって、ユーザが意図しない比較的大きな動きをノイズとして排除できる。この点はステップＳ１３４と同様である。ステップＳ１５０では、ウィンドウシステム４００は、速度Ｖｙの方向を判断し、垂直上方向を向いている場合ステップＳ１５２に進み、垂直下方向を向いている場合ステップＳ１５４に進む。
【０２５７】
ステップＳ１５２では、ウィンドウシステム４００は、フラグＪＦに、ジェスチャ３を示す３０ｈを代入してリターンする。一方、ステップＳ１５４では、ウィンドウシステム４００は、フラグＪＦに、ジェスチャ４を示す２０ｈを代入してリターンする。
【０２５８】
上記のように、受付フラグがオンになった後、つまり、「パー」の状態が一定時間継続した後、手の重心の左移動、右移動、上移動、及び下移動を判断する。これにより、ユーザが意図しない動きが有効なジェスチャと認識されるのを防止できる。
【０２５９】
例えば、受付フラグを設けずに、重心の左移動が発生したときに、ジェスチャ１が行われたと認識し、右移動が発生したときに、ジェスチャ２が行われたと認識することを想定する。一般に、手をスイングする際、ある程度移動したら、スイング動作を停止するところ、それによって、手がぶれることも多い。この場合、本来のスイング方向と逆方向に手がぶれることも多い。また、スイング後に、無意識に手を元に戻す（逆スイングする）こともある。
【０２６０】
従って、手が左移動してジェスチャ１が行われたと判断した後、すぐに、逆方向のスイングが検出されることもあり、それがジェスチャ２と判断されてしまう。この場合、ジェスチャ２は、ユーザが意図しない入力である。
【０２６１】
本実施の形態のように、ユーザが、「パー」の状態を一定時間継続させて、特定のジェスチャを行う意思表示を行なった後、特定のジェスチャ（手の移動）の有無を判断すれば、このような逆方向のスイングが有効なジェスチャと判断されることはない。
【０２６２】
なお、図２９では、水平移動のジェスチャ（ジェスチャ１，２）と垂直移動のジェスチャ（ジェスチャ３，４）とを選択的に判断し、双方が検出されることはなかった。ただし、双方を判断して、双方を検出することもできる。
【０２６３】
さて、以上のように、本実施の形態によれば、アプリケーションプログラム１００等の各アプリケーションプログラムは、モーションセンサ６００により検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手をモーションセンサ６００により撮影し、撮影画像からの検出結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【０２６４】
「多彩な入力」とは、上記例では、手の形状（グー、チョキ、パー、一本指、）、手の形状の変化（図３（ｂ）参照）、手の面積（イメージセンサ５と手との間の距離に相関）、及び、指先の位置ないしは移動である。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本実施の形態では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、マウスボタンの操作を擬似的なボタン操作に対応させることにより（図３（ｂ）参照）、マウスと同等の機能を包含できる。
【０２６５】
このように、モーションセンサ６００は、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【０２６６】
また、モーションセンサ６００が差分画像を解析して手を検出するので、このような処理をＣＰＵ５１は行なう必要がなく、その処理負荷を軽減でき、また、ＣＰＵ５１上で動作するコンピュータプログラムのプログラマは、手を検出するためのプログラムを作成する必要がなく、その負担を軽減できる。つまり、コンピュータシステム７００に簡易にモーションセンサ６００を搭載できる。
【０２６７】
また、本実施の形態では、ウィンドウシステム４００は、モーションセンサ６００が検出したユーザの指先の位置に対応するモニタ６７の画面上の位置にカーソルを表示する。つまり、ユーザは、三次元空間中で手を動かしながら、非接触で、カーソルを操作できる。
【０２６８】
さらに、本実施の形態では、ウィンドウシステム４００は、モーションセンサ６００が検出したユーザの手の情報に基づいて、アプリケーションプログラム１００から依頼されたイベントが発生したか否かを監視し、イベントが発生した場合に、依頼主であるアプリケーションプログラム１００に、イベントの発生を通知する。従って、アプリケーションプログラム１００をイベント駆動型プログラムとして作成することができ、ウィンドウの制御に好適である。
【０２６９】
さらに、本実施の形態では、ユーザは、１本指を立てた状態から、もう一本の指を立てて２本指を立てた状態にするだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる（図３（ｂ）の第１の例）。
【０２７０】
また、擬似的なボタン操作の前後において、常に１本の指は撮影されるので、その指先に対応する画面上の位置にカーソルを表示でき、ポインティングと擬似的なボタン操作を片手で行なうことができる（図３（ｂ）の第１の例）。
【０２７１】
また、本実施の形態によれば、ユーザは、２本指を立てた状態から、もう一本の指を閉じて１本指を立てた状態にするだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる（図３（ｂ）の第２の例）。
【０２７２】
また、擬似的なボタン操作の前後において、常に１本の指は撮影されるので、その指先に対応する画面上の位置にカーソルを表示でき、ポインティングと擬似的なボタン操作を片手で行なうことができる（図３（ｂ）の第２の例）。
【０２７３】
さらに、本実施の形態によれば、ユーザは、２本の指の指先を近づけるだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる（図３（ｂ）の第３の例）。
【０２７４】
また、検出された２つの指先の間（例えば中点）にカーソルを表示することができ、ポインティングと擬似的なボタン操作を片手で行なうことができる（図３（ｂ）の第３の例）。
【０２７５】
さらに、本実施の形態によれば、ユーザは、三次元空間中で、１本指を立てた状態から、その指を折って、再び、元の立てた状態に戻すというジェスチャを行なうだけで、非接触のクリック操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、クリック操作を行なうことができる（図２３（ａ）の第４の例）。
【０２７６】
このような人のジェスチャでは、指が曲げられた後、指先が、ほぼ元の位置に戻ることが、本願発明者の実験により検証されている。このため、このようなジェスチャを検出することにより、クリック操作が行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できる。
【０２７７】
さらに、本実施の形態によれば、ユーザは、三次元空間中で、１本指を立てた状態から、その指を折って、再び、元の立てた状態に戻し、さらに、再び、その指を折って、再び、元の立てた状態に戻すというジェスチャを行なうだけで、つまり、シングルクリック操作のためのジェスチャを２回行なうだけで、非接触のダブルクリック操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、ダブルクリック操作を行なうことができる（図２３（ｂ）の第４の例）。
【０２７８】
このようなダブルクリック操作は、シングルクリック操作を２回行うものであるところ、折り曲げられた指先は、２回とも、ほぼ同じ位置に戻ってくることが、本願発明者の実験により検証されている。このため、このようなジェスチャを検出することにより、ダブルクリック操作が行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できる。
【０２７９】
また、本実施の形態では、ＭＣＵ３は、指先５０の動きが一定範囲ＤＩＳ内に収まっている場合に（図２４のステップＳ１２０８及びＳ１２１２で肯定判断）、ユーザがクリック操作（シングルクリック又はダブルクリック）を行なうことを意図しているとみなし、矩形範囲５２を設定し（図２４のステップＳ１２１６）、これをトリガとして、ユーザがクリック操作に対応するジェスチャを行ったか否かを判定できる。このため、ユーザが当該ジェスチャを行なったか否かを、常に判定する必要がなく、処理負荷を軽減できる。
【０２８０】
さらに、ＭＣＵ３は、矩形範囲５２が設定されてから所定時間ＴＣ内に、指先５０が矩形範囲５２から消失したと判断しない場合（図２５のステップＳ１２５４）、又は、矩形範囲５２に指先が出現したと判断しない場合（図２５のステップＳ１２６２）、滞在フラグをオフにして、矩形範囲５２を解除する（図２５のステップＳ１２８４）。
【０２８１】
このように、所定時間ＴＣ内に、指先５０が矩形範囲５２から消失したと判断しない場合、又は、矩形範囲５２に指先が出現したと判断しない場合、ユーザがクリック操作（シングルクリック又はダブルクリック）を行なうことを意図していないとみなして、ユーザの意図に反してクリック操作が行なわれたと判定されることを防止できる。つまり、一般にクリック操作は素早く行なわれるところ、所定時間ＴＣを適切に設定することにより、同一の動きであっても、クリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【０２８２】
さらに、本実施の形態によれば、輪郭から大体の指先を決定し（図１１のステップＳ３７３，Ｓ３７５、図１３のステップＳ４４５）、その周囲画素のみを用いて補正を行なうので（図１４（ａ）〜図１４（ｄ））、処理のための記憶容量の削減と処理速度の向上を図ることができる。
【０２８３】
また、補正が小数点精度で実行されるので、イメージセンサ５が比較的低解像度であっても、高精度で指先の位置を決定することができる。その結果、イメージセンサ５より高解像度のモニタ６７の画面上の、指先に対応する位置にカーソルを表示する場合でも、その動きを滑らかにすることができる。
【０２８４】
さらに、周囲画素の画素値により、補正を行なうので、補正後の指先を、輪郭線上ではなく、指の内部の位置に決定でき、ユーザが指先と認識する位置により近づけることができる。その結果、指先に対応するモニタ６７の画面上の位置にカーソルを表示する場合、ユーザにとって、指先によるカーソルの制御が容易になる。なお、一般に、人は、指の腹を向けて、指を動かすときは、指の輪郭線上の凸点を指先と認識せず、指先端部の指の腹（ｆｉｎｇｅｒ  ｐａｄ）の中心を指先と認識するものである。
【０２８５】
さらに、本実施の形態では、補正後の指先の位置が、周囲画素の範囲（９×９画素の範囲）を超えるように、補正を行う。このため、補正後の指先の位置を指先端部の指の腹の一定位置あるいは略一定位置に決定することができ、図１１のステップＳ３７３，Ｓ３７５、及び図１３のステップＳ４４５により検出された指先の位置が安定していない場合でも、補正後の指先の位置を極力一定させ、あるいは、指先の位置の相違を極力小さい範囲に収めることができる。その結果、指先に対応するモニタ６７の画面上の位置にカーソルを表示する場合、カーソルを安定化できる。
【０２８６】
また、補正後の指先を、ユーザが指先と認識する位置により一層近づけることができる。その結果、指先に対応するモニタ６７の画面上の位置にカーソルを表示する場合、ユーザにとって、指先によるカーソルの制御が一層容易になる。
【０２８７】
さらに、本実施の形態では、指先画素Ｐ４と指先画素Ｐ４の斜め方向に位置する周囲画素（Ｐ０，Ｐ２，Ｐ６，Ｐ８）との間の距離と、指先画素Ｐ４と指先画素Ｐ４の水平方向又は垂直方向に位置する周囲画素（Ｐ１，Ｐ３，Ｐ５，Ｐ７）との間の距離と、が等しくなるように、周囲画素（Ｐ０，Ｐ２，Ｐ６，Ｐ８）の座標を定義する（図１８（ａ）参照）。その結果、重みとして画素値を利用するに当って、全周囲画素の画素値が均等に扱われ、方向によって偏りのない補正を行なうことができる。
【０２８８】
さらに、本実施の形態によれば、ＣＰＵ５１は、被写体の形状（グー、チョキ、パー、１本指）を入力とした情報処理を実行することができる。
【０２８９】
さらに、本実施の形態によれば、指先と水かきとの間の画素に基づいて指を特定し（図９のステップＳ２５７及びＳ２５９、図１７参照）、輪郭画像の重心により指を特定しないので、重心により指を特定する場合と比較して、精度良く指を特定でき（図９）、ひいてはより精度良く手の形状を判定できる（図１０、図１１）。一般に、輪郭画像の重心と、被写体の重心と、は一致しない場合も多く、この場合に、重心により指を特定すると、認識の精度が低くなる。
【０２９０】
また、指先と水かきとの間の画素に基づいて得られた、隣り合う指と指とがなす角度だけでなく、重心から指先に相当する画素までの距離に基づいて、手の形状を判断するので（図１１のステップＳ３４５〜Ｓ３５１）、より多様な手の形状を判定できる（図１１）。例えば、手の形状が「チョキ」であることを判定できる。
【０２９１】
また、重心から輪郭線上の画素までの距離を求めるといった簡単な計算で（図８のステップＳ２０３）、手の形状を判定できる（図１２）。例えば、重心から輪郭線上の画素までの距離が、一定範囲内の場合に、手の形状が「グー」であることを判定できる。
【０２９２】
さらに、本実施の形態によれば、図９のステップＳ２７５の結果だけに基づいて、検出された指先の数を判断するのではなく、さらに、重心座標（Ｘｇ，Ｙｇ）と凸点（図６のステップＳ３３）の画素Ｐｊの座標との間の距離Ｄを加味して（図１３のステップＳ４２７，Ｓ４４１）、指が１本だけ立っている状態か否かを判定する。このため、より精度よく、指が１本だけ立っている状態を検出できる。
【０２９３】
さらに、本実施の形態によれば、画像上の被写体の面積は（図８のステップＳ２１３）、イメージセンサ５と被写体との間の距離に相関するので、面積により、イメージセンサ５と被写体との間の距離を容易に判断できる。
【０２９４】
図３０は、本発明の実施の形態の変形例によるコンピュータシステムの階層図である。なお、図１と同様の部分については、同じ参照符号を付して適宜説明を省略する。図３０を参照して、変形例によるコンピュータシステムは、オペレーティングシステム３００により管理される。オペレーティングシステム３００のウィンドウシステム４００は、オペレーティングシステム３００上で並行して動作する複数のアプリケーションプログラム１００にそれぞれ固有のウィンドウを割り当て制御する。また、ウィンドウシステム４００は、モニタ６７の画面に表示するカーソルを制御する。
【０２９５】
ミドルウェア２５０は、オペレーティングシステム３００上で動作し、オペレーティングシステム３００にない特定の機能を、各アプリケーションプログラム１００に提供する。例えば、この特定の機能は、モーションセンサ６００が検出したユーザの手の情報に基づきウィンドウを制御するための機能である。より具体的な例を挙げると、この特定の機能は、モーションセンサ６００が検出したユーザの手の位置情報に基づき、速度及び／又は方向を算出する機能である。例えば、この特定の機能は、モーションセンサ６００が検出したユーザの手の位置情報に基づき、所定の軌跡を描いたか否かを判断する機能である。例えば、この特定の機能は、手の面積が一定値以上になったか否かを判断する機能である。例えば、手の回転角度を算出する機能である。例えば、手の加速度を算出する機能である。例えば、手の形状の所定の変化（例えば「パー」から「グー」への変化）を検出する機能である。
【０２９６】
また、ミドルウェア２５０は、ウィンドウシステム４００の代わりに、図２７〜図２９の処理を実行することもできる。
【０２９７】
なお、ミドルウェア２５０は、これら機能の結果をイベントの発生として、アプリケーションプログラム１００に通知することもできる。また、ミドルウェア２５０は、オペレーティングシステム３００から、モーションセンサ６００が検出したユーザの手の情報を取得する。
【０２９８】
以上のように、変形例では、マウス等の接触型ポインティングデバイスで入力できる操作又はイベントはもちろん、接触型ポインティングデバイスでは入力することができない操作又はイベントをも入力できる。従って、各アプリケーションプログラム１００は、多彩な入力又はイベントに応じた処理（ウィンドウの制御を含む。）を実行することができる。
【０２９９】
また、各アプリケーションプログラム１００は、ＡＰＩ２００（図３０では図示省略）を介して、ウィンドウシステム４００の機能を利用でき、割り当てられたウィンドウを制御する。この点は、図１の場合と同じである。なお、ミドルウェア２５０の特定の機能は、ＡＰＩ２００を介して、各アプリケーションプログラム１００に提供されてもよい。
【０３００】
なお、変形例によるコンピュータシステムの電気的構成は、図２（ａ）及び図２（ｂ）に示したものと同じである。また、変形例は、上記実施の形態のコンピュータシステム７００と同様の技術的特徴を有するので、コンピュータシステム７００と同様の効果を有する。
【０３０１】
なお、本発明は、上記の実施の形態に限られるものではなく、その要旨を逸脱しない範囲で種々の態様において実施することが可能であり、例えば、以下のような変形も可能である。
【０３０２】
（１）上記では、「グー」、「チョキ」、「パー」、及び「１本指」の形状を認識したが、これに限定されない。
【０３０３】
（２）モーションセンサ６００は、赤外発光ダイオード９を搭載した。しかし、赤外発光ダイオード９は必須ではない。赤外発光ダイオード９を搭載しない場合、イメージセンサ５は、露光時画像のみを出力し、ＭＣＵ３は、その画像を処理する。
【０３０４】
（３）上記では、指先画素Ｐ４を原点（０，０）として、周囲画素の座標値を設定し、補正値（Ｘｃ，Ｙｃ）を算出し、それを指先画素Ｐ４の座標（Ｘｂ，Ｙｂ）に加算することで、補正座標（Ｘｆ，Ｙｆ）を得た（図１８（ａ）及び図１８（ｂ））。ただし、図１４の第１〜第４の例の各式で使用する座標の原点は、これに限定されない。例えば、図１１のステップＳ３７３，Ｓ３７５、及び図１３のステップＳ４４５で求められた座標を、そのまま、指先画素Ｐ４の座標として使用して、周囲画素の座標を定め、補正座標（Ｘｆ，Ｙｆ）を求めることもできる。この場合は、図１４（ａ）〜図１４（ｄ）の各ステップで得られた値（Ｘｃ，Ｙｃ）が、補正座標（Ｘｆ，Ｙｆ）そのものであり、加算は不要である。
【０３０５】
（４）上記では、ポインティングデバイスとして、モーションセンサ６００のみを搭載した。ただし、マウス等の他のポインティングデバイスと併用することもできる。これにより、モーションセンサ６００及びマウス等の他のポインティングデバイスのそれぞれの利点を活かすことができる。
【０３０６】
（５）上記例では、モーションセンサ６００が検出する手の情報は、手の形状、手の形状の変化、手の面積、手の移動、手の移動軌跡、及び、指先の位置ないしは移動であった。ただし、モーションセンサ６００が検出する手の情報は、これらに限定されない。例えば、モーションセンサ６００によって検出されるユーザの手の情報は、手の動き（例えば、手の回転、指先の動き）、手の速度、及び／又は、手の加速度であってもよい。手の回転とは、例えば、手首を軸として、時計回り及び／又は反時計回りに、手を回転させる動作である。この場合、例えば、あたかも実際のダイヤルを握っているかのような手をして、手を回転させる。
【０３０７】
また、モーションセンサ６００が検出する手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、手自体の動き、位置、移動、移動軌跡、速度、および、加速度のみを意味するのではなく、手の指先の動き、位置、移動、移動軌跡、速度、および、加速度を含む概念である。また、この場合、指先は、一本の指に限らず、複数本の指の指先を含んでよい。さらに、手は、片手であってもよいし、両手であってもよい。
【０３０８】
なお、ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、総称して、ジェスチャと呼ぶこともできる。
【０３０９】
（６）図１及び図３０では、ウィンドウシステム４００は、オペレーティングシステム３００に含まれていたが、オペレーティングシステム３００上で動作するプログラムと考えることもできる。また、デバイスドライバ５００は、オペレーティングシステム３００に含まれていないが、オペレーティングシステム３００に含まれる機能と考えることもできる。
【０３１０】
（７）ＣＰＵ５１が、モーションセンサ６００をマウスとして認識するように、モーションセンサ６００内の情報設定を行なうこともできる。つまり、ＣＰＵ５１に、モーションセンサ６００をマウスとして認識させるのである。この場合、指先の水平方向（Ｘ軸方向）及び垂直方向（Ｙ軸方向）の移動量が、それぞれ、マウスの水平方向（Ｘ軸方向）及び垂直方向（Ｙ軸方向）の移動量に対応し、擬似的なボタン操作が、マウスボタンの押下に対応する。この場合は、マウスと同等の入力操作以外の、モーションセンサ６００特有の入力に関しては、変形例によるミドルウェア２５０により対応する。
【０３１１】
（８）図２３（ａ）の第４の例では、所定時間ＴＣ内に、シングルクリック操作に対応するジェスチャが検出されない場合は、矩形範囲５２が解除されシングルクリック操作判定がリセットされた（図２５のステップＳ１２８４）。
【０３１２】
ただし、ＭＣＵ３が、指先５０が矩形範囲５２から消失したと判断した後（ステップＳ１２５４で肯定判断）の所定時間ＴＣ２内に、指先５０が矩形範囲５２に出現したと判断しない場合、矩形範囲５２を解除し、シングルクリック操作判定をリセットしてもよい。なお、ＭＣＵ３が、矩形範囲５２設定後所定時間ＴＣ内に、指先５０が矩形範囲５２から消失したと判断しない場合に、矩形範囲５２を解除する点は、図２５と同じである。
【０３１３】
このように、所定時間ＴＣ２内に、ＭＣＵ３が、指先５０が矩形範囲５２に出現したと判断しない場合、ユーザがクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してクリック操作が行なわれたと判定されることを防止できる。つまり、一般にクリック操作は素早く行なわれるところ、所定時間ＴＣ２を適切に設定することにより、同一の動きであっても、クリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【０３１４】
また、図２３（ｂ）の第４の例では、所定時間ＴＣ内に、ダブルクリック操作に対応するジェスチャが検出されない場合は、ダブルクリック操作判定がリセットされた（図２５のステップＳ１２８４）。
【０３１５】
ただし、仮クリックフラグがオンになった後において、ＭＣＵ３が、指先５０が矩形範囲５２から消失したと判断した後の所定時間ＴＣ３内に、指先５０が矩形範囲５２に出現したと判断しない場合、矩形範囲５２を解除し、ダブルクリック操作判定をリセットしてもよい。なお、仮クリックフラグがオンになった後において、ＭＣＵ３が、矩形範囲５２の設定後所定時間ＴＣ内に、指先５０が矩形範囲５２から消失したと判断しない場合に、矩形範囲５２を解除する点は、図２５と同じである。また、仮クリックフラグがオンになるまでの判定（シングルクリックの判定）は図２５又は上記変形と同じである。
【０３１６】
このように、所定時間ＴＣ３内に、ＭＣＵ３が、指先５０が矩形範囲５２に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間ＴＣ３を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【０３１７】
また、ＭＣＵ３が、指先５０が矩形範囲に出現したと判断してから、つまり、仮クリックフラグをオンにしてから所定時間ＴＣ４内に、指先５０が矩形範囲５２から消失したと判断しない場合、矩形範囲５２を解除し、ダブルクリック操作判定をリセットしてもよい。なお、仮クリックフラグがオンになるまでの判定（シングルクリックの判定）は図２５又は上記変形と同じである。
【０３１８】
このように、所定時間ＴＣ４内に、ＭＣＵ３が、指先５０が矩形範囲５２から消失したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間ＴＣ４を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【０３１９】
さらに、この場合、ＭＣＵ３が、仮クリックフラグをオンにしてから所定時間ＴＣ４内に、指先５０の消失の後、再び指先５０が矩形範囲５２に出現したと判断しない場合、矩形範囲５２を解除し、ダブルクリック操作判定をリセットしてもよい。
【０３２０】
このように、所定時間ＴＣ４内に、ＭＣＵ３が、指先５０が矩形範囲５２に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間ＴＣ４を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【０３２１】
また、このような判定に代えて、ＭＣＵ３が、仮クリックフラグをオンにしてから所定時間ＴＣ４内の指先５０の消失の後の所定時間ＴＣ５内に、指先５０が矩形範囲５２に出現したと判断しない場合、矩形範囲５２を解除し、ダブルクリック操作判定をリセットすることもできる。
【０３２２】
このように、所定時間ＴＣ５内に、ＭＣＵ３が、指先５０が矩形範囲５２に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間ＴＣ５を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【０３２３】
ここで、上記の所定時間ＴＣ２〜ＴＣ５は、実験及び試行錯誤等により決定される。
【０３２４】
（９）ジェスチャによるコントロールは、特に、プレゼンテーション用のアプリケーションプログラム１００が表示するウィンドウのコントロールに有効である。なぜなら、一般に、プレゼンテーションを行う人は、端末から離れてプレゼンテーションを行う場合も多いからである。
【０３２５】
（１０）上記では、モーションセンサ６００によるマルチウィンドウの制御に焦点を当てて説明した。ただし、本発明が、マルチウィンドウの制御に限定されないことは言うまでもない。つまり、モーションセンサ６００のジェスチャコントロール機能とポインティングデバイス機能とを、１つのウィンドウ（アプリケーションプログラム１００）を制御するために使用することもできる。この場合も、ジェスチャコントロール機能とポインティングデバイス機能とを制御内容に応じて使い分けて、マルチウィンドウの制御と同様に、ユーザに快適な操作性を提供できる。
【０３２６】
（１１）上記では、イメージセンサ５が差分画像を生成した。ただし、ＭＣＵ３が、赤外光発光時画像と非発光時画像との差分画像を生成することもできる。この場合、イメージセンサ５及びＭＣＵ３を、撮影装置と呼ぶこともできる。もちろん、上記実施の形態において、イメージセンサ５及びＭＣＵ３を、撮影装置と呼ぶこともできる。
【０３２７】
（１２）ＭＣＵ３が行なう処理の全部又は一部をＣＰＵ５１が行なうこともできるし、逆に、ＣＰＵ５１が行なう処理の全部又は一部をＭＣＵ３が行うこともできる。要するに、どちらがどの処理を行なうかは、仕様に応じて、任意に決定できる。例えば、イメージセンサ５が生成した差分画像を、ＣＰＵ５１に渡し、ＣＰＵ５１が、画像解析を行って、手の検出等を行ってもよい。
【０３２８】
（１３）ＭＣＵ３に各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、また、並列的あるいは個別に実行される処理も含むものである。
【０３２９】
（１４）本明細書及び請求の範囲において、手段とは必ずしも物理的手段を意味するものではなく、各手段の機能がソフトウェアによって実現される場合も含む。さらに、１つの手段の機能が２つ以上の物理的手段により実現されても、もしくは２つ以上の手段の機能が１つの物理的手段により実現されてもよい。
【産業上の利用可能性】
【０３３０】
本発明は、マルチウィンドウを操作するためのポインティングデバイスを必要とするコンピュータの分野に利用可能である。
【符号の説明】
【０３３１】
３…ＭＣＵ、５…イメージセンサ、７…メモリ、９…赤外発光ダイオード、５０…コンピュータ、５１…ＣＰＵ、５３…メインメモリ、５５…チップセット、５７…ＧＰＵ、５９…ＳＰＵ、６１…ＨＤＤ、６３…ドライブ、６５…通信部、６７…モニタ、６９…スピーカ、７１…キーボード、７５…リムーバブル記録媒体、１００…アプリケーションプログラム、２００…アプリケーションプログラムインタフェース（ＡＰＩ）、２５０…ミドルウェア、３００…オペレーティングシステム、４００…ウィンドウシステム、５００…デバイスドライバ、６００…モーションセンサ。
【図１】
2012073658.tif 000003
【図２】
2012073658.tif 000004
【図３】
2012073658.tif 000005
【図４】
2012073658.tif 000006
【図５】
2012073658.tif 000007
【図６】
2012073658.tif 000008
【図７】
2012073658.tif 000009
【図８】
2012073658.tif 000010
【図９】
2012073658.tif 000011
【図１０】
2012073658.tif 000012
【図１１】
2012073658.tif 000013
【図１２】
2012073658.tif 000014
【図１３】
2012073658.tif 000015
【図１４】
2012073658.tif 000016
【図１５】
2012073658.tif 000017
【図１６】
2012073658.tif 000018
【図１７】
2012073658.tif 000019
【図１８】
2012073658.tif 000020
【図１９】
2012073658.tif 000021
【図２０】
2012073658.tif 000022
【図２１】
2012073658.tif 000023
【図２２】
2012073658.tif 000024
【図２３】
2012073658.tif 000025
【図２４】
2012073658.tif 000026
【図２５】
2012073658.tif 000027
【図２６】
2012073658.tif 000028
【図２７】
2012073658.tif 000029
【図２８】
2012073658.tif 000030
【図２９】
2012073658.tif 000031
【図３０】
2012073658.tif 000032