コンピュータシステム
【課題】 マルチウィンドウの操作において、ユーザに快適な操作性を提供できるコンピュータシステムを提供することである。
【解決手段】 ウィンドウシステム400は、並行して動作する複数のアプリケーションプログラム100にそれぞれ固有のウィンドウを割り当て制御する。ポインティングデバイスとしてのモーションセンサ600は、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、照射時に得られた画像と非照射時に得られた画像との差分画像を解析し、ユーザの手を検出する。ウィンドウシステム400は、モーションセンサ600が検出したユーザの手の情報に基づきウィンドウを制御するための機能を各アプリケーションプログラム100に提供する。
【解決手段】 ウィンドウシステム400は、並行して動作する複数のアプリケーションプログラム100にそれぞれ固有のウィンドウを割り当て制御する。ポインティングデバイスとしてのモーションセンサ600は、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、照射時に得られた画像と非照射時に得られた画像との差分画像を解析し、ユーザの手を検出する。ウィンドウシステム400は、モーションセンサ600が検出したユーザの手の情報に基づきウィンドウを制御するための機能を各アプリケーションプログラム100に提供する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、三次元空間中の人の手の動きを撮影し、撮影画像を解析して、解析結果をポインティングに利用するコンピュータシステム及びその関連技術に関する。
【背景技術】
【0002】
特許文献1は、非接触型ポインティングデバイスであるカーソル操作装置を開示する。このカーソル操作装置は、カメラにより三次元空間中のユーザの指先の動きを検出して、その動きにカーソルを追従させ、非接触で機器を操作する。そして、カーソル操作装置は、画面に表示されたボタンの上にカーソルが一定時間滞在すると、クリック操作がなされたと判断し、そのボタンが押下されたとみなす。
【0003】
なお、マウスやタッチパッド等、ユーザが接触して操作するポインティングデバイスを、非接触型に対して、接触型ポインティングデバイスと呼ぶ。
【0004】
ところで、マイクロソフトコーポレーションが提供するオペレーティングシステムであるWindows(登録商標)は、並行して動作する複数のアプリケーションそれぞれに固有のウィンドウを割り当て画面出力を多重化するウィンドウシステムを搭載する。各アプリケーションプログラムは、ウィンドウシステムの機能を利用して、それぞれに割り当てられたウィンドウを制御する。
【0005】
ユーザは、マウス等のポインティングデバイスを操作し、ウィンドウシステムを介して、同一画面に表示された複数のウィンドウ(マルチウィンドウ)を操作する。つまり、ウィンドウシステムは、ユーザが操作するポインティングデバイスの情報に基づいて、ユーザによるウィンドウの操作を検出し、依頼先のアプリケーションに通知する。アプリケーションプログラムは、その通知を受けて、自分に割り当てられたウィンドウを制御する。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2004−258837
【発明の概要】
【発明が解決しようとする課題】
【0007】
しかしながら、マウス等の接触型ポインティングデバイスにより、マルチウィンドウを操作することは、ユーザに対して、必ずしも快適な操作性を提供しない。なぜなら、接触型ポインティングデバイスでは、ユーザの操作が限定的だからである。例えば、マウスの場合、マウスの移動とマウスボタンの操作しかできない。
【0008】
そこで、本発明は、マルチウィンドウの操作において、ユーザに快適な操作性を提供できるコンピュータシステム及びその関連技術を提供することを目的とする。
【課題を解決するための手段】
【0009】
本発明の第1の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、を備え、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する。
【0010】
この構成によれば、各アプリケーションプログラムは、モーションセンサにより検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手をモーションセンサにより撮影し、撮影画像からの検出結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【0011】
「多彩な入力」とは、例えば、手の形状(グー、チョキ、パー、一本指、)、手の形状の変化、手の面積(モーションセンサと手との間の距離に相関)、手の動き(例えば、手の回転、指先の動き)、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度、などである。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本発明では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、手の形状の所定の変化により、擬似的にボタン操作が行なわれたとみなすことにより、マウスと同等の機能を包含できる。
【0012】
このように、モーションセンサは、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【0013】
また、モーションセンサが差分画像を解析して手を検出するので、このような処理をウィンドウシステムは行なう必要がなく、その処理負荷を軽減でき、また、ウィンドウシステムのプログラマは、手を検出するためのプログラムを作成する必要がなく、その負担を軽減できる。つまり、コンピュータシステムに簡易にモーションセンサを搭載できる。
【0014】
本発明の第2の観点によれば、コンピュータシステムは、複数のアプリケーションが並行して動作可能なコンピュータシステムであって、前記コンピュータシステム全体を管理するオペレーティングシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、前記モーションセンサを制御し、前記モーションセンサから解析結果である前記ユーザの手の情報を受け取って、前記オペレーティングシステムに渡すデバイスドライバと、前記デバイスドライバから受け取った前記ユーザの手の情報に基づく前記オペレーティングシステムの所定機能を前記各アプリケーションプログラムに提供するアプリケーションプログラムインタフェースと、を備え、前記オペレーティングシステムは、並行して動作する前記複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムを含み、前記所定機能は、前記ウィンドウを前記モーションセンサが検出した前記ユーザの手の情報に基づき制御するための前記ウィンドウシステムの機能である。
【0015】
この構成によれば、上記第1の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第1の観点によるコンピュータシステムと同様の効果を奏する。
【0016】
上記第1及び第2の観点によるコンピュータシステムにおいて、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、画面上のカーソルを制御する。
【0017】
この構成によれば、ユーザは、三次元空間中で手を動かしながら、非接触で、カーソルを操作できる。
【0018】
上記第1及び第2の観点によるコンピュータシステムにおいて、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、前記アプリケーションプログラムから依頼されたイベントが発生したか否かを監視し、前記イベントが発生した場合に、依頼主である前記アプリケーションプログラムに、前記イベントの発生を通知するイベント監視手段を含む。
【0019】
この構成によれば、アプリケーションプログラムをイベント駆動型プログラムとして作成することができ、ウィンドウの制御に好適である。
【0020】
上記第1及び第2の観点によるコンピュータシステムにおいて、前記モーションセンサによって検出される前記ユーザの手の情報は、前記ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度の情報の一部または全部である。
【0021】
この構成によれば、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができる。
【0022】
ここで、本明細書及び特許請求の範囲において、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、手自体の動き、位置、移動、移動軌跡、速度、および、加速度のみを意味するのではなく、手の指先の動き、位置、移動、移動軌跡、速度、および、加速度を含む概念である。また、この場合、指先は、一本の指に限らず、複数本の指の指先を含んでよい。さらに、手は、片手であってもよいし、両手であってもよい。
【0023】
本発明の第3の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供するミドルウェアと、を備える。
【0024】
この構成によれば、上記第1の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第1の観点によるコンピュータシステムと同様の効果を奏する。
【0025】
本発明の第4の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を生成する撮影手段と、前記差分画像を解析して、前記ユーザの手の情報を取得する解析手段と、を備え、前記ウィンドウシステムは、前記解析手段が取得した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する。
【0026】
この構成によれば、各アプリケーションプログラムは、撮影手段及び解析手段により検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手を撮影手段により撮影し、解析手段による撮影画像の解析結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【0027】
「多彩な入力」とは、例えば、手の形状(グー、チョキ、パー、一本指、)、手の形状の変化、手の面積(モーションセンサと手との間の距離に相関)、手の動き(例えば、手の回転、指先の動き)、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度、などである。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本発明では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、手の形状の所定の変化により、擬似的にボタン操作が行なわれたとみなすことにより、マウスと同等の機能を包含できる。
【0028】
このように、モーションセンサは、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【0029】
本発明の第5の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を生成する撮影手段と、前記差分画像を解析して、前記ユーザの手の情報を取得するミドルウェアと、を備え、前記ミドルウェアは、前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供する。
【0030】
この構成によれば、上記第4の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第4の観点によるコンピュータシステムと同様の効果を奏する。
【図面の簡単な説明】
【0031】
【図1】本発明の実施の形態によるコンピュータシステム700の階層図である。
【図2】(a)本発明の実施の形態によるコンピュータシステム700の電気的構成を示す図である。(b)図2(a)のモーションセンサ600の電気的構成を示す図である。
【図3】(a)本発明の実施の形態による擬似ボタン操作の説明図である。(b)本発明の実施の形態による擬似ボタン操作の第1〜第3の例の説明図である。
【図4】図2のMCU3による画像解析処理の流れの一例を示すフローチャートである。
【図5】図4のステップS1の2値化処理の流れの一例を示すフローチャートである。
【図6】図4のステップS7の変曲点の検出処理の流れの一例を示すフローチャートである。
【図7】図4のステップS9の輪郭画像の形状を判定する処理の流れの一例を示すフローチャートである。
【図8】図7のステップS161の輪郭情報を算出する処理の流れの一例を示すフローチャートである。
【図9】図7のステップS163の指先を検出する処理の流れの一例を示すフローチャートである。
【図10】図7のステップS165の「パー」を判定する処理の流れの一例を示すフローチャートである。
【図11】図7のステップS167の「チョキ」を判定する処理の流れの一例を示すフローチャートである。
【図12】図7のステップS169の「グー」を判定する処理の流れの一例を示すフローチャートである。
【図13】図7のステップS171の一本指を判定する処理の流れの一例を示すフローチャートである。
【図14】(a)図11のステップS377及び図13のステップS447の指先補正値計算処理の第1の例の流れを示すフローチャートである。(b)図11のステップS377及び図13のステップS447の指先補正値計算処理の第2の例の流れを示すフローチャートである。(c)図11のステップS377及び図13のステップS447の指先補正値計算処理の第3の例の流れを示すフローチャートである。(d)図11のステップS377及び図13のステップS447の指先補正値計算処理の第4の例の流れを示すフローチャートである。
【図15】(a)図4のステップS11の擬似ボタン操作判定処理の第1の例の流れを示すフローチャートである。(b)図4のステップS11の擬似ボタン操作判定処理の第2の例の流れを示すフローチャートである。(c)図4のステップS11の擬似ボタン操作判定処理の第3の例の流れを示すフローチャートである。
【図16】図4のステップS5で検出される偏角θjの説明図である。
【図17】図4のステップS7で検出される変曲点及び図7のステップS163で検出される指先の説明図である。
【図18】(a)図14(a)及び図14(c)の指先補正値計算処理の説明図である。(b)図14(b)及び図14(d)の指先補正値計算処理の説明図である。
【図19】指先補正値計算処理における除数の説明図である。
【図20】図1のウィンドウシステム400によるイベント監視処理の流れの一例を示すフローチャートである。
【図21】図1のウィンドウシステム400によるカーソル制御処理の流れの一例を示すフローチャートである。
【図22】(a)図4のステップS11の擬似ボタン操作判定処理の第4の例の流れを示すフローチャートである。(b)図4のステップS11の擬似ボタン操作判定処理の第5の例の流れを示すフローチャートである。(c)図4のステップS11の擬似ボタン操作判定処理の第6の例の流れを示すフローチャートである。
【図23】(a)本発明の実施の形態による擬似ボタン操作の第4の例(シングルクリック)の説明図である。(b)本発明の実施の形態による擬似ボタン操作の第4の例(ダブルクリック)の説明図である。
【図24】図4のステップS11の擬似ボタン操作判定処理の第7の例の流れの一部を示すフローチャートである。
【図25】図4のステップS11の擬似ボタン操作判定処理の第7の例の流れの他の一部を示すフローチャートである。
【図26】図1のウィンドウシステム400が受け付け可能なジェスチャの例示図である。
【図27】図1のウィンドウシステム400によるジェスチャ判定処理の流れの一例を示すフローチャートである。
【図28】図27のステップS102のジェスチャ1〜4の判定処理の流れの一部の一例を示すフローチャートである。
【図29】図27のステップS102のジェスチャ1〜4の判定処理の流れの他の一部の一例を示すフローチャートである。
【図30】本発明の実施の形態の変形例によるコンピュータシステムの階層図である。
【発明を実施するための形態】
【0032】
以下、本発明の実施の形態について、図面を参照しながら説明する。なお、図中、同一または相当部分については同一の参照符号を付してその説明を援用する。また、本明細書において、数字の後尾に付した「h」は、16進数であることを示す。
【0033】
図1は、本発明の実施の形態によるコンピュータシステム700の階層図である。図1を参照して、このコンピュータシステム700は、オペレーティングシステム300により管理される。オペレーティングシステム300は、ハードウェアを抽象化したインタフェースをアプリケーションプログラム100に提供するソフトウェアである。ハードウェアの抽象化とは、ハードウェアの統一的で単純化された利用方法を提供することである。また、オペレーティングシステム300は、プロセス管理やメモリ管理を行い、ファイルシステムを有し、グラフィカルユーザインタフェース(GUI)や通信機能等を提供する。
【0034】
オペレーティングシステム300は、その機能の一つとしてウィンドウシステム400を含む。ウィンドウシステム400は、オペレーティングシステム300上で並行して動作する複数のアプリケーションプログラム100にそれぞれ固有のウィンドウを割り当て制御する。これらの複数のウィンドウ(マルチウィンドウ)は、後述するモニタ67の画面上に表示される。また、ウィンドウシステム400は、モニタ67の画面に表示するカーソルを制御する。
【0035】
アプリケーションプログラム100は、オペレーティングシステム300上で動作し、コンピュータシステム700の利用者がコンピュータシステム700上で実行したい作業を実施する機能を直接的に有するソフトウェアである。
【0036】
アプリケーションプログラムインタフェース(API)200は、各アプリケーションプログラム100からオペレーティングシステムの各種機能を呼び出すためのインタフェースである。API200は、アプリケーションプログラム100から呼び出すことができるオペレーティングシステム300の機能と定義することもできる。なお、APIはシステムコールと呼ばれることもある。
【0037】
従って、各アプリケーションプログラム100は、API200を介して、オペレーティングシステム300の各種機能を利用することができる。例えば、各アプリケーションプログラム100は、API200を介して、ウィンドウシステム400を利用することができる。
【0038】
一方、ポインティングデバイスとしてのモーションセンサ600は、デバイスドライバ500により制御される。モーションセンサ600は、後述するイメージセンサ5を備えており、イメージセンサ5により、ユーザの手を撮影し、その画像を解析して、解析結果をデバイスドライバ500に出力する。
【0039】
デバイスドライバ500は、オペレーティングシステム300の環境下で動作し、モーションセンサ600から受け取った解析結果を、オペレーティングシステム300に渡す。
【0040】
オペレーティングシステム300は、モーションセンサ600の解析結果に基づく各種機能を、API200を介して、各アプリケーションプログラム100に提供することができる。例えば、各アプリケーションプログラム100は、API200を介して、モーションセンサ600の解析結果に基づくウィンドウシステム400の機能を利用することができる。
【0041】
図2(a)は、本発明の実施の形態によるコンピュータシステム700の電気的構成を示す図である。図2(a)を参照して、コンピュータシステム700は、コンピュータ50、モニタ67、スピーカ69、及び、キーボード71を含む。コンピュータ50は、CPU(中央演算処理装置)51、メインメモリ53、チップセット55、GPU(グラフィックスプロセシングユニット)57、SPU(サウンドプロセシングユニット)59、HDD(ハードディスクドライブ)61、ドライブ63、通信部65、及びモーションセンサ600を含む。
【0042】
CPU51は、HDD61に格納されたコンピュータプログラムを実行して各種演算を行う。メインメモリ53は、CPU51から直接読み書きが行われる高速のメモリである。GPU57は、グラフィックス処理を実行し、モニタ67に映像信号を与える。モニタ67は与えられた映像信号に応じて映像を表示する。SPU59は、サウンド処理を実行し、スピーカ69に音声信号を与える。スピーカ69は与えられた音声信号に応じて音声を出力する。HDD61は、コンピュータプログラム及びデータを格納するための補助記憶装置である。ドライブ63は、リムーバブル記録媒体75からデータを読み込んだり、書き込んだりする装置である。通信部65は、ネットワークへの接続を司るLANカードやUSBコントローラなどを含み(図示せず)、通信を制御する。
【0043】
CPU51、GPU57、SPU59、HDD61、ドライブ63、通信部65、キーボード71、及びモーションセンサ600といった機能ユニットは、チップセット55に接続される。チップセット55は、これに接続される機能ユニット間のデータの受け渡しを管理する。
【0044】
HDD61は、図1のアプリケーションプログラム100、API200、オペレーティングシステム300、ウィンドウシステム400、及び、デバイスドライバ500を格納する。CPU51は、これらのプログラムを、メインメモリ53にロードし、実行する。そして、CPU51は、実行結果を、モニタ67やスピーカ69に出力し、あるいは、HDD61やメインメモリ53に格納する。
【0045】
なお、図1のアプリケーションプログラム100、API200、オペレーティングシステム300、ウィンドウシステム400、及び、デバイスドライバ500は、リムーバブル記録媒体75からHDD61に格納されてもよいし、あるいは、ネットワーク経由でHDD61に格納されてもよい。リムーバブル記録媒体75は、例えば、CD(CD−ROM、Video−CDを含む)やDVD(DVD−Video、DVD−ROM、DVD−RAMを含む)等の光ディスク、半導体メモリを搭載したメモリカード・メモリカートリッジ・USBメモリ、光磁気ディスク、磁気テープ、及び/又は、フレキシブルディスク等である。
【0046】
図2(b)は、図2(a)のモーションセンサ600の電気的構成を示す図である。図2(b)を参照して、このモーションセンサ600は、MCU(Micro Controler Unit)3、イメージセンサ5、及び赤外発光ダイオード9を含む。MCU3は、メモリ7を含む。イメージセンサ5は、カラー及びグレースケールのいずれでも使用でき、また、その画素数も任意にものを使用できるが、本実施の形態では、グレースケールで、64×64画素の比較的低解像度のものを使用する。赤外発光ダイオード9は、赤外光を発光する。また、イメージセンサ5としては、CMOSイメージセンサやCCDイメージセンサ等を採用できる。
【0047】
MCU3のメモリ7は、RAM、ROM、及びフラッシュメモリ等の半導体メモリであり、プログラム格納領域、データ格納領域、作業領域、及び一時格納領域等として利用される。MCU3は、メモリ7に格納されたプログラムに従って、後述のフローチャートで示される各種処理を実行する。なお、仕様に応じて、記録媒体として、メモリ7の他、CD(CD−ROM、Video−CDを含む)やDVD(DVD−Video、DVD−ROM、DVD−RAMを含む)等の光ディスク、半導体メモリを搭載したメモリカード・メモリカートリッジ・USBメモリ、ハードディスク、光磁気ディスク、磁気テープ、及び、フレキシブルディスク等を、MCU3に接続することもできる。そして、これらにプログラムやデータなどを格納することもできる。
【0048】
MCU3は、メモリ7に格納されたプログラムに従って、イメージセンサ5を制御する。イメージセンサ5は、MCU3の制御の下、赤外発光ダイオード9を間欠的に駆動し、三次元空間中で動かされる被写体(本実施の形態では人の手)に赤外光を間欠的に照射する。イメージセンサ5は、赤外光照射時及び非照射時の双方において、撮影処理を実行し、赤外光照射時画像と非照射時画像との差分画像を生成して、MCU3に出力する。差分をとることにより、背景等のノイズを簡易に除去でき、簡易に被写体の像のみを抽出できる。
【0049】
MCU3は、メモリ7に格納されたプログラムに従って、イメージセンサ5から受け取った差分画像を解析して、ユーザの手を検出して、その形状、面積、重心位置、及び、指先位置、並びに、擬似的なボタン操作の有無の情報等を、チップセット55を介して、CPU51に与える。すると、CPU51は、モーションセンサ600の解析結果である手の情報に基づき、各種処理を実行する。
【0050】
図3(a)及び図3(b)は、本発明の実施の形態による擬似ボタン操作の説明図である。図3(a)を参照して、モーションセンサ600は、ユーザ(人)の手を撮影し、得られた画像を解析することによって、指先a及びbの位置を求める。この例では、指先aは、人差し指の指先であり、指先bは、親指の指先である。
【0051】
図3(b)を参照して、第1の例では、CPU51は、モーションセンサ600から指先aの位置を受け取って、モニタ67の画面上の対応する位置にカーソルを表示する。また、モーションセンサ600は、撮影画像中に指先aと指先bとが存在する状態から、撮影画像中に指先aのみが存在する状態へ遷移したことを検出すると、例えば、二本の指(親指及び人差し指)が写っている状態から、カーソルの位置に関係ない一本の指(親指)が折り曲げられ、カーソルの位置を制御する他の一本の指(人差し指)のみが写っている状態に遷移したことを検出すると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをCPU51に通知する。すると、CPU51は、ボタン操作に応じた処理を実行する。
【0052】
第2の例では、CPU51は、モーションセンサ600から指先aの位置を受け取って、モニタ67の画面上の対応する位置にカーソルを表示する。また、モーションセンサ600は、撮影画像中に指先aのみが存在する状態から、撮影画像中に指先aと指先bとが存在する状態へ遷移したことを検出すると、例えば、カーソルの位置に関係ない一本の指(親指)が折り曲げられ、カーソルの位置を制御する他の一本の指(人差し指)のみが写っている状態から、二本の指(親指及び人差し指)が写っている状態に遷移したことを検出すると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをCPU51に通知する。すると、CPU51は、ボタン操作に応じた処理を実行する。
【0053】
第3の例では、CPU51は、モーションセンサ600から指先aの位置と指先bの位置との中点の位置を受け取って、モニタ67の画面上の対応する位置にカーソルを表示する。また、モーションセンサ600は、指先aと指先bとの間の距離を算出して、その距離が一定値以下になったことを検出すると、つまり、指先aと指先bとが近づいて、その距離が一定値以下になると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをCPU51に通知する。すると、CPU51は、ボタン操作に応じた処理を実行する。
【0054】
ここで、上記第1〜第3の例において、擬似的にボタン操作が行われたと判定されたことを、ボタンのプレス操作(ボタンを押したままの状態)が行なわれたとみなすこともできるし、あるいは、クリック操作(ボタンを押下して放す操作)が行なわれたとみなすこともできる。
【0055】
なお、擬似的にボタン操作が行われたと判定されたことを、ボタンのプレス操作が行なわれたとみなす場合、ボタンを放したとみなす操作は、次のようにして判定される。
【0056】
第1の例では、モーションセンサ600は、撮影画像中に指先aのみが存在する状態から、撮影画像中に指先aと指先bとが存在する状態へ遷移したことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを話す操作が行なわれたことをCPU51に通知する。
【0057】
第2の例では、モーションセンサ600は、撮影画像中に指先aと指先bとが存在する状態から、撮影画像中に指先aのみが存在する状態へ遷移したことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを放す操作が行なわれたことをCPU51に通知する。
【0058】
第3の例では、モーションセンサ600は、指先aと指先bとの間の距離を算出して、その距離が一定値以下になった後、再び、その距離が一定値を超えたことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを放す操作が行なわれたことをCPU51に通知する。
【0059】
ここで、「擬似的なボタン操作」とは、ポインティングデバイス等のデバイスの実際のボタンの操作ではないが、実際のボタンを操作する場合と同等の情報ないしは命令を、三次元空間中のジェスチャにより、コンピュータに与えることを意味する。
【0060】
次に、フローチャートを用いてモーションセンサ600のMCU3の処理の詳細を説明する。
【0061】
図4は、図2のMCU3による画像解析処理の流れの一例を示すフローチャートである。図4を参照して、ステップS1にて、MCU3は、イメージセンサ5が出力した差分画像を2値化する。ステップS3にて、MCU3は、2値化された差分画像から被写体(本実施の形態では手)の像の輪郭線を抽出する。この処理では、輪郭線上の各画素Pj(j=0〜J−1)の座標(XO[j],YO[j])を求める。
【0062】
ここで、本実施の形態では、値Jは、輪郭線上の画素Pjの総数を示す。また、反時計回りに輪郭線の抽出処理が実行されるものとする。
【0063】
輪郭線を抽出するためのアルゴリズムは、周知のものを使用できる。例えば、3×3の小画素領域からなるマスクを用いる方法で、このマスクの中心を輪郭線上にたえずおきならが、順次、マスクを移動して、輪郭線を抽出する。
【0064】
ステップS5にて、MCU3は、抽出した輪郭線上の各画素PjのベクトルVjの偏角θjを算出する。
【0065】
図16は、図4のステップS5で検出される偏角θjの説明図である。図6を参照して、今、被写体の輪郭線上の3つの画素Pj−1,Pj,及びPj+1に注目する。また、輪郭線を反時計回りにスキャンするものとする。画素PjのベクトルVjは、画素Pjから次の画素Pj+1に向かうベクトルとして定義される。画素PjのベクトルVjの偏角θjは、画素Pjの1つ前の画素Pj−1のベクトルVj−1に対してベクトルVjがなす角度として定義される。反時計回りの偏角θjの符号は正であり、時計回りの偏角θjの符号は負である。
【0066】
図4に戻って、ステップS7にて、MCU3は、抽出した輪郭線の変曲点を検出する。変曲点は、輪郭線の向きが変化する点であり、凸点と凹点とが定義される。
【0067】
図17は、図4のステップS7で検出される変曲点の説明図である。図17を参照して、抽出した輪郭線21の向きが変化する点として、変曲点I0〜I8が挙げられる。変曲点I0,I2,I4,I6及びI8は凸点である。変曲点I1,I3,I5及びI7は凹点である。
【0068】
図4に戻って、ステップS9にて、MCU3は、抽出した輪郭線(輪郭画像)の形状(グー、チョキ、パー、一本指、不定)を判定する。ステップS11にて、MCU3は、擬似的なボタン操作が行なわれたか否かを判定する。ステップS13にて、MCU3は、ステップS1の結果(後述の掩蔽フラグ)、ステップS9の結果(輪郭画像の重心座標、面積、形状の情報(後述のフラグSH)、補正後の指先の座標、並びに、二つの指先の中点座標)、及びステップS11の結果(後述の擬似ボタンフラグないしはシングルクリックフラグ及びダブルクリックフラグ)をCPU51に送信する。なお、MCU3は、イメージセンサ5から1フレームの差分画像を受け取るたびに、ステップS1〜S13を繰り返す。
【0069】
図5は、図4のステップS1の2値化処理の流れの一例を示すフローチャートである。図5を参照して、ステップS50にて、MCU3は、差分画像の各画素Dの2値化後の値を代入する配列PD[][]並びに変数X,Y及びNAに0を代入する。ステップS51にて、MCU3は、イメージセンサ5から、差分画像の画素データDをリードする。なお、イメージセンサ5の解像度は64×64画素とする。また、イメージセンサ5からの差分画像の左上を原点とし、水平右方向をX座標の正、垂直下方向をY座標の正とする。そして、イメージセンサ5は、Y=0の行から、Xをインクリメントしながら、X=63まで、順次画素データDを出力する。そして、X=63の画素データDを出力した後、Yを1つインクリメントし、Y=1の行から、Xをインクリメントしながら、X=63まで、順次画素データDを出力する。イメージセンサ5は、このような処理をY=63まで行ない、差分画像の全画素Dを出力する。
【0070】
ステップS52にて、MCU3は、画素データ(輝度値)Dと所定の閾値THFとを比較する。そして、ステップS54にて、MCU3は、画素データDが閾値THFより大きい場合、その画素Dは手の像の一部であるとみなしステップS56に進み、それ以外はその画素Dは背景とみなしてステップS60に進む。ステップS56では、MCU3は、配列[X][Y]に1を代入する。そして、ステップS58にて、MCU3は、カウンタNAを1つインクリメントする。すなわち、カウンタNAは、1が代入された配列[X][Y]の数、つまり、手の像の一部とみなされた画素Dの数を示す。さらに言い換えると、カウンタNAは、手の像を構成する画素Dの数を示す。一方、ステップS60では、MCU3は、配列[X][Y]に0を代入する。
【0071】
ステップS62では、MCU3は、変数Xを1つインクリメントする。ステップS64にて、MCU3は、変数Xの値が64か否かを判断し、64の場合ステップS66に進み、それ以外はステップS51に戻る。ステップS66にて、MCU3は、変数Yを1つインクリメントする。ステップS68にて、MCU3は、変数Yの値が64になったか否かを判断し、64の場合ステップS70に進み、それ以外はステップS51に戻る。
【0072】
ステップS70にて、MCU3は、カウンタNAの値(つまり手の像の大きさ)が、所定値Arより大きいか否かを判断し、大きい場合イメージセンサ5がユーザの手で覆われた(掩蔽された)とみなしてステップS72に進み、それ以外はステップS76に進む。例えば、全画素数が、4096であるので、その約90%である3686を所定値Arとする。
【0073】
ステップS70で肯定判断の後、ステップS72にて、MCU3は、カウンタpを1つインクリメントする。カウンタpは、ステップS70の肯定判断の連続回数を示す。なお、カウンタpはシステム初期化時に0にセットされる。ステップS74にて、MCU3は、カウンタpの値が所定値Taより大きいか否かを判断し、大きい場合、所定時間連続してイメージセンサ5が手で覆われたことを意味するのでステップS78に進み、それ以外はステップS80に進む。ステップS78にて、MCU3は、所定時間連続してイメージセンサ5が手で覆われたこと示す掩蔽フラグをオンにする。一方、ステップS80では、MCU3は、掩蔽フラグをオフにする。
【0074】
ステップS70で否定判断の後、ステップS76にて、MCU3は、カウンタpに0を代入して、ステップS80に進む。
【0075】
以上のように、MCU3は、イメージセンサ5が出力する各画素Dを順次2値化して配列PD[][]に代入する。このように、差分画像(グレースケール)をメモリ7に持つことなく順次2値化することによりメモリ容量を削減できる。もちろん、MCU3は、イメージセンサ5が出力した差分画像(グレースケール)を一旦メモリ7に格納した後に、2値化することもできるし、あるいは、2値化せずにそのまま処理することもできる。
【0076】
図6は、図4のステップS7の変曲点の検出処理の流れの一例を示すフローチャートである。図6を参照して、ステップS21にて、MCU3は、変数DA,ADA,j,及びCF[]に0を代入する。ステップS23にて、MCU3は、図4のステップS3で検出された輪郭線上の画素Pjの偏角θjをメモリ7から取得する。ステップS25にて、MCU3は、変数DAの現在の値に偏角θjを加算して、変数DAに代入する。ステップS27にて、MCU3は、変数DAの絶対値を求めて、変数ADAに代入する。
【0077】
ステップS29にて、MCU3は、変数ADAの値が135度になったか否かを判断し、135度の場合輪郭線の向きが変わったと判断して、画素Pjを変曲点とみなしてステップS31に進み、それ以外はステップS39に進む。ステップS31では、MCU3は、変数DAの符号が正か否かを判断し、正の場合ステップS33に進み、負の場合ステップS35に進む。ステップS33では、MCU3は、凸凹フラグCF[j]に、変曲点が凸点であることを示す01を代入する。一方、ステップS35では、MCU3は、凸凹フラグCF[j]に、変曲点が凹点であることを示す10を代入する。
【0078】
ステップS37にて、MCU3は、変数DAに0を代入する。ステップS39にて、MCU3は、変数jを1つインクリメントする。ステップS41にて、MCU3は、変数jの値が、値Jと等しくなったか否かを判断し、j=Jの場合リターンし、それ以外はステップS23に進む。
【0079】
図7は、図4のステップS9の輪郭画像の形状を判定する処理の流れの一例を示すフローチャートである。図7を参照して、ステップS161にて、MCU3は、輪郭線に関する情報を算出する。ステップS163にて、MCU3は、輪郭画像から手の指先に相当する画素を検出する。
【0080】
再び、図17を参照して、凸点I0,I2,I4,I6及びI8を総称して、凸点As(s=0,1,…,S)と表記し、凹点I1,I3,I5及びI7を総称して、凹点Bt(t=0,1,…,T)と表記する。MCU3は、凸点Asから一定画素数Npだけ離れて位置する2つの画素を結ぶ線分23を求め、凸点Asから線分23に下ろした垂線25の長さLvを算出する。MCU3は、長さLvが、所定値CLを超えている場合に、その凸点Asを指先の候補とする。
【0081】
そして、MCU3は、指先の候補とした凸点Asの両側又は一方側に凹点Btが存在するか否かを判断し、存在する場合、その凸点Asを指先とみなす。
【0082】
また、MCU3は、「パー」及び「グー」を判定するのに必要な傾角θvを算出する。傾角θvは、指先とみなされた凸点Asから線分23に下ろした垂線25が、差分画像のX軸と平行な線27となす角である。
【0083】
図7に戻って、ステップS165にて、MCU3は、輪郭画像の形状が「パー」をした手の形状であるか否かを判定する。ステップS167にて、MCU3は、輪郭画像の形状が「チョキ」をした手の形状であるか否かを判定する。ステップS169にて、MCU3は、輪郭画像の形状が「グー」をした手の形状であるか否かを判定する。ステップS171にて、MCU3は、輪郭画像の形状が一本指を立てた手の形状であるか否かを判定してリターンする。
【0084】
図8は、図7のステップS161の輪郭情報を算出する処理の流れの一例を示すフローチャートである。図8を参照して、ステップS191にて、MCU3は、変数XG,YG及びjに0を代入する。ステップS193にて、MCU3は、変数XGの現在の値に輪郭線上の画素PjのX座標XO[j]を加算したものを、変数XGに代入する。また、MCU3は、変数YGの現在の値に輪郭線上の画素PjのY座標YO[j]を加算したものを、変数XGに代入する。ステップS195にて、MCU3は、変数jを1つインクリメントする。ステップS197にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS199に進み、それ以外はステップS193に進む。
【0085】
ステップS199にて、MCU3は、変数XGの値を値Jで除したものを、変数Xgに代入する。また、MCU3は、変数YGの値を値Jで除したものを、変数Ygに代入する。座標(Xg,Yg)は、輪郭画像の重心座標を示す。
【0086】
ステップS201にて、MCU3は、変数j,LS及びL[]に0を代入する。ステップS203にて、MCU3は、次式により、重心座標(Xg,Yg)と輪郭線上の各画素Pjの座標(XO[j],YO[j])との間の距離L[j]を算出する。
【0087】
L[j]←√((Xg−XO[j])2+(Yg−YO[j])2)
【0088】
ステップS205にて、MCU3は、変数LSの現在の値に変数L[j]の値を加算したものを、変数LSに代入する。ステップS207にて、MCU3は、変数jを1つインクリメントする。ステップS209にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS211に進み、それ以外はステップS203に進む。
【0089】
ステップS211にて、MCU3は、変数LSの値を値Jで除することにより、距離L[j]の平均値AVLを算出する。ステップS213にて、MCU3は、輪郭線及び輪郭線内の画素を計数して、輪郭画像の面積を算出してリターンする。
【0090】
図9は、図7のステップS163の指先を検出する処理の流れの一例を示すフローチャートである。図9を参照して、ステップS241にて、MCU3は、変数j及びFP[]に0を代入する。ステップS243にて、MCU3は、フラグCF[j]が凸点を示す01にセットされているか否かを判断し、肯定的判断の場合ステップS245に進み、否定的判断の場合ステップS249に進む。
【0091】
ステップS245にて、MCU3は、凸点である画素Pjの両側又は一方側に、フラグCF[j]に凹点を示す10がセットされている画素が存在するか否かを判断し、存在する場合画素Pjを指先候補とみなしてステップS247に進み、存在しない場合ステップS249に進む。ステップS247にて、MCU3は、フラグFP[j]に画素Pjが指先候補であることを示す1をセットする。
【0092】
ステップS249にて、MCU3は、変数jを1つインクリメントする。ステップS251にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS253に進み、それ以外はステップS243に進む。
【0093】
ステップS253にて、MCU3は、変数j,q,TF[],θv[],XT,YT,Q及びθvに0を代入する。ステップS255にて、MCU3は、フラグFP[j]に指先候補を示す1がセットされているか否かを判断し、肯定的判断の場合ステップS257に進み、それ以外はステップS271に進む。
【0094】
ステップS257にて、MCU3は、画素Pj+Npと画素Pj−Npとを結ぶ線分23に画素Pjから下ろした垂線25の長さLvを算出する(図17参照)。ステップS259にて、MCU3は、長さLvが所定値CLを超えているか否かを判断し、超えている場合画素Pjを指先とみなしてステップS261に進み、それ以外はステップS271に進む。
【0095】
ステップS261にて、MCU3は、指先フラグTF[j]に画素Pjが指先であることを示す1をセットする。ステップS263にて、MCU3は、変数XT[q]に画素PjのX座標を代入する。また、MCU3は、変数YT[q]に画素PjのY座標を代入する。座標(XT[q],YT[q])は、指先の座標である。ステップS265にて、MCU3は、垂線25の傾角θvを算出する(図17参照)。ステップS267にて、MCU3は、変数θv[q]に傾角θvを代入する。傾角θv[q]は、座標(XT[q],YT[q])で示される指先に対応する指の傾角である。ステップS269にて、MCU3は、変数qを1つインクリメントする。
【0096】
ステップS271にて、MCU3は、変数jを1つインクリメントする。ステップS273にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS275に進み、それ以外はステップS255に進む。ステップS275にて、MCU3は、変数Qに変数qの値を代入してリターンする。変数Qの値は、検出された指先の数を表す。
【0097】
図10は、図7のステップS165の「パー」を判定する処理の流れの一例を示すフローチャートである。図4を参照して、ステップS301にて、MCU3は、変数Qの値(指先の数)が3以上か否かを判断し、3以上の場合ステップS303に進み、それ以外はリターンする。ステップS303にて、MCU3は、変数q及びmに0を代入する。ステップS305にて、MCU3は、配列θv[q]と配列θv[q+1]との差の絶対値を算出し、変数θdに代入する。変数θdは、隣り合う指と指とがなす角度を表す。
【0098】
ステップS307にて、MCU3は、変数θdの値が100度未満か否かを判断し、肯定的判断の場合ステップS309に進み、否定的判断の場合ステップS311に進む。ステップS309にて、MCU3は、変数mを1つインクリメントする。ステップS311にて、MCU3は、変数qを1つインクリメントする。
【0099】
ステップS313にて、MCU3は、変数qの値が値Qになったか否かを判断し、値Qになった場合ステップS315に進み、それ以外はステップS305に進む。
【0100】
ステップS315では、MCU3は、変数mの値が、6以下3以上であるか否かを判断し、肯定的判断の場合手の形状が「パー」であると判断してステップS317に進み、否定的判断の場合リターンする。変数mの値は、隣り合う指と指とがなす角度θdが100度未満のケースの発生回数である。ステップS317では、MCU3は、フラグSHを「パー」を示す10hにセットして、図4のステップS11に進む。
【0101】
図11は、図7のステップS167の「チョキ」を判定する処理の流れの一例を示すフローチャートである。図11を参照して、ステップS341にて、MCU3は、変数Qの値(指先の数)が2又は3の場合ステップS343に進み、それ以外はリターンする。
【0102】
ステップS343にて、MCU3は、変数q,p,SH,XL,YL,XS及びYSに0を代入する。ステップS345にて、MCU3は、輪郭画像の重心座標(Xg,Yg)と指先の座標(XT[q],YT[q])との間の距離Lgt0を算出する。ステップS347にて、MCU3は、距離Lgt0が平均値AVL(図8のステップS211参照)に1.1を乗じたもの以上か否かを判断し、つまり、距離Lgt0が平均値AVLの110%以上か否かを判断し、肯定的判断の場合ステップS349に進み、否定的判断の場合ステップS359に進む。
【0103】
ステップS349にて、MCU3は、輪郭画像の重心座標(Xg,Yg)と指先の座標(XT[q+1],YT[q+1])との間の距離Lgt1を算出する。座標(XT[q+1],YT[q+1])の指先は、座標(XT[q],YT[q])の指先の隣の指先である。ステップS351にて、MCU3は、距離Lgt1が値AVLに1.1を乗じたもの以上か否かを判断し、つまり、距離Lgt1が平均値AVLの110%以上か否かを判断し、肯定的判断の場合ステップS353に進み、否定的判断の場合ステップS359に進む。
【0104】
ステップS353では、MCU3は、配列θv[q]と配列θv[q+1]との差の絶対値(つまり、隣あう指と指とがなす角度)を算出し、変数θdに代入する。ステップS355にて、MCU3は、変数θdの値が90度未満か否かを判断し、肯定的判断の場合ステップS357に進み、否定的判断の場合ステップS359に進む。ステップS357にて、MCU3は、変数pを1つインクリメントする。
【0105】
ステップS359にて、MCU3は、変数qを1つインクリメントする。ステップS361にて、MCU3は、変数qの値が値Qになったか否かを判断し、値Qになった場合ステップS363に進み、それ以外はステップS345に進む。ステップS363にて、MCU3は、変数pの値が1又は2の場合手の形状が「チョキ」と判断してステップS365に進み、それ以外はリターンする。
【0106】
ステップS365にて、MCU3は、変数Qの値が2か否かを判断し、2の場合、つまり、検出された指が2本の場合、ステップS369に進み、それ以外はステップS367に進む。ステップS367では、MCU3は、フラグSHを「チョキ」を示す21hにセットして、図4のステップS11に進む。なお、値21hは、3本の指が検出されたことになっているが、そのうち1本は指ではないノイズであることを示している。
【0107】
ステップS369では、MCU3は、フラグSHを「チョキ」を示す20hにセットする。なお、値20hは、2本の指が検出され、ステップS367のようなノイズを含まないことを示している。ステップS371にて、MCU3は、距離Lgt0が距離Lgt1より大きいか否かを判断し、つまり、検出された2本の指のどちらが長いか否かを判断し、距離Ltg0が大きい場合ステップS373に進み、それ以外はステップS375に進む。
【0108】
ステップS373では、MCU3は、座標XL及びYLにそれぞれ座標XT[0]及びYT[0]を代入する。また、MCU3は、座標XS及びYSにそれぞれ座標XT[1]及びYT[1]を代入する。一方、ステップS375では、MCU3は、座標XL及びYLにそれぞれ座標XT[1]及びYT[1]を代入する。また、MCU3は、座標XS及びYSにそれぞれ座標XT[0]及びYT[0]を代入する。ここで、座標(XL,YL)は、長い指の指先の座標であり、座標(XS,YS)は、短い指の指先の座標である。
【0109】
ステップS377にて、MCU3は、座標(XL,YL)及び座標(XS,YS)のそれぞれに対して、補正値を算出する。ステップS379にて、MCU3は、座標(XL,YL)に、その補正値を加算して、補正後座標を求める。また、MCU3は、座標(XS,YS)に、その補正値を加算して、補正後座標を求める。ステップS381にて、MCU3は、座標(XL,YL)の補正後座標と座標(XS,YS)の補正後座標との中点座標を算出する。そして、MCU3は、図4のステップS11に進む。
【0110】
図12は、図7のステップS169の「グー」を判定する処理の流れの一例を示すフローチャートである。図12を参照して、ステップS391にて、MCU3は、変数Qの値(指先の数)が2以上か否かを判断して、肯定的判断の場合ステップS393に進み、否定的判断の場合リターンする。
【0111】
ステップS393にて、MCU3は、変数jに0を代入する。ステップS395にて、MCU3は、距離L[j](図8のステップS203参照)が、平均値AVL(図8のステップS211参照)に0.6を乗じたもの以上であり、かつ、値AVLに1.4を乗じたもの以下であるか否かを判断し、つまり、距離L[j]が、平均値AVLの60%以上であり、かつ、平均値AVLの140%以下であるか否かを判断し、肯定的判断の場合ステップS397に進み、否定的判断の場合リターンする。
【0112】
ステップS397にて、MCU3は、変数jを1つインクリメントする。ステップS399にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合手の形状が「グー」と判断しステップS401に進み、それ以外はステップS395に進む。ステップS401にて、MCU3は、フラグSHを「グー」を示す30hにセットして、図4のステップS11に進む。
【0113】
図13は、図7のステップS171の一本指を判定する処理の流れの一例を示すフローチャートである。図13を参照して、ステップS421にて、MCU3は、変数Qの値(指先の数)が1以下か否かを判断して、肯定的判断の場合ステップS423に進み、否定的判断の場合ステップS447に進む。ステップS447では、MCU3は、フラグSHを「不定」を示す00hにセットしてリターンする。
【0114】
一方、ステップS423では、MCU3は、変数j,s,Dc[],Dca及びDcmに0を代入する。ステップS425にて、MCU3は、フラグFP[j]に指先候補(つまり凸点)を示す1がセットされているか否かを判断し、肯定的判断の場合ステップS427に進み、それ以外はステップS433に進む。
【0115】
ステップS427では、MCU3は、重心座標(Xg,Yg)と凸点の画素Pjとの間の距離Dを算出する。ステップS429にて、MCU3は、配列Dc[s]に距離Dを代入する。ステップS431にて、MCU3は、変数sを1つインクリメントする。ステップS433にて、MCU3は、変数jを1つインクリメントする。ステップS435にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS437に進み、それ以外はステップS425に進む。
【0116】
ステップS437にて、距離Dc[s]の平均値Dcaを算出する。つまり、平均値Dcaは、重心から各凸点までの距離の平均値である。ステップS439にて、距離Dc[s]から、最大値Dcmを検出する。つまり、最大値Dcmは、重心から各凸点までの距離のうち、最大のものである。ステップS441にて、MCU3は、最大値Dcmが、平均値Dcaに1.3を乗じた値以上か否かを判断し、肯定判断の場合一本の指が立った状態であるとみなしてステップS443に進み、否定判断の場合ステップS447に進む。
【0117】
ステップS443では、MCU3は、フラグSHを「1本の指が立った状態」を示す40hにセットする。ステップS445では、MCU3は、座標XHに、最大値Dcmに対応する凸点の画素PjのX座標を代入する。また、MCU3は、座標YHに、最大値Dcmに対応する凸点の画素PjのY座標を代入する。座標(XH,YH)は、立った状態の1本指の指先の座標である。ステップS447にて、MCU3は、座標(XH,YH)の補正値を計算する。ステップS447にて、MCU3は、座標(XH,YH)に、その補正値を加算し、補正後座標を求める。そして、MCU3は、リターンする。
【0118】
さて、次に、図11のステップS373及びS375で求めた指先を示す画素の座標(XL,YL)及び(XS,YS)、並びに、図13のステップS445で求めた指先を示す画素の座標(XH,YH)を、イメージセンサ5の解像度を超える高精度で再計算する方法を説明する。以下では、再計算前の指先を示す画素P4の座標を、座標(Xb,Yb)と表記する。そして、下記のようにして、座標(Xb,Yb)の補正値(Xc,Yc)を求める。本実施の形態では、補正値の算出方法として、第1〜第4の例を挙げる。
【0119】
図14(a)は、図11のステップS377及び図13のステップS447の指先補正値計算処理の第1の例の流れを示すフローチャートである。図14(b)は、図11のステップS377及び図13のステップS447の指先補正値計算処理の第2の例の流れを示すフローチャートである。図14(c)は、図11のステップS377及び図13のステップS447の指先補正値計算処理の第3の例の流れを示すフローチャートである。図14(d)は、図11のステップS377及び図13のステップS447の指先補正値計算処理の第4の例の流れを示すフローチャートである。
【0120】
図18(a)は、図14(a)及び図14(c)の指先補正値計算処理の説明図である。図18(b)は、図14(b)及び図14(d)の指先補正値計算処理の説明図である。
【0121】
図18(a)及び図18(b)を参照して、補正前(再計算前)の指先画素P4の座標(Xb,Yb)を原点(0,0)とする。図中、水平右方向をx軸の正とし、垂直下方向をy軸の正とする。そして、補正前の指先画素P4を取り囲む8個の画素P0,P1,P2,P5,P6,P7及びP8を利用する。また、画素P0〜P8は、それぞれ、画素値(つまり輝度値)p0〜p8を有する。
【0122】
図18(a)に示すように、第1及び第3の例では、原点(0,0)の指先画素P4の上下左右の画素P1,P7,P3及びP5の座標は、それぞれ、座標(0,−1),(0,1),(−1,0)及び(1,0)である。また、指先画素P4の左上画素P0、右上画素P2、左下画素P6及び右下画素P8の座標は、それぞれ、座標(−√2/2,−√2/2),(√2/2,−√2/2),(−√2/2,√2/2)及び(√2/2,√2/2)である。
【0123】
一方、図18(b)に示すように、第2及び第4の例では、原点(0,0)の指先画素P4の周囲画素P0,P1,P2,P5,P6,P7及びP8の座標は、それぞれ、座標(−1,−1)、(0,−1)、(1,−1)、(−1,0)、(1,0)、(−1,1)、(0,1)及び(1,1)である。
【0124】
なお、下記の数式中シンボル“*”及び“/”は、それぞれ、乗算及び除算を示す。
【0125】
図14(a)を参照して、第1の例では、ステップS361及びS363にて、MCU3は、次式により、X座標Xbの補正値Xc及びY座標Ybの補正値Ycを算出する。値Csは定数である。定数Csは1より大きい値である。
【0126】
Xc=(A/C)*Cs
Yc=(B/C)*Cs
【0127】
A=−R*p0+0*p1+R*p2+(−1)*p3+0*p4+1*p5+(−R)*p6+0*p7+R*p8
B=−R*p0+(−1)*p1+(−R)*p2+0*p3+0*p4+0*p5+R*p6+1*p7+R*p8
C=p0+p1+p2+P3+p4+p5+p6+p7+p8
R=√2/2
【0128】
よって、補正後の指先のX座標Xf及びY座標Yfは、次のようになる。
【0129】
Xf=Xb+Xc
Yf=Yb+Yc
【0130】
図14(b)を参照して、第2の例では、ステップS371及びS373にて、MCU3は、次式により、X座標Xbの補正値Xc及びY座標Ybの補正値Ycを算出する。値Csは定数である。
【0131】
Xc=(D/C)*Cs
Yc=(E/C)*Cs
【0132】
D=−1*p0+0*p1+1*p2+(−1)*p3+0*p4+1*p5+(−1)*p6+0*p7+1*p8
E=−1*p0+(−1)*p1+(−1)*p2+0*p3+0*p4+0*p5+1*p6+1*p7+1*p8
C=p0+p1+p2+P3+p4+p5+p6+p7+p8
【0133】
よって、補正後の指先のX座標Xf及びY座標Yfは、次のようになる。
【0134】
Xf=Xb+Xc
Yf=Yb+Yc
【0135】
図14(c)を参照して、第3の例では、ステップS381及びS383にて、MCU3は、次式により、X座標Xbの補正値Xc及びY座標Ybの補正値Ycを算出する。値pmaxは、画素値p0〜p8のうちの最大値を示す。
【0136】
Xc=A/pmax
Yc=B/pmax
【0137】
A=−R*p0+0*p1+R*p2+(−1)*p3+0*p4+1*p5+(−R)*p6+0*p7+R*p8
B=−R*p0+(−1)*p1+(−R)*p2+0*p3+0*p4+0*p5+R*p6+1*p7+R*p8
R=√2/2
【0138】
よって、補正後の指先のX座標Xf及びY座標Yfは、次のようになる。
【0139】
Xf=Xb+Xc
Yf=Yb+Yc
【0140】
図14(d)を参照して、第4の例では、ステップS391及びS393にて、MCU3は、次式により、X座標Xbの補正値Xc及びY座標Ybの補正値Ycを算出する。値pmaxは、画素値p0〜p8のうちの最大値を示す。
【0141】
Xc=D/pmax
Yc=E/pmax
【0142】
D=−1*p0+0*p1+1*p2+(−1)*p3+0*p4+1*p5+(−1)*p6+0*p7+1*p8
E=−1*p0+(−1)*p1+(−1)*p2+0*p3+0*p4+0*p5+1*p6+1*p7+1*p8
【0143】
よって、補正後の指先のX座標Xf及びY座標Yfは、次のようになる。
【0144】
Xf=Xb+Xc
Yf=Yb+Yc
【0145】
ここで、図11のステップS377の指先補正値算出処理では、MCU3は、座標(XL,YL)及び(XS,YS)のそれぞれを指先P4の座標(Xb,Yb)として、それぞれの補正値を算出する。また、図13のステップS447の指先補正値算出処理では、座標(XH,YH)を指先P4の座標(Xb,Yb)として、その補正値を算出する。
【0146】
図18(b)を参照しながら、上記第4の例について補足説明する。
【0147】
第4の例の上記式では、指先画素P4並びに周囲画素P0,P1,P2,P5,P6,P7及びP8の座標(0,0)、(−1,−1)、(0,−1)、(1,−1)、(−1,0)、(1,0)、(−1,1)、(0,1)及び(1,1)に、対応する画素値p4,p0,p1,p2,P3,p5,p6,p7及びp8で重み付けをし、それらの和Dが算出される。そして、和Dを値pmaxで除することにより、補正値Xcを求める。
【0148】
このようにして、小数点を持った精度の補正値Xcが得られる。なお、座標Xbは、画素単位で求められるので、整数値である。従って、座標Xbに補正値Xcを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にY座標についても言える。
【0149】
また、画素値による重み付けを行うことにより得られた補正値Xcを、補正前のX座標Xbに加えることにより、画素値(輝度値)の大きい側に、X座標Xbを補正できる(画素値による重み付け)。このことは同様にY座標についても言える。つまり、偏角θjから変曲点を求めることによって、手の輪郭線上の画素から、指先に相当する画素を特定し(図11のステップS373及びS375並びに図13のステップS445)、さらに、画素値を加味することによって、輪郭線上で特定された画素の周囲で、より画素値の大きい位置に、指先の座標を補正している。なぜなら、画像に写り込んだ指の像のうち、その先端部分であって、さらに、画素値(輝度値)の大きい位置を、指先とみなすことにより、より適切に指先を特定できるからである。
【0150】
さらに、和Dを、画素値p0〜p8のうちの最大値pmaxで除している。つまり、除数を、固定値とするのではなく、変動値としている。これは、イメージセンサ5から手までの距離は、一定ではないからである。つまり、イメージセンサ5から手までの距離が近い場合は、画像に指は大きく写り込み、一方、イメージセンサ5から手までの距離が遠い場合は、画像には指は小さく写り込むので、補正値Xcを、イメージセンサ5から手までの遠近に応じて、適切な値に設定するためである。補正値Ycについても同様である。
【0151】
例えば、除数を固定値とする場合、その固定値が小さすぎると、イメージセンサ5から手までの距離が遠い場合は比較的妥当な値になるかもしれないが、近い場合は、補正値が大きくなりすぎてしまう。また、逆に、除数を固定値とする場合、その固定値が大きすぎると、イメージセンサ5から手までの距離が近い場合は比較的妥当な値になるかもしれないが、遠い場合は、補正値が小さくなりすぎてしまう。また、イメージセンサ5から手までの距離が遠い場合と近い場合の双方に適切な除数を、固定値として設定することは困難である。なぜなら、同じ距離で同じ指を撮影する場合であっても、イメージセンサ5が設置される環境(照明や外光など)によって、画素値(輝度値)は異なってくるし、また、指の色彩、輪郭、及び表面の形状等も人によって異なるからである。
【0152】
また、値C(=p0+p1+p2+P3+p4+p5+p6+p7+p8)で除することにより、加重平均をとることもできる。しかし、次の理由により、除数は、値Cではなく、最大値pmaxとするほうが好ましい。
【0153】
図19を参照して、一般的に、実際の人間の指先30は、平面視において、ある点を頂点(「実頂点」と呼ぶ。)32として、円弧状となっている。一方、本実施の形態のように、比較的低解像度の画像から指の輪郭を検出し、指先を決定する場合、常に実頂点32を指先として検出することは困難である。従って、検出される指先は、実頂点32であったり、実頂点32の左の点34になったり、右の点36になったりする。
【0154】
この場合、和Dを値Cで除して補正値とすると、その補正値は、図18(b)の画素P4を中心とした9×9画素の範囲を超えることができない。和Eについても同様である。このため、例えば、図19の実頂点32の補正後の位置は点38、点34の補正後の位置は点40、点36の補正後の位置は点42となる。このように、補正後の指先の位置は、これら3つの点で異なっている。同じ指先を検出するのに、異なった部分を指先と認識したのでは、検出された指先位置に配置されるカーソルが安定しない。
【0155】
そこで、輪郭から求めた指先が、一定していな場合でも、補正後の位置を極力一定させるため、あるいは、指先の位置の相違を極力小さい範囲に収めるため、最大値pmaxで和D及びEを除して、補正値を、9×9画素の範囲を越えるようにし、補正後の位置が、図19の点44、つまり、指先端部30の腹の中心付近に集まるようにした。
【0156】
図18(a)を参照しながら、上記第1の例について補足説明する。この例では、第4の例と異なり、画素P0,P2,P6及びP8の重み付けの対象を、それぞれ、座標(−√2/2,−√2/2),(√2/2,−√2/2),(−√2/2,√2/2)及び(√2/2,√2/2)とした。これは次の理由による。
【0157】
補正前の指先画素P4の中心からの距離を、全周囲画素で同じ値として、画素値を重みとするに当って、全画素値を均等に扱うためである。例えば、画素P4と画素P5との間の距離は「1」であるが、画素P2の座標を(1,−1)として計算すると、画素P4と画素P2との間の距離は、「√2」となってしまい、周囲画素の位置によって不均衡が発生する。補正前の指先画素P4の中心からの距離を、全周囲画素で同じ値とすることにより、補正値を方向によって偏りのないものとすることができる。
【0158】
また、この例では、A/C及びB/Cに定数Csを乗じている。これは、第4の例で、除数を値Cとせず、加重平均をとらなかった理由と同じである。つまり、輪郭から求めた指先が、一定していな場合でも、補正後の位置を極力一定させるため、あるいは、指先の位置の相違を極力小さい範囲に収めるため、定数Csを乗じて、補正値を、9×9画素の範囲を越えるようにし、補正後の位置が、図19の点44に集まるようにしたのである。なお、定数Csを乗ずることなしにA/C及びB/Cを補正値とすることもできる。
【0159】
ここで、定数Csは、実験及び試行錯誤等により決定される。また、定数Csを、検出された指の幅に応じて動的に変更することもできる。例えば、画像から指の幅を算出し、その幅に所定数(小数値)を乗じることにより、定数Csを決定する。この所定数は、実験及び試行錯誤等により決定される。例えばこの所定数は2/3である。なお、例えば、補正前の指先画素の左右それぞれに一定画素数離れた左右の画素間の距離を求め、それを指の幅とする。
【0160】
また、和A及びBをそれぞれ値Cで除して加重平均をとるのは、小数点を持った精度の補正値Xc及びYcを得るためである。なお、座標Xbは、画素単位で求められるので、整数値である。従って、座標Xbに補正値Xcを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にY座標についても言える。
【0161】
さらに、画素値による重み付けを行う理由は、第4の例と同様である。
【0162】
上記第2の例について補足説明する。定数Csを乗じる理由、加重平均をとる理由、及び、画素値による重み付けを行なう理由は、第1の例と同じである。
【0163】
上記第3の例について補足説明する。和A及びBをそれぞれ最大値pmaxで除して加重平均をとるのは、小数点を持った精度の補正値Xc及びYcを得るためである。なお、座標Xbは、画素単位で求められるので、整数値である。従って、座標Xbに補正値Xcを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にY座標についても言える。
【0164】
また、画素P0,P2,P6及びP8の重み付けの対象を、それぞれ、座標(−√2/2,−√2/2),(√2/2,−√2/2),(−√2/2,√2/2)及び(√2/2,√2/2)とした理由は、第1の例と同じである。
【0165】
さらに、画素値による重み付けを行う理由、除数を変動値とした理由、及び、最大値pmaxで除し加重平均をとらない理由は、第4の例と同様である。
【0166】
ここで、図14(a)〜図14(d)に示す指先補正値計算処理を実行する場合は、MCU3は、画素値p0〜p8を、イメージセンサ5から順次取得し、計算式に代入して、補正値(Xc,Yc)を算出する。なお、イメージセンサ5は、MCU3による2値化のために差分画像を出力した後でも、一定時間は(次の撮影処理までは)、差分画像データを保持しているので、指先補正値計算処理では、そこから必要な画素を取得することができる。このように、3×3画素(グレースケール)を一旦メモリ7に格納するのではなく、イメージセンサ5からの出力画素を順次処理しており、これにより、メモリ容量を削減できる。もちろん、イメージセンサ5が出力した差分画像をそのままメモリ7に格納して処理したり、あるいは、3×3画素(グレースケール)を一旦メモリ7に格納して処理することもできる。
【0167】
図15(a)は、図4のステップS11の擬似ボタン操作判定処理の第1の例の流れを示すフローチャートである(図3(b)の第1の例に対応)。図15(a)を参照して、ステップS621にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップS623にて、MCU3は、手の形状を示す今回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「1本指」の状態)、ステップS627に進み、それ以外はリターンする。
【0168】
ステップS627では、MCU3は、手の形状を示す前回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS629に進み、それ以外はリターンする。ステップS629では、MCU3は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【0169】
図15(b)は、図4のステップS11の擬似ボタン操作判定処理の第2の例の流れを示すフローチャートである(図3(b)の第2の例に対応)。図15(b)を参照して、ステップS601にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップS603にて、MCU3は、手の形状を示す今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS607に進み、それ以外はリターンする。
【0170】
ステップS607では、MCU3は、手の形状を示す前回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「1本指」の状態)、ステップS609に進み、それ以外はリターンする。ステップS609では、MCU3は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【0171】
図15(c)は、図4のステップS11の擬似ボタン操作判定処理の第3の例の流れを示すフローチャートである(図3(b)の第3の例に対応)。図15(c)を参照して、ステップS641にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップS643にて、MCU3は、手の形状を示す今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS645に進み、それ以外はリターンする。
【0172】
ステップS645では、MCU3は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離DCを算出する。ステップS647にて、MCU3は、距離DCが一定値CCより小さいか否かを判断し、小さい場合一方指先が他方指先に近づいたと判断してステップS649に進み、それ以外はリターンする。ステップS649にて、MCU3は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【0173】
ここで、図15(a)〜図15(c)及び後述の図22(a)〜図22(c)において、今回のフラグSHとは、イメージセンサ5から今回受け取った1フレームの画像データに基づき設定されたフラグを意味する。また、前回のフラグSHとは、イメージセンサ5から前回受け取った1フレームの画像データに基づき設定されたフラグを意味する。
【0174】
また、図15(a)〜図15(c)は、擬似的にボタン操作が行われたと判定されたこと(つまり、擬似ボタンフラグのオン)を、クリック操作(ボタンを押下して放す操作)が行なわれたとみなす場合の処理例を示している。
【0175】
次に、図22(a)〜図22(c)を参照して、擬似的にボタン操作が行われたと判定されたこと(つまり、擬似ボタンフラグのオン)を、ボタンのプレス操作(ボタンを押したままの状態)が行なわれたとみなす処理例を説明する。なお、擬似ボタンフラグのオフは、ボタンを放した状態とみなされる。
【0176】
図22(a)は、図4のステップS11の擬似ボタン操作判定処理の第4の例の流れを示すフローチャートである(図3(b)の第1の例に対応)。図22(a)を参照して、ステップS701にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップS709に進み、オフの場合ステップS703に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【0177】
ステップS703にて、MCU3は、手の形状を示す今回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「1本指」の状態)、ステップS705に進み、それ以外はリターンする。
【0178】
ステップS705では、MCU3は、手の形状を示す前回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS707に進み、それ以外はリターンする。ステップS707では、MCU3は、擬似的にボタンがプレスされたことを示すため、擬似ボタンフラグをオンにする。
【0179】
一方、ステップS709では、MCU3は、今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS711に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップS711では、MCU3は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【0180】
図22(b)は、図4のステップS11の擬似ボタン操作判定処理の第5の例の流れを示すフローチャートである(図3(b)の第2の例に対応)。図22(b)を参照して、ステップS731にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップS739に進み、オフの場合ステップS733に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【0181】
ステップS733にて、MCU3は、手の形状を示す今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS735に進み、それ以外はリターンする。
【0182】
ステップS735では、MCU3は、手の形状を示す前回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「1本指」の状態)、ステップS737に進み、それ以外はリターンする。ステップS737では、MCU3は、擬似的にボタンがプレスされたことを示すため、擬似ボタンフラグをオンにする。
【0183】
一方、ステップS739では、MCU3は、今回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「一本指」の状態)、ステップS741に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップS741では、MCU3は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【0184】
図22(c)は、図4のステップS11の擬似ボタン操作判定処理の第6の例の流れを示すフローチャートである(図3(b)の第3の例に対応)。図22(c)を参照して、ステップS761にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップS771に進み、オフの場合ステップS763に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【0185】
ステップS763にて、MCU3は、手の形状を示す今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS765に進み、それ以外はリターンする。
【0186】
ステップS765では、MCU3は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離DCを算出する。ステップS767にて、MCU3は、距離DCが一定値CCより小さいか否かを判断し、小さい場合一方指先が他方指先に近づいたと判断してステップS769に進み、それ以外はリターンする。ステップS769にて、MCU3は、擬似的にボタンのプレスが行なわれたことを示すため、擬似ボタンフラグをオンにする。
【0187】
一方、ステップS771にて、MCU3は、今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS773に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。
【0188】
ステップS773では、MCU3は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離DCを算出する。ステップS775にて、MCU3は、距離DCが一定値CC以上か否かを判断し、CC以上の場合擬似的にボタンが放されたとみなしてステップS777に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップS777にて、MCU3は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【0189】
ところで、上記では、図3(b)を参照して、擬似ボタン操作の第1〜第3の例を説明した。以下では、擬似ボタン操作の第4の例を説明する。この第4の例では、シングルクリック及びダブルクリックの判定を行なう。
【0190】
図23(a)は、本発明の実施の形態による擬似ボタン操作の第4の例(シングルクリック)の説明図である。図23(a)を参照して、一定時間TC以内に、ステップS2000〜S2004の変化が検出された場合に、シングルクリックが行なわれたとみなす。
【0191】
具体的には、指先50が大体静止した状態になった場合に、最新の指先50を中心とした矩形範囲(例えば3画素×3画素)52を設定する(ステップS2000)。例えば、最新の指先50から一定距離RD内に過去所定数分の指先50が存在する場合に、指先50が大体静止した状態であると判断される。
【0192】
この矩形範囲52の設定から一定時間TC以内に、矩形範囲52から指先50が消失し(出て)、矩形範囲52に指先50が存在しない状態になり(ステップS2002)、そして、再び、矩形範囲52に指先50が出現し(入って)、矩形範囲52に指先50が存在する状態になった時に(ステップS2004)、シングルクリックが行なわれたとみなす。例えば、矩形範囲52内の画素値(輝度値)の合計値を、所定の閾値と比較して、合計値が閾値を超えていれば矩形範囲52に指先50が存在すると判断し、一方、合計値が閾値以下の場合に矩形範囲52に指先50が存在しないと判断する。
【0193】
なお、例えば、ユーザが、一定時間TC以内に、人差し指を伸ばした状態から、人差し指の第3関節(付け根の関節)を曲げて指を折り、再び、元の状態(人差し指を伸ばした状態)に戻すというジェスチャを行なった時に、シングルクリックが行なわれたとみなされる。この場合、第1及び第2関節の状態は任意である。また、例えば、ユーザが、一定時間TC以内に、人差し指を伸ばした状態から、人差し指の第2関節を曲げて指を折り(第3関節は固定)、再び、元の状態(人差し指を伸ばした状態)に戻すというジェスチャを行なった時に、シングルクリックが行なわれたとみなされる。この場合、第1関節の状態は任意である。ここで、指先に一番近い関節を第1関節、その次の関節を第2関節、さらにその次の関節を第3関節と呼んでいる。
【0194】
この例のような人のジェスチャでは、指が曲げられた後、指先が、ほぼ元の位置に戻ることが、本願発明者の実験により検証されている。このため、図23(a)で説明した手法により、シングルクリックが行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できるのである。
【0195】
図23(b)は、本発明の実施の形態による擬似ボタン操作の第4の例(ダブルクリック)の説明図である。図23(b)を参照して、一定時間TC以内に、ステップS2100〜S2108の変化が検出された場合に、ダブルクリックが行なわれたとみなす。この場合の一定時間TCは、シングルクリックを判定するときの一定時間TCと同じである。
【0196】
具体的には、指先50が大体静止した状態になった場合に、最新の指先50を中心とした矩形範囲(例えば3画素×3画素)52を設定する(ステップS2100)。指先50が大体静止した状態の判断方法は、シングルクリックの場合と同じである。
【0197】
この矩形範囲52の設定から一定時間TC以内に、矩形範囲52から指先50が消失し(出て)、矩形範囲52に指先50が存在しない状態になり(ステップS2102)、そして、再び、矩形範囲52に指先50が出現し(入って)、矩形範囲52に指先50が存在する状態になり(ステップS2104)、再び、矩形範囲52から指先50が消失し(出て)、矩形範囲52に指先50が存在しない状態になり(ステップS2106)、そして、再び、矩形範囲52に指先50が出現し(入って)、矩形範囲52に指先50が存在する状態になった時に(ステップS2108)、ダブルクリックが行なわれたとみなす。矩形範囲52に指先50が存在するか否かの判断は、シングルクリックの場合と同じである。
【0198】
なお、ダブルクリックは、上記のシングルクリックのジェスチャをユーザが2回行なうことで実行される。また、ダブルクリックは、シングルクリックを2回行なうものであり、それ故、折り曲げられた指先は、2回とも、ほぼ同じ位置に戻ってくる。この点も本願発明者により検証されている。このため、図23(b)で説明した手法により、ダブルクリックが行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できるのである。
【0199】
図24及び図25は、図4のステップS11の擬似ボタン操作判定処理の第7の例の流れを示すフローチャートである(図23(a)及び図23(b)の第4の例に対応)。図24を参照して、ステップS1200にて、MCU3は、シングルクリックが行なわれたとみなす時にオンにセットされるシングルクリックフラグと、ダブルクリックが行なわれたとみなす時にオンにセットされるダブルクリックフラグと、をオフにする。
【0200】
ステップS1202にて、MCU3は、滞在フラグがオンか否かを判断し、オンの場合図25のステップS1250に進み、オフの場合ステップS1204に進む。滞在フラグは、指先50が大体静止した状態になったと判断された時に、つまり、図23(a)及び図23(b)の矩形範囲52が設定された時にオンにセットされるフラグである。従って、ステップS1202で否定判断がされた後のステップS1204〜S1220の処理は、矩形範囲52を設定するための処理である。一方、ステップS1202で肯定判断がされた後のステップS1250〜S1284の処理は、図23(a)及び図23(b)のステップS2002,S2004,S2102〜S2108の状態を判断するための処理である。
【0201】
ステップS1204にて、MCU3は、変数kに0をセットする。ステップS1206にて、MCU3は、最新の指先50と、過去の指先50と、の間の距離DISを算出する。距離DISは次式により算出される。
【0202】
DIS=√(XD2+YD2)
XD=Xf[0]−Xf[k+1]
YD=Yf[0]−Yf[k+1]
【0203】
ここで、図13のステップS449では、補正後の指先50の座標(Xf,Yf)を計算する。この場合、補正後の指先50の座標(Xf,Yf)は、キューに格納され、現在及び過去の計N個のデータが保存される(Nは2以上の整数。本実施の形態ではN=10)。キューは、X座標Xfを代入する配列Xf[0]〜Xf[9]及びY座標Yfを代入する配列Yf[0]〜Yf[9]により構成される。配列Xf[0]及びYf[0]に常に最新の座標(Xf,Yf)が格納される。
【0204】
従って、ステップS1206では、最新の指先50の座標(Xf[0],Yf[0])と、それより(k+1)個だけ過去の指先50の座標(Xf[k+1],Yf[k+1])と、の間の距離DISが計算される。
【0205】
そして、ステップS1208にて、MCU3は、距離DISが、一定距離RDより小さいか否かを判断し、小さい場合ステップS1210に進み、それ以外は指先50が静止した状態にないと判断してステップS1220に進む。ステップS1210にて、MCU3は、変数kを1つインクリメントする。ステップS1212にて、MCU3は、変数kの値が9になったか否かを判断し、9になった場合ステップS1214に進み、それ以外はステップS1206に戻る。
【0206】
ステップS1212でk=9が判断されたことは、最新の指先50と過去9個の指先50それぞれとの間の距離全てが、一定距離RD内に存在することを意味する。つまり、指先50が大体静止した状態にあることを意味する。このため、ステップS1214では、MCU3は、滞在フラグをオンにする。一方、距離DISが一定距離RD内にない過去の指先50が1つでも存在する場合は、指先50が静止した状態にないと判断する。このため、ステップS1220では、MCU3は、滞在フラグをオフにしてリターンする。
【0207】
ステップS1214の次のステップS1216にて、MCU3は、最新の指先50の座標(Xf[0],Yf[0])を中心とした矩形範囲52を設定する(図23(a)のステップS2000及び図23(b)のステップS2100に相当)。そして、ステップS1218にて、MCU3は、タイマTMをセットしてリターンする。このタイマTMは、上記一定時間TC(図23(a)及び図23(b)参照)を計測するためのものである。この一定時間TCは、実験及び試行錯誤等により、決定される。
【0208】
図25を参照して、ステップS1250にて、MCU3は、タイマTMの値が一定時間TCになったか否かを判断し、一定時間TCになった場合ステップS1278に進み、一定時間になっていない場合ステップS1252に進む。
【0209】
ステップS1252にて、MCU3は、消失フラグがオンか否かを判断し、オンの場合ステップS1262に進み、オフの場合ステップS1254に進む。消失フラグは、矩形範囲52に指先50が存在する状態から存在しない状態に変化したときにオンにされるフラグである。
【0210】
ステップS1254では、MCU3は、矩形範囲52に指先50が不存在か否かを判断し、存在する場合リターンし、不存在の場合ステップS1256に進む。ステップS1256にて、MCU3は、消失フラグをオンにしてリターンする(図23(a)のステップS2002並びに図23(b)のステップS2102及びS2106に相当)。
【0211】
消失フラグがオンの場合、ステップS1262にて、MCU3は、矩形範囲52に指先50が存在するか否かを判断し、存在しない場合リターンし、存在する場合ステップS1264に進む(図23(a)のステップS2004並びに図23(b)のステップS2104及びS2108に相当)。
【0212】
ステップS1264では、MCU3は、仮クリックフラグがオンか否かを判断し、オンの場合ステップS1272に進み、オフの場合ステップS1266に進む。仮クリックフラグは、ユーザのジェスチャがシングルクリックの条件(図23(a)のステップS2000〜S2004)を満たしたときにオンにされるフラグである。ただし、ダブルクリックはシングルクリックの動作を含むので(図23(b)のステップS2100〜S2104)、一定時間TCが経過するまでは、ダブルクリックが行なわれる可能性もある。このため、一定時間TCの経過後に、シングルクリックかダブルクリックかを最終決定する必要がある。それ故、シングルクリックの条件が満たされた時、仮クリックフラグにより、最終決定まで、その事実を保持しておくのである。
【0213】
ステップS1266では、MCU3は、シングルクリックの条件が満足されたので、仮クリックフラグをオンにする。そして、ステップS1268にて、MCU3は、消失フラグをオフにしてリターンする。なぜなら、ステップS1262で肯定判断がされているからである。
【0214】
一方、ステップS1272にて、MCU3は、ダブルクリックフラグをオンにする。なぜなら、仮クリックフラグがオンである状態において、さらに、図23(b)のステップS2106,S2108の変化が検出されたからである(ステップS1264にて肯定判断、ステップS1252にて肯定判断、ステップS1262にて肯定判断)。ステップS1274にて、MCU3は、タイマTMを解除する。ステップS1276にて、MCU3は、滞在フラグ、消失フラグ及び仮クリックフラグをオフにしてリターンする。なぜなら、ダブルクリックが決定されているため、これが最終決定だからである。なお、滞在フラグのオフは、矩形範囲52の解除、つまり、クリック操作判定のリセットに相当する。
【0215】
さて、ステップS1250にて肯定判断がされた後、MCU3は、最終決定を行なうべく、ステップS1278に進む。ステップS1278にて、MCU3は、仮クリックフラグがオンか否かを判断し、オンの場合ステップS1280に進み、オフの場合シングルクリックもダブルクリックも行なわれていないためステップS1282に進む。ステップS1280では、MCU3は、シングルクリックフラグをオンにしてステップS1282に進む。
【0216】
ステップS1282にて、MCU3は、タイマTMを解除する。ステップS1284にて、MCU3は、滞在フラグ、消失フラグ及び仮クリックフラグをオフにしてリターンする。なお、滞在フラグのオフは、矩形範囲52の解除、つまり、クリック操作判定のリセットに相当する。
【0217】
なお、シングルクリックフラグ及びダブルクリックフラグは、図4のステップS13にて、コンピュータ11に送信される。
【0218】
図20は、図1のウィンドウシステム400によるイベント監視処理の流れの一例を示すフローチャートである。図20を参照して、ステップS800にて、ウィンドウシステム400は、第1アプリケーションプログラム100から依頼されたイベントが発生したか否かをチェックし、発生した場合ステップS802に進み、発生していない場合ステップS800に戻る。ステップS802では、ウィンドウシステム400は、イベントの発生を第1アプリケーションプログラム100に通知する。
【0219】
一方、ステップS900にて、第1アプリケーションプログラム100は、ウィンドウシステム400からイベント発生の通知を受けたか否かをチェックし、通知を受けた場合ステップS902に進み、通知を受けていない場合ステップS900に戻る。ステップS902では、第1アプリケーションプログラム100は、発生したイベントに応じた処理(ウィンドウの制御を含む。)を実行する。
【0220】
また、ステップS804にて、ウィンドウシステム400は、第2アプリケーションプログラム100から依頼されたイベントが発生したか否かをチェックし、発生した場合ステップS806に進み、発生していない場合ステップS804に戻る。ステップS806では、ウィンドウシステム400は、イベントの発生を第2アプリケーションプログラム100に通知する。
【0221】
一方、ステップS1000にて、第2アプリケーションプログラム100は、ウィンドウシステム400からイベント発生の通知を受けたか否かをチェックし、通知を受けた場合ステップS1002に進み、通知を受けていない場合ステップS1000に戻る。ステップS1002では、第2アプリケーションプログラム100は、発生したイベントに応じた処理(ウィンドウの制御を含む。)を実行する。
【0222】
なお、ステップS802及びS806の通知は、第1及び第2アプリケーションプログラム100に対して、API200を介して行なわれる。
【0223】
ここで、イベントの例を幾つか挙げる。例えば、アプリケーションプログラム100が制御するウィンドウに設けられたボタン上にカーソルが位置し、かつ、擬似的にボタン操作が行なわれた場合に、つまり、ウィンドウ中のボタンが押下された場合に、イベントが発生する。CPU51は、ボタン押下に応じた処理を実行する。
【0224】
例えば、後述する図26に示すジェスチャ1〜13のそれぞれの発生に対して、イベントが発生する。この場合、例えば、ジェスチャ1によりイベントが発生した場合、CPU51は、手の移動方向である水平左方向に、モニタ67に表示された画面をスクロールする。
【0225】
例えば、所定の手の形状(例えば、「グー」)が検出された場合にイベントが発生する。例えば、手の面積が一定値以上になったらイベントが発生する。例えば、手又は指先の移動軌跡が所定軌跡になった場合にイベントが発生する。例えば、手の一定角度の回転が発生したらイベントが発生する。例えば、手の速度が一定値以上になったらイベントが発生する。例えば、手の加速度が一定値以上になったらイベントが発生する。
【0226】
以上のように、本実施の形態では、マウス等の接触型ポインティングデバイスで生成できるイベントはもちろん、接触型ポインティングデバイスでは生成することができないイベントをも生成できる。従って、各アプリケーションプログラム100は、多彩なイベントに応じた処理(ウィンドウの制御を含む。)を実行することができる。
【0227】
図21は、図1のウィンドウシステム400によるカーソル制御処理の流れの一例を示すフローチャートである。図21を参照して、ステップS1100にて、ウィンドウシステム400は、デバイスドライバ500からユーザの指先の座標を取得する。ステップS1102にて、ウィンドウシステム400は、受け取った指先の座標を、モニタ67に応じたスクリーン座標に変換する。ステップS1104にて、ウィンドウシステム400は、スクリーン座標に変換された指先の座標上にカーソルを表示し、ステップS1100に進む。
【0228】
図26は、図1のウィンドウシステム400が受け付け可能なジェスチャの例示図である。図26を参照して、ジェスチャ1は、手を「パー」にした後、水平左方向へスイングする動作である。ジェスチャ2は、手を「パー」にした後、水平右方向へスイングする動作である。ジェスチャ3は、手を「パー」にした後、垂直上方向へスイングする動作である。ジェスチャ4は、手を「パー」にした後、垂直下方向へスイングする動作である。
【0229】
ジェスチャ5は、手を「グー」から「チョキ」に変化させる動作である。ジェスチャ6は、手を「グー」から「パー」に変化させる動作である。ジェスチャ7は、手を「チョキ」から「グー」に変化させる動作である。ジェスチャ8は、手を「チョキ」から「パー」に変化させる動作である。ジェスチャ9は、手を「パー」から「グー」に変化させる動作である。ジェスチャ10は、手を「パー」から「チョキ」に変化させる動作である。
【0230】
ジェスチャ11は、手でイメージセンサ5、つまり、カメラを覆う(掩蔽する)動作である。ジェスチャ12は、時計回りに、手で円を描く動作である。ジェスチャ13は、反時計回りに、手で円を描く動作である。
【0231】
ウィンドウシステム400は、各ジェスチャ1〜13を検出し、それぞれをイベントの発生として認識し、依頼先のアプリケーションプログラム100に通知することができる。
【0232】
ここで、各ジェスチャ1〜13を、キーボード71の各種キー(例えば、タブキー、左方向キー、右方向キー、上方向キー、下方向キー、スペースキー、ページアップキー、ページダウンキー、エスケープキー、及び、Windows(登録商標)キーなど)に割り当てることもできる。
【0233】
また、各ジェスチャ1〜13を、キーボード71のショートカットキー(例えば、Altキー+F4キー(ウィンドウを閉じる)、Altキー+Escキー(複数のアプリケーションの切り替え)、Homeキー(先頭にジャンプ)、Endキー(末行にジャンプ)、F1キー(ヘルプを呼び出す)、Ctrlキー+Sキー(上書き保存)、Windowsキー+Rキー(ファイル名を指定して実行)、Windowsキー+Mキー(すべてのウィンドウを最小化)、及び、Windowsキー+Dキー(すべてのウィンドウを元のサイズに戻す)など)に割り当てることもできる。
【0234】
なお、オペレーティングシステム300のために用意されたキー及びショートカットキーを、ジェスチャ1〜13に割り当てることができる。また、アプリケーションプログラム100ごとに用意されたキー及びショートカットキーを、アプリケーションプログラム100ごとにジェスチャ1〜13に割り当てることもできる。つまり、アプリケーションプログラム100ごとにジェスチャ1〜13を割り当てることができ、ジェスチャ1〜13により実行される機能は、アプリケーションプログラム100ごとに異なってもよい。
【0235】
また、複数のアプリケーションプログラム100が起動している場合に、フォアグラウンド(最前面)のウィンドウに対応するアプリケーションプログラム100を認識して、そのアプリケーションプログラム100のために用意されたキー及びショートカットキーが割り当てられたジェスチャ1〜13を有効とすることもできる。
【0236】
なお、ジェスチャ1〜13にキーやショートカットキーが割り当てられる場合は、ジェスチャの検出が、それに割り当てられたキーないしはショートカットキーの押下に相当する。アプリケーションプログラム100が、あるキーないしはショートカットキーの押下というイベントの発生通知をウィンドウシステム400に依頼している場合、例えば、ウィンドウシステム400は、変換テーブルを参照して、検出されたジェスチャが、依頼されたキーないしはショートカットキーが割り当てられたものか否かを判断し、イベントの発生をアプリケーションプログラム100に通知する。変換テーブルは、ジェスチャ1〜13と、キーないしはショートカットキーと、を関連付けたテーブルである。
【0237】
また、各ジェスチャ1〜13を、各種システムコールないしはAPI(例えば、ブラウザの起動、ウィンドウの最大化、及び、ウィンドウの最小化など)に割り当て、対応するシステムコールないしはAPIを呼び出すために利用することもできる。
【0238】
さらに、各ジェスチャ1〜13を各種実行ファイルないしはアプリケーションに割り当て、対応する実行ファイルないしはアプリケーションを実行するために利用することもできる。
【0239】
ここで、各ジェスチャ1〜13に割り当てるキー、ショートカットキー、システムコールないしはAPI、及び、実行ファイルは、固定的に設定されていてもよいし、コンピュータシステム700のユーザによって登録(動的に変更)できるようにすることもできる。
【0240】
図27は、図1のウィンドウシステム400によるジェスチャ判定処理の流れの一例を示すフローチャートである。図27を参照して、ステップS100にて、ウィンドウシステム400は、ジェスチャ判定処理で必要な変数等(後述の変数CP,TL、及び、受付フラグ等)を初期化する。
【0241】
ステップS101にて、ウィンドウシステム400は、ステップS102〜S105で検出されたジェスチャを示すフラグJFに00h(不定を意味)を代入する。ステップS102にて、ウィンドウシステム400は、ジェスチャ1〜4のいずれかが実行されたか否かを判断する。この場合、ウィンドウシステム400は、ジェスチャ1が検出されたとき、フラグJFに10hを代入し、ジェスチャ2が検出されたとき、フラグJFに20hを代入し、ジェスチャ3が検出されたとき、フラグJFに30hを代入し、ジェスチャ4が検出されたとき、フラグJFに40hを代入する。
【0242】
ステップS103にて、ウィンドウシステム400は、今回のフラグSH及び前回のフラグSHを参照して(図10〜図12参照)、ジェスチャ5〜10のいずれかが実行されたか否かを判断する。この場合、ウィンドウシステム400は、ジェスチャ5が検出されたとき、フラグJFに50hを代入し、ジェスチャ6が検出されたとき、フラグJFに60hを代入し、ジェスチャ7が検出されたとき、フラグJFに70hを代入し、ジェスチャ8が検出されたとき、フラグJFに80hを代入し、ジェスチャ9が検出されたとき、フラグJFに90hを代入し、ジェスチャ10が検出されたとき、フラグJFにA0hを代入する。
【0243】
ステップS104にて、ウィンドウシステム400は、掩蔽フラグを参照して(図5参照)、ジェスチャ11が実行されたか否かを判断する。この場合、ウィンドウシステム400は、ジェスチャ11が検出されたとき、フラグJFにB0hを代入する。
【0244】
ステップS105にて、ウィンドウシステム400は、現在及び過去の手の重心座標(Xg,Yg)に基づいて、手の移動軌跡を算出し、ジェスチャ12が実行されたと判断したときはフラグJFにC0hを代入し、ジェスチャ13が実行されたと判断したときはフラグJFにD0hを代入する。
【0245】
ステップS106にて、ウィンドウシステム400は、フラグJFの値を、ジェスチャフラグFFに代入して、ステップS101に進む。ウィンドウシステム400は、イメージセンサ5が1フレームの差分画像を出力するたびに、ジェスチャフラグFFを見て、アプリケーションプログラム100から依頼されたイベントの発生の有無を確認する。なお、ウィンドウシステム400は、イメージセンサ5が1フレームの差分画像を出力するたびに、ステップS101〜S106を繰り返す。
【0246】
なお、図27の処理は、ウィンドウシステム400以外のプログラムが行ってもよい。
【0247】
図28及び図29は、図27のステップS102のジェスチャ1〜4の判定処理の流れの一例を示すフローチャートである。図28を参照して、ステップS110にて、ウィンドウシステム400は、受付フラグがオンか否かを判断し、オフの場合ステップS111に進み、オンの場合図29のステップS120に進む。受付フラグは、手の形状が一定時間連続して「パー」であるときにオンにされるフラグである。
【0248】
ステップS111にて、ウィンドウシステム400は、フラグSHを取得する。ステップS112にて、ウィンドウシステム400は、フラグSHの値が10h(手の形状がパー)か否かを判断し、10hの場合ステップS113に進み、それ以外はステップS116に進む。ステップS116では、ウィンドウシステム400は、カウンタCPに0を代入する。カウンタCPは、フラグSHの値が10hである状態(パーの状態)が連続して発生した回数を示す。
【0249】
一方、ステップS113では、ウィンドウシステム400は、カウンタCPを1つインクリメントする。ステップS114にて、ウィンドウシステム400は、カウンタCPの値が所定値PTより大きいか否かを判断し、大きい場合ステップS115に進み、それ以外はステップS117に進む。ステップS115では、ウィンドウシステム400は受付フラグをオンにする。一方、ステップS117では、ウィンドウシステム400は、受付フラグをオフにする。
【0250】
図29を参照して、図28のステップS110での肯定判断の後、ステップS120では、ウィンドウシステム400は、カウンタTLを1つインクリメントする。カウンタTLは、受付フラグがオンになってからの経過時間を示す。ステップS122にて、ウィンドウシステム400は、カウンタTLの値が所定値LLより大きいか否かを判断し、大きい場合ステップS124に進み、それ以外はステップS128に進む。ステップS124では、ウィンドウシステム400は、受付フラグをオフにする。ステップS126にて、ウィンドウシステム400は、カウンタTLに0を代入してリターンする。
【0251】
一方、ステップS122で否定判断の後、ステップS128にて、ウィンドウシステム400は、手の重心(Xg,Yg)のX方向の速度Vxを算出する。ステップS130にて、ウィンドウシステム400は、速度Vxが所定値NSより小さいか否かを判断し、小さい場合X方向の動きはノイズ(ユーザが意図しない、手の小さなぶれ等)とみなしステップS142に進み、それ以外はステップS132に進む。ステップS132にて、ウィンドウシステム400は、所定フレーム数fnにおける速度Vxの平均値VxAを算出する。なお、この場合のフレームは、イメージセンサ5が差分画像を出力する周期を示す。
【0252】
ステップS134にて、ウィンドウシステム400は、平均値VxAが所定値THVより大きいか否かを判断し、大きい場合ステップS136に進み、それ以外はX方向の動きはノイズとみなし(つまりユーザが意図しない動きとみなし)ステップS142に進む。ステップS134によって、ユーザが意図しない比較的大きな動きをノイズとして排除できる。つまり、大きな動きの後、小さな動きが続く場合、このような動きはノイズと判断するほうが適切であるところ、このような場合は、平均値VxAが小さくなるので、このような動きをノイズとして排除できる。
【0253】
ステップS136では、ウィンドウシステム400は、速度Vxの方向を判断し、水平左方向を向いている場合ステップS138に進み、水平右方向を向いている場合ステップS140に進む。
【0254】
ステップS138では、ウィンドウシステム400は、フラグJFに、ジェスチャ1を示す10hを代入してリターンする。一方、ステップS140では、ウィンドウシステム400は、フラグJFに、ジェスチャ2を示す20hを代入してリターンする。
【0255】
さて、ステップS142にて、ウィンドウシステム400は、手の重心(Xg,Yg)のY方向の速度Vyを算出する。ステップS144にて、ウィンドウシステム400は、速度Vyが所定値NSより小さいか否かを判断し、小さい場合Y方向の動きはノイズ(ユーザが意図しない、手の小さなぶれ等)とみなしリターンし、それ以外はステップS146に進む。ステップS146にて、ウィンドウシステム400は、所定フレーム数fnにおける速度Vyの平均値VyAを算出する。なお、この場合のフレームは、イメージセンサ5が差分画像を出力する周期を示す。
【0256】
ステップS148にて、ウィンドウシステム400は、平均値VyAが所定値THVより大きいか否かを判断し、大きい場合ステップS150に進み、それ以外はY方向の動きはノイズとみなし(つまりユーザが意図しない動きとみなし)リターンする。ステップS148によって、ユーザが意図しない比較的大きな動きをノイズとして排除できる。この点はステップS134と同様である。ステップS150では、ウィンドウシステム400は、速度Vyの方向を判断し、垂直上方向を向いている場合ステップS152に進み、垂直下方向を向いている場合ステップS154に進む。
【0257】
ステップS152では、ウィンドウシステム400は、フラグJFに、ジェスチャ3を示す30hを代入してリターンする。一方、ステップS154では、ウィンドウシステム400は、フラグJFに、ジェスチャ4を示す20hを代入してリターンする。
【0258】
上記のように、受付フラグがオンになった後、つまり、「パー」の状態が一定時間継続した後、手の重心の左移動、右移動、上移動、及び下移動を判断する。これにより、ユーザが意図しない動きが有効なジェスチャと認識されるのを防止できる。
【0259】
例えば、受付フラグを設けずに、重心の左移動が発生したときに、ジェスチャ1が行われたと認識し、右移動が発生したときに、ジェスチャ2が行われたと認識することを想定する。一般に、手をスイングする際、ある程度移動したら、スイング動作を停止するところ、それによって、手がぶれることも多い。この場合、本来のスイング方向と逆方向に手がぶれることも多い。また、スイング後に、無意識に手を元に戻す(逆スイングする)こともある。
【0260】
従って、手が左移動してジェスチャ1が行われたと判断した後、すぐに、逆方向のスイングが検出されることもあり、それがジェスチャ2と判断されてしまう。この場合、ジェスチャ2は、ユーザが意図しない入力である。
【0261】
本実施の形態のように、ユーザが、「パー」の状態を一定時間継続させて、特定のジェスチャを行う意思表示を行なった後、特定のジェスチャ(手の移動)の有無を判断すれば、このような逆方向のスイングが有効なジェスチャと判断されることはない。
【0262】
なお、図29では、水平移動のジェスチャ(ジェスチャ1,2)と垂直移動のジェスチャ(ジェスチャ3,4)とを選択的に判断し、双方が検出されることはなかった。ただし、双方を判断して、双方を検出することもできる。
【0263】
さて、以上のように、本実施の形態によれば、アプリケーションプログラム100等の各アプリケーションプログラムは、モーションセンサ600により検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手をモーションセンサ600により撮影し、撮影画像からの検出結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【0264】
「多彩な入力」とは、上記例では、手の形状(グー、チョキ、パー、一本指、)、手の形状の変化(図3(b)参照)、手の面積(イメージセンサ5と手との間の距離に相関)、及び、指先の位置ないしは移動である。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本実施の形態では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、マウスボタンの操作を擬似的なボタン操作に対応させることにより(図3(b)参照)、マウスと同等の機能を包含できる。
【0265】
このように、モーションセンサ600は、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【0266】
また、モーションセンサ600が差分画像を解析して手を検出するので、このような処理をCPU51は行なう必要がなく、その処理負荷を軽減でき、また、CPU51上で動作するコンピュータプログラムのプログラマは、手を検出するためのプログラムを作成する必要がなく、その負担を軽減できる。つまり、コンピュータシステム700に簡易にモーションセンサ600を搭載できる。
【0267】
また、本実施の形態では、ウィンドウシステム400は、モーションセンサ600が検出したユーザの指先の位置に対応するモニタ67の画面上の位置にカーソルを表示する。つまり、ユーザは、三次元空間中で手を動かしながら、非接触で、カーソルを操作できる。
【0268】
さらに、本実施の形態では、ウィンドウシステム400は、モーションセンサ600が検出したユーザの手の情報に基づいて、アプリケーションプログラム100から依頼されたイベントが発生したか否かを監視し、イベントが発生した場合に、依頼主であるアプリケーションプログラム100に、イベントの発生を通知する。従って、アプリケーションプログラム100をイベント駆動型プログラムとして作成することができ、ウィンドウの制御に好適である。
【0269】
さらに、本実施の形態では、ユーザは、1本指を立てた状態から、もう一本の指を立てて2本指を立てた状態にするだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる(図3(b)の第1の例)。
【0270】
また、擬似的なボタン操作の前後において、常に1本の指は撮影されるので、その指先に対応する画面上の位置にカーソルを表示でき、ポインティングと擬似的なボタン操作を片手で行なうことができる(図3(b)の第1の例)。
【0271】
また、本実施の形態によれば、ユーザは、2本指を立てた状態から、もう一本の指を閉じて1本指を立てた状態にするだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる(図3(b)の第2の例)。
【0272】
また、擬似的なボタン操作の前後において、常に1本の指は撮影されるので、その指先に対応する画面上の位置にカーソルを表示でき、ポインティングと擬似的なボタン操作を片手で行なうことができる(図3(b)の第2の例)。
【0273】
さらに、本実施の形態によれば、ユーザは、2本の指の指先を近づけるだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる(図3(b)の第3の例)。
【0274】
また、検出された2つの指先の間(例えば中点)にカーソルを表示することができ、ポインティングと擬似的なボタン操作を片手で行なうことができる(図3(b)の第3の例)。
【0275】
さらに、本実施の形態によれば、ユーザは、三次元空間中で、1本指を立てた状態から、その指を折って、再び、元の立てた状態に戻すというジェスチャを行なうだけで、非接触のクリック操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、クリック操作を行なうことができる(図23(a)の第4の例)。
【0276】
このような人のジェスチャでは、指が曲げられた後、指先が、ほぼ元の位置に戻ることが、本願発明者の実験により検証されている。このため、このようなジェスチャを検出することにより、クリック操作が行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できる。
【0277】
さらに、本実施の形態によれば、ユーザは、三次元空間中で、1本指を立てた状態から、その指を折って、再び、元の立てた状態に戻し、さらに、再び、その指を折って、再び、元の立てた状態に戻すというジェスチャを行なうだけで、つまり、シングルクリック操作のためのジェスチャを2回行なうだけで、非接触のダブルクリック操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、ダブルクリック操作を行なうことができる(図23(b)の第4の例)。
【0278】
このようなダブルクリック操作は、シングルクリック操作を2回行うものであるところ、折り曲げられた指先は、2回とも、ほぼ同じ位置に戻ってくることが、本願発明者の実験により検証されている。このため、このようなジェスチャを検出することにより、ダブルクリック操作が行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できる。
【0279】
また、本実施の形態では、MCU3は、指先50の動きが一定範囲DIS内に収まっている場合に(図24のステップS1208及びS1212で肯定判断)、ユーザがクリック操作(シングルクリック又はダブルクリック)を行なうことを意図しているとみなし、矩形範囲52を設定し(図24のステップS1216)、これをトリガとして、ユーザがクリック操作に対応するジェスチャを行ったか否かを判定できる。このため、ユーザが当該ジェスチャを行なったか否かを、常に判定する必要がなく、処理負荷を軽減できる。
【0280】
さらに、MCU3は、矩形範囲52が設定されてから所定時間TC内に、指先50が矩形範囲52から消失したと判断しない場合(図25のステップS1254)、又は、矩形範囲52に指先が出現したと判断しない場合(図25のステップS1262)、滞在フラグをオフにして、矩形範囲52を解除する(図25のステップS1284)。
【0281】
このように、所定時間TC内に、指先50が矩形範囲52から消失したと判断しない場合、又は、矩形範囲52に指先が出現したと判断しない場合、ユーザがクリック操作(シングルクリック又はダブルクリック)を行なうことを意図していないとみなして、ユーザの意図に反してクリック操作が行なわれたと判定されることを防止できる。つまり、一般にクリック操作は素早く行なわれるところ、所定時間TCを適切に設定することにより、同一の動きであっても、クリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0282】
さらに、本実施の形態によれば、輪郭から大体の指先を決定し(図11のステップS373,S375、図13のステップS445)、その周囲画素のみを用いて補正を行なうので(図14(a)〜図14(d))、処理のための記憶容量の削減と処理速度の向上を図ることができる。
【0283】
また、補正が小数点精度で実行されるので、イメージセンサ5が比較的低解像度であっても、高精度で指先の位置を決定することができる。その結果、イメージセンサ5より高解像度のモニタ67の画面上の、指先に対応する位置にカーソルを表示する場合でも、その動きを滑らかにすることができる。
【0284】
さらに、周囲画素の画素値により、補正を行なうので、補正後の指先を、輪郭線上ではなく、指の内部の位置に決定でき、ユーザが指先と認識する位置により近づけることができる。その結果、指先に対応するモニタ67の画面上の位置にカーソルを表示する場合、ユーザにとって、指先によるカーソルの制御が容易になる。なお、一般に、人は、指の腹を向けて、指を動かすときは、指の輪郭線上の凸点を指先と認識せず、指先端部の指の腹(finger pad)の中心を指先と認識するものである。
【0285】
さらに、本実施の形態では、補正後の指先の位置が、周囲画素の範囲(9×9画素の範囲)を超えるように、補正を行う。このため、補正後の指先の位置を指先端部の指の腹の一定位置あるいは略一定位置に決定することができ、図11のステップS373,S375、及び図13のステップS445により検出された指先の位置が安定していない場合でも、補正後の指先の位置を極力一定させ、あるいは、指先の位置の相違を極力小さい範囲に収めることができる。その結果、指先に対応するモニタ67の画面上の位置にカーソルを表示する場合、カーソルを安定化できる。
【0286】
また、補正後の指先を、ユーザが指先と認識する位置により一層近づけることができる。その結果、指先に対応するモニタ67の画面上の位置にカーソルを表示する場合、ユーザにとって、指先によるカーソルの制御が一層容易になる。
【0287】
さらに、本実施の形態では、指先画素P4と指先画素P4の斜め方向に位置する周囲画素(P0,P2,P6,P8)との間の距離と、指先画素P4と指先画素P4の水平方向又は垂直方向に位置する周囲画素(P1,P3,P5,P7)との間の距離と、が等しくなるように、周囲画素(P0,P2,P6,P8)の座標を定義する(図18(a)参照)。その結果、重みとして画素値を利用するに当って、全周囲画素の画素値が均等に扱われ、方向によって偏りのない補正を行なうことができる。
【0288】
さらに、本実施の形態によれば、CPU51は、被写体の形状(グー、チョキ、パー、1本指)を入力とした情報処理を実行することができる。
【0289】
さらに、本実施の形態によれば、指先と水かきとの間の画素に基づいて指を特定し(図9のステップS257及びS259、図17参照)、輪郭画像の重心により指を特定しないので、重心により指を特定する場合と比較して、精度良く指を特定でき(図9)、ひいてはより精度良く手の形状を判定できる(図10、図11)。一般に、輪郭画像の重心と、被写体の重心と、は一致しない場合も多く、この場合に、重心により指を特定すると、認識の精度が低くなる。
【0290】
また、指先と水かきとの間の画素に基づいて得られた、隣り合う指と指とがなす角度だけでなく、重心から指先に相当する画素までの距離に基づいて、手の形状を判断するので(図11のステップS345〜S351)、より多様な手の形状を判定できる(図11)。例えば、手の形状が「チョキ」であることを判定できる。
【0291】
また、重心から輪郭線上の画素までの距離を求めるといった簡単な計算で(図8のステップS203)、手の形状を判定できる(図12)。例えば、重心から輪郭線上の画素までの距離が、一定範囲内の場合に、手の形状が「グー」であることを判定できる。
【0292】
さらに、本実施の形態によれば、図9のステップS275の結果だけに基づいて、検出された指先の数を判断するのではなく、さらに、重心座標(Xg,Yg)と凸点(図6のステップS33)の画素Pjの座標との間の距離Dを加味して(図13のステップS427,S441)、指が1本だけ立っている状態か否かを判定する。このため、より精度よく、指が1本だけ立っている状態を検出できる。
【0293】
さらに、本実施の形態によれば、画像上の被写体の面積は(図8のステップS213)、イメージセンサ5と被写体との間の距離に相関するので、面積により、イメージセンサ5と被写体との間の距離を容易に判断できる。
【0294】
図30は、本発明の実施の形態の変形例によるコンピュータシステムの階層図である。なお、図1と同様の部分については、同じ参照符号を付して適宜説明を省略する。図30を参照して、変形例によるコンピュータシステムは、オペレーティングシステム300により管理される。オペレーティングシステム300のウィンドウシステム400は、オペレーティングシステム300上で並行して動作する複数のアプリケーションプログラム100にそれぞれ固有のウィンドウを割り当て制御する。また、ウィンドウシステム400は、モニタ67の画面に表示するカーソルを制御する。
【0295】
ミドルウェア250は、オペレーティングシステム300上で動作し、オペレーティングシステム300にない特定の機能を、各アプリケーションプログラム100に提供する。例えば、この特定の機能は、モーションセンサ600が検出したユーザの手の情報に基づきウィンドウを制御するための機能である。より具体的な例を挙げると、この特定の機能は、モーションセンサ600が検出したユーザの手の位置情報に基づき、速度及び/又は方向を算出する機能である。例えば、この特定の機能は、モーションセンサ600が検出したユーザの手の位置情報に基づき、所定の軌跡を描いたか否かを判断する機能である。例えば、この特定の機能は、手の面積が一定値以上になったか否かを判断する機能である。例えば、手の回転角度を算出する機能である。例えば、手の加速度を算出する機能である。例えば、手の形状の所定の変化(例えば「パー」から「グー」への変化)を検出する機能である。
【0296】
また、ミドルウェア250は、ウィンドウシステム400の代わりに、図27〜図29の処理を実行することもできる。
【0297】
なお、ミドルウェア250は、これら機能の結果をイベントの発生として、アプリケーションプログラム100に通知することもできる。また、ミドルウェア250は、オペレーティングシステム300から、モーションセンサ600が検出したユーザの手の情報を取得する。
【0298】
以上のように、変形例では、マウス等の接触型ポインティングデバイスで入力できる操作又はイベントはもちろん、接触型ポインティングデバイスでは入力することができない操作又はイベントをも入力できる。従って、各アプリケーションプログラム100は、多彩な入力又はイベントに応じた処理(ウィンドウの制御を含む。)を実行することができる。
【0299】
また、各アプリケーションプログラム100は、API200(図30では図示省略)を介して、ウィンドウシステム400の機能を利用でき、割り当てられたウィンドウを制御する。この点は、図1の場合と同じである。なお、ミドルウェア250の特定の機能は、API200を介して、各アプリケーションプログラム100に提供されてもよい。
【0300】
なお、変形例によるコンピュータシステムの電気的構成は、図2(a)及び図2(b)に示したものと同じである。また、変形例は、上記実施の形態のコンピュータシステム700と同様の技術的特徴を有するので、コンピュータシステム700と同様の効果を有する。
【0301】
なお、本発明は、上記の実施の形態に限られるものではなく、その要旨を逸脱しない範囲で種々の態様において実施することが可能であり、例えば、以下のような変形も可能である。
【0302】
(1)上記では、「グー」、「チョキ」、「パー」、及び「1本指」の形状を認識したが、これに限定されない。
【0303】
(2)モーションセンサ600は、赤外発光ダイオード9を搭載した。しかし、赤外発光ダイオード9は必須ではない。赤外発光ダイオード9を搭載しない場合、イメージセンサ5は、露光時画像のみを出力し、MCU3は、その画像を処理する。
【0304】
(3)上記では、指先画素P4を原点(0,0)として、周囲画素の座標値を設定し、補正値(Xc,Yc)を算出し、それを指先画素P4の座標(Xb,Yb)に加算することで、補正座標(Xf,Yf)を得た(図18(a)及び図18(b))。ただし、図14の第1〜第4の例の各式で使用する座標の原点は、これに限定されない。例えば、図11のステップS373,S375、及び図13のステップS445で求められた座標を、そのまま、指先画素P4の座標として使用して、周囲画素の座標を定め、補正座標(Xf,Yf)を求めることもできる。この場合は、図14(a)〜図14(d)の各ステップで得られた値(Xc,Yc)が、補正座標(Xf,Yf)そのものであり、加算は不要である。
【0305】
(4)上記では、ポインティングデバイスとして、モーションセンサ600のみを搭載した。ただし、マウス等の他のポインティングデバイスと併用することもできる。これにより、モーションセンサ600及びマウス等の他のポインティングデバイスのそれぞれの利点を活かすことができる。
【0306】
(5)上記例では、モーションセンサ600が検出する手の情報は、手の形状、手の形状の変化、手の面積、手の移動、手の移動軌跡、及び、指先の位置ないしは移動であった。ただし、モーションセンサ600が検出する手の情報は、これらに限定されない。例えば、モーションセンサ600によって検出されるユーザの手の情報は、手の動き(例えば、手の回転、指先の動き)、手の速度、及び/又は、手の加速度であってもよい。手の回転とは、例えば、手首を軸として、時計回り及び/又は反時計回りに、手を回転させる動作である。この場合、例えば、あたかも実際のダイヤルを握っているかのような手をして、手を回転させる。
【0307】
また、モーションセンサ600が検出する手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、手自体の動き、位置、移動、移動軌跡、速度、および、加速度のみを意味するのではなく、手の指先の動き、位置、移動、移動軌跡、速度、および、加速度を含む概念である。また、この場合、指先は、一本の指に限らず、複数本の指の指先を含んでよい。さらに、手は、片手であってもよいし、両手であってもよい。
【0308】
なお、ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、総称して、ジェスチャと呼ぶこともできる。
【0309】
(6)図1及び図30では、ウィンドウシステム400は、オペレーティングシステム300に含まれていたが、オペレーティングシステム300上で動作するプログラムと考えることもできる。また、デバイスドライバ500は、オペレーティングシステム300に含まれていないが、オペレーティングシステム300に含まれる機能と考えることもできる。
【0310】
(7)CPU51が、モーションセンサ600をマウスとして認識するように、モーションセンサ600内の情報設定を行なうこともできる。つまり、CPU51に、モーションセンサ600をマウスとして認識させるのである。この場合、指先の水平方向(X軸方向)及び垂直方向(Y軸方向)の移動量が、それぞれ、マウスの水平方向(X軸方向)及び垂直方向(Y軸方向)の移動量に対応し、擬似的なボタン操作が、マウスボタンの押下に対応する。この場合は、マウスと同等の入力操作以外の、モーションセンサ600特有の入力に関しては、変形例によるミドルウェア250により対応する。
【0311】
(8)図23(a)の第4の例では、所定時間TC内に、シングルクリック操作に対応するジェスチャが検出されない場合は、矩形範囲52が解除されシングルクリック操作判定がリセットされた(図25のステップS1284)。
【0312】
ただし、MCU3が、指先50が矩形範囲52から消失したと判断した後(ステップS1254で肯定判断)の所定時間TC2内に、指先50が矩形範囲52に出現したと判断しない場合、矩形範囲52を解除し、シングルクリック操作判定をリセットしてもよい。なお、MCU3が、矩形範囲52設定後所定時間TC内に、指先50が矩形範囲52から消失したと判断しない場合に、矩形範囲52を解除する点は、図25と同じである。
【0313】
このように、所定時間TC2内に、MCU3が、指先50が矩形範囲52に出現したと判断しない場合、ユーザがクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してクリック操作が行なわれたと判定されることを防止できる。つまり、一般にクリック操作は素早く行なわれるところ、所定時間TC2を適切に設定することにより、同一の動きであっても、クリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0314】
また、図23(b)の第4の例では、所定時間TC内に、ダブルクリック操作に対応するジェスチャが検出されない場合は、ダブルクリック操作判定がリセットされた(図25のステップS1284)。
【0315】
ただし、仮クリックフラグがオンになった後において、MCU3が、指先50が矩形範囲52から消失したと判断した後の所定時間TC3内に、指先50が矩形範囲52に出現したと判断しない場合、矩形範囲52を解除し、ダブルクリック操作判定をリセットしてもよい。なお、仮クリックフラグがオンになった後において、MCU3が、矩形範囲52の設定後所定時間TC内に、指先50が矩形範囲52から消失したと判断しない場合に、矩形範囲52を解除する点は、図25と同じである。また、仮クリックフラグがオンになるまでの判定(シングルクリックの判定)は図25又は上記変形と同じである。
【0316】
このように、所定時間TC3内に、MCU3が、指先50が矩形範囲52に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間TC3を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0317】
また、MCU3が、指先50が矩形範囲に出現したと判断してから、つまり、仮クリックフラグをオンにしてから所定時間TC4内に、指先50が矩形範囲52から消失したと判断しない場合、矩形範囲52を解除し、ダブルクリック操作判定をリセットしてもよい。なお、仮クリックフラグがオンになるまでの判定(シングルクリックの判定)は図25又は上記変形と同じである。
【0318】
このように、所定時間TC4内に、MCU3が、指先50が矩形範囲52から消失したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間TC4を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0319】
さらに、この場合、MCU3が、仮クリックフラグをオンにしてから所定時間TC4内に、指先50の消失の後、再び指先50が矩形範囲52に出現したと判断しない場合、矩形範囲52を解除し、ダブルクリック操作判定をリセットしてもよい。
【0320】
このように、所定時間TC4内に、MCU3が、指先50が矩形範囲52に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間TC4を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0321】
また、このような判定に代えて、MCU3が、仮クリックフラグをオンにしてから所定時間TC4内の指先50の消失の後の所定時間TC5内に、指先50が矩形範囲52に出現したと判断しない場合、矩形範囲52を解除し、ダブルクリック操作判定をリセットすることもできる。
【0322】
このように、所定時間TC5内に、MCU3が、指先50が矩形範囲52に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間TC5を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0323】
ここで、上記の所定時間TC2〜TC5は、実験及び試行錯誤等により決定される。
【0324】
(9)ジェスチャによるコントロールは、特に、プレゼンテーション用のアプリケーションプログラム100が表示するウィンドウのコントロールに有効である。なぜなら、一般に、プレゼンテーションを行う人は、端末から離れてプレゼンテーションを行う場合も多いからである。
【0325】
(10)上記では、モーションセンサ600によるマルチウィンドウの制御に焦点を当てて説明した。ただし、本発明が、マルチウィンドウの制御に限定されないことは言うまでもない。つまり、モーションセンサ600のジェスチャコントロール機能とポインティングデバイス機能とを、1つのウィンドウ(アプリケーションプログラム100)を制御するために使用することもできる。この場合も、ジェスチャコントロール機能とポインティングデバイス機能とを制御内容に応じて使い分けて、マルチウィンドウの制御と同様に、ユーザに快適な操作性を提供できる。
【0326】
(11)上記では、イメージセンサ5が差分画像を生成した。ただし、MCU3が、赤外光発光時画像と非発光時画像との差分画像を生成することもできる。この場合、イメージセンサ5及びMCU3を、撮影装置と呼ぶこともできる。もちろん、上記実施の形態において、イメージセンサ5及びMCU3を、撮影装置と呼ぶこともできる。
【0327】
(12)MCU3が行なう処理の全部又は一部をCPU51が行なうこともできるし、逆に、CPU51が行なう処理の全部又は一部をMCU3が行うこともできる。要するに、どちらがどの処理を行なうかは、仕様に応じて、任意に決定できる。例えば、イメージセンサ5が生成した差分画像を、CPU51に渡し、CPU51が、画像解析を行って、手の検出等を行ってもよい。
【0328】
(13)MCU3に各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、また、並列的あるいは個別に実行される処理も含むものである。
【0329】
(14)本明細書及び請求の範囲において、手段とは必ずしも物理的手段を意味するものではなく、各手段の機能がソフトウェアによって実現される場合も含む。さらに、1つの手段の機能が2つ以上の物理的手段により実現されても、もしくは2つ以上の手段の機能が1つの物理的手段により実現されてもよい。
【産業上の利用可能性】
【0330】
本発明は、マルチウィンドウを操作するためのポインティングデバイスを必要とするコンピュータの分野に利用可能である。
【符号の説明】
【0331】
3…MCU、5…イメージセンサ、7…メモリ、9…赤外発光ダイオード、50…コンピュータ、51…CPU、53…メインメモリ、55…チップセット、57…GPU、59…SPU、61…HDD、63…ドライブ、65…通信部、67…モニタ、69…スピーカ、71…キーボード、75…リムーバブル記録媒体、100…アプリケーションプログラム、200…アプリケーションプログラムインタフェース(API)、250…ミドルウェア、300…オペレーティングシステム、400…ウィンドウシステム、500…デバイスドライバ、600…モーションセンサ。
【技術分野】
【0001】
本発明は、三次元空間中の人の手の動きを撮影し、撮影画像を解析して、解析結果をポインティングに利用するコンピュータシステム及びその関連技術に関する。
【背景技術】
【0002】
特許文献1は、非接触型ポインティングデバイスであるカーソル操作装置を開示する。このカーソル操作装置は、カメラにより三次元空間中のユーザの指先の動きを検出して、その動きにカーソルを追従させ、非接触で機器を操作する。そして、カーソル操作装置は、画面に表示されたボタンの上にカーソルが一定時間滞在すると、クリック操作がなされたと判断し、そのボタンが押下されたとみなす。
【0003】
なお、マウスやタッチパッド等、ユーザが接触して操作するポインティングデバイスを、非接触型に対して、接触型ポインティングデバイスと呼ぶ。
【0004】
ところで、マイクロソフトコーポレーションが提供するオペレーティングシステムであるWindows(登録商標)は、並行して動作する複数のアプリケーションそれぞれに固有のウィンドウを割り当て画面出力を多重化するウィンドウシステムを搭載する。各アプリケーションプログラムは、ウィンドウシステムの機能を利用して、それぞれに割り当てられたウィンドウを制御する。
【0005】
ユーザは、マウス等のポインティングデバイスを操作し、ウィンドウシステムを介して、同一画面に表示された複数のウィンドウ(マルチウィンドウ)を操作する。つまり、ウィンドウシステムは、ユーザが操作するポインティングデバイスの情報に基づいて、ユーザによるウィンドウの操作を検出し、依頼先のアプリケーションに通知する。アプリケーションプログラムは、その通知を受けて、自分に割り当てられたウィンドウを制御する。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開2004−258837
【発明の概要】
【発明が解決しようとする課題】
【0007】
しかしながら、マウス等の接触型ポインティングデバイスにより、マルチウィンドウを操作することは、ユーザに対して、必ずしも快適な操作性を提供しない。なぜなら、接触型ポインティングデバイスでは、ユーザの操作が限定的だからである。例えば、マウスの場合、マウスの移動とマウスボタンの操作しかできない。
【0008】
そこで、本発明は、マルチウィンドウの操作において、ユーザに快適な操作性を提供できるコンピュータシステム及びその関連技術を提供することを目的とする。
【課題を解決するための手段】
【0009】
本発明の第1の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、を備え、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する。
【0010】
この構成によれば、各アプリケーションプログラムは、モーションセンサにより検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手をモーションセンサにより撮影し、撮影画像からの検出結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【0011】
「多彩な入力」とは、例えば、手の形状(グー、チョキ、パー、一本指、)、手の形状の変化、手の面積(モーションセンサと手との間の距離に相関)、手の動き(例えば、手の回転、指先の動き)、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度、などである。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本発明では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、手の形状の所定の変化により、擬似的にボタン操作が行なわれたとみなすことにより、マウスと同等の機能を包含できる。
【0012】
このように、モーションセンサは、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【0013】
また、モーションセンサが差分画像を解析して手を検出するので、このような処理をウィンドウシステムは行なう必要がなく、その処理負荷を軽減でき、また、ウィンドウシステムのプログラマは、手を検出するためのプログラムを作成する必要がなく、その負担を軽減できる。つまり、コンピュータシステムに簡易にモーションセンサを搭載できる。
【0014】
本発明の第2の観点によれば、コンピュータシステムは、複数のアプリケーションが並行して動作可能なコンピュータシステムであって、前記コンピュータシステム全体を管理するオペレーティングシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、前記モーションセンサを制御し、前記モーションセンサから解析結果である前記ユーザの手の情報を受け取って、前記オペレーティングシステムに渡すデバイスドライバと、前記デバイスドライバから受け取った前記ユーザの手の情報に基づく前記オペレーティングシステムの所定機能を前記各アプリケーションプログラムに提供するアプリケーションプログラムインタフェースと、を備え、前記オペレーティングシステムは、並行して動作する前記複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムを含み、前記所定機能は、前記ウィンドウを前記モーションセンサが検出した前記ユーザの手の情報に基づき制御するための前記ウィンドウシステムの機能である。
【0015】
この構成によれば、上記第1の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第1の観点によるコンピュータシステムと同様の効果を奏する。
【0016】
上記第1及び第2の観点によるコンピュータシステムにおいて、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、画面上のカーソルを制御する。
【0017】
この構成によれば、ユーザは、三次元空間中で手を動かしながら、非接触で、カーソルを操作できる。
【0018】
上記第1及び第2の観点によるコンピュータシステムにおいて、前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、前記アプリケーションプログラムから依頼されたイベントが発生したか否かを監視し、前記イベントが発生した場合に、依頼主である前記アプリケーションプログラムに、前記イベントの発生を通知するイベント監視手段を含む。
【0019】
この構成によれば、アプリケーションプログラムをイベント駆動型プログラムとして作成することができ、ウィンドウの制御に好適である。
【0020】
上記第1及び第2の観点によるコンピュータシステムにおいて、前記モーションセンサによって検出される前記ユーザの手の情報は、前記ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度の情報の一部または全部である。
【0021】
この構成によれば、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができる。
【0022】
ここで、本明細書及び特許請求の範囲において、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、手自体の動き、位置、移動、移動軌跡、速度、および、加速度のみを意味するのではなく、手の指先の動き、位置、移動、移動軌跡、速度、および、加速度を含む概念である。また、この場合、指先は、一本の指に限らず、複数本の指の指先を含んでよい。さらに、手は、片手であってもよいし、両手であってもよい。
【0023】
本発明の第3の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供するミドルウェアと、を備える。
【0024】
この構成によれば、上記第1の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第1の観点によるコンピュータシステムと同様の効果を奏する。
【0025】
本発明の第4の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を生成する撮影手段と、前記差分画像を解析して、前記ユーザの手の情報を取得する解析手段と、を備え、前記ウィンドウシステムは、前記解析手段が取得した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する。
【0026】
この構成によれば、各アプリケーションプログラムは、撮影手段及び解析手段により検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手を撮影手段により撮影し、解析手段による撮影画像の解析結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【0027】
「多彩な入力」とは、例えば、手の形状(グー、チョキ、パー、一本指、)、手の形状の変化、手の面積(モーションセンサと手との間の距離に相関)、手の動き(例えば、手の回転、指先の動き)、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度、などである。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本発明では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、手の形状の所定の変化により、擬似的にボタン操作が行なわれたとみなすことにより、マウスと同等の機能を包含できる。
【0028】
このように、モーションセンサは、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【0029】
本発明の第5の観点によれば、コンピュータシステムは、並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を生成する撮影手段と、前記差分画像を解析して、前記ユーザの手の情報を取得するミドルウェアと、を備え、前記ミドルウェアは、前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供する。
【0030】
この構成によれば、上記第4の観点によるコンピュータシステムと同様の技術的特徴を有するので、上記第4の観点によるコンピュータシステムと同様の効果を奏する。
【図面の簡単な説明】
【0031】
【図1】本発明の実施の形態によるコンピュータシステム700の階層図である。
【図2】(a)本発明の実施の形態によるコンピュータシステム700の電気的構成を示す図である。(b)図2(a)のモーションセンサ600の電気的構成を示す図である。
【図3】(a)本発明の実施の形態による擬似ボタン操作の説明図である。(b)本発明の実施の形態による擬似ボタン操作の第1〜第3の例の説明図である。
【図4】図2のMCU3による画像解析処理の流れの一例を示すフローチャートである。
【図5】図4のステップS1の2値化処理の流れの一例を示すフローチャートである。
【図6】図4のステップS7の変曲点の検出処理の流れの一例を示すフローチャートである。
【図7】図4のステップS9の輪郭画像の形状を判定する処理の流れの一例を示すフローチャートである。
【図8】図7のステップS161の輪郭情報を算出する処理の流れの一例を示すフローチャートである。
【図9】図7のステップS163の指先を検出する処理の流れの一例を示すフローチャートである。
【図10】図7のステップS165の「パー」を判定する処理の流れの一例を示すフローチャートである。
【図11】図7のステップS167の「チョキ」を判定する処理の流れの一例を示すフローチャートである。
【図12】図7のステップS169の「グー」を判定する処理の流れの一例を示すフローチャートである。
【図13】図7のステップS171の一本指を判定する処理の流れの一例を示すフローチャートである。
【図14】(a)図11のステップS377及び図13のステップS447の指先補正値計算処理の第1の例の流れを示すフローチャートである。(b)図11のステップS377及び図13のステップS447の指先補正値計算処理の第2の例の流れを示すフローチャートである。(c)図11のステップS377及び図13のステップS447の指先補正値計算処理の第3の例の流れを示すフローチャートである。(d)図11のステップS377及び図13のステップS447の指先補正値計算処理の第4の例の流れを示すフローチャートである。
【図15】(a)図4のステップS11の擬似ボタン操作判定処理の第1の例の流れを示すフローチャートである。(b)図4のステップS11の擬似ボタン操作判定処理の第2の例の流れを示すフローチャートである。(c)図4のステップS11の擬似ボタン操作判定処理の第3の例の流れを示すフローチャートである。
【図16】図4のステップS5で検出される偏角θjの説明図である。
【図17】図4のステップS7で検出される変曲点及び図7のステップS163で検出される指先の説明図である。
【図18】(a)図14(a)及び図14(c)の指先補正値計算処理の説明図である。(b)図14(b)及び図14(d)の指先補正値計算処理の説明図である。
【図19】指先補正値計算処理における除数の説明図である。
【図20】図1のウィンドウシステム400によるイベント監視処理の流れの一例を示すフローチャートである。
【図21】図1のウィンドウシステム400によるカーソル制御処理の流れの一例を示すフローチャートである。
【図22】(a)図4のステップS11の擬似ボタン操作判定処理の第4の例の流れを示すフローチャートである。(b)図4のステップS11の擬似ボタン操作判定処理の第5の例の流れを示すフローチャートである。(c)図4のステップS11の擬似ボタン操作判定処理の第6の例の流れを示すフローチャートである。
【図23】(a)本発明の実施の形態による擬似ボタン操作の第4の例(シングルクリック)の説明図である。(b)本発明の実施の形態による擬似ボタン操作の第4の例(ダブルクリック)の説明図である。
【図24】図4のステップS11の擬似ボタン操作判定処理の第7の例の流れの一部を示すフローチャートである。
【図25】図4のステップS11の擬似ボタン操作判定処理の第7の例の流れの他の一部を示すフローチャートである。
【図26】図1のウィンドウシステム400が受け付け可能なジェスチャの例示図である。
【図27】図1のウィンドウシステム400によるジェスチャ判定処理の流れの一例を示すフローチャートである。
【図28】図27のステップS102のジェスチャ1〜4の判定処理の流れの一部の一例を示すフローチャートである。
【図29】図27のステップS102のジェスチャ1〜4の判定処理の流れの他の一部の一例を示すフローチャートである。
【図30】本発明の実施の形態の変形例によるコンピュータシステムの階層図である。
【発明を実施するための形態】
【0032】
以下、本発明の実施の形態について、図面を参照しながら説明する。なお、図中、同一または相当部分については同一の参照符号を付してその説明を援用する。また、本明細書において、数字の後尾に付した「h」は、16進数であることを示す。
【0033】
図1は、本発明の実施の形態によるコンピュータシステム700の階層図である。図1を参照して、このコンピュータシステム700は、オペレーティングシステム300により管理される。オペレーティングシステム300は、ハードウェアを抽象化したインタフェースをアプリケーションプログラム100に提供するソフトウェアである。ハードウェアの抽象化とは、ハードウェアの統一的で単純化された利用方法を提供することである。また、オペレーティングシステム300は、プロセス管理やメモリ管理を行い、ファイルシステムを有し、グラフィカルユーザインタフェース(GUI)や通信機能等を提供する。
【0034】
オペレーティングシステム300は、その機能の一つとしてウィンドウシステム400を含む。ウィンドウシステム400は、オペレーティングシステム300上で並行して動作する複数のアプリケーションプログラム100にそれぞれ固有のウィンドウを割り当て制御する。これらの複数のウィンドウ(マルチウィンドウ)は、後述するモニタ67の画面上に表示される。また、ウィンドウシステム400は、モニタ67の画面に表示するカーソルを制御する。
【0035】
アプリケーションプログラム100は、オペレーティングシステム300上で動作し、コンピュータシステム700の利用者がコンピュータシステム700上で実行したい作業を実施する機能を直接的に有するソフトウェアである。
【0036】
アプリケーションプログラムインタフェース(API)200は、各アプリケーションプログラム100からオペレーティングシステムの各種機能を呼び出すためのインタフェースである。API200は、アプリケーションプログラム100から呼び出すことができるオペレーティングシステム300の機能と定義することもできる。なお、APIはシステムコールと呼ばれることもある。
【0037】
従って、各アプリケーションプログラム100は、API200を介して、オペレーティングシステム300の各種機能を利用することができる。例えば、各アプリケーションプログラム100は、API200を介して、ウィンドウシステム400を利用することができる。
【0038】
一方、ポインティングデバイスとしてのモーションセンサ600は、デバイスドライバ500により制御される。モーションセンサ600は、後述するイメージセンサ5を備えており、イメージセンサ5により、ユーザの手を撮影し、その画像を解析して、解析結果をデバイスドライバ500に出力する。
【0039】
デバイスドライバ500は、オペレーティングシステム300の環境下で動作し、モーションセンサ600から受け取った解析結果を、オペレーティングシステム300に渡す。
【0040】
オペレーティングシステム300は、モーションセンサ600の解析結果に基づく各種機能を、API200を介して、各アプリケーションプログラム100に提供することができる。例えば、各アプリケーションプログラム100は、API200を介して、モーションセンサ600の解析結果に基づくウィンドウシステム400の機能を利用することができる。
【0041】
図2(a)は、本発明の実施の形態によるコンピュータシステム700の電気的構成を示す図である。図2(a)を参照して、コンピュータシステム700は、コンピュータ50、モニタ67、スピーカ69、及び、キーボード71を含む。コンピュータ50は、CPU(中央演算処理装置)51、メインメモリ53、チップセット55、GPU(グラフィックスプロセシングユニット)57、SPU(サウンドプロセシングユニット)59、HDD(ハードディスクドライブ)61、ドライブ63、通信部65、及びモーションセンサ600を含む。
【0042】
CPU51は、HDD61に格納されたコンピュータプログラムを実行して各種演算を行う。メインメモリ53は、CPU51から直接読み書きが行われる高速のメモリである。GPU57は、グラフィックス処理を実行し、モニタ67に映像信号を与える。モニタ67は与えられた映像信号に応じて映像を表示する。SPU59は、サウンド処理を実行し、スピーカ69に音声信号を与える。スピーカ69は与えられた音声信号に応じて音声を出力する。HDD61は、コンピュータプログラム及びデータを格納するための補助記憶装置である。ドライブ63は、リムーバブル記録媒体75からデータを読み込んだり、書き込んだりする装置である。通信部65は、ネットワークへの接続を司るLANカードやUSBコントローラなどを含み(図示せず)、通信を制御する。
【0043】
CPU51、GPU57、SPU59、HDD61、ドライブ63、通信部65、キーボード71、及びモーションセンサ600といった機能ユニットは、チップセット55に接続される。チップセット55は、これに接続される機能ユニット間のデータの受け渡しを管理する。
【0044】
HDD61は、図1のアプリケーションプログラム100、API200、オペレーティングシステム300、ウィンドウシステム400、及び、デバイスドライバ500を格納する。CPU51は、これらのプログラムを、メインメモリ53にロードし、実行する。そして、CPU51は、実行結果を、モニタ67やスピーカ69に出力し、あるいは、HDD61やメインメモリ53に格納する。
【0045】
なお、図1のアプリケーションプログラム100、API200、オペレーティングシステム300、ウィンドウシステム400、及び、デバイスドライバ500は、リムーバブル記録媒体75からHDD61に格納されてもよいし、あるいは、ネットワーク経由でHDD61に格納されてもよい。リムーバブル記録媒体75は、例えば、CD(CD−ROM、Video−CDを含む)やDVD(DVD−Video、DVD−ROM、DVD−RAMを含む)等の光ディスク、半導体メモリを搭載したメモリカード・メモリカートリッジ・USBメモリ、光磁気ディスク、磁気テープ、及び/又は、フレキシブルディスク等である。
【0046】
図2(b)は、図2(a)のモーションセンサ600の電気的構成を示す図である。図2(b)を参照して、このモーションセンサ600は、MCU(Micro Controler Unit)3、イメージセンサ5、及び赤外発光ダイオード9を含む。MCU3は、メモリ7を含む。イメージセンサ5は、カラー及びグレースケールのいずれでも使用でき、また、その画素数も任意にものを使用できるが、本実施の形態では、グレースケールで、64×64画素の比較的低解像度のものを使用する。赤外発光ダイオード9は、赤外光を発光する。また、イメージセンサ5としては、CMOSイメージセンサやCCDイメージセンサ等を採用できる。
【0047】
MCU3のメモリ7は、RAM、ROM、及びフラッシュメモリ等の半導体メモリであり、プログラム格納領域、データ格納領域、作業領域、及び一時格納領域等として利用される。MCU3は、メモリ7に格納されたプログラムに従って、後述のフローチャートで示される各種処理を実行する。なお、仕様に応じて、記録媒体として、メモリ7の他、CD(CD−ROM、Video−CDを含む)やDVD(DVD−Video、DVD−ROM、DVD−RAMを含む)等の光ディスク、半導体メモリを搭載したメモリカード・メモリカートリッジ・USBメモリ、ハードディスク、光磁気ディスク、磁気テープ、及び、フレキシブルディスク等を、MCU3に接続することもできる。そして、これらにプログラムやデータなどを格納することもできる。
【0048】
MCU3は、メモリ7に格納されたプログラムに従って、イメージセンサ5を制御する。イメージセンサ5は、MCU3の制御の下、赤外発光ダイオード9を間欠的に駆動し、三次元空間中で動かされる被写体(本実施の形態では人の手)に赤外光を間欠的に照射する。イメージセンサ5は、赤外光照射時及び非照射時の双方において、撮影処理を実行し、赤外光照射時画像と非照射時画像との差分画像を生成して、MCU3に出力する。差分をとることにより、背景等のノイズを簡易に除去でき、簡易に被写体の像のみを抽出できる。
【0049】
MCU3は、メモリ7に格納されたプログラムに従って、イメージセンサ5から受け取った差分画像を解析して、ユーザの手を検出して、その形状、面積、重心位置、及び、指先位置、並びに、擬似的なボタン操作の有無の情報等を、チップセット55を介して、CPU51に与える。すると、CPU51は、モーションセンサ600の解析結果である手の情報に基づき、各種処理を実行する。
【0050】
図3(a)及び図3(b)は、本発明の実施の形態による擬似ボタン操作の説明図である。図3(a)を参照して、モーションセンサ600は、ユーザ(人)の手を撮影し、得られた画像を解析することによって、指先a及びbの位置を求める。この例では、指先aは、人差し指の指先であり、指先bは、親指の指先である。
【0051】
図3(b)を参照して、第1の例では、CPU51は、モーションセンサ600から指先aの位置を受け取って、モニタ67の画面上の対応する位置にカーソルを表示する。また、モーションセンサ600は、撮影画像中に指先aと指先bとが存在する状態から、撮影画像中に指先aのみが存在する状態へ遷移したことを検出すると、例えば、二本の指(親指及び人差し指)が写っている状態から、カーソルの位置に関係ない一本の指(親指)が折り曲げられ、カーソルの位置を制御する他の一本の指(人差し指)のみが写っている状態に遷移したことを検出すると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをCPU51に通知する。すると、CPU51は、ボタン操作に応じた処理を実行する。
【0052】
第2の例では、CPU51は、モーションセンサ600から指先aの位置を受け取って、モニタ67の画面上の対応する位置にカーソルを表示する。また、モーションセンサ600は、撮影画像中に指先aのみが存在する状態から、撮影画像中に指先aと指先bとが存在する状態へ遷移したことを検出すると、例えば、カーソルの位置に関係ない一本の指(親指)が折り曲げられ、カーソルの位置を制御する他の一本の指(人差し指)のみが写っている状態から、二本の指(親指及び人差し指)が写っている状態に遷移したことを検出すると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをCPU51に通知する。すると、CPU51は、ボタン操作に応じた処理を実行する。
【0053】
第3の例では、CPU51は、モーションセンサ600から指先aの位置と指先bの位置との中点の位置を受け取って、モニタ67の画面上の対応する位置にカーソルを表示する。また、モーションセンサ600は、指先aと指先bとの間の距離を算出して、その距離が一定値以下になったことを検出すると、つまり、指先aと指先bとが近づいて、その距離が一定値以下になると、ユーザが擬似的にボタン操作を行なったと判定し、擬似的にボタン操作が行なわれたことをCPU51に通知する。すると、CPU51は、ボタン操作に応じた処理を実行する。
【0054】
ここで、上記第1〜第3の例において、擬似的にボタン操作が行われたと判定されたことを、ボタンのプレス操作(ボタンを押したままの状態)が行なわれたとみなすこともできるし、あるいは、クリック操作(ボタンを押下して放す操作)が行なわれたとみなすこともできる。
【0055】
なお、擬似的にボタン操作が行われたと判定されたことを、ボタンのプレス操作が行なわれたとみなす場合、ボタンを放したとみなす操作は、次のようにして判定される。
【0056】
第1の例では、モーションセンサ600は、撮影画像中に指先aのみが存在する状態から、撮影画像中に指先aと指先bとが存在する状態へ遷移したことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを話す操作が行なわれたことをCPU51に通知する。
【0057】
第2の例では、モーションセンサ600は、撮影画像中に指先aと指先bとが存在する状態から、撮影画像中に指先aのみが存在する状態へ遷移したことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを放す操作が行なわれたことをCPU51に通知する。
【0058】
第3の例では、モーションセンサ600は、指先aと指先bとの間の距離を算出して、その距離が一定値以下になった後、再び、その距離が一定値を超えたことを検出すると、ユーザが擬似的にボタンを放す操作を行なったと判定し、擬似的にボタンを放す操作が行なわれたことをCPU51に通知する。
【0059】
ここで、「擬似的なボタン操作」とは、ポインティングデバイス等のデバイスの実際のボタンの操作ではないが、実際のボタンを操作する場合と同等の情報ないしは命令を、三次元空間中のジェスチャにより、コンピュータに与えることを意味する。
【0060】
次に、フローチャートを用いてモーションセンサ600のMCU3の処理の詳細を説明する。
【0061】
図4は、図2のMCU3による画像解析処理の流れの一例を示すフローチャートである。図4を参照して、ステップS1にて、MCU3は、イメージセンサ5が出力した差分画像を2値化する。ステップS3にて、MCU3は、2値化された差分画像から被写体(本実施の形態では手)の像の輪郭線を抽出する。この処理では、輪郭線上の各画素Pj(j=0〜J−1)の座標(XO[j],YO[j])を求める。
【0062】
ここで、本実施の形態では、値Jは、輪郭線上の画素Pjの総数を示す。また、反時計回りに輪郭線の抽出処理が実行されるものとする。
【0063】
輪郭線を抽出するためのアルゴリズムは、周知のものを使用できる。例えば、3×3の小画素領域からなるマスクを用いる方法で、このマスクの中心を輪郭線上にたえずおきならが、順次、マスクを移動して、輪郭線を抽出する。
【0064】
ステップS5にて、MCU3は、抽出した輪郭線上の各画素PjのベクトルVjの偏角θjを算出する。
【0065】
図16は、図4のステップS5で検出される偏角θjの説明図である。図6を参照して、今、被写体の輪郭線上の3つの画素Pj−1,Pj,及びPj+1に注目する。また、輪郭線を反時計回りにスキャンするものとする。画素PjのベクトルVjは、画素Pjから次の画素Pj+1に向かうベクトルとして定義される。画素PjのベクトルVjの偏角θjは、画素Pjの1つ前の画素Pj−1のベクトルVj−1に対してベクトルVjがなす角度として定義される。反時計回りの偏角θjの符号は正であり、時計回りの偏角θjの符号は負である。
【0066】
図4に戻って、ステップS7にて、MCU3は、抽出した輪郭線の変曲点を検出する。変曲点は、輪郭線の向きが変化する点であり、凸点と凹点とが定義される。
【0067】
図17は、図4のステップS7で検出される変曲点の説明図である。図17を参照して、抽出した輪郭線21の向きが変化する点として、変曲点I0〜I8が挙げられる。変曲点I0,I2,I4,I6及びI8は凸点である。変曲点I1,I3,I5及びI7は凹点である。
【0068】
図4に戻って、ステップS9にて、MCU3は、抽出した輪郭線(輪郭画像)の形状(グー、チョキ、パー、一本指、不定)を判定する。ステップS11にて、MCU3は、擬似的なボタン操作が行なわれたか否かを判定する。ステップS13にて、MCU3は、ステップS1の結果(後述の掩蔽フラグ)、ステップS9の結果(輪郭画像の重心座標、面積、形状の情報(後述のフラグSH)、補正後の指先の座標、並びに、二つの指先の中点座標)、及びステップS11の結果(後述の擬似ボタンフラグないしはシングルクリックフラグ及びダブルクリックフラグ)をCPU51に送信する。なお、MCU3は、イメージセンサ5から1フレームの差分画像を受け取るたびに、ステップS1〜S13を繰り返す。
【0069】
図5は、図4のステップS1の2値化処理の流れの一例を示すフローチャートである。図5を参照して、ステップS50にて、MCU3は、差分画像の各画素Dの2値化後の値を代入する配列PD[][]並びに変数X,Y及びNAに0を代入する。ステップS51にて、MCU3は、イメージセンサ5から、差分画像の画素データDをリードする。なお、イメージセンサ5の解像度は64×64画素とする。また、イメージセンサ5からの差分画像の左上を原点とし、水平右方向をX座標の正、垂直下方向をY座標の正とする。そして、イメージセンサ5は、Y=0の行から、Xをインクリメントしながら、X=63まで、順次画素データDを出力する。そして、X=63の画素データDを出力した後、Yを1つインクリメントし、Y=1の行から、Xをインクリメントしながら、X=63まで、順次画素データDを出力する。イメージセンサ5は、このような処理をY=63まで行ない、差分画像の全画素Dを出力する。
【0070】
ステップS52にて、MCU3は、画素データ(輝度値)Dと所定の閾値THFとを比較する。そして、ステップS54にて、MCU3は、画素データDが閾値THFより大きい場合、その画素Dは手の像の一部であるとみなしステップS56に進み、それ以外はその画素Dは背景とみなしてステップS60に進む。ステップS56では、MCU3は、配列[X][Y]に1を代入する。そして、ステップS58にて、MCU3は、カウンタNAを1つインクリメントする。すなわち、カウンタNAは、1が代入された配列[X][Y]の数、つまり、手の像の一部とみなされた画素Dの数を示す。さらに言い換えると、カウンタNAは、手の像を構成する画素Dの数を示す。一方、ステップS60では、MCU3は、配列[X][Y]に0を代入する。
【0071】
ステップS62では、MCU3は、変数Xを1つインクリメントする。ステップS64にて、MCU3は、変数Xの値が64か否かを判断し、64の場合ステップS66に進み、それ以外はステップS51に戻る。ステップS66にて、MCU3は、変数Yを1つインクリメントする。ステップS68にて、MCU3は、変数Yの値が64になったか否かを判断し、64の場合ステップS70に進み、それ以外はステップS51に戻る。
【0072】
ステップS70にて、MCU3は、カウンタNAの値(つまり手の像の大きさ)が、所定値Arより大きいか否かを判断し、大きい場合イメージセンサ5がユーザの手で覆われた(掩蔽された)とみなしてステップS72に進み、それ以外はステップS76に進む。例えば、全画素数が、4096であるので、その約90%である3686を所定値Arとする。
【0073】
ステップS70で肯定判断の後、ステップS72にて、MCU3は、カウンタpを1つインクリメントする。カウンタpは、ステップS70の肯定判断の連続回数を示す。なお、カウンタpはシステム初期化時に0にセットされる。ステップS74にて、MCU3は、カウンタpの値が所定値Taより大きいか否かを判断し、大きい場合、所定時間連続してイメージセンサ5が手で覆われたことを意味するのでステップS78に進み、それ以外はステップS80に進む。ステップS78にて、MCU3は、所定時間連続してイメージセンサ5が手で覆われたこと示す掩蔽フラグをオンにする。一方、ステップS80では、MCU3は、掩蔽フラグをオフにする。
【0074】
ステップS70で否定判断の後、ステップS76にて、MCU3は、カウンタpに0を代入して、ステップS80に進む。
【0075】
以上のように、MCU3は、イメージセンサ5が出力する各画素Dを順次2値化して配列PD[][]に代入する。このように、差分画像(グレースケール)をメモリ7に持つことなく順次2値化することによりメモリ容量を削減できる。もちろん、MCU3は、イメージセンサ5が出力した差分画像(グレースケール)を一旦メモリ7に格納した後に、2値化することもできるし、あるいは、2値化せずにそのまま処理することもできる。
【0076】
図6は、図4のステップS7の変曲点の検出処理の流れの一例を示すフローチャートである。図6を参照して、ステップS21にて、MCU3は、変数DA,ADA,j,及びCF[]に0を代入する。ステップS23にて、MCU3は、図4のステップS3で検出された輪郭線上の画素Pjの偏角θjをメモリ7から取得する。ステップS25にて、MCU3は、変数DAの現在の値に偏角θjを加算して、変数DAに代入する。ステップS27にて、MCU3は、変数DAの絶対値を求めて、変数ADAに代入する。
【0077】
ステップS29にて、MCU3は、変数ADAの値が135度になったか否かを判断し、135度の場合輪郭線の向きが変わったと判断して、画素Pjを変曲点とみなしてステップS31に進み、それ以外はステップS39に進む。ステップS31では、MCU3は、変数DAの符号が正か否かを判断し、正の場合ステップS33に進み、負の場合ステップS35に進む。ステップS33では、MCU3は、凸凹フラグCF[j]に、変曲点が凸点であることを示す01を代入する。一方、ステップS35では、MCU3は、凸凹フラグCF[j]に、変曲点が凹点であることを示す10を代入する。
【0078】
ステップS37にて、MCU3は、変数DAに0を代入する。ステップS39にて、MCU3は、変数jを1つインクリメントする。ステップS41にて、MCU3は、変数jの値が、値Jと等しくなったか否かを判断し、j=Jの場合リターンし、それ以外はステップS23に進む。
【0079】
図7は、図4のステップS9の輪郭画像の形状を判定する処理の流れの一例を示すフローチャートである。図7を参照して、ステップS161にて、MCU3は、輪郭線に関する情報を算出する。ステップS163にて、MCU3は、輪郭画像から手の指先に相当する画素を検出する。
【0080】
再び、図17を参照して、凸点I0,I2,I4,I6及びI8を総称して、凸点As(s=0,1,…,S)と表記し、凹点I1,I3,I5及びI7を総称して、凹点Bt(t=0,1,…,T)と表記する。MCU3は、凸点Asから一定画素数Npだけ離れて位置する2つの画素を結ぶ線分23を求め、凸点Asから線分23に下ろした垂線25の長さLvを算出する。MCU3は、長さLvが、所定値CLを超えている場合に、その凸点Asを指先の候補とする。
【0081】
そして、MCU3は、指先の候補とした凸点Asの両側又は一方側に凹点Btが存在するか否かを判断し、存在する場合、その凸点Asを指先とみなす。
【0082】
また、MCU3は、「パー」及び「グー」を判定するのに必要な傾角θvを算出する。傾角θvは、指先とみなされた凸点Asから線分23に下ろした垂線25が、差分画像のX軸と平行な線27となす角である。
【0083】
図7に戻って、ステップS165にて、MCU3は、輪郭画像の形状が「パー」をした手の形状であるか否かを判定する。ステップS167にて、MCU3は、輪郭画像の形状が「チョキ」をした手の形状であるか否かを判定する。ステップS169にて、MCU3は、輪郭画像の形状が「グー」をした手の形状であるか否かを判定する。ステップS171にて、MCU3は、輪郭画像の形状が一本指を立てた手の形状であるか否かを判定してリターンする。
【0084】
図8は、図7のステップS161の輪郭情報を算出する処理の流れの一例を示すフローチャートである。図8を参照して、ステップS191にて、MCU3は、変数XG,YG及びjに0を代入する。ステップS193にて、MCU3は、変数XGの現在の値に輪郭線上の画素PjのX座標XO[j]を加算したものを、変数XGに代入する。また、MCU3は、変数YGの現在の値に輪郭線上の画素PjのY座標YO[j]を加算したものを、変数XGに代入する。ステップS195にて、MCU3は、変数jを1つインクリメントする。ステップS197にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS199に進み、それ以外はステップS193に進む。
【0085】
ステップS199にて、MCU3は、変数XGの値を値Jで除したものを、変数Xgに代入する。また、MCU3は、変数YGの値を値Jで除したものを、変数Ygに代入する。座標(Xg,Yg)は、輪郭画像の重心座標を示す。
【0086】
ステップS201にて、MCU3は、変数j,LS及びL[]に0を代入する。ステップS203にて、MCU3は、次式により、重心座標(Xg,Yg)と輪郭線上の各画素Pjの座標(XO[j],YO[j])との間の距離L[j]を算出する。
【0087】
L[j]←√((Xg−XO[j])2+(Yg−YO[j])2)
【0088】
ステップS205にて、MCU3は、変数LSの現在の値に変数L[j]の値を加算したものを、変数LSに代入する。ステップS207にて、MCU3は、変数jを1つインクリメントする。ステップS209にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS211に進み、それ以外はステップS203に進む。
【0089】
ステップS211にて、MCU3は、変数LSの値を値Jで除することにより、距離L[j]の平均値AVLを算出する。ステップS213にて、MCU3は、輪郭線及び輪郭線内の画素を計数して、輪郭画像の面積を算出してリターンする。
【0090】
図9は、図7のステップS163の指先を検出する処理の流れの一例を示すフローチャートである。図9を参照して、ステップS241にて、MCU3は、変数j及びFP[]に0を代入する。ステップS243にて、MCU3は、フラグCF[j]が凸点を示す01にセットされているか否かを判断し、肯定的判断の場合ステップS245に進み、否定的判断の場合ステップS249に進む。
【0091】
ステップS245にて、MCU3は、凸点である画素Pjの両側又は一方側に、フラグCF[j]に凹点を示す10がセットされている画素が存在するか否かを判断し、存在する場合画素Pjを指先候補とみなしてステップS247に進み、存在しない場合ステップS249に進む。ステップS247にて、MCU3は、フラグFP[j]に画素Pjが指先候補であることを示す1をセットする。
【0092】
ステップS249にて、MCU3は、変数jを1つインクリメントする。ステップS251にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS253に進み、それ以外はステップS243に進む。
【0093】
ステップS253にて、MCU3は、変数j,q,TF[],θv[],XT,YT,Q及びθvに0を代入する。ステップS255にて、MCU3は、フラグFP[j]に指先候補を示す1がセットされているか否かを判断し、肯定的判断の場合ステップS257に進み、それ以外はステップS271に進む。
【0094】
ステップS257にて、MCU3は、画素Pj+Npと画素Pj−Npとを結ぶ線分23に画素Pjから下ろした垂線25の長さLvを算出する(図17参照)。ステップS259にて、MCU3は、長さLvが所定値CLを超えているか否かを判断し、超えている場合画素Pjを指先とみなしてステップS261に進み、それ以外はステップS271に進む。
【0095】
ステップS261にて、MCU3は、指先フラグTF[j]に画素Pjが指先であることを示す1をセットする。ステップS263にて、MCU3は、変数XT[q]に画素PjのX座標を代入する。また、MCU3は、変数YT[q]に画素PjのY座標を代入する。座標(XT[q],YT[q])は、指先の座標である。ステップS265にて、MCU3は、垂線25の傾角θvを算出する(図17参照)。ステップS267にて、MCU3は、変数θv[q]に傾角θvを代入する。傾角θv[q]は、座標(XT[q],YT[q])で示される指先に対応する指の傾角である。ステップS269にて、MCU3は、変数qを1つインクリメントする。
【0096】
ステップS271にて、MCU3は、変数jを1つインクリメントする。ステップS273にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS275に進み、それ以外はステップS255に進む。ステップS275にて、MCU3は、変数Qに変数qの値を代入してリターンする。変数Qの値は、検出された指先の数を表す。
【0097】
図10は、図7のステップS165の「パー」を判定する処理の流れの一例を示すフローチャートである。図4を参照して、ステップS301にて、MCU3は、変数Qの値(指先の数)が3以上か否かを判断し、3以上の場合ステップS303に進み、それ以外はリターンする。ステップS303にて、MCU3は、変数q及びmに0を代入する。ステップS305にて、MCU3は、配列θv[q]と配列θv[q+1]との差の絶対値を算出し、変数θdに代入する。変数θdは、隣り合う指と指とがなす角度を表す。
【0098】
ステップS307にて、MCU3は、変数θdの値が100度未満か否かを判断し、肯定的判断の場合ステップS309に進み、否定的判断の場合ステップS311に進む。ステップS309にて、MCU3は、変数mを1つインクリメントする。ステップS311にて、MCU3は、変数qを1つインクリメントする。
【0099】
ステップS313にて、MCU3は、変数qの値が値Qになったか否かを判断し、値Qになった場合ステップS315に進み、それ以外はステップS305に進む。
【0100】
ステップS315では、MCU3は、変数mの値が、6以下3以上であるか否かを判断し、肯定的判断の場合手の形状が「パー」であると判断してステップS317に進み、否定的判断の場合リターンする。変数mの値は、隣り合う指と指とがなす角度θdが100度未満のケースの発生回数である。ステップS317では、MCU3は、フラグSHを「パー」を示す10hにセットして、図4のステップS11に進む。
【0101】
図11は、図7のステップS167の「チョキ」を判定する処理の流れの一例を示すフローチャートである。図11を参照して、ステップS341にて、MCU3は、変数Qの値(指先の数)が2又は3の場合ステップS343に進み、それ以外はリターンする。
【0102】
ステップS343にて、MCU3は、変数q,p,SH,XL,YL,XS及びYSに0を代入する。ステップS345にて、MCU3は、輪郭画像の重心座標(Xg,Yg)と指先の座標(XT[q],YT[q])との間の距離Lgt0を算出する。ステップS347にて、MCU3は、距離Lgt0が平均値AVL(図8のステップS211参照)に1.1を乗じたもの以上か否かを判断し、つまり、距離Lgt0が平均値AVLの110%以上か否かを判断し、肯定的判断の場合ステップS349に進み、否定的判断の場合ステップS359に進む。
【0103】
ステップS349にて、MCU3は、輪郭画像の重心座標(Xg,Yg)と指先の座標(XT[q+1],YT[q+1])との間の距離Lgt1を算出する。座標(XT[q+1],YT[q+1])の指先は、座標(XT[q],YT[q])の指先の隣の指先である。ステップS351にて、MCU3は、距離Lgt1が値AVLに1.1を乗じたもの以上か否かを判断し、つまり、距離Lgt1が平均値AVLの110%以上か否かを判断し、肯定的判断の場合ステップS353に進み、否定的判断の場合ステップS359に進む。
【0104】
ステップS353では、MCU3は、配列θv[q]と配列θv[q+1]との差の絶対値(つまり、隣あう指と指とがなす角度)を算出し、変数θdに代入する。ステップS355にて、MCU3は、変数θdの値が90度未満か否かを判断し、肯定的判断の場合ステップS357に進み、否定的判断の場合ステップS359に進む。ステップS357にて、MCU3は、変数pを1つインクリメントする。
【0105】
ステップS359にて、MCU3は、変数qを1つインクリメントする。ステップS361にて、MCU3は、変数qの値が値Qになったか否かを判断し、値Qになった場合ステップS363に進み、それ以外はステップS345に進む。ステップS363にて、MCU3は、変数pの値が1又は2の場合手の形状が「チョキ」と判断してステップS365に進み、それ以外はリターンする。
【0106】
ステップS365にて、MCU3は、変数Qの値が2か否かを判断し、2の場合、つまり、検出された指が2本の場合、ステップS369に進み、それ以外はステップS367に進む。ステップS367では、MCU3は、フラグSHを「チョキ」を示す21hにセットして、図4のステップS11に進む。なお、値21hは、3本の指が検出されたことになっているが、そのうち1本は指ではないノイズであることを示している。
【0107】
ステップS369では、MCU3は、フラグSHを「チョキ」を示す20hにセットする。なお、値20hは、2本の指が検出され、ステップS367のようなノイズを含まないことを示している。ステップS371にて、MCU3は、距離Lgt0が距離Lgt1より大きいか否かを判断し、つまり、検出された2本の指のどちらが長いか否かを判断し、距離Ltg0が大きい場合ステップS373に進み、それ以外はステップS375に進む。
【0108】
ステップS373では、MCU3は、座標XL及びYLにそれぞれ座標XT[0]及びYT[0]を代入する。また、MCU3は、座標XS及びYSにそれぞれ座標XT[1]及びYT[1]を代入する。一方、ステップS375では、MCU3は、座標XL及びYLにそれぞれ座標XT[1]及びYT[1]を代入する。また、MCU3は、座標XS及びYSにそれぞれ座標XT[0]及びYT[0]を代入する。ここで、座標(XL,YL)は、長い指の指先の座標であり、座標(XS,YS)は、短い指の指先の座標である。
【0109】
ステップS377にて、MCU3は、座標(XL,YL)及び座標(XS,YS)のそれぞれに対して、補正値を算出する。ステップS379にて、MCU3は、座標(XL,YL)に、その補正値を加算して、補正後座標を求める。また、MCU3は、座標(XS,YS)に、その補正値を加算して、補正後座標を求める。ステップS381にて、MCU3は、座標(XL,YL)の補正後座標と座標(XS,YS)の補正後座標との中点座標を算出する。そして、MCU3は、図4のステップS11に進む。
【0110】
図12は、図7のステップS169の「グー」を判定する処理の流れの一例を示すフローチャートである。図12を参照して、ステップS391にて、MCU3は、変数Qの値(指先の数)が2以上か否かを判断して、肯定的判断の場合ステップS393に進み、否定的判断の場合リターンする。
【0111】
ステップS393にて、MCU3は、変数jに0を代入する。ステップS395にて、MCU3は、距離L[j](図8のステップS203参照)が、平均値AVL(図8のステップS211参照)に0.6を乗じたもの以上であり、かつ、値AVLに1.4を乗じたもの以下であるか否かを判断し、つまり、距離L[j]が、平均値AVLの60%以上であり、かつ、平均値AVLの140%以下であるか否かを判断し、肯定的判断の場合ステップS397に進み、否定的判断の場合リターンする。
【0112】
ステップS397にて、MCU3は、変数jを1つインクリメントする。ステップS399にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合手の形状が「グー」と判断しステップS401に進み、それ以外はステップS395に進む。ステップS401にて、MCU3は、フラグSHを「グー」を示す30hにセットして、図4のステップS11に進む。
【0113】
図13は、図7のステップS171の一本指を判定する処理の流れの一例を示すフローチャートである。図13を参照して、ステップS421にて、MCU3は、変数Qの値(指先の数)が1以下か否かを判断して、肯定的判断の場合ステップS423に進み、否定的判断の場合ステップS447に進む。ステップS447では、MCU3は、フラグSHを「不定」を示す00hにセットしてリターンする。
【0114】
一方、ステップS423では、MCU3は、変数j,s,Dc[],Dca及びDcmに0を代入する。ステップS425にて、MCU3は、フラグFP[j]に指先候補(つまり凸点)を示す1がセットされているか否かを判断し、肯定的判断の場合ステップS427に進み、それ以外はステップS433に進む。
【0115】
ステップS427では、MCU3は、重心座標(Xg,Yg)と凸点の画素Pjとの間の距離Dを算出する。ステップS429にて、MCU3は、配列Dc[s]に距離Dを代入する。ステップS431にて、MCU3は、変数sを1つインクリメントする。ステップS433にて、MCU3は、変数jを1つインクリメントする。ステップS435にて、MCU3は、変数jの値が値Jになったか否かを判断し、値Jになった場合ステップS437に進み、それ以外はステップS425に進む。
【0116】
ステップS437にて、距離Dc[s]の平均値Dcaを算出する。つまり、平均値Dcaは、重心から各凸点までの距離の平均値である。ステップS439にて、距離Dc[s]から、最大値Dcmを検出する。つまり、最大値Dcmは、重心から各凸点までの距離のうち、最大のものである。ステップS441にて、MCU3は、最大値Dcmが、平均値Dcaに1.3を乗じた値以上か否かを判断し、肯定判断の場合一本の指が立った状態であるとみなしてステップS443に進み、否定判断の場合ステップS447に進む。
【0117】
ステップS443では、MCU3は、フラグSHを「1本の指が立った状態」を示す40hにセットする。ステップS445では、MCU3は、座標XHに、最大値Dcmに対応する凸点の画素PjのX座標を代入する。また、MCU3は、座標YHに、最大値Dcmに対応する凸点の画素PjのY座標を代入する。座標(XH,YH)は、立った状態の1本指の指先の座標である。ステップS447にて、MCU3は、座標(XH,YH)の補正値を計算する。ステップS447にて、MCU3は、座標(XH,YH)に、その補正値を加算し、補正後座標を求める。そして、MCU3は、リターンする。
【0118】
さて、次に、図11のステップS373及びS375で求めた指先を示す画素の座標(XL,YL)及び(XS,YS)、並びに、図13のステップS445で求めた指先を示す画素の座標(XH,YH)を、イメージセンサ5の解像度を超える高精度で再計算する方法を説明する。以下では、再計算前の指先を示す画素P4の座標を、座標(Xb,Yb)と表記する。そして、下記のようにして、座標(Xb,Yb)の補正値(Xc,Yc)を求める。本実施の形態では、補正値の算出方法として、第1〜第4の例を挙げる。
【0119】
図14(a)は、図11のステップS377及び図13のステップS447の指先補正値計算処理の第1の例の流れを示すフローチャートである。図14(b)は、図11のステップS377及び図13のステップS447の指先補正値計算処理の第2の例の流れを示すフローチャートである。図14(c)は、図11のステップS377及び図13のステップS447の指先補正値計算処理の第3の例の流れを示すフローチャートである。図14(d)は、図11のステップS377及び図13のステップS447の指先補正値計算処理の第4の例の流れを示すフローチャートである。
【0120】
図18(a)は、図14(a)及び図14(c)の指先補正値計算処理の説明図である。図18(b)は、図14(b)及び図14(d)の指先補正値計算処理の説明図である。
【0121】
図18(a)及び図18(b)を参照して、補正前(再計算前)の指先画素P4の座標(Xb,Yb)を原点(0,0)とする。図中、水平右方向をx軸の正とし、垂直下方向をy軸の正とする。そして、補正前の指先画素P4を取り囲む8個の画素P0,P1,P2,P5,P6,P7及びP8を利用する。また、画素P0〜P8は、それぞれ、画素値(つまり輝度値)p0〜p8を有する。
【0122】
図18(a)に示すように、第1及び第3の例では、原点(0,0)の指先画素P4の上下左右の画素P1,P7,P3及びP5の座標は、それぞれ、座標(0,−1),(0,1),(−1,0)及び(1,0)である。また、指先画素P4の左上画素P0、右上画素P2、左下画素P6及び右下画素P8の座標は、それぞれ、座標(−√2/2,−√2/2),(√2/2,−√2/2),(−√2/2,√2/2)及び(√2/2,√2/2)である。
【0123】
一方、図18(b)に示すように、第2及び第4の例では、原点(0,0)の指先画素P4の周囲画素P0,P1,P2,P5,P6,P7及びP8の座標は、それぞれ、座標(−1,−1)、(0,−1)、(1,−1)、(−1,0)、(1,0)、(−1,1)、(0,1)及び(1,1)である。
【0124】
なお、下記の数式中シンボル“*”及び“/”は、それぞれ、乗算及び除算を示す。
【0125】
図14(a)を参照して、第1の例では、ステップS361及びS363にて、MCU3は、次式により、X座標Xbの補正値Xc及びY座標Ybの補正値Ycを算出する。値Csは定数である。定数Csは1より大きい値である。
【0126】
Xc=(A/C)*Cs
Yc=(B/C)*Cs
【0127】
A=−R*p0+0*p1+R*p2+(−1)*p3+0*p4+1*p5+(−R)*p6+0*p7+R*p8
B=−R*p0+(−1)*p1+(−R)*p2+0*p3+0*p4+0*p5+R*p6+1*p7+R*p8
C=p0+p1+p2+P3+p4+p5+p6+p7+p8
R=√2/2
【0128】
よって、補正後の指先のX座標Xf及びY座標Yfは、次のようになる。
【0129】
Xf=Xb+Xc
Yf=Yb+Yc
【0130】
図14(b)を参照して、第2の例では、ステップS371及びS373にて、MCU3は、次式により、X座標Xbの補正値Xc及びY座標Ybの補正値Ycを算出する。値Csは定数である。
【0131】
Xc=(D/C)*Cs
Yc=(E/C)*Cs
【0132】
D=−1*p0+0*p1+1*p2+(−1)*p3+0*p4+1*p5+(−1)*p6+0*p7+1*p8
E=−1*p0+(−1)*p1+(−1)*p2+0*p3+0*p4+0*p5+1*p6+1*p7+1*p8
C=p0+p1+p2+P3+p4+p5+p6+p7+p8
【0133】
よって、補正後の指先のX座標Xf及びY座標Yfは、次のようになる。
【0134】
Xf=Xb+Xc
Yf=Yb+Yc
【0135】
図14(c)を参照して、第3の例では、ステップS381及びS383にて、MCU3は、次式により、X座標Xbの補正値Xc及びY座標Ybの補正値Ycを算出する。値pmaxは、画素値p0〜p8のうちの最大値を示す。
【0136】
Xc=A/pmax
Yc=B/pmax
【0137】
A=−R*p0+0*p1+R*p2+(−1)*p3+0*p4+1*p5+(−R)*p6+0*p7+R*p8
B=−R*p0+(−1)*p1+(−R)*p2+0*p3+0*p4+0*p5+R*p6+1*p7+R*p8
R=√2/2
【0138】
よって、補正後の指先のX座標Xf及びY座標Yfは、次のようになる。
【0139】
Xf=Xb+Xc
Yf=Yb+Yc
【0140】
図14(d)を参照して、第4の例では、ステップS391及びS393にて、MCU3は、次式により、X座標Xbの補正値Xc及びY座標Ybの補正値Ycを算出する。値pmaxは、画素値p0〜p8のうちの最大値を示す。
【0141】
Xc=D/pmax
Yc=E/pmax
【0142】
D=−1*p0+0*p1+1*p2+(−1)*p3+0*p4+1*p5+(−1)*p6+0*p7+1*p8
E=−1*p0+(−1)*p1+(−1)*p2+0*p3+0*p4+0*p5+1*p6+1*p7+1*p8
【0143】
よって、補正後の指先のX座標Xf及びY座標Yfは、次のようになる。
【0144】
Xf=Xb+Xc
Yf=Yb+Yc
【0145】
ここで、図11のステップS377の指先補正値算出処理では、MCU3は、座標(XL,YL)及び(XS,YS)のそれぞれを指先P4の座標(Xb,Yb)として、それぞれの補正値を算出する。また、図13のステップS447の指先補正値算出処理では、座標(XH,YH)を指先P4の座標(Xb,Yb)として、その補正値を算出する。
【0146】
図18(b)を参照しながら、上記第4の例について補足説明する。
【0147】
第4の例の上記式では、指先画素P4並びに周囲画素P0,P1,P2,P5,P6,P7及びP8の座標(0,0)、(−1,−1)、(0,−1)、(1,−1)、(−1,0)、(1,0)、(−1,1)、(0,1)及び(1,1)に、対応する画素値p4,p0,p1,p2,P3,p5,p6,p7及びp8で重み付けをし、それらの和Dが算出される。そして、和Dを値pmaxで除することにより、補正値Xcを求める。
【0148】
このようにして、小数点を持った精度の補正値Xcが得られる。なお、座標Xbは、画素単位で求められるので、整数値である。従って、座標Xbに補正値Xcを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にY座標についても言える。
【0149】
また、画素値による重み付けを行うことにより得られた補正値Xcを、補正前のX座標Xbに加えることにより、画素値(輝度値)の大きい側に、X座標Xbを補正できる(画素値による重み付け)。このことは同様にY座標についても言える。つまり、偏角θjから変曲点を求めることによって、手の輪郭線上の画素から、指先に相当する画素を特定し(図11のステップS373及びS375並びに図13のステップS445)、さらに、画素値を加味することによって、輪郭線上で特定された画素の周囲で、より画素値の大きい位置に、指先の座標を補正している。なぜなら、画像に写り込んだ指の像のうち、その先端部分であって、さらに、画素値(輝度値)の大きい位置を、指先とみなすことにより、より適切に指先を特定できるからである。
【0150】
さらに、和Dを、画素値p0〜p8のうちの最大値pmaxで除している。つまり、除数を、固定値とするのではなく、変動値としている。これは、イメージセンサ5から手までの距離は、一定ではないからである。つまり、イメージセンサ5から手までの距離が近い場合は、画像に指は大きく写り込み、一方、イメージセンサ5から手までの距離が遠い場合は、画像には指は小さく写り込むので、補正値Xcを、イメージセンサ5から手までの遠近に応じて、適切な値に設定するためである。補正値Ycについても同様である。
【0151】
例えば、除数を固定値とする場合、その固定値が小さすぎると、イメージセンサ5から手までの距離が遠い場合は比較的妥当な値になるかもしれないが、近い場合は、補正値が大きくなりすぎてしまう。また、逆に、除数を固定値とする場合、その固定値が大きすぎると、イメージセンサ5から手までの距離が近い場合は比較的妥当な値になるかもしれないが、遠い場合は、補正値が小さくなりすぎてしまう。また、イメージセンサ5から手までの距離が遠い場合と近い場合の双方に適切な除数を、固定値として設定することは困難である。なぜなら、同じ距離で同じ指を撮影する場合であっても、イメージセンサ5が設置される環境(照明や外光など)によって、画素値(輝度値)は異なってくるし、また、指の色彩、輪郭、及び表面の形状等も人によって異なるからである。
【0152】
また、値C(=p0+p1+p2+P3+p4+p5+p6+p7+p8)で除することにより、加重平均をとることもできる。しかし、次の理由により、除数は、値Cではなく、最大値pmaxとするほうが好ましい。
【0153】
図19を参照して、一般的に、実際の人間の指先30は、平面視において、ある点を頂点(「実頂点」と呼ぶ。)32として、円弧状となっている。一方、本実施の形態のように、比較的低解像度の画像から指の輪郭を検出し、指先を決定する場合、常に実頂点32を指先として検出することは困難である。従って、検出される指先は、実頂点32であったり、実頂点32の左の点34になったり、右の点36になったりする。
【0154】
この場合、和Dを値Cで除して補正値とすると、その補正値は、図18(b)の画素P4を中心とした9×9画素の範囲を超えることができない。和Eについても同様である。このため、例えば、図19の実頂点32の補正後の位置は点38、点34の補正後の位置は点40、点36の補正後の位置は点42となる。このように、補正後の指先の位置は、これら3つの点で異なっている。同じ指先を検出するのに、異なった部分を指先と認識したのでは、検出された指先位置に配置されるカーソルが安定しない。
【0155】
そこで、輪郭から求めた指先が、一定していな場合でも、補正後の位置を極力一定させるため、あるいは、指先の位置の相違を極力小さい範囲に収めるため、最大値pmaxで和D及びEを除して、補正値を、9×9画素の範囲を越えるようにし、補正後の位置が、図19の点44、つまり、指先端部30の腹の中心付近に集まるようにした。
【0156】
図18(a)を参照しながら、上記第1の例について補足説明する。この例では、第4の例と異なり、画素P0,P2,P6及びP8の重み付けの対象を、それぞれ、座標(−√2/2,−√2/2),(√2/2,−√2/2),(−√2/2,√2/2)及び(√2/2,√2/2)とした。これは次の理由による。
【0157】
補正前の指先画素P4の中心からの距離を、全周囲画素で同じ値として、画素値を重みとするに当って、全画素値を均等に扱うためである。例えば、画素P4と画素P5との間の距離は「1」であるが、画素P2の座標を(1,−1)として計算すると、画素P4と画素P2との間の距離は、「√2」となってしまい、周囲画素の位置によって不均衡が発生する。補正前の指先画素P4の中心からの距離を、全周囲画素で同じ値とすることにより、補正値を方向によって偏りのないものとすることができる。
【0158】
また、この例では、A/C及びB/Cに定数Csを乗じている。これは、第4の例で、除数を値Cとせず、加重平均をとらなかった理由と同じである。つまり、輪郭から求めた指先が、一定していな場合でも、補正後の位置を極力一定させるため、あるいは、指先の位置の相違を極力小さい範囲に収めるため、定数Csを乗じて、補正値を、9×9画素の範囲を越えるようにし、補正後の位置が、図19の点44に集まるようにしたのである。なお、定数Csを乗ずることなしにA/C及びB/Cを補正値とすることもできる。
【0159】
ここで、定数Csは、実験及び試行錯誤等により決定される。また、定数Csを、検出された指の幅に応じて動的に変更することもできる。例えば、画像から指の幅を算出し、その幅に所定数(小数値)を乗じることにより、定数Csを決定する。この所定数は、実験及び試行錯誤等により決定される。例えばこの所定数は2/3である。なお、例えば、補正前の指先画素の左右それぞれに一定画素数離れた左右の画素間の距離を求め、それを指の幅とする。
【0160】
また、和A及びBをそれぞれ値Cで除して加重平均をとるのは、小数点を持った精度の補正値Xc及びYcを得るためである。なお、座標Xbは、画素単位で求められるので、整数値である。従って、座標Xbに補正値Xcを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にY座標についても言える。
【0161】
さらに、画素値による重み付けを行う理由は、第4の例と同様である。
【0162】
上記第2の例について補足説明する。定数Csを乗じる理由、加重平均をとる理由、及び、画素値による重み付けを行なう理由は、第1の例と同じである。
【0163】
上記第3の例について補足説明する。和A及びBをそれぞれ最大値pmaxで除して加重平均をとるのは、小数点を持った精度の補正値Xc及びYcを得るためである。なお、座標Xbは、画素単位で求められるので、整数値である。従って、座標Xbに補正値Xcを加えることにより、小数点精度の座標値を得ることができる。これらのことは同様にY座標についても言える。
【0164】
また、画素P0,P2,P6及びP8の重み付けの対象を、それぞれ、座標(−√2/2,−√2/2),(√2/2,−√2/2),(−√2/2,√2/2)及び(√2/2,√2/2)とした理由は、第1の例と同じである。
【0165】
さらに、画素値による重み付けを行う理由、除数を変動値とした理由、及び、最大値pmaxで除し加重平均をとらない理由は、第4の例と同様である。
【0166】
ここで、図14(a)〜図14(d)に示す指先補正値計算処理を実行する場合は、MCU3は、画素値p0〜p8を、イメージセンサ5から順次取得し、計算式に代入して、補正値(Xc,Yc)を算出する。なお、イメージセンサ5は、MCU3による2値化のために差分画像を出力した後でも、一定時間は(次の撮影処理までは)、差分画像データを保持しているので、指先補正値計算処理では、そこから必要な画素を取得することができる。このように、3×3画素(グレースケール)を一旦メモリ7に格納するのではなく、イメージセンサ5からの出力画素を順次処理しており、これにより、メモリ容量を削減できる。もちろん、イメージセンサ5が出力した差分画像をそのままメモリ7に格納して処理したり、あるいは、3×3画素(グレースケール)を一旦メモリ7に格納して処理することもできる。
【0167】
図15(a)は、図4のステップS11の擬似ボタン操作判定処理の第1の例の流れを示すフローチャートである(図3(b)の第1の例に対応)。図15(a)を参照して、ステップS621にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップS623にて、MCU3は、手の形状を示す今回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「1本指」の状態)、ステップS627に進み、それ以外はリターンする。
【0168】
ステップS627では、MCU3は、手の形状を示す前回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS629に進み、それ以外はリターンする。ステップS629では、MCU3は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【0169】
図15(b)は、図4のステップS11の擬似ボタン操作判定処理の第2の例の流れを示すフローチャートである(図3(b)の第2の例に対応)。図15(b)を参照して、ステップS601にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップS603にて、MCU3は、手の形状を示す今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS607に進み、それ以外はリターンする。
【0170】
ステップS607では、MCU3は、手の形状を示す前回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「1本指」の状態)、ステップS609に進み、それ以外はリターンする。ステップS609では、MCU3は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【0171】
図15(c)は、図4のステップS11の擬似ボタン操作判定処理の第3の例の流れを示すフローチャートである(図3(b)の第3の例に対応)。図15(c)を参照して、ステップS641にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグをオフにする。ステップS643にて、MCU3は、手の形状を示す今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS645に進み、それ以外はリターンする。
【0172】
ステップS645では、MCU3は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離DCを算出する。ステップS647にて、MCU3は、距離DCが一定値CCより小さいか否かを判断し、小さい場合一方指先が他方指先に近づいたと判断してステップS649に進み、それ以外はリターンする。ステップS649にて、MCU3は、擬似的なボタン操作が行なわれたことを示すため、擬似ボタンフラグをオンにする。
【0173】
ここで、図15(a)〜図15(c)及び後述の図22(a)〜図22(c)において、今回のフラグSHとは、イメージセンサ5から今回受け取った1フレームの画像データに基づき設定されたフラグを意味する。また、前回のフラグSHとは、イメージセンサ5から前回受け取った1フレームの画像データに基づき設定されたフラグを意味する。
【0174】
また、図15(a)〜図15(c)は、擬似的にボタン操作が行われたと判定されたこと(つまり、擬似ボタンフラグのオン)を、クリック操作(ボタンを押下して放す操作)が行なわれたとみなす場合の処理例を示している。
【0175】
次に、図22(a)〜図22(c)を参照して、擬似的にボタン操作が行われたと判定されたこと(つまり、擬似ボタンフラグのオン)を、ボタンのプレス操作(ボタンを押したままの状態)が行なわれたとみなす処理例を説明する。なお、擬似ボタンフラグのオフは、ボタンを放した状態とみなされる。
【0176】
図22(a)は、図4のステップS11の擬似ボタン操作判定処理の第4の例の流れを示すフローチャートである(図3(b)の第1の例に対応)。図22(a)を参照して、ステップS701にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップS709に進み、オフの場合ステップS703に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【0177】
ステップS703にて、MCU3は、手の形状を示す今回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「1本指」の状態)、ステップS705に進み、それ以外はリターンする。
【0178】
ステップS705では、MCU3は、手の形状を示す前回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS707に進み、それ以外はリターンする。ステップS707では、MCU3は、擬似的にボタンがプレスされたことを示すため、擬似ボタンフラグをオンにする。
【0179】
一方、ステップS709では、MCU3は、今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS711に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップS711では、MCU3は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【0180】
図22(b)は、図4のステップS11の擬似ボタン操作判定処理の第5の例の流れを示すフローチャートである(図3(b)の第2の例に対応)。図22(b)を参照して、ステップS731にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップS739に進み、オフの場合ステップS733に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【0181】
ステップS733にて、MCU3は、手の形状を示す今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS735に進み、それ以外はリターンする。
【0182】
ステップS735では、MCU3は、手の形状を示す前回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「1本指」の状態)、ステップS737に進み、それ以外はリターンする。ステップS737では、MCU3は、擬似的にボタンがプレスされたことを示すため、擬似ボタンフラグをオンにする。
【0183】
一方、ステップS739では、MCU3は、今回のフラグSHに40hがセットされているか否かを判断し、40hがセットされている場合(つまり、「一本指」の状態)、ステップS741に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップS741では、MCU3は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【0184】
図22(c)は、図4のステップS11の擬似ボタン操作判定処理の第6の例の流れを示すフローチャートである(図3(b)の第3の例に対応)。図22(c)を参照して、ステップS761にて、MCU3は、擬似的なボタン操作の有無を示す擬似ボタンフラグがオンか否かを判断し、オンの場合ステップS771に進み、オフの場合ステップS763に進む。なお、擬似ボタンフラグは、システム初期化時にオフにセットされるものとする。
【0185】
ステップS763にて、MCU3は、手の形状を示す今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS765に進み、それ以外はリターンする。
【0186】
ステップS765では、MCU3は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離DCを算出する。ステップS767にて、MCU3は、距離DCが一定値CCより小さいか否かを判断し、小さい場合一方指先が他方指先に近づいたと判断してステップS769に進み、それ以外はリターンする。ステップS769にて、MCU3は、擬似的にボタンのプレスが行なわれたことを示すため、擬似ボタンフラグをオンにする。
【0187】
一方、ステップS771にて、MCU3は、今回のフラグSHに20hがセットされているか否かを判断し、20hがセットされている場合(つまり、「チョキ」の状態)、ステップS773に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。
【0188】
ステップS773では、MCU3は、補正後の一方の指先の座標と、補正後の他方の指先の座標と、の間の距離DCを算出する。ステップS775にて、MCU3は、距離DCが一定値CC以上か否かを判断し、CC以上の場合擬似的にボタンが放されたとみなしてステップS777に進み、それ以外はボタンプレスの状態が維持されているとみなしリターンする。ステップS777にて、MCU3は、擬似的にボタンが放されたことを示すため、擬似ボタンフラグをオフにする。
【0189】
ところで、上記では、図3(b)を参照して、擬似ボタン操作の第1〜第3の例を説明した。以下では、擬似ボタン操作の第4の例を説明する。この第4の例では、シングルクリック及びダブルクリックの判定を行なう。
【0190】
図23(a)は、本発明の実施の形態による擬似ボタン操作の第4の例(シングルクリック)の説明図である。図23(a)を参照して、一定時間TC以内に、ステップS2000〜S2004の変化が検出された場合に、シングルクリックが行なわれたとみなす。
【0191】
具体的には、指先50が大体静止した状態になった場合に、最新の指先50を中心とした矩形範囲(例えば3画素×3画素)52を設定する(ステップS2000)。例えば、最新の指先50から一定距離RD内に過去所定数分の指先50が存在する場合に、指先50が大体静止した状態であると判断される。
【0192】
この矩形範囲52の設定から一定時間TC以内に、矩形範囲52から指先50が消失し(出て)、矩形範囲52に指先50が存在しない状態になり(ステップS2002)、そして、再び、矩形範囲52に指先50が出現し(入って)、矩形範囲52に指先50が存在する状態になった時に(ステップS2004)、シングルクリックが行なわれたとみなす。例えば、矩形範囲52内の画素値(輝度値)の合計値を、所定の閾値と比較して、合計値が閾値を超えていれば矩形範囲52に指先50が存在すると判断し、一方、合計値が閾値以下の場合に矩形範囲52に指先50が存在しないと判断する。
【0193】
なお、例えば、ユーザが、一定時間TC以内に、人差し指を伸ばした状態から、人差し指の第3関節(付け根の関節)を曲げて指を折り、再び、元の状態(人差し指を伸ばした状態)に戻すというジェスチャを行なった時に、シングルクリックが行なわれたとみなされる。この場合、第1及び第2関節の状態は任意である。また、例えば、ユーザが、一定時間TC以内に、人差し指を伸ばした状態から、人差し指の第2関節を曲げて指を折り(第3関節は固定)、再び、元の状態(人差し指を伸ばした状態)に戻すというジェスチャを行なった時に、シングルクリックが行なわれたとみなされる。この場合、第1関節の状態は任意である。ここで、指先に一番近い関節を第1関節、その次の関節を第2関節、さらにその次の関節を第3関節と呼んでいる。
【0194】
この例のような人のジェスチャでは、指が曲げられた後、指先が、ほぼ元の位置に戻ることが、本願発明者の実験により検証されている。このため、図23(a)で説明した手法により、シングルクリックが行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できるのである。
【0195】
図23(b)は、本発明の実施の形態による擬似ボタン操作の第4の例(ダブルクリック)の説明図である。図23(b)を参照して、一定時間TC以内に、ステップS2100〜S2108の変化が検出された場合に、ダブルクリックが行なわれたとみなす。この場合の一定時間TCは、シングルクリックを判定するときの一定時間TCと同じである。
【0196】
具体的には、指先50が大体静止した状態になった場合に、最新の指先50を中心とした矩形範囲(例えば3画素×3画素)52を設定する(ステップS2100)。指先50が大体静止した状態の判断方法は、シングルクリックの場合と同じである。
【0197】
この矩形範囲52の設定から一定時間TC以内に、矩形範囲52から指先50が消失し(出て)、矩形範囲52に指先50が存在しない状態になり(ステップS2102)、そして、再び、矩形範囲52に指先50が出現し(入って)、矩形範囲52に指先50が存在する状態になり(ステップS2104)、再び、矩形範囲52から指先50が消失し(出て)、矩形範囲52に指先50が存在しない状態になり(ステップS2106)、そして、再び、矩形範囲52に指先50が出現し(入って)、矩形範囲52に指先50が存在する状態になった時に(ステップS2108)、ダブルクリックが行なわれたとみなす。矩形範囲52に指先50が存在するか否かの判断は、シングルクリックの場合と同じである。
【0198】
なお、ダブルクリックは、上記のシングルクリックのジェスチャをユーザが2回行なうことで実行される。また、ダブルクリックは、シングルクリックを2回行なうものであり、それ故、折り曲げられた指先は、2回とも、ほぼ同じ位置に戻ってくる。この点も本願発明者により検証されている。このため、図23(b)で説明した手法により、ダブルクリックが行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できるのである。
【0199】
図24及び図25は、図4のステップS11の擬似ボタン操作判定処理の第7の例の流れを示すフローチャートである(図23(a)及び図23(b)の第4の例に対応)。図24を参照して、ステップS1200にて、MCU3は、シングルクリックが行なわれたとみなす時にオンにセットされるシングルクリックフラグと、ダブルクリックが行なわれたとみなす時にオンにセットされるダブルクリックフラグと、をオフにする。
【0200】
ステップS1202にて、MCU3は、滞在フラグがオンか否かを判断し、オンの場合図25のステップS1250に進み、オフの場合ステップS1204に進む。滞在フラグは、指先50が大体静止した状態になったと判断された時に、つまり、図23(a)及び図23(b)の矩形範囲52が設定された時にオンにセットされるフラグである。従って、ステップS1202で否定判断がされた後のステップS1204〜S1220の処理は、矩形範囲52を設定するための処理である。一方、ステップS1202で肯定判断がされた後のステップS1250〜S1284の処理は、図23(a)及び図23(b)のステップS2002,S2004,S2102〜S2108の状態を判断するための処理である。
【0201】
ステップS1204にて、MCU3は、変数kに0をセットする。ステップS1206にて、MCU3は、最新の指先50と、過去の指先50と、の間の距離DISを算出する。距離DISは次式により算出される。
【0202】
DIS=√(XD2+YD2)
XD=Xf[0]−Xf[k+1]
YD=Yf[0]−Yf[k+1]
【0203】
ここで、図13のステップS449では、補正後の指先50の座標(Xf,Yf)を計算する。この場合、補正後の指先50の座標(Xf,Yf)は、キューに格納され、現在及び過去の計N個のデータが保存される(Nは2以上の整数。本実施の形態ではN=10)。キューは、X座標Xfを代入する配列Xf[0]〜Xf[9]及びY座標Yfを代入する配列Yf[0]〜Yf[9]により構成される。配列Xf[0]及びYf[0]に常に最新の座標(Xf,Yf)が格納される。
【0204】
従って、ステップS1206では、最新の指先50の座標(Xf[0],Yf[0])と、それより(k+1)個だけ過去の指先50の座標(Xf[k+1],Yf[k+1])と、の間の距離DISが計算される。
【0205】
そして、ステップS1208にて、MCU3は、距離DISが、一定距離RDより小さいか否かを判断し、小さい場合ステップS1210に進み、それ以外は指先50が静止した状態にないと判断してステップS1220に進む。ステップS1210にて、MCU3は、変数kを1つインクリメントする。ステップS1212にて、MCU3は、変数kの値が9になったか否かを判断し、9になった場合ステップS1214に進み、それ以外はステップS1206に戻る。
【0206】
ステップS1212でk=9が判断されたことは、最新の指先50と過去9個の指先50それぞれとの間の距離全てが、一定距離RD内に存在することを意味する。つまり、指先50が大体静止した状態にあることを意味する。このため、ステップS1214では、MCU3は、滞在フラグをオンにする。一方、距離DISが一定距離RD内にない過去の指先50が1つでも存在する場合は、指先50が静止した状態にないと判断する。このため、ステップS1220では、MCU3は、滞在フラグをオフにしてリターンする。
【0207】
ステップS1214の次のステップS1216にて、MCU3は、最新の指先50の座標(Xf[0],Yf[0])を中心とした矩形範囲52を設定する(図23(a)のステップS2000及び図23(b)のステップS2100に相当)。そして、ステップS1218にて、MCU3は、タイマTMをセットしてリターンする。このタイマTMは、上記一定時間TC(図23(a)及び図23(b)参照)を計測するためのものである。この一定時間TCは、実験及び試行錯誤等により、決定される。
【0208】
図25を参照して、ステップS1250にて、MCU3は、タイマTMの値が一定時間TCになったか否かを判断し、一定時間TCになった場合ステップS1278に進み、一定時間になっていない場合ステップS1252に進む。
【0209】
ステップS1252にて、MCU3は、消失フラグがオンか否かを判断し、オンの場合ステップS1262に進み、オフの場合ステップS1254に進む。消失フラグは、矩形範囲52に指先50が存在する状態から存在しない状態に変化したときにオンにされるフラグである。
【0210】
ステップS1254では、MCU3は、矩形範囲52に指先50が不存在か否かを判断し、存在する場合リターンし、不存在の場合ステップS1256に進む。ステップS1256にて、MCU3は、消失フラグをオンにしてリターンする(図23(a)のステップS2002並びに図23(b)のステップS2102及びS2106に相当)。
【0211】
消失フラグがオンの場合、ステップS1262にて、MCU3は、矩形範囲52に指先50が存在するか否かを判断し、存在しない場合リターンし、存在する場合ステップS1264に進む(図23(a)のステップS2004並びに図23(b)のステップS2104及びS2108に相当)。
【0212】
ステップS1264では、MCU3は、仮クリックフラグがオンか否かを判断し、オンの場合ステップS1272に進み、オフの場合ステップS1266に進む。仮クリックフラグは、ユーザのジェスチャがシングルクリックの条件(図23(a)のステップS2000〜S2004)を満たしたときにオンにされるフラグである。ただし、ダブルクリックはシングルクリックの動作を含むので(図23(b)のステップS2100〜S2104)、一定時間TCが経過するまでは、ダブルクリックが行なわれる可能性もある。このため、一定時間TCの経過後に、シングルクリックかダブルクリックかを最終決定する必要がある。それ故、シングルクリックの条件が満たされた時、仮クリックフラグにより、最終決定まで、その事実を保持しておくのである。
【0213】
ステップS1266では、MCU3は、シングルクリックの条件が満足されたので、仮クリックフラグをオンにする。そして、ステップS1268にて、MCU3は、消失フラグをオフにしてリターンする。なぜなら、ステップS1262で肯定判断がされているからである。
【0214】
一方、ステップS1272にて、MCU3は、ダブルクリックフラグをオンにする。なぜなら、仮クリックフラグがオンである状態において、さらに、図23(b)のステップS2106,S2108の変化が検出されたからである(ステップS1264にて肯定判断、ステップS1252にて肯定判断、ステップS1262にて肯定判断)。ステップS1274にて、MCU3は、タイマTMを解除する。ステップS1276にて、MCU3は、滞在フラグ、消失フラグ及び仮クリックフラグをオフにしてリターンする。なぜなら、ダブルクリックが決定されているため、これが最終決定だからである。なお、滞在フラグのオフは、矩形範囲52の解除、つまり、クリック操作判定のリセットに相当する。
【0215】
さて、ステップS1250にて肯定判断がされた後、MCU3は、最終決定を行なうべく、ステップS1278に進む。ステップS1278にて、MCU3は、仮クリックフラグがオンか否かを判断し、オンの場合ステップS1280に進み、オフの場合シングルクリックもダブルクリックも行なわれていないためステップS1282に進む。ステップS1280では、MCU3は、シングルクリックフラグをオンにしてステップS1282に進む。
【0216】
ステップS1282にて、MCU3は、タイマTMを解除する。ステップS1284にて、MCU3は、滞在フラグ、消失フラグ及び仮クリックフラグをオフにしてリターンする。なお、滞在フラグのオフは、矩形範囲52の解除、つまり、クリック操作判定のリセットに相当する。
【0217】
なお、シングルクリックフラグ及びダブルクリックフラグは、図4のステップS13にて、コンピュータ11に送信される。
【0218】
図20は、図1のウィンドウシステム400によるイベント監視処理の流れの一例を示すフローチャートである。図20を参照して、ステップS800にて、ウィンドウシステム400は、第1アプリケーションプログラム100から依頼されたイベントが発生したか否かをチェックし、発生した場合ステップS802に進み、発生していない場合ステップS800に戻る。ステップS802では、ウィンドウシステム400は、イベントの発生を第1アプリケーションプログラム100に通知する。
【0219】
一方、ステップS900にて、第1アプリケーションプログラム100は、ウィンドウシステム400からイベント発生の通知を受けたか否かをチェックし、通知を受けた場合ステップS902に進み、通知を受けていない場合ステップS900に戻る。ステップS902では、第1アプリケーションプログラム100は、発生したイベントに応じた処理(ウィンドウの制御を含む。)を実行する。
【0220】
また、ステップS804にて、ウィンドウシステム400は、第2アプリケーションプログラム100から依頼されたイベントが発生したか否かをチェックし、発生した場合ステップS806に進み、発生していない場合ステップS804に戻る。ステップS806では、ウィンドウシステム400は、イベントの発生を第2アプリケーションプログラム100に通知する。
【0221】
一方、ステップS1000にて、第2アプリケーションプログラム100は、ウィンドウシステム400からイベント発生の通知を受けたか否かをチェックし、通知を受けた場合ステップS1002に進み、通知を受けていない場合ステップS1000に戻る。ステップS1002では、第2アプリケーションプログラム100は、発生したイベントに応じた処理(ウィンドウの制御を含む。)を実行する。
【0222】
なお、ステップS802及びS806の通知は、第1及び第2アプリケーションプログラム100に対して、API200を介して行なわれる。
【0223】
ここで、イベントの例を幾つか挙げる。例えば、アプリケーションプログラム100が制御するウィンドウに設けられたボタン上にカーソルが位置し、かつ、擬似的にボタン操作が行なわれた場合に、つまり、ウィンドウ中のボタンが押下された場合に、イベントが発生する。CPU51は、ボタン押下に応じた処理を実行する。
【0224】
例えば、後述する図26に示すジェスチャ1〜13のそれぞれの発生に対して、イベントが発生する。この場合、例えば、ジェスチャ1によりイベントが発生した場合、CPU51は、手の移動方向である水平左方向に、モニタ67に表示された画面をスクロールする。
【0225】
例えば、所定の手の形状(例えば、「グー」)が検出された場合にイベントが発生する。例えば、手の面積が一定値以上になったらイベントが発生する。例えば、手又は指先の移動軌跡が所定軌跡になった場合にイベントが発生する。例えば、手の一定角度の回転が発生したらイベントが発生する。例えば、手の速度が一定値以上になったらイベントが発生する。例えば、手の加速度が一定値以上になったらイベントが発生する。
【0226】
以上のように、本実施の形態では、マウス等の接触型ポインティングデバイスで生成できるイベントはもちろん、接触型ポインティングデバイスでは生成することができないイベントをも生成できる。従って、各アプリケーションプログラム100は、多彩なイベントに応じた処理(ウィンドウの制御を含む。)を実行することができる。
【0227】
図21は、図1のウィンドウシステム400によるカーソル制御処理の流れの一例を示すフローチャートである。図21を参照して、ステップS1100にて、ウィンドウシステム400は、デバイスドライバ500からユーザの指先の座標を取得する。ステップS1102にて、ウィンドウシステム400は、受け取った指先の座標を、モニタ67に応じたスクリーン座標に変換する。ステップS1104にて、ウィンドウシステム400は、スクリーン座標に変換された指先の座標上にカーソルを表示し、ステップS1100に進む。
【0228】
図26は、図1のウィンドウシステム400が受け付け可能なジェスチャの例示図である。図26を参照して、ジェスチャ1は、手を「パー」にした後、水平左方向へスイングする動作である。ジェスチャ2は、手を「パー」にした後、水平右方向へスイングする動作である。ジェスチャ3は、手を「パー」にした後、垂直上方向へスイングする動作である。ジェスチャ4は、手を「パー」にした後、垂直下方向へスイングする動作である。
【0229】
ジェスチャ5は、手を「グー」から「チョキ」に変化させる動作である。ジェスチャ6は、手を「グー」から「パー」に変化させる動作である。ジェスチャ7は、手を「チョキ」から「グー」に変化させる動作である。ジェスチャ8は、手を「チョキ」から「パー」に変化させる動作である。ジェスチャ9は、手を「パー」から「グー」に変化させる動作である。ジェスチャ10は、手を「パー」から「チョキ」に変化させる動作である。
【0230】
ジェスチャ11は、手でイメージセンサ5、つまり、カメラを覆う(掩蔽する)動作である。ジェスチャ12は、時計回りに、手で円を描く動作である。ジェスチャ13は、反時計回りに、手で円を描く動作である。
【0231】
ウィンドウシステム400は、各ジェスチャ1〜13を検出し、それぞれをイベントの発生として認識し、依頼先のアプリケーションプログラム100に通知することができる。
【0232】
ここで、各ジェスチャ1〜13を、キーボード71の各種キー(例えば、タブキー、左方向キー、右方向キー、上方向キー、下方向キー、スペースキー、ページアップキー、ページダウンキー、エスケープキー、及び、Windows(登録商標)キーなど)に割り当てることもできる。
【0233】
また、各ジェスチャ1〜13を、キーボード71のショートカットキー(例えば、Altキー+F4キー(ウィンドウを閉じる)、Altキー+Escキー(複数のアプリケーションの切り替え)、Homeキー(先頭にジャンプ)、Endキー(末行にジャンプ)、F1キー(ヘルプを呼び出す)、Ctrlキー+Sキー(上書き保存)、Windowsキー+Rキー(ファイル名を指定して実行)、Windowsキー+Mキー(すべてのウィンドウを最小化)、及び、Windowsキー+Dキー(すべてのウィンドウを元のサイズに戻す)など)に割り当てることもできる。
【0234】
なお、オペレーティングシステム300のために用意されたキー及びショートカットキーを、ジェスチャ1〜13に割り当てることができる。また、アプリケーションプログラム100ごとに用意されたキー及びショートカットキーを、アプリケーションプログラム100ごとにジェスチャ1〜13に割り当てることもできる。つまり、アプリケーションプログラム100ごとにジェスチャ1〜13を割り当てることができ、ジェスチャ1〜13により実行される機能は、アプリケーションプログラム100ごとに異なってもよい。
【0235】
また、複数のアプリケーションプログラム100が起動している場合に、フォアグラウンド(最前面)のウィンドウに対応するアプリケーションプログラム100を認識して、そのアプリケーションプログラム100のために用意されたキー及びショートカットキーが割り当てられたジェスチャ1〜13を有効とすることもできる。
【0236】
なお、ジェスチャ1〜13にキーやショートカットキーが割り当てられる場合は、ジェスチャの検出が、それに割り当てられたキーないしはショートカットキーの押下に相当する。アプリケーションプログラム100が、あるキーないしはショートカットキーの押下というイベントの発生通知をウィンドウシステム400に依頼している場合、例えば、ウィンドウシステム400は、変換テーブルを参照して、検出されたジェスチャが、依頼されたキーないしはショートカットキーが割り当てられたものか否かを判断し、イベントの発生をアプリケーションプログラム100に通知する。変換テーブルは、ジェスチャ1〜13と、キーないしはショートカットキーと、を関連付けたテーブルである。
【0237】
また、各ジェスチャ1〜13を、各種システムコールないしはAPI(例えば、ブラウザの起動、ウィンドウの最大化、及び、ウィンドウの最小化など)に割り当て、対応するシステムコールないしはAPIを呼び出すために利用することもできる。
【0238】
さらに、各ジェスチャ1〜13を各種実行ファイルないしはアプリケーションに割り当て、対応する実行ファイルないしはアプリケーションを実行するために利用することもできる。
【0239】
ここで、各ジェスチャ1〜13に割り当てるキー、ショートカットキー、システムコールないしはAPI、及び、実行ファイルは、固定的に設定されていてもよいし、コンピュータシステム700のユーザによって登録(動的に変更)できるようにすることもできる。
【0240】
図27は、図1のウィンドウシステム400によるジェスチャ判定処理の流れの一例を示すフローチャートである。図27を参照して、ステップS100にて、ウィンドウシステム400は、ジェスチャ判定処理で必要な変数等(後述の変数CP,TL、及び、受付フラグ等)を初期化する。
【0241】
ステップS101にて、ウィンドウシステム400は、ステップS102〜S105で検出されたジェスチャを示すフラグJFに00h(不定を意味)を代入する。ステップS102にて、ウィンドウシステム400は、ジェスチャ1〜4のいずれかが実行されたか否かを判断する。この場合、ウィンドウシステム400は、ジェスチャ1が検出されたとき、フラグJFに10hを代入し、ジェスチャ2が検出されたとき、フラグJFに20hを代入し、ジェスチャ3が検出されたとき、フラグJFに30hを代入し、ジェスチャ4が検出されたとき、フラグJFに40hを代入する。
【0242】
ステップS103にて、ウィンドウシステム400は、今回のフラグSH及び前回のフラグSHを参照して(図10〜図12参照)、ジェスチャ5〜10のいずれかが実行されたか否かを判断する。この場合、ウィンドウシステム400は、ジェスチャ5が検出されたとき、フラグJFに50hを代入し、ジェスチャ6が検出されたとき、フラグJFに60hを代入し、ジェスチャ7が検出されたとき、フラグJFに70hを代入し、ジェスチャ8が検出されたとき、フラグJFに80hを代入し、ジェスチャ9が検出されたとき、フラグJFに90hを代入し、ジェスチャ10が検出されたとき、フラグJFにA0hを代入する。
【0243】
ステップS104にて、ウィンドウシステム400は、掩蔽フラグを参照して(図5参照)、ジェスチャ11が実行されたか否かを判断する。この場合、ウィンドウシステム400は、ジェスチャ11が検出されたとき、フラグJFにB0hを代入する。
【0244】
ステップS105にて、ウィンドウシステム400は、現在及び過去の手の重心座標(Xg,Yg)に基づいて、手の移動軌跡を算出し、ジェスチャ12が実行されたと判断したときはフラグJFにC0hを代入し、ジェスチャ13が実行されたと判断したときはフラグJFにD0hを代入する。
【0245】
ステップS106にて、ウィンドウシステム400は、フラグJFの値を、ジェスチャフラグFFに代入して、ステップS101に進む。ウィンドウシステム400は、イメージセンサ5が1フレームの差分画像を出力するたびに、ジェスチャフラグFFを見て、アプリケーションプログラム100から依頼されたイベントの発生の有無を確認する。なお、ウィンドウシステム400は、イメージセンサ5が1フレームの差分画像を出力するたびに、ステップS101〜S106を繰り返す。
【0246】
なお、図27の処理は、ウィンドウシステム400以外のプログラムが行ってもよい。
【0247】
図28及び図29は、図27のステップS102のジェスチャ1〜4の判定処理の流れの一例を示すフローチャートである。図28を参照して、ステップS110にて、ウィンドウシステム400は、受付フラグがオンか否かを判断し、オフの場合ステップS111に進み、オンの場合図29のステップS120に進む。受付フラグは、手の形状が一定時間連続して「パー」であるときにオンにされるフラグである。
【0248】
ステップS111にて、ウィンドウシステム400は、フラグSHを取得する。ステップS112にて、ウィンドウシステム400は、フラグSHの値が10h(手の形状がパー)か否かを判断し、10hの場合ステップS113に進み、それ以外はステップS116に進む。ステップS116では、ウィンドウシステム400は、カウンタCPに0を代入する。カウンタCPは、フラグSHの値が10hである状態(パーの状態)が連続して発生した回数を示す。
【0249】
一方、ステップS113では、ウィンドウシステム400は、カウンタCPを1つインクリメントする。ステップS114にて、ウィンドウシステム400は、カウンタCPの値が所定値PTより大きいか否かを判断し、大きい場合ステップS115に進み、それ以外はステップS117に進む。ステップS115では、ウィンドウシステム400は受付フラグをオンにする。一方、ステップS117では、ウィンドウシステム400は、受付フラグをオフにする。
【0250】
図29を参照して、図28のステップS110での肯定判断の後、ステップS120では、ウィンドウシステム400は、カウンタTLを1つインクリメントする。カウンタTLは、受付フラグがオンになってからの経過時間を示す。ステップS122にて、ウィンドウシステム400は、カウンタTLの値が所定値LLより大きいか否かを判断し、大きい場合ステップS124に進み、それ以外はステップS128に進む。ステップS124では、ウィンドウシステム400は、受付フラグをオフにする。ステップS126にて、ウィンドウシステム400は、カウンタTLに0を代入してリターンする。
【0251】
一方、ステップS122で否定判断の後、ステップS128にて、ウィンドウシステム400は、手の重心(Xg,Yg)のX方向の速度Vxを算出する。ステップS130にて、ウィンドウシステム400は、速度Vxが所定値NSより小さいか否かを判断し、小さい場合X方向の動きはノイズ(ユーザが意図しない、手の小さなぶれ等)とみなしステップS142に進み、それ以外はステップS132に進む。ステップS132にて、ウィンドウシステム400は、所定フレーム数fnにおける速度Vxの平均値VxAを算出する。なお、この場合のフレームは、イメージセンサ5が差分画像を出力する周期を示す。
【0252】
ステップS134にて、ウィンドウシステム400は、平均値VxAが所定値THVより大きいか否かを判断し、大きい場合ステップS136に進み、それ以外はX方向の動きはノイズとみなし(つまりユーザが意図しない動きとみなし)ステップS142に進む。ステップS134によって、ユーザが意図しない比較的大きな動きをノイズとして排除できる。つまり、大きな動きの後、小さな動きが続く場合、このような動きはノイズと判断するほうが適切であるところ、このような場合は、平均値VxAが小さくなるので、このような動きをノイズとして排除できる。
【0253】
ステップS136では、ウィンドウシステム400は、速度Vxの方向を判断し、水平左方向を向いている場合ステップS138に進み、水平右方向を向いている場合ステップS140に進む。
【0254】
ステップS138では、ウィンドウシステム400は、フラグJFに、ジェスチャ1を示す10hを代入してリターンする。一方、ステップS140では、ウィンドウシステム400は、フラグJFに、ジェスチャ2を示す20hを代入してリターンする。
【0255】
さて、ステップS142にて、ウィンドウシステム400は、手の重心(Xg,Yg)のY方向の速度Vyを算出する。ステップS144にて、ウィンドウシステム400は、速度Vyが所定値NSより小さいか否かを判断し、小さい場合Y方向の動きはノイズ(ユーザが意図しない、手の小さなぶれ等)とみなしリターンし、それ以外はステップS146に進む。ステップS146にて、ウィンドウシステム400は、所定フレーム数fnにおける速度Vyの平均値VyAを算出する。なお、この場合のフレームは、イメージセンサ5が差分画像を出力する周期を示す。
【0256】
ステップS148にて、ウィンドウシステム400は、平均値VyAが所定値THVより大きいか否かを判断し、大きい場合ステップS150に進み、それ以外はY方向の動きはノイズとみなし(つまりユーザが意図しない動きとみなし)リターンする。ステップS148によって、ユーザが意図しない比較的大きな動きをノイズとして排除できる。この点はステップS134と同様である。ステップS150では、ウィンドウシステム400は、速度Vyの方向を判断し、垂直上方向を向いている場合ステップS152に進み、垂直下方向を向いている場合ステップS154に進む。
【0257】
ステップS152では、ウィンドウシステム400は、フラグJFに、ジェスチャ3を示す30hを代入してリターンする。一方、ステップS154では、ウィンドウシステム400は、フラグJFに、ジェスチャ4を示す20hを代入してリターンする。
【0258】
上記のように、受付フラグがオンになった後、つまり、「パー」の状態が一定時間継続した後、手の重心の左移動、右移動、上移動、及び下移動を判断する。これにより、ユーザが意図しない動きが有効なジェスチャと認識されるのを防止できる。
【0259】
例えば、受付フラグを設けずに、重心の左移動が発生したときに、ジェスチャ1が行われたと認識し、右移動が発生したときに、ジェスチャ2が行われたと認識することを想定する。一般に、手をスイングする際、ある程度移動したら、スイング動作を停止するところ、それによって、手がぶれることも多い。この場合、本来のスイング方向と逆方向に手がぶれることも多い。また、スイング後に、無意識に手を元に戻す(逆スイングする)こともある。
【0260】
従って、手が左移動してジェスチャ1が行われたと判断した後、すぐに、逆方向のスイングが検出されることもあり、それがジェスチャ2と判断されてしまう。この場合、ジェスチャ2は、ユーザが意図しない入力である。
【0261】
本実施の形態のように、ユーザが、「パー」の状態を一定時間継続させて、特定のジェスチャを行う意思表示を行なった後、特定のジェスチャ(手の移動)の有無を判断すれば、このような逆方向のスイングが有効なジェスチャと判断されることはない。
【0262】
なお、図29では、水平移動のジェスチャ(ジェスチャ1,2)と垂直移動のジェスチャ(ジェスチャ3,4)とを選択的に判断し、双方が検出されることはなかった。ただし、双方を判断して、双方を検出することもできる。
【0263】
さて、以上のように、本実施の形態によれば、アプリケーションプログラム100等の各アプリケーションプログラムは、モーションセンサ600により検出されたユーザの手の情報によって、それぞれに割り当てられたウィンドウを制御できる。つまり、三次元空間中で動かされるユーザの手をモーションセンサ600により撮影し、撮影画像からの検出結果に基づいて、非接触でマルチウィンドウを操作できる。その結果、接触型ポインティングデバイスを使用する場合と比較して、多彩な入力を行なうことができ、マルチウィンドウの操作において、ユーザに快適な操作性を提供できる。
【0264】
「多彩な入力」とは、上記例では、手の形状(グー、チョキ、パー、一本指、)、手の形状の変化(図3(b)参照)、手の面積(イメージセンサ5と手との間の距離に相関)、及び、指先の位置ないしは移動である。接触型ポインティングデバイスでは、これら全てを入力することはできない。逆に、本実施の形態では、接触型ポインティングデバイスと同等の機能を包含できる。例えば、カーソルを指先の動きに追従させ、かつ、マウスボタンの操作を擬似的なボタン操作に対応させることにより(図3(b)参照)、マウスと同等の機能を包含できる。
【0265】
このように、モーションセンサ600は、ジェスチャコントロールデバイスとしても機能するし、ポインティングデバイスとしても機能する。従って、ウィンドウの制御内容によって、ジェスチャコントロール機能とポインティングデバイス機能とを使い分けることができ、ユーザの操作性を最適化できる。
【0266】
また、モーションセンサ600が差分画像を解析して手を検出するので、このような処理をCPU51は行なう必要がなく、その処理負荷を軽減でき、また、CPU51上で動作するコンピュータプログラムのプログラマは、手を検出するためのプログラムを作成する必要がなく、その負担を軽減できる。つまり、コンピュータシステム700に簡易にモーションセンサ600を搭載できる。
【0267】
また、本実施の形態では、ウィンドウシステム400は、モーションセンサ600が検出したユーザの指先の位置に対応するモニタ67の画面上の位置にカーソルを表示する。つまり、ユーザは、三次元空間中で手を動かしながら、非接触で、カーソルを操作できる。
【0268】
さらに、本実施の形態では、ウィンドウシステム400は、モーションセンサ600が検出したユーザの手の情報に基づいて、アプリケーションプログラム100から依頼されたイベントが発生したか否かを監視し、イベントが発生した場合に、依頼主であるアプリケーションプログラム100に、イベントの発生を通知する。従って、アプリケーションプログラム100をイベント駆動型プログラムとして作成することができ、ウィンドウの制御に好適である。
【0269】
さらに、本実施の形態では、ユーザは、1本指を立てた状態から、もう一本の指を立てて2本指を立てた状態にするだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる(図3(b)の第1の例)。
【0270】
また、擬似的なボタン操作の前後において、常に1本の指は撮影されるので、その指先に対応する画面上の位置にカーソルを表示でき、ポインティングと擬似的なボタン操作を片手で行なうことができる(図3(b)の第1の例)。
【0271】
また、本実施の形態によれば、ユーザは、2本指を立てた状態から、もう一本の指を閉じて1本指を立てた状態にするだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる(図3(b)の第2の例)。
【0272】
また、擬似的なボタン操作の前後において、常に1本の指は撮影されるので、その指先に対応する画面上の位置にカーソルを表示でき、ポインティングと擬似的なボタン操作を片手で行なうことができる(図3(b)の第2の例)。
【0273】
さらに、本実施の形態によれば、ユーザは、2本の指の指先を近づけるだけで、擬似的にボタン操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、擬似的にボタン操作を行なうことができる(図3(b)の第3の例)。
【0274】
また、検出された2つの指先の間(例えば中点)にカーソルを表示することができ、ポインティングと擬似的なボタン操作を片手で行なうことができる(図3(b)の第3の例)。
【0275】
さらに、本実施の形態によれば、ユーザは、三次元空間中で、1本指を立てた状態から、その指を折って、再び、元の立てた状態に戻すというジェスチャを行なうだけで、非接触のクリック操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、クリック操作を行なうことができる(図23(a)の第4の例)。
【0276】
このような人のジェスチャでは、指が曲げられた後、指先が、ほぼ元の位置に戻ることが、本願発明者の実験により検証されている。このため、このようなジェスチャを検出することにより、クリック操作が行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できる。
【0277】
さらに、本実施の形態によれば、ユーザは、三次元空間中で、1本指を立てた状態から、その指を折って、再び、元の立てた状態に戻し、さらに、再び、その指を折って、再び、元の立てた状態に戻すというジェスチャを行なうだけで、つまり、シングルクリック操作のためのジェスチャを2回行なうだけで、非接触のダブルクリック操作を行なうことができる。このように、ユーザにとって容易なジェスチャにより、ダブルクリック操作を行なうことができる(図23(b)の第4の例)。
【0278】
このようなダブルクリック操作は、シングルクリック操作を2回行うものであるところ、折り曲げられた指先は、2回とも、ほぼ同じ位置に戻ってくることが、本願発明者の実験により検証されている。このため、このようなジェスチャを検出することにより、ダブルクリック操作が行なわれたか否かを、安定して、かつ、確実に、つまり、高い再現性をもって、判断できる。
【0279】
また、本実施の形態では、MCU3は、指先50の動きが一定範囲DIS内に収まっている場合に(図24のステップS1208及びS1212で肯定判断)、ユーザがクリック操作(シングルクリック又はダブルクリック)を行なうことを意図しているとみなし、矩形範囲52を設定し(図24のステップS1216)、これをトリガとして、ユーザがクリック操作に対応するジェスチャを行ったか否かを判定できる。このため、ユーザが当該ジェスチャを行なったか否かを、常に判定する必要がなく、処理負荷を軽減できる。
【0280】
さらに、MCU3は、矩形範囲52が設定されてから所定時間TC内に、指先50が矩形範囲52から消失したと判断しない場合(図25のステップS1254)、又は、矩形範囲52に指先が出現したと判断しない場合(図25のステップS1262)、滞在フラグをオフにして、矩形範囲52を解除する(図25のステップS1284)。
【0281】
このように、所定時間TC内に、指先50が矩形範囲52から消失したと判断しない場合、又は、矩形範囲52に指先が出現したと判断しない場合、ユーザがクリック操作(シングルクリック又はダブルクリック)を行なうことを意図していないとみなして、ユーザの意図に反してクリック操作が行なわれたと判定されることを防止できる。つまり、一般にクリック操作は素早く行なわれるところ、所定時間TCを適切に設定することにより、同一の動きであっても、クリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0282】
さらに、本実施の形態によれば、輪郭から大体の指先を決定し(図11のステップS373,S375、図13のステップS445)、その周囲画素のみを用いて補正を行なうので(図14(a)〜図14(d))、処理のための記憶容量の削減と処理速度の向上を図ることができる。
【0283】
また、補正が小数点精度で実行されるので、イメージセンサ5が比較的低解像度であっても、高精度で指先の位置を決定することができる。その結果、イメージセンサ5より高解像度のモニタ67の画面上の、指先に対応する位置にカーソルを表示する場合でも、その動きを滑らかにすることができる。
【0284】
さらに、周囲画素の画素値により、補正を行なうので、補正後の指先を、輪郭線上ではなく、指の内部の位置に決定でき、ユーザが指先と認識する位置により近づけることができる。その結果、指先に対応するモニタ67の画面上の位置にカーソルを表示する場合、ユーザにとって、指先によるカーソルの制御が容易になる。なお、一般に、人は、指の腹を向けて、指を動かすときは、指の輪郭線上の凸点を指先と認識せず、指先端部の指の腹(finger pad)の中心を指先と認識するものである。
【0285】
さらに、本実施の形態では、補正後の指先の位置が、周囲画素の範囲(9×9画素の範囲)を超えるように、補正を行う。このため、補正後の指先の位置を指先端部の指の腹の一定位置あるいは略一定位置に決定することができ、図11のステップS373,S375、及び図13のステップS445により検出された指先の位置が安定していない場合でも、補正後の指先の位置を極力一定させ、あるいは、指先の位置の相違を極力小さい範囲に収めることができる。その結果、指先に対応するモニタ67の画面上の位置にカーソルを表示する場合、カーソルを安定化できる。
【0286】
また、補正後の指先を、ユーザが指先と認識する位置により一層近づけることができる。その結果、指先に対応するモニタ67の画面上の位置にカーソルを表示する場合、ユーザにとって、指先によるカーソルの制御が一層容易になる。
【0287】
さらに、本実施の形態では、指先画素P4と指先画素P4の斜め方向に位置する周囲画素(P0,P2,P6,P8)との間の距離と、指先画素P4と指先画素P4の水平方向又は垂直方向に位置する周囲画素(P1,P3,P5,P7)との間の距離と、が等しくなるように、周囲画素(P0,P2,P6,P8)の座標を定義する(図18(a)参照)。その結果、重みとして画素値を利用するに当って、全周囲画素の画素値が均等に扱われ、方向によって偏りのない補正を行なうことができる。
【0288】
さらに、本実施の形態によれば、CPU51は、被写体の形状(グー、チョキ、パー、1本指)を入力とした情報処理を実行することができる。
【0289】
さらに、本実施の形態によれば、指先と水かきとの間の画素に基づいて指を特定し(図9のステップS257及びS259、図17参照)、輪郭画像の重心により指を特定しないので、重心により指を特定する場合と比較して、精度良く指を特定でき(図9)、ひいてはより精度良く手の形状を判定できる(図10、図11)。一般に、輪郭画像の重心と、被写体の重心と、は一致しない場合も多く、この場合に、重心により指を特定すると、認識の精度が低くなる。
【0290】
また、指先と水かきとの間の画素に基づいて得られた、隣り合う指と指とがなす角度だけでなく、重心から指先に相当する画素までの距離に基づいて、手の形状を判断するので(図11のステップS345〜S351)、より多様な手の形状を判定できる(図11)。例えば、手の形状が「チョキ」であることを判定できる。
【0291】
また、重心から輪郭線上の画素までの距離を求めるといった簡単な計算で(図8のステップS203)、手の形状を判定できる(図12)。例えば、重心から輪郭線上の画素までの距離が、一定範囲内の場合に、手の形状が「グー」であることを判定できる。
【0292】
さらに、本実施の形態によれば、図9のステップS275の結果だけに基づいて、検出された指先の数を判断するのではなく、さらに、重心座標(Xg,Yg)と凸点(図6のステップS33)の画素Pjの座標との間の距離Dを加味して(図13のステップS427,S441)、指が1本だけ立っている状態か否かを判定する。このため、より精度よく、指が1本だけ立っている状態を検出できる。
【0293】
さらに、本実施の形態によれば、画像上の被写体の面積は(図8のステップS213)、イメージセンサ5と被写体との間の距離に相関するので、面積により、イメージセンサ5と被写体との間の距離を容易に判断できる。
【0294】
図30は、本発明の実施の形態の変形例によるコンピュータシステムの階層図である。なお、図1と同様の部分については、同じ参照符号を付して適宜説明を省略する。図30を参照して、変形例によるコンピュータシステムは、オペレーティングシステム300により管理される。オペレーティングシステム300のウィンドウシステム400は、オペレーティングシステム300上で並行して動作する複数のアプリケーションプログラム100にそれぞれ固有のウィンドウを割り当て制御する。また、ウィンドウシステム400は、モニタ67の画面に表示するカーソルを制御する。
【0295】
ミドルウェア250は、オペレーティングシステム300上で動作し、オペレーティングシステム300にない特定の機能を、各アプリケーションプログラム100に提供する。例えば、この特定の機能は、モーションセンサ600が検出したユーザの手の情報に基づきウィンドウを制御するための機能である。より具体的な例を挙げると、この特定の機能は、モーションセンサ600が検出したユーザの手の位置情報に基づき、速度及び/又は方向を算出する機能である。例えば、この特定の機能は、モーションセンサ600が検出したユーザの手の位置情報に基づき、所定の軌跡を描いたか否かを判断する機能である。例えば、この特定の機能は、手の面積が一定値以上になったか否かを判断する機能である。例えば、手の回転角度を算出する機能である。例えば、手の加速度を算出する機能である。例えば、手の形状の所定の変化(例えば「パー」から「グー」への変化)を検出する機能である。
【0296】
また、ミドルウェア250は、ウィンドウシステム400の代わりに、図27〜図29の処理を実行することもできる。
【0297】
なお、ミドルウェア250は、これら機能の結果をイベントの発生として、アプリケーションプログラム100に通知することもできる。また、ミドルウェア250は、オペレーティングシステム300から、モーションセンサ600が検出したユーザの手の情報を取得する。
【0298】
以上のように、変形例では、マウス等の接触型ポインティングデバイスで入力できる操作又はイベントはもちろん、接触型ポインティングデバイスでは入力することができない操作又はイベントをも入力できる。従って、各アプリケーションプログラム100は、多彩な入力又はイベントに応じた処理(ウィンドウの制御を含む。)を実行することができる。
【0299】
また、各アプリケーションプログラム100は、API200(図30では図示省略)を介して、ウィンドウシステム400の機能を利用でき、割り当てられたウィンドウを制御する。この点は、図1の場合と同じである。なお、ミドルウェア250の特定の機能は、API200を介して、各アプリケーションプログラム100に提供されてもよい。
【0300】
なお、変形例によるコンピュータシステムの電気的構成は、図2(a)及び図2(b)に示したものと同じである。また、変形例は、上記実施の形態のコンピュータシステム700と同様の技術的特徴を有するので、コンピュータシステム700と同様の効果を有する。
【0301】
なお、本発明は、上記の実施の形態に限られるものではなく、その要旨を逸脱しない範囲で種々の態様において実施することが可能であり、例えば、以下のような変形も可能である。
【0302】
(1)上記では、「グー」、「チョキ」、「パー」、及び「1本指」の形状を認識したが、これに限定されない。
【0303】
(2)モーションセンサ600は、赤外発光ダイオード9を搭載した。しかし、赤外発光ダイオード9は必須ではない。赤外発光ダイオード9を搭載しない場合、イメージセンサ5は、露光時画像のみを出力し、MCU3は、その画像を処理する。
【0304】
(3)上記では、指先画素P4を原点(0,0)として、周囲画素の座標値を設定し、補正値(Xc,Yc)を算出し、それを指先画素P4の座標(Xb,Yb)に加算することで、補正座標(Xf,Yf)を得た(図18(a)及び図18(b))。ただし、図14の第1〜第4の例の各式で使用する座標の原点は、これに限定されない。例えば、図11のステップS373,S375、及び図13のステップS445で求められた座標を、そのまま、指先画素P4の座標として使用して、周囲画素の座標を定め、補正座標(Xf,Yf)を求めることもできる。この場合は、図14(a)〜図14(d)の各ステップで得られた値(Xc,Yc)が、補正座標(Xf,Yf)そのものであり、加算は不要である。
【0305】
(4)上記では、ポインティングデバイスとして、モーションセンサ600のみを搭載した。ただし、マウス等の他のポインティングデバイスと併用することもできる。これにより、モーションセンサ600及びマウス等の他のポインティングデバイスのそれぞれの利点を活かすことができる。
【0306】
(5)上記例では、モーションセンサ600が検出する手の情報は、手の形状、手の形状の変化、手の面積、手の移動、手の移動軌跡、及び、指先の位置ないしは移動であった。ただし、モーションセンサ600が検出する手の情報は、これらに限定されない。例えば、モーションセンサ600によって検出されるユーザの手の情報は、手の動き(例えば、手の回転、指先の動き)、手の速度、及び/又は、手の加速度であってもよい。手の回転とは、例えば、手首を軸として、時計回り及び/又は反時計回りに、手を回転させる動作である。この場合、例えば、あたかも実際のダイヤルを握っているかのような手をして、手を回転させる。
【0307】
また、モーションセンサ600が検出する手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、手自体の動き、位置、移動、移動軌跡、速度、および、加速度のみを意味するのではなく、手の指先の動き、位置、移動、移動軌跡、速度、および、加速度を含む概念である。また、この場合、指先は、一本の指に限らず、複数本の指の指先を含んでよい。さらに、手は、片手であってもよいし、両手であってもよい。
【0308】
なお、ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度は、総称して、ジェスチャと呼ぶこともできる。
【0309】
(6)図1及び図30では、ウィンドウシステム400は、オペレーティングシステム300に含まれていたが、オペレーティングシステム300上で動作するプログラムと考えることもできる。また、デバイスドライバ500は、オペレーティングシステム300に含まれていないが、オペレーティングシステム300に含まれる機能と考えることもできる。
【0310】
(7)CPU51が、モーションセンサ600をマウスとして認識するように、モーションセンサ600内の情報設定を行なうこともできる。つまり、CPU51に、モーションセンサ600をマウスとして認識させるのである。この場合、指先の水平方向(X軸方向)及び垂直方向(Y軸方向)の移動量が、それぞれ、マウスの水平方向(X軸方向)及び垂直方向(Y軸方向)の移動量に対応し、擬似的なボタン操作が、マウスボタンの押下に対応する。この場合は、マウスと同等の入力操作以外の、モーションセンサ600特有の入力に関しては、変形例によるミドルウェア250により対応する。
【0311】
(8)図23(a)の第4の例では、所定時間TC内に、シングルクリック操作に対応するジェスチャが検出されない場合は、矩形範囲52が解除されシングルクリック操作判定がリセットされた(図25のステップS1284)。
【0312】
ただし、MCU3が、指先50が矩形範囲52から消失したと判断した後(ステップS1254で肯定判断)の所定時間TC2内に、指先50が矩形範囲52に出現したと判断しない場合、矩形範囲52を解除し、シングルクリック操作判定をリセットしてもよい。なお、MCU3が、矩形範囲52設定後所定時間TC内に、指先50が矩形範囲52から消失したと判断しない場合に、矩形範囲52を解除する点は、図25と同じである。
【0313】
このように、所定時間TC2内に、MCU3が、指先50が矩形範囲52に出現したと判断しない場合、ユーザがクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してクリック操作が行なわれたと判定されることを防止できる。つまり、一般にクリック操作は素早く行なわれるところ、所定時間TC2を適切に設定することにより、同一の動きであっても、クリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0314】
また、図23(b)の第4の例では、所定時間TC内に、ダブルクリック操作に対応するジェスチャが検出されない場合は、ダブルクリック操作判定がリセットされた(図25のステップS1284)。
【0315】
ただし、仮クリックフラグがオンになった後において、MCU3が、指先50が矩形範囲52から消失したと判断した後の所定時間TC3内に、指先50が矩形範囲52に出現したと判断しない場合、矩形範囲52を解除し、ダブルクリック操作判定をリセットしてもよい。なお、仮クリックフラグがオンになった後において、MCU3が、矩形範囲52の設定後所定時間TC内に、指先50が矩形範囲52から消失したと判断しない場合に、矩形範囲52を解除する点は、図25と同じである。また、仮クリックフラグがオンになるまでの判定(シングルクリックの判定)は図25又は上記変形と同じである。
【0316】
このように、所定時間TC3内に、MCU3が、指先50が矩形範囲52に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間TC3を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0317】
また、MCU3が、指先50が矩形範囲に出現したと判断してから、つまり、仮クリックフラグをオンにしてから所定時間TC4内に、指先50が矩形範囲52から消失したと判断しない場合、矩形範囲52を解除し、ダブルクリック操作判定をリセットしてもよい。なお、仮クリックフラグがオンになるまでの判定(シングルクリックの判定)は図25又は上記変形と同じである。
【0318】
このように、所定時間TC4内に、MCU3が、指先50が矩形範囲52から消失したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間TC4を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0319】
さらに、この場合、MCU3が、仮クリックフラグをオンにしてから所定時間TC4内に、指先50の消失の後、再び指先50が矩形範囲52に出現したと判断しない場合、矩形範囲52を解除し、ダブルクリック操作判定をリセットしてもよい。
【0320】
このように、所定時間TC4内に、MCU3が、指先50が矩形範囲52に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間TC4を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0321】
また、このような判定に代えて、MCU3が、仮クリックフラグをオンにしてから所定時間TC4内の指先50の消失の後の所定時間TC5内に、指先50が矩形範囲52に出現したと判断しない場合、矩形範囲52を解除し、ダブルクリック操作判定をリセットすることもできる。
【0322】
このように、所定時間TC5内に、MCU3が、指先50が矩形範囲52に出現したと判断しない場合、ユーザがダブルクリック操作を行なうことを意図していないとみなして、ユーザの意図に反してダブルクリック操作が行なわれたと判定されることを防止できる。つまり、一般にダブルクリック操作は素早く行なわれるところ、所定時間TC5を適切に設定することにより、同一の動きであっても、ダブルクリック操作を意図したジェスチャ以外の動きを除外して、誤判定を防止できる。
【0323】
ここで、上記の所定時間TC2〜TC5は、実験及び試行錯誤等により決定される。
【0324】
(9)ジェスチャによるコントロールは、特に、プレゼンテーション用のアプリケーションプログラム100が表示するウィンドウのコントロールに有効である。なぜなら、一般に、プレゼンテーションを行う人は、端末から離れてプレゼンテーションを行う場合も多いからである。
【0325】
(10)上記では、モーションセンサ600によるマルチウィンドウの制御に焦点を当てて説明した。ただし、本発明が、マルチウィンドウの制御に限定されないことは言うまでもない。つまり、モーションセンサ600のジェスチャコントロール機能とポインティングデバイス機能とを、1つのウィンドウ(アプリケーションプログラム100)を制御するために使用することもできる。この場合も、ジェスチャコントロール機能とポインティングデバイス機能とを制御内容に応じて使い分けて、マルチウィンドウの制御と同様に、ユーザに快適な操作性を提供できる。
【0326】
(11)上記では、イメージセンサ5が差分画像を生成した。ただし、MCU3が、赤外光発光時画像と非発光時画像との差分画像を生成することもできる。この場合、イメージセンサ5及びMCU3を、撮影装置と呼ぶこともできる。もちろん、上記実施の形態において、イメージセンサ5及びMCU3を、撮影装置と呼ぶこともできる。
【0327】
(12)MCU3が行なう処理の全部又は一部をCPU51が行なうこともできるし、逆に、CPU51が行なう処理の全部又は一部をMCU3が行うこともできる。要するに、どちらがどの処理を行なうかは、仕様に応じて、任意に決定できる。例えば、イメージセンサ5が生成した差分画像を、CPU51に渡し、CPU51が、画像解析を行って、手の検出等を行ってもよい。
【0328】
(13)MCU3に各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、また、並列的あるいは個別に実行される処理も含むものである。
【0329】
(14)本明細書及び請求の範囲において、手段とは必ずしも物理的手段を意味するものではなく、各手段の機能がソフトウェアによって実現される場合も含む。さらに、1つの手段の機能が2つ以上の物理的手段により実現されても、もしくは2つ以上の手段の機能が1つの物理的手段により実現されてもよい。
【産業上の利用可能性】
【0330】
本発明は、マルチウィンドウを操作するためのポインティングデバイスを必要とするコンピュータの分野に利用可能である。
【符号の説明】
【0331】
3…MCU、5…イメージセンサ、7…メモリ、9…赤外発光ダイオード、50…コンピュータ、51…CPU、53…メインメモリ、55…チップセット、57…GPU、59…SPU、61…HDD、63…ドライブ、65…通信部、67…モニタ、69…スピーカ、71…キーボード、75…リムーバブル記録媒体、100…アプリケーションプログラム、200…アプリケーションプログラムインタフェース(API)、250…ミドルウェア、300…オペレーティングシステム、400…ウィンドウシステム、500…デバイスドライバ、600…モーションセンサ。
【特許請求の範囲】
【請求項1】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、を備え、
前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する、コンピュータシステム。
【請求項2】
複数のアプリケーションが並行して動作可能なコンピュータシステムであって、
前記コンピュータシステム全体を管理するオペレーティングシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、
前記モーションセンサを制御し、前記モーションセンサから解析結果である前記ユーザの手の情報を受け取って、前記オペレーティングシステムに渡すデバイスドライバと、
前記デバイスドライバから受け取った前記ユーザの手の情報に基づく前記オペレーティングシステムの所定機能を前記各アプリケーションプログラムに提供するアプリケーションプログラムインタフェースと、を備え、
前記オペレーティングシステムは、並行して動作する前記複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムを含み、
前記所定機能は、前記ウィンドウを前記モーションセンサが検出した前記ユーザの手の情報に基づき制御するための前記ウィンドウシステムの機能である、コンピュータシステム。
【請求項3】
前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、画面上のカーソルを制御する、請求項1又は2記載のコンピュータシステム。
【請求項4】
前記ウィンドウシステムは、
前記モーションセンサが検出した前記ユーザの手の情報に基づいて、前記アプリケーションプログラムから依頼されたイベントが発生したか否かを監視し、前記イベントが発生した場合に、依頼主である前記アプリケーションプログラムに、前記イベントの発生を通知するイベント監視手段を含む請求項1から3のいずれかに記載のコンピュータシステム。
【請求項5】
前記モーションセンサによって検出される前記ユーザの手の情報は、前記ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度の情報の一部または全部である、請求項1から4のいずれかに記載のコンピュータシステム。
【請求項6】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、
前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供するミドルウェアと、を備えたコンピュータシステム。
【請求項7】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を生成する撮影手段と、
前記差分画像を解析して、前記ユーザの手の情報を取得する解析手段と、を備え、
前記ウィンドウシステムは、前記解析手段が取得した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する、コンピュータシステム。
【請求項8】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を生成する撮影手段と、
前記差分画像を解析して、前記ユーザの手の情報を取得するミドルウェアと、を備え、
前記ミドルウェアは、前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供する、コンピュータシステム。
【請求項1】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、を備え、
前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する、コンピュータシステム。
【請求項2】
複数のアプリケーションが並行して動作可能なコンピュータシステムであって、
前記コンピュータシステム全体を管理するオペレーティングシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、
前記モーションセンサを制御し、前記モーションセンサから解析結果である前記ユーザの手の情報を受け取って、前記オペレーティングシステムに渡すデバイスドライバと、
前記デバイスドライバから受け取った前記ユーザの手の情報に基づく前記オペレーティングシステムの所定機能を前記各アプリケーションプログラムに提供するアプリケーションプログラムインタフェースと、を備え、
前記オペレーティングシステムは、並行して動作する前記複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムを含み、
前記所定機能は、前記ウィンドウを前記モーションセンサが検出した前記ユーザの手の情報に基づき制御するための前記ウィンドウシステムの機能である、コンピュータシステム。
【請求項3】
前記ウィンドウシステムは、前記モーションセンサが検出した前記ユーザの手の情報に基づいて、画面上のカーソルを制御する、請求項1又は2記載のコンピュータシステム。
【請求項4】
前記ウィンドウシステムは、
前記モーションセンサが検出した前記ユーザの手の情報に基づいて、前記アプリケーションプログラムから依頼されたイベントが発生したか否かを監視し、前記イベントが発生した場合に、依頼主である前記アプリケーションプログラムに、前記イベントの発生を通知するイベント監視手段を含む請求項1から3のいずれかに記載のコンピュータシステム。
【請求項5】
前記モーションセンサによって検出される前記ユーザの手の情報は、前記ユーザの手の形状、手の形状の変化、手の面積、手の動き、手の位置、手の移動、手の移動軌跡、手の速度、および、手の加速度の情報の一部または全部である、請求項1から4のいずれかに記載のコンピュータシステム。
【請求項6】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を解析し、前記ユーザの手を検出する、ポインティングデバイスとしてのモーションセンサと、
前記モーションセンサが検出した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供するミドルウェアと、を備えたコンピュータシステム。
【請求項7】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を実行し、前記照射時に得られた画像と前記非照射時に得られた画像との差分画像を生成する撮影手段と、
前記差分画像を解析して、前記ユーザの手の情報を取得する解析手段と、を備え、
前記ウィンドウシステムは、前記解析手段が取得した前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を前記各アプリケーションプログラムに提供する、コンピュータシステム。
【請求項8】
並行して動作する複数のアプリケーションプログラムにそれぞれ固有のウィンドウを割り当て制御するウィンドウシステムと、
三次元空間中で動かされるユーザの手に間欠的に光を照射し、照射時及び非照射時で撮影処理を生成する撮影手段と、
前記差分画像を解析して、前記ユーザの手の情報を取得するミドルウェアと、を備え、
前記ミドルウェアは、前記ユーザの手の情報に基づき前記ウィンドウを制御するための機能を、前記各アプリケーションプログラムに提供する、コンピュータシステム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【公開番号】特開2012−73658(P2012−73658A)
【公開日】平成24年4月12日(2012.4.12)
【国際特許分類】
【出願番号】特願2010−203730(P2010−203730)
【出願日】平成22年9月10日(2010.9.10)
【出願人】(396025861)新世代株式会社 (138)
【Fターム(参考)】
【公開日】平成24年4月12日(2012.4.12)
【国際特許分類】
【出願日】平成22年9月10日(2010.9.10)
【出願人】(396025861)新世代株式会社 (138)
【Fターム(参考)】
[ Back to top ]