情報処理プログラムおよび情報処理装置
【構成】 ゲーム装置10はカメラカートリッジ60を含み、カメラカートリッジ60で撮影されたユーザの顔画像から複数の特徴点を検出する。ゲーム装置10は、この複数の特徴点を用いて、左目および右目の黒目の領域についての面積をそれぞれ算出する。そして、ゲーム装置10は、算出した面積に基づいて、左目または右目のいずれか一方が閉じているかどうかを検知する。ゲーム装置10は、この検知結果に応じてゲーム処理を実行する。
【効果】 片目を閉じる動作を簡単に検出することができる。
【効果】 片目を閉じる動作を簡単に検出することができる。
【発明の詳細な説明】
【技術分野】
【0001】
この発明は情報処理プログラムおよび情報処理装置に関し、特にたとえば、撮像手段を備え、この撮像手段により利用者の顔画像を取得する、情報処理プログラムおよび情報処理装置に関する。
【背景技術】
【0002】
背景技術の一例が特許文献1に開示される。この特許文献1の運転者の状態検出装置では、入力された運転者の顔画像が2値化され、2値化された画像内で眼球の存在領域が定められる。そして、その眼球の存在領域が走査され、連続黒色画素が検出されて、黒目部分が存在するかどうかの判定基準が設定された上で、目の開閉が検出される。
【特許文献1】特開平6−227278号
【発明の開示】
【発明が解決しようとする課題】
【0003】
しかし、特許文献1に開示される技術では、目の開閉を検出することができるが、片目だけを閉じる動作を検出することができない。
【0004】
それゆえに、この発明の主たる目的は、新規な、情報処理プログラムおよび情報処理装置を提供することである。
【0005】
また、この発明の他の目的は、片目だけを閉じる動作を検出することができる、情報処理プログラムおよび情報処理装置を提供することである。
【課題を解決するための手段】
【0006】
本発明は、上記の課題を解決するために、以下の構成を採用した。なお、括弧内の参照符号および補足説明等は、本発明の理解を助けるために後述する実施の形態との対応関係を示したものであって、本発明を何ら限定するものではない。
【0007】
第1の発明は、撮像手段を備え、撮像手段により利用者の顔画像を取得する情報処理装置のコンピュータで実行される情報処理プログラムであって、撮像手段により撮像された利用者の顔画像から、左右の目の領域の大きさを示す目領域値をそれぞれ算出する目領域値算出ステップと、目領域値算出ステップによって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する片目判定ステップとを、コンピュータに実行させる、情報処理プログラムである。
【0008】
第1の発明では、情報処理プログラムは、情報処理装置(10)のコンピュータで実行される。情報処理装置は、撮像手段(60)を備えており、この撮像手段によって利用者の顔画像を取得する。目領域値算出ステップ(34,S13)は、撮像手段により撮像された利用者の顔画像から、左右の目の領域(黒目の領域、白目の領域、または、それら両方を合わせた領域など)の大きさを示す目領域値をそれぞれ算出する。片目判定ステップ(34、S19,S23)は、目領域値算出ステップによって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する。
【0009】
第1の発明によれば、左右の目領域値を比較するので、片目を閉じているか否かを判定することができる。
【0010】
第2の発明は第1の発明に従属し、片目判定ステップは、左右の目に対するそれぞれの目領域値の比率に応じて片目が閉じたかどうかを判定する。
【0011】
第2の発明では、片目判定ステップは左右の目に対するそれぞれの目領域値の比率に応じて片目が閉じたかどうかを判定する。たとえば、一方の目領域の面積が、他方の目領域の面積の3分の2よりも小さいとき、当該一方の目を閉じていると判定することができる。
【0012】
第2の発明によれば、左右の目領域値の比率を求めて比較するだけなので、片目を閉じたかどうかの判定が容易である。
【0013】
第3の発明は第1または第2の発明に従属し、左右の目に対する検索領域をそれぞれ設定する検索領域設定ステップを、コンピュータにさらに実行させ、目領域値算出ステップは、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから目領域値を算出する。
【0014】
第3の発明では、検索領域設定ステップ(34,S77)は、左右の目に対する検索領域をそれぞれ設定する。目領域値算出ステップは、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから目領域値を算出する。つまり、顔画像の一部から左右の目領域値が算出される。
【0015】
第3の発明によれば、検索領域を設定するので、顔全体を検索する必要がない。つまり、処理の効率化を図ることができる。
【0016】
第4の発明は第3の発明に従属し、目領域値算出ステップは、撮像手段により撮像された利用者の顔画像から、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する黒目領域値算出ステップを含む。
【0017】
第4の発明では、目領域は、左右の目の黒目領域である。黒目領域値算出ステップは、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する。たとえば、黒目領域値は、黒目領域の面積や黒目領域の長さ(縦方向に最も長い部分)についての数値である。ただし、目の色は、黒色に限定される必要はなく、他の色(茶色や青色など)も含む。
【0018】
第4の発明によれば、黒目の領域の大きさを左右の目で比較するだけなので、比較的簡単な計算によって片目を閉じたかどうかを判断することができる。
【0019】
第5の発明は第4の発明に従属し、撮像手段により撮像された利用者の顔画像から左右の目の特徴点を取得する特徴点取得ステップを、コンピュータにさらに実行させ、検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を用いて左右の目に対数する検索領域のそれぞれを設定する。
【0020】
第5の発明では、特徴点取得ステップ(34,S43,S47)は、撮像手段により撮像された利用者の顔画像から左右の目の特徴点を取得する。検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を用いて検索領域のそれぞれを設定する。たとえば、右目と左目との距離を用いて、左右の黒目領域を検索する領域がそれぞれ設定される。
【0021】
第5の発明によれば、左右の目の特徴点を利用するので、確実に目の位置を認識して、黒目領域値を取得することができる。つまり、片目を閉じたことを正確に判定することができる。
【0022】
第6の発明は第5の発明に従属し、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから黒目基準値を算出する黒目基準値算出ステップを、コンピュータにさらに実行させ、黒目領域値算出ステップは、黒目基準値算出ステップによって算出された黒目基準値を閾値として黒目領域値を算出する。
【0023】
第6の発明では、黒目基準値算出ステップ(34,S79,S81,S83,S85,S87,S89)は、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから黒目基準値を算出する。黒目領域値算出ステップは、この黒目基準値を閾値として黒目領域値を算出する。たとえば、黒目基準値を用いて、黒目か白目かを判定する。
【0024】
第6の発明によれば、黒目基準値を閾値として黒目領域値を算出するので、個体差や撮影状況によるばらつきを無くして、正確に片目を閉じたことを判定することができる。
【0025】
第7の発明は第6の発明に従属し、黒目基準値は、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれにおける明度に関する値である。
【0026】
第7の発明では、黒目基準値は、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれにおける明度に関する値である。たとえば、左右の明るさの違いで、左右の黒目基準値が異なる値に設定される。
【0027】
第7の発明によれば、個体差や撮影状況によるばらつきを吸収することができる。
【0028】
第8の発明は第7の発明に従属し、黒目基準値算出ステップは、検索領域設定ステップによって設定されたすべての検索領域内で最も暗い色と最も明るい色との少なくとも一方を用いて黒目基準値を設定する。
【0029】
第8の発明では、黒目基準値算出ステップは、検索領域設定ステップによって設定されたすべての検索領域内で、最も暗い色と最も明るい色との少なくとも一方を用いて黒目基準値を設定する。たとえば、左目の検索領域のうちの最も暗い色(または明るい色)と、右目の検索領域のうちの最も暗い色(または明るい色)とを比較することにより明るさの違いが検出され、黒目基準値が設定される。または、最も暗い色同士の比較結果と、最も明るい色同士の比較結果とから明るさの違いが検出され、黒目基準値が設定される。
【0030】
第8の発明によれば、左右で一番明るい画素と一番暗い画素とを元に黒色かどうかを判別する基準値を設定するので、ノイズなどの影響を無くすことができる。
【0031】
第9の発明は第1の発明に従属し、撮像手段により撮像された利用者の顔画像をグレースケール化するグレースケール化ステップを、コンピュータにさらに実行させ、黒目領域値算出ステップは、グレースケール化ステップによってグレースケール化された顔画像から黒目領域値を算出する。
【0032】
第9の発明では、グレースケール化ステップ(34,S71)は、撮像手段により撮像された利用者の顔画像をグレースケール化する。つまり、顔画像のグレースケール画像が取得される。黒目領域算出ステップは、グレースケール化ステップによってグレースケール化された顔画像から黒目領域値を算出する。
【0033】
第9の発明によれば、顔画像をグレースケール化するので、黒目領域を容易に検出することができる。
【0034】
第10の発明は第9の発明に従属し、左右の目に対する検索領域をそれぞれ設定する検索領域設定ステップを、コンピュータにさらに実行させ、目領域算出ステップは、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから目領域値を算出する。
【0035】
第10の発明においても、第3の発明と同様に、処理の効率化を図ることができる。
【0036】
第11の発明は第10の発明に従属し、目領域値算出ステップは、撮像手段により撮像された利用者の顔画像から、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する黒目領域値算出ステップを含む。
【0037】
第11の発明では、第4の発明と同様に、目領域は、左右の目の黒目領域であり、黒目領域値算出ステップは、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する。
【0038】
第11の発明においても、第4の発明と同様に、比較的簡単な計算によって片目を閉じたかどうかを判断することができる。
【0039】
第12の発明は第11の発明に従属し、グレースケール化ステップによってグレースケール化された顔画像から左右の目の特徴点を取得する特徴点取得ステップを、コンピュータにさらに実行させ、検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を用いて左右の目に対する検索領域のそれぞれを設定する。
【0040】
第12の発明においても、第5の発明と同様に、確実に目の位置を認識して、黒目領域値を取得することができる。
【0041】
第13の発明は第12の発明に従属し、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから黒目基準値を算出する黒目基準値算出ステップを、コンピュータにさらに実行させ、黒目領域値算出ステップは、黒目基準値算出ステップによって算出された黒目基準値を閾値として黒目領域値を算出する。
【0042】
第13の発明においても、第6の発明と同様に、個体差や撮影状況によるばらつきを無くして、正確に片目を閉じたことを判定することができる。
【0043】
第14の発明は第13の発明に従属し、黒目基準値は、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれにおける明度に関する値である。
【0044】
第14の発明においても、第7の発明と同様に、個体差や撮影状況によるばらつきを吸収することができる。
【0045】
第15の発明は第14の発明に従属し、黒目基準値算出ステップは、検索領域設定ステップによって設定されたすべての検索領域内で最も暗い色と最も明るい色との少なくとも一方を用いて黒目基準値を設定する。
【0046】
第15の発明においても、第8の発明と同様に、ノイズなどの影響を無くすことができる。
【0047】
第16の発明は第5または第12の発明に従属し、検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を中心に、左右の目に対する検索領域をそれぞれ設定する。
【0048】
第16の発明では、検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を中心に、左右の目に対する検索領域をそれぞれ設定する。たとえば、特徴点は、左右の黒目領域のそれぞれの中心点に設定される。
【0049】
第16の発明によれば、左右の目の特徴点を中心に検索領域が設定されるので、確実に黒目領域を検索領域に収めることができる。
【0050】
第17の発明は第5または第12の発明に従属し、特徴点取得ステップによって取得された左右の目の特徴点間の距離を算出する距離算出ステップを、コンピュータにさらに実行させ、検索領域設定ステップは、距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、左右の目に対する検索領域をそれぞれ設定する。
【0051】
第17の発明では、距離算出ステップ(34,S75)は、特徴点取得ステップによって取得された左右の目の特徴点間の距離を算出する。検索領域設定ステップは、その特徴点間の距離を用いて、左右の目に対する検索領域をそれぞれ設定する。
【0052】
第17の発明によれば、左右の目の特徴点間の距離を用いて検索領域を設定するので、検索領域の設定が簡単である。また、そのような距離を用いることにより、検索領域に確実に黒目を収めることができる。
【0053】
第18の発明は第17の発明に従属し、距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、黒目領域値算出ステップによって算出された黒目領域値を正規化する正規化ステップを、コンピュータにさらに実行させ、片目判定ステップは、正規化ステップによって正規化された左右の目それぞれに対する黒目領域値を比較することにより片目を閉じたかどうかを判定する。
【0054】
第18の発明では、正規化ステップ(34,S161,S223)は、距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、黒目領域値算出ステップによって算出された黒目領域値を正規化する。片目判定ステップは、正規化ステップによって正規化された左右の目それぞれに対する黒目領域値を比較することにより片目を閉じたかどうかを判定する。
【0055】
第18の発明では、黒目領域値を左右の目の特徴点間の距離を用いて正規化するので、撮影された顔画像の縮尺に拘わらず、片目を閉じたかどうかを判定することができる。
【0056】
第19の発明は、第7または第14の発明に従属し、黒目領域値算出ステップは、検索領域設定ステップによって設定された検索領域内の第1方向に走査して、最も暗い画素を第1方向基準値として設定する第1方向基準値設定ステップと、第1方向基準値から続く黒目基準値より暗い画素の数を算出する画素数算出ステップとを含み、画素数算出ステップによって算出された暗い画素数を黒目領域値とする。
【0057】
第19の発明では、第1方向基準値設定ステップ(34,S95,S167)は、検索領域設定ステップによって設定された検索領域内の第1方向に走査して、最も暗い画素を第1方向基準値として設定する。画素数算出ステップ(34,S97−S123,S169−S195)は、第1方向基準値から続く黒目基準値より暗い画素の数を算出する。黒目領域値算出ステップは、画素数算出ステップによって算出された暗い画素数を黒目領域値とする。
【0058】
第19の発明によれば、最も暗い画素を中心にして第1方向に連続する暗い画素の数を算出するので、正確な基準で黒色が連続するラインを算出することができる。
【0059】
第20の発明は第19の発明に従属し、黒目領域値算出ステップは、第1方向に直交する第2方向に対して第1方向を順次ずらして、第1方向基準値設定ステップと画素数算出ステップとを繰り返し実行し、第1方向基準値から続く黒目基準値より暗い画素数を合算する画素数合算ステップを含み、画素数合算ステップによって合算された暗い画素数を黒目領域値とする。
【0060】
第20の発明では、画素数合算ステップは、第1方向の走査が終了すると、第1方向に直交する第2方向に対して第1方向を順次ずらして(34,S131,S203)、第1方向基準値設定ステップと画素数算出ステップとを繰り返し実行し、第1方向基準値から続く黒目基準値より暗い画素数を合算する。つまり、黒目領域値算出ステップは、黒目基準値より暗い画素が第1方向に連続する画素数を、第1方向に直交する第2方向にずらして順次算出し、それらすべてを合算した暗い画素数を黒目領域とする。
【0061】
第20の発明によれば、第1方向に連続する暗い画素のラインを第1方向とは直交する第2方向に順次ずらして算出し、その合計を求めるので、正確に黒目領域値を求めることができる。
【0062】
第21の発明は第19または第20の発明に従属し、黒目領域値算出ステップは、画素数算出ステップによって、第1方向基準値から続く黒目基準値より暗い画素の数が所定数以上に達したときには、無効値を黒目領域値として設定する。
【0063】
第21の発明では、黒目領域値算出ステップは、画素数算出ステップによって、第1方向基準値から続く黒目基準値より暗い画素の数が所定数以上に達したときには(S125またはS197で“YES”)、黒目ではなく、髪の毛や睫毛であると判断して、無効値を黒目領域として設定する(34,S129,S201)。
【0064】
第21の発明によれば、黒目領域値が所定数以上の場合には、黒目ではないと判断して、それを無効にするので、髪の毛が目にかかっていたり、睫毛の長い人が目を閉じていたりするような所望でない状態を、片目を閉じているかどうかの判定から除外することができる。
【0065】
第22の発明は第21の発明に従属し、特徴点取得ステップ、検索領域算出ステップ、黒目基準値算出ステップ、黒目領域値算出ステップは、コンピュータによって少なくとも2回繰り返し実行され、連続して黒目領域値に無効値が設定されていないときにのみ、片目判定ステップをコンピュータに実行させる。
【0066】
第22の発明では、情報処理プログラムは、特徴点取得ステップ、検索領域算出ステップ、黒目基準値算出ステップ、黒目領域値算出ステップを、コンピュータに少なくとも2回繰り返し実行させる。そして、情報処理プログラムは、連続して黒目領域値に無効値が設定されていないときにのみ(S17で“NO”)、片目判定ステップをコンピュータに実行させる。
【0067】
第22の発明によれば、複数回繰り返した結果から片目を閉じたかどうかを判定するので、安定した正しい判定を行なうことができる。
【0068】
第23の発明は第19または第20の発明に従属し、画素数算出ステップは、黒目基準値より明るい画素が所定数以上続いた場合には、第1方向基準値から当該明るい画素までの数を黒目領域値として設定する。
【0069】
第23の発明では、画素数算出ステップは、黒目基準値より明るい画素が所定数以上続いた場合には(S107,S121,S179,S193で“YES”)、第1方向基準値から当該明るい画素までの数を黒目領域値として設定する。つまり、黒目に含まれる白い部分を黒目と判断し、黒目と白目とを正確に区別するようにしてある。
【0070】
第23の発明によれば、黒目と白目とを正確に区別するので、黒目領域値を正しく算出することができる。
【0071】
第24の発明は第1の発明に従属し、片目判定ステップによって片目を閉じていることが判定された場合に、所定の処理を実行する処理ステップを、コンピュータにさらに実行させる。
【0072】
第24の発明では、情報処理プログラムは、片目判定ステップによって片目を閉じていることが判定された場合に(S19,S23で“YES”)、所定の処理を実行する処理ステップを、コンピュータにさらに実行させる。
【0073】
第24の発明によれば、ユーザが片目を閉じることにより、所定の処理が実行されるので、ユーザは手で操作を行う必要がない。
【0074】
第25の発明は、撮像手段を備え、撮像手段により利用者の顔画像を取得する情報処理装置であって、撮像手段により撮像された利用者の顔画像から、左右の目の領域の大きさを示す目領域値をそれぞれ算出する目領域値算出手段と、目領域値算出手段によって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する片目判定手段とを備える、情報処理装置である。
【0075】
第25の発明においても、第1の発明と同様に、片目を閉じている動作を検出することができる。
【発明の効果】
【0076】
この発明によれば、左右の目領域値を比較するので、その比較結果に応じて片目を閉じている動作を検出することができる。
【0077】
この発明の上述の目的,その他の目的,特徴および利点は、図面を参照して行う以下の実施例の詳細な説明から一層明らかとなろう。
【発明を実施するための最良の形態】
【0078】
図1を参照して、この発明の実施例であるゲーム装置10は、第1の液晶表示器(LCD)12および第2のLCD14を含む。LCD12およびLCD14は、所定の配置位置となるようにハウジング16に収納される。この実施例では、ハウジング16は、上側ハウジング16aと下側ハウジング16bとによって構成され、LCD12は上側ハウジング16aに収納され、LCD14は下側ハウジング16bに収納される。したがって、LCD12とLCD14とは縦(上下)に並ぶように近接して配置される。
【0079】
なお、この実施例では、表示器としてLCDを用いるようにしてあるが、LCDに代えて、EL(Electronic Luminescence)ディスプレイやプラズマディスプレイを用いるようにしてもよい。
【0080】
図1からも分かるように、上側ハウジング16aは、LCD12の平面形状よりも少し大きな平面形状を有し、一方主面からLCD12の表示面を露出するように開口部が形成される。一方、下側ハウジング16bは、その平面形状が上側ハウジング16aよりも横長に選ばれ、横方向の略中央部にLCD14の表示面を露出するように開口部が形成される。下側ハウジング16bのLCD14の左方には電源スイッチ18が設けられる。
【0081】
また、上側ハウジング16aには、LCD12を挟んで左右に、スピーカ36aおよび36b(図2)のための音抜き孔20aおよび20bが形成される。そして、下側ハウジング16bには、マイク(図示せず)のためのマイク孔20cが形成されるとともに、操作スイッチ22(22a,22b,22c,22d,22e,22Lおよび22R)が設けられる。
【0082】
また、上側ハウジング16aと下側ハウジング16bとは、上側ハウジング16aの下辺(下端)と下側ハウジング16bの上辺(上端)の一部とが回動可能に連結されている。したがって、たとえば、ゲームをプレイしない場合には、LCD12の表示面とLCD14の表示面とが対面するように、上側ハウジング16aを回動させて折りたたんでおけば、LCD12の表示面およびLCD14の表示面に傷がつくなどの破損を防止することができる。ただし、上側ハウジング16aと下側ハウジング16bとは、回動可能に連結せずに、それらを一体的(固定的)に設けたハウジング16を形成するようにしてもよい。
【0083】
操作スイッチ22は、方向指示スイッチ(十字スイッチ)22a,スタートスイッチ22b、セレクトスイッチ22c、動作スイッチ(Aボタン)22d、動作スイッチ(Bボタン)22e、動作スイッチ(Xボタン)22f、動作スイッチ(Yボタン)22g、動作スイッチ(Lボタン)22Lおよび動作スイッチ(Rボタン)22Rを含む。スイッチ22aは、下側ハウジング16bの一方主面であり、LCD14の左側に配置される。その他のスイッチ22b−22gは、下側ハウジング16bの一方主面であり、LCD14の右側に配置される。さらに、スイッチ22Lおよびスイッチ22Rは、それぞれ、上側ハウジング16aとの連結部を挟む下側ハウジング16bの上側面の左右角部に配置される。
【0084】
方向指示スイッチ22aは、ディジタルジョイスティックとして機能し、4つの押圧部の1つを操作することによって、ユーザないしプレイヤによって操作可能なプレイヤキャラクタ(またはプレイヤオブジェクト)の移動方向を指示したり、カーソルの移動方向を指示したりする等に用いられる。また、各押圧部には、特定の役割を割り当てることができ、4つの押圧部の1つを操作することによって、割り当てられた役割を指示(指定)することができる。
【0085】
スタートスイッチ22bは、プッシュボタンで構成され、ゲームを開始(再開)したり、一時停止(Pause)したりする等に用いられる。また、セレクトスイッチ22cは、プッシュボタンで構成され、ゲームモードの選択等に用いられる。
【0086】
動作スイッチ22dすなわちAボタンは、プッシュボタンで構成され、方向指示以外の動作、すなわち、プレイヤキャラクタに打つ(パンチ)、投げる、つかむ(取得)、乗る、ジャンプするなどの任意のアクションをさせることができる。たとえば、アクションゲームにおいては、ジャンプ、パンチ、武器を動かす等を指示することができる。また、ロールプレイングゲーム(RPG)やシミュレーションRPGにおいては、アイテムの取得、武器やコマンドの選択および決定等を指示することができる。さらに、方向指示スイッチ22aやセレクトスイッチ22cで選択された項目を決定することもできる。動作スイッチ22eすなわちBボタンは、プッシュボタンで構成され、セレクトスイッチ22cで選択したゲームモードの変更やAボタン22dで決定したアクションの取り消し等のために用いられる。
【0087】
動作スイッチ22fすなわちXボタン、および動作スイッチ22gすなわちYボタンは、プッシュボタンで構成され、Aボタン22dとBボタン22eだけでは、ゲーム進行ができないときに、補助的な操作に用いられる。ただし、Xボタン22fおよびYボタン22gは、Aボタン22dおよびBボタン22eと同様の操作に用いることも可能である。もちろん、ゲームプレイにおいてXボタン22fとYボタン22gとを必ずしも使用しなくてよい。
【0088】
動作スイッチ22L(左押しボタン)および動作スイッチ22R(右押しボタン)は、プッシュボタンで構成され、左押しボタン(Lボタン)22Lおよび右押しボタン(Rボタン)22Rは、Aボタン22dおよびBボタン22eと同様の操作に用いることができ、また、Aボタン22dおよびBボタン22eの補助的な操作に用いることができる。さらに、Lボタン22LおよびRボタン22Rは、方向スイッチ22a、Aボタン22d,Bボタン22e,Xボタン22f,Yボタン22gに割り当てられた役割を、他の役割に変更することができる。
【0089】
また、LCD14の上面には、タッチパネル24が装着される。タッチパネル24としては、たとえば、抵抗膜方式、光学式(赤外線方式)および静電容量結合式のいずれかの種類のものを用いることができる。また、タッチパネル24は、その上面をスティック26ないしはペン(スタイラスペン)或いは指(以下、これらを「スティック26等」という場合がある。)で、押圧したり、撫でたり、触れたりすることにより操作(タッチ入力)すると、スティック26等の操作位置の座標を検出して、検出した座標(検出座標)に対応する座標データを出力する。
【0090】
なお、この実施例では、LCD14(LCD12も同じ、または略同じ。)の表示面の解像度は256dot×192dotであり、タッチパネル24の検出精度も表示画面に対応して256dot×192dotとしてあるが、タッチパネル24の検出精度は表示画面の解像度よりも低くてもよく、高くてもよい。
【0091】
LCD12およびLCD14には異なるゲーム画面が表示されてもよい。たとえば、レースゲームでは一方のLCDに運転席からの視点による画面を表示し、他方のLCDにレース(コース)全体の画面を表示することができる。また、RPGでは、一方のLCDにマップやプレイヤキャラクタ等のキャラクタを表示し、他方のLCDにプレイヤキャラクタが所有するアイテムを表示することができる。さらに、一方のLCD(この実施例では、LCD14)にゲームの操作画面(ゲーム画面)を表示し、他方のLCD(この実施例では、LCD12)に当該ゲームに関する情報(得点やレベルなど)を含む他のゲーム画面を表示することができる。さらには、2つのLCD12およびLCD14を合わせて1つの画面として用いることにより、プレイヤキャラクタが倒さなければならない巨大な怪物(敵キャラクタ)を表示することもできる。
【0092】
したがって、プレイヤはスティック26等でタッチパネル24を操作することにより、LCD14の画面に表示されるプレイヤキャラクタ、敵キャラクタ、アイテムキャラクタ、操作オブジェクトなどの画像を指示(操作)したり、コマンドを選択(入力)したりすることができる。また、3次元ゲーム空間に設けられる仮想カメラ(視点)の方向(視線の向き)を変化させたり、ゲーム画面(マップ)のスクロール(徐々に移動表示)方向を指示したりすることもできる。
【0093】
なお、ゲームの種類によっては、タッチパネル24を用いることにより、その他の入力指示も可能である。たとえば、座標入力指示を入力したり、LCD14において文字,数字,記号等を手書き入力したりすることができる。
【0094】
このように、ゲーム装置10は、2画面分の表示部となるLCD12およびLCD14を有し、いずれか一方(この実施例では、LCD14)の上面にタッチパネル24が設けられるので、2画面(12,14)と2系統の操作部(22,24)とを有する構成になっている。
【0095】
また、この実施例では、スティック26は、たとえば下側ハウジング16bに設けられる収納部(図1では点線で示す)に収納することができ、必要に応じて取り出される。ただし、スティック26を設けない場合には、その収納部も設ける必要はない。
【0096】
さらに、ゲーム装置10はメモリカード(またはカートリッジ)28を含み、このメモリカード28は着脱自在であり、下側ハウジング16bの裏面ないしは上端(天面)に設けられる挿入部30a(図1では点線で示す)に挿入される。図1では省略するが、挿入部30aの奥部には、メモリカード28の挿入方向先端部に設けられるコネクタ(図示せず)と接合するためのコネクタ32a(図2参照)が設けられており、したがって、メモリカード28が挿入部30aに挿入されると、コネクタ同士が接合され、ゲーム装置10のCPUコア34(図2参照)がメモリカード28にアクセス可能となる。
【0097】
さらにまた、ゲーム装置10はカメラカートリッジ60を含み、このカメラカートリッジ60は着脱自在であり、下側ハウジング16bの裏面ないし下端(底面)に設けられる挿入部30b(図1では点線で示す)に挿入される。図1では省略するが、挿入部30bの奥部には、カメラカートリッジ60の挿入方向先端部に設けられるコネクタ(図示せず)と接合するためのコネクタ32b(図2参照)が設けられており、したがって、カメラカートリッジ60が挿入部30bに挿入されると、コネクタ同士が接合され、ゲーム装置10のCPUコア34(図2参照)がカメラカートリッジ60にアクセス可能となる。
【0098】
なお、図1では表現できないが、上側ハウジング16aの音抜き孔20aおよび20bと対応する位置であり、この上側ハウジング16aの内部にはスピーカ36aおよび36b(図2参照)が設けられる。
【0099】
また、図1では省略するが、たとえば、下側ハウジング16bの裏面側には、電池収容ボックスが設けられ、また、下側ハウジング16bの底面側には、音量スイッチ、外部拡張コネクタおよびイヤフォンジャックなどが設けられる。
【0100】
図2はゲーム装置10の電気的な構成を示すブロック図である。図2を参照して、ゲーム装置10は電子回路基板38を含み、この電子回路基板38には上述のCPUコア34等の回路コンポーネントが実装される。CPUコア34は、バス40を介して前述のコネクタ32aおよびコネクタ32bに接続されるとともに、RAM42、第1のグラフィック処理ユニット(GPU)44、第2のGPU46、入出カインターフェース回路(以下、「I/F回路」という。)48およびLCDコントローラ50が接続される。
【0101】
コネクタ32aには、上述したように、メモリカード28が着脱自在に接続される。メモリカード28は、ROM28aおよびRAM28bを含み、図示は省略するが、ROM28aおよびRAM28bは、互いにバスで接続され、さらに、コネクタ32aと接合されるコネクタ(図示せず)に接続される。したがって、上述したように、CPUコア34は、ROM28aおよびRAM28bにアクセスすることができるのである。
【0102】
ROM28aは、ゲーム装置10で実行すべきゲームのためのゲームプログラム、画像データ(文字やオブジェクトの画像、背景画像、アイテム画像、アイコン(ボタン)画像、メッセージ画像など)およびゲームに必要な音(音楽)のデータ(音データ)等を予め記憶する。RAM(バックアップRAM)28bは、そのゲームの途中データやゲームの結果データなどを記憶(セーブ)する。
【0103】
RAM42は、バッファメモリないしはワーキングメモリとして使用される。つまり、CPUコア34は、メモリカード28のROM28aに記憶されたゲームプログラム、画像データおよび音データ等をRAM42にロードし、ロードしたゲームプログラムを実行する。また、CPUコア34は、ゲームの進行に応じて一時的に発生するデータ(ゲームデータやフラグデータ)をRAM42に記憶しつつゲーム処理を実行する。
【0104】
なお、ゲームプログラム、画像データおよび音データ等は、ROM28aから一度に全部、または部分的かつ順次的に読み出され、RAM42に記憶(ロード)される。
【0105】
ただし、メモリカード28のROM28aには、ゲーム以外の他のアプリケーションについてのプログラムおよび当該アプリケーションの実行に必要な画像データが記憶される場合もある。また、必要に応じて、音(音楽)データが記憶されてもよい。かかる場合には、ゲーム装置10では、当該アプリケーションが実行される。
【0106】
また、コネクタ32bには、上述したように、カメラカートリッジ60が着脱自在に接続される。カメラカートリッジ60は、CCDイメージャやCMOSイメージャのような撮像装置を用いたカメラ機能を備え、撮影した画像のデータ(撮影画像データ)を、コネクタ32bおよびバスを介してCPUコア34に与える。CPUコア34は、カメラカートリッジ60からの撮影画像データをRAM42に記憶(一時記憶)する。なお、図1では、カメラカートリッジ60の筐体から露出して、撮像装置のレンズ60aが設けられる。
【0107】
GPU44およびGPU46は、それぞれ、描画手段の一部を形成し、たとえばシングルチップASICで構成され、CPUコア34からのグラフィックスコマンド(作画命令)を受け、そのグラフィックスコマンドに従って画像データを生成する。ただし、CPUコア34は、グラフィックスコマンドに加えて、画像データの生成に必要な画像生成プログラム(ゲームプログラムに含まれる。)をGPU44およびGPU46のそれぞれに与える。
【0108】
また、GPU44には、第1のビデオRAM(以下、「VRAM」という。)52が接続され、GPU46には、第2のVRAM54が接続される。GPU44およびGPU46が作画コマンドを実行するにあたって必要なデータ(画像データ:ポリゴンやテクスチャ等のデータ)は、GPU44およびGPU46が、それぞれ、第1のVRAM52および第2のVRAM54にアクセスして取得する。
【0109】
なお、CPUコア34は、描画に必要な画像データをGPU44およびGPU46を介して第1のVRAM52および第2のVRAM54に書き込む。GPU44はVRAM52にアクセスして描画のための画像データを作成し、GPU46はVRAM54にアクセスして描画のための画像データを作成する。
【0110】
VRAM52およびVRAM54は、LCDコントローラ50に接続される。LCDコントローラ50はレジスタ56を含み、レジスタ56はたとえば1ビットで構成され、CPUコア34の指示によって「0」または「1」の値(データ値)を記憶する。LCDコントローラ50は、レジスタ56のデータ値が「0」である場合には、GPU44によって作成された画像データをLCD12に出力し、GPU46によって作成された画像データをLCD14に出力する。また、LCDコントローラ50は、レジスタ56のデータ値が「1」である場合には、GPU44によって作成された画像データをLCD14に出力し、GPU46によって作成された画像データをLCD12に出力する。
【0111】
なお、LCDコントローラ50は、VRAM52およびVRAM54から直接画像データを読み出したり、GPU44およびGPU46を介してVRAM52およびVRAM54から画像データを読み出したりする。
【0112】
I/F回路48には、操作スイッチ22,タッチパネル24およびスピーカ36a,36bが接続される。ここで、操作スイッチ22は、上述したスイッチ22a,22b,22c,22d,22e,22g,22Lおよび22Rであり、操作スイッチ22が操作されると、対応する操作信号(操作データ)がI/F回路48を介してCPUコア34に入力される。また、タッチパネル24からの座標データがI/F回路48を介してCPUコア34に入力される。さらに、CPUコア34は、ゲーム音楽(BGM)、効果音またはゲームキャラクタの音声(擬制音)などのゲームに必要な音データをRAM42から読み出し、I/F回路48を介してスピーカ36a,36bから出力する。
【0113】
図3はこの実施例におけるゲーム装置10の使用例を示す図解図である。図1および図3から分かるように、図3では、図1に示すゲーム装置10を反時計周りに約90°回転した状態で、ユーザないしプレイヤ(以下、単に「ユーザ」という。)が両手で把持している。したがって、LCD12およびLCD14は横並びに配置される。このようにして、カメラカートリッジ60でユーザの顔を撮影するとともに、当該ユーザがLCD12およびLCD14に表示される画面を見て仮想ゲーム等のアプリケーションを実行できるようにしてある。
【0114】
図4は、上述のゲーム装置10を用いて仮想ゲーム等のアプリケーションを実行する場合に、図3に示した状態で、LCD12に表示される画面100およびLCD14に表示される画面200の例を示す。ただし、図4においては、簡単のため、LCD12およびLCD14の表示面のみを示してある。画面100は、その上部に表示領域102を含み、表示領域102には、たとえば、ユーザに対する質問の内容がテキスト表示される。
【0115】
また、画面200は、その中央上部に表示領域202を含み、この表示領域202には、画像(この実施例では、ユーザの顔画像)が表示される。顔画像は、上述したカメラカートリッジ60で撮影されたユーザの顔画像であり、その顔画像の鏡像が表示領域202に表示される。また、表示領域202の下方には、上記表示領域102に表示された質問に回答するための選択肢がボタン画像204およびボタン画像206のそれぞれにテキスト表示される。
【0116】
このようなアプリケーションでは、ユーザが片目を閉じる動作を行うことにより、ボタン画像(204,206)を押す(オンする)などの操作が可能である。つまり、ユーザは、操作スイッチ22の操作やタッチパネル24のタッチ入力(タッチ操作)に代えて、片目を閉じる動作によってコマンドを入力することができるのである。
【0117】
たとえば、図4に示す例では、画面100の表示領域102に表示される質問に対して、左目または右目を閉じることにより、ボタン画像204またはボタン画像206を選択(オン)して、回答することができる。ただし、カメラカートリッジ60によって、ユーザの顔画像が撮影され、片目を閉じる動作が認識される必要がある。ユーザの顔画像が撮影されているか否かをユーザが容易に判断できるようにするために、画面200の表示領域202にカメラカートリッジ60で撮影されている画像を表示するようにしてある。
【0118】
図5(A)および図5(B)には、画面100および画面200の他の例が示される。図5(A)に示す画面100では、その上部に表示領域110にユーザに対する指示ないし通知(メッセージ)がテキスト表示される。また、図5(A)に示す画面200では、表示領域202の下方にボタン画像208が表示される。かかる場合には、ユーザが左目または右目を閉じることにより、ボタン画像208をオンして、画面100に表示された指示ないしメッセージを見た(理解した)旨を入力することができる。
【0119】
また、図5(B)に示す画面100では、その全体にゲーム画面の背景(マップ)が表示され、その中央下部にプレイヤキャラクタ120が表示される。一方、図5(B)に示す画面200では、表示領域202の下方にボタン画像210およびボタン画像212が設けられる。かかる場合には、ユーザは、左目または右目を閉じることにより、ボタン画像210またはボタン画像212をオンして、プレイヤキャラクタ120の進行方向(左または右)を指示することができる。
【0120】
このように、片目を閉じる動作によってアプリケーションを操作することができる。ここで、片目を閉じる動作の検出方法について簡単に説明することにする。図6は、撮影されたユーザの顔画像およびその特徴点Pi(i=1,2,…,41,42)を示す図解図である。ただし、図6では、RAM42に展開される画像をカメラ座標系で示し、また、画像を展開する領域(展開領域)は、後述するように、LCD14の大きさに相当する領域がRAM42に確保される。図6からも分かるように、展開領域の左上の頂点がカメラ座標の原点Oである。また、カメラ座標系では、図面の右方向がX軸のプラス方向であり、図面の下方向がY軸のプラス方向である。
【0121】
ユーザの顔画像の特徴点Piの位置は、カメラカートリッジ60によって撮影されたユーザの顔画像に対して、エッジ検出等の画像処理を施すことによって検出される。特徴点Piが検出されると、この特徴点Piを用いて、撮影画像の一部を走査することにより、左目および右目の黒目の領域(黒目領域)についての面積がそれぞれ求められる。そして、右目と左目との黒目領域の面積の比較結果(比率)に応じて、片目(左目または右目)を閉じているかどうかを判断するようにしてある。以下、この実施例では、片目を閉じる動作をウインクと言うことがあるが、同時に両目を閉じる動作は含まない。
【0122】
図7は、図2に示したRAM42のメモリマップの一例を示す図解図である。図7に示すように、RAM42はプログラム記憶領域70およびデータ記憶領域72を含む。プログラム記憶領域70には、仮想ゲームなどのアプリケーションプログラム(情報処理プログラム)が記憶され、この情報処理プログラムは、メイン処理プログラム70a、画像生成プログラム70b、画像表示プログラム70c、画像更新プログラム70d、ウインク検知プログラム70eおよびコマンド処理プログラム70fなどによって構成される。また、ウインク検知プログラム70eは、特徴点検出プログラム700および面積計測プログラム702などを含む。
【0123】
メイン処理プログラム70aは、アプリケーションのメインルーチンを処理するためのプログラムである。画像生成プログラム70bは、ポリゴンデータやテクスチャデータなどを用いて、アプリケーションを実行するために必要な画像(アプリケーション画像)を生成するためのプログラムである。画像表示プログラム70cは、画像生成プログラム70bに従って生成されたアプリケーション画像をLCD12およびLCD14に表示するためのプログラムである。画像更新プログラム70dは、LCD12およびLCD14に表示される画面100および画面200を更新するためのプログラムである。
【0124】
ウインク検知プログラム70eは、ユーザのウインクを検知するとともに、閉じている目を検出するためのプログラムである。特徴点検出プログラム700は、一定時間(この実施例では、10フレーム:フレームは画面更新単位時間(1/60秒))毎に、カメラカートリッジ60によって撮影(撮像)されたユーザの顔画像に対して、エッジ検出等の画像処理を施すことによって、顔画像における42個の特徴点Piを検出および更新するためのプログラムである。面積計測プログラム702は、特徴点検出プログラム700に従って検出された特徴点Piを用いて、右目の黒目領域の面積および左目の黒目領域の面積を、それぞれ計測するためのプログラムである。
【0125】
コマンド処理プログラム70fは、ウインク検知プログラム70eに従ってウインクおよび閉じている目が検出されたとき、閉じている目に応じた処理を実行するためのプログラムである。
【0126】
なお、図示は省略するが、情報処理プログラムは、音出力プログラムやバックアッププログラムなども含む。音出力プログラムは、図示しない音(音楽)データを用いて、アプリケーションを実行する場合に必要な音(音楽)を生成および出力するためのプログラムである。バックアッププログラムは、ユーザの指示やアプリケーションの実行中に発生するイベントに応じて、作業中のデータ(途中データ)または作業後のデータ(結果データ)を、メモリカード28のRAM28bに保存(セーブ)するためのプログラムである。
【0127】
図8は図7に示したデータ記憶領域72の具体的な内容の一例を示す図解図である。図8に示すように、データ記憶領域72には、特徴点データ72a、今回の左目の黒目領域の面積データ72b、今回の右目の黒目領域の面積データ72c、前回の左目の黒目領域の面積データ72dおよび前回の右目の黒目領域の面積データ72eが記憶される。また、特徴点取得フラグ72f、ウインク検知実行フラグ72g、左目処理フラグ72hおよび右目処理フラグ72iが記憶される。
【0128】
特徴点データ72aは、特徴点検出プログラム70fに従って検出されたすべての特徴点Piについての座標データである。今回の左目の黒目領域の面積データ72bは、左目の黒目領域について今回計測された面積についてのデータである。今回の右目の黒目領域の面積データ72cは、右目の黒目領域について今回計測された面積についてのデータである。前回の左目の黒目領域の面積データ72dは、右目の黒目領域について前回計測された面積についてのデータである。前回の右目の黒目領域について前回計測された面積についてのデータである。
【0129】
特徴点取得フラグ72fは、撮影画像データから特徴点Piを取得できたか否かを示すフラグであり、たとえば、1ビットのレジスタで構成される。撮影画像データから特徴点Piを取得できた場合には、特徴点取得フラグ(IsEnable)72fが成立(true)され、レジスタにデータ値「1」が設定される。一方、撮影画像データから特徴点Piを取得できない場合には、特徴点取得フラグ72fが不成立(false)され、レジスタにデータ値「0」が設定される。
【0130】
ウインク検知実行フラグ72gは、ウインクの有無を実際に検知するか否かを示すフラグであり、たとえば、1ビットのレジスタで構成される。この実施例では、一定時間(10フレーム)毎に、ウインク検知実行フラグ(IsCheck)72gが成立され、レジスタにデータ値「1」が設定される。それ以外では、ウインク検知実行フラグ72gが不成立され、レジスタにデータ値「0」が設定される。
【0131】
左目処理フラグ72hは、左目のウインク処理を実行するかどうかを示すフラグであり、たとえば、1ビットのレジスタで構成される。この左目処理フラグ(Lexe)72hは、ウインクが検知され、左目が閉じられていることが判断されたときに成立され、レジスタにデータ値「1」が設定される。それ以外では、左目処理フラグ72hは不成立され、レジスタにデータ値「0」が設定される。
【0132】
右目処理フラグ72iは、右目のウインク処理を実行するかどうかを示すフラグであり、たとえば、1ビットのレジスタで構成される。この右目処理フラグ(Rexe)72iは、ウインクが検知され、右目が閉じられていることが判断されたときに成立され、レジスタにデータ値「1」が設定される。それ以外では、右目処理フラグ72iは不成立され、レジスタにデータ値「0」が設定される。
【0133】
なお、図示は省略するが、画像データ、音データなどの他のデータ、他のフラグ、カウンタなどもデータ記憶領域72に記憶される。
【0134】
具体的には、図2に示したCPUコア34が図9および図10に示すウインク検知処理を実行する。図9に示すように、CPUコア34がウインク検知処理を開始すると、ステップS1で、変数、カウンタおよびフラグを初期化する。具体的には、変数maxSizeL,maxSizeR,preMaxSizeL,preMaxSizeRのそれぞれに初期値(−1)を代入する。ただし、これらの変数の初期値(−1)は、無効(値)を意味する。また、変数Countに初期値(0)を代入する。そして、フラグIsEnable,IsCheck,Lexe,Rexeを初期値(false)に設定する。
【0135】
ただし、変数maxSizeLは、今回の左目の黒目領域の面積データ72bであり、変数maxSizeRは、今回の右目の黒目領域の面積データ72cであり、変数preMaxSizeLは、前回の左目の黒目領域の面積データ72dであり、そして、変数preMaxSizeRは、前回の右目の黒目領域の面積データ72eである。また、変数countは、フレーム数のカウント値であり、一定値(9)になると、リセット(0)される。上述したように、フラグIsEnableは、特徴点Piを取得できたか否かを示す特徴点取得フラグ72fであり、フラグIsCheckは、ウインクの検知を行うか否かを示すウインク検知実行フラグ72gであり、フラグLexeは、左目のウインク処理を実行するか否かを示す左目処理フラグ72hであり、そして、フラグRexeは、右目のウインク処理を実行するか否かを示す右目処理フラグ72iである。
【0136】
次に、ステップS3では、後述する特徴点データの更新処理(図11参照)を実行する。続くステップS5では、フラグIsCheckがtrueであるかどうかを判断する。つまり、CPUコア34は、今回ウインクの検知を行うかどうかを判定する。ステップS5で“NO”であれば、つまりフラグIsCheckがfalseであれば、今回ウインクの検知を行わないと判定して、図10に示すステップS27に進む。一方、ステップS5で“YES”であれば、つまりフラグIsCheckがtrueであれば、今回ウインクの検知を行うと判定して、ステップS7で、変数preMaxSizeLに変数maxSizeLを代入するとともに、変数preMaxSizeRに変数maxSizeRを代入する。つまり、CPUコア34は、今回の左目の黒目領域の面積データ72bのコピーを前回の左目の黒目領域の面積データ72dとしてデータ記憶領域72に記憶するとともに、今回の右目の黒目領域の面積データ72cのコピーを前回の右目の黒目領域の面積データ72eとしてデータ記憶領域72に記憶する。
【0137】
そして、ステップS9で、フラグIsEnableがtrueであるかどうかを判断する。つまり、CPUコア34は、特徴点Piを取得できたかどうかを判定する。ステップS9で“NO”であれば、つまりフラグIsEnableがfalseであれば、特徴点Piを取得できていないと判断して、ステップS11で、変数maxSizeLおよび変数maxSizeRのそれぞれに−1(無効値)を代入して、ステップS27に進む。一方、ステップS9で“YES”であれば、つまりフラグIsEnableがtrueであれば、特徴点Piを取得できたと判断して、ステップS13で、後述する面積計測処理(図12−図21参照)を実行して、ステップS15に進む。
【0138】
ステップS15では、変数minLに、変数preMaxSizeLおよび変数maxSizeLのうち小さい方を代入し、変数maxLに、変数preMaxSizeLおよび変数maxSizeLのうち大きい方を代入し、変数minRに、変数preMaxSizeRおよび変数maxSizeRのうち小さい方を代入し、変数minRに、変数preMaxSizeRおよび変数maxSizeRのうち大きい方を代入する。次のステップS17では、変数minLまたは変数minRが0よりも小さいかどうかを判断する。つまり、CPUコア34は、変数minLまたは変数minRが−1(無効値)であるかどうかを判断する。
【0139】
ステップS17で“YES”であれば、つまり変数minLまたは変数minRが0より小さければ、ウインクを検知することができないと判断して、ステップS27に進む。一方、ステップS17で“NO”であれば、つまり変数minLおよびminRが0以上であれば、ウインクを検知することができると判断して、図10に示すステップS19に進む。
【0140】
図10に示すように、ステップS19では、変数maxLが変数minR×2/3よりも小さいかどうかを判断する。つまり、CPUコア34は、左目を閉じたかどうかを判断する。ステップS19で“YES”であれば、つまり変数maxLが変数minR×2/3よりも小さければ、ステップS21で、左目のウインク処理についてのフラグLexeをtrueに設定して、ウインク検知処理を終了する。一方、ステップS19で“NO”であれば、つまり変数maxLが変数minR×2/3以上であれば、ステップS23で、変数maxRが変数minL×2/3よりも小さいかどうかを判断する。つまり、CPUコア34は、右目を閉じたかどうかを判断する。
【0141】
ステップS23で“YES”であれば、つまり変数maxRが変数minL×2/3よりも小さければ、ステップS25で、右目のウインク処理についてのフラグRexeをtrueに設定して、ウインク検知処理を終了する。一方、ステップS23で“NO”であれば、つまり変数maxRが変数minL×2/3以上であれば、ステップS27で、ウインク検知を終了するかどうかを判断する。ここでは、CPUコア34は、ユーザの指示やアプリケーションのイベントの発生によって、ウインク検知を終了するかどうかを判断する。ステップS27で“NO”であれば、つまりウインク検知を終了しない場合には、図9に示したステップS3に戻る。一方、ステップS27で“YES”であれば、つまりウインク検知を終了する場合には、ウインク検知処理を終了する。
【0142】
なお、図示は省略するが、左目のウインク処理のフラグLexeまたは右目のウインク処理のフラグRexeがtrueである場合には、図4および図5を用いて説明したように、アプリケーションにおいて、そのウインクに従った処理が実行される。
【0143】
また、ステップS19およびS23の判断処理において使用した数式は、経験的に得られたものであるが、これに限定される必要はない。左目の黒目領域の面積と右目の黒目領域の面積との比率で、ウインクを検知している点に着目されたい。
【0144】
図11は図9に示したステップS3の特徴点データの更新処理を示すフロー図である。図11を参照して、CPUコア34は、特徴点データの更新処理を開始すると、ステップS41で、特徴点取得処理を終了したかどうかを判断する。なお、図示は省略したが、ウインク検知処理が開始され、初期化処理(S1)が実行されるときに、特徴点取得処理も開始される。この特徴点取得処理は、ウインク検知処理とは別に実行される。
【0145】
ステップS41で“NO”であれば、つまり特徴点取得処理を終了していなければ、そのままステップS49に進む。一方、ステップS41で“YES”であれば、つまり特徴点取得処理を終了すれば、ステップS43で、特徴点Piを取得できたかどうかを判断する。つまり、CPUコア34は、特徴点取得処理の結果、特徴点データ72aがRAM42に記憶(更新)されたかどうかを判断するのである。
【0146】
ステップS43で“NO”であれば、つまり特徴点Piを取得できていない場合には、特徴点の取得(更新)に失敗したと判断して、ステップS45で、フラグIsEnableをfalseに設定して、ステップS49に進む。一方、ステップS43で“YES”であれば、つまり特徴点Piを取得できた場合には、ステップS47で、フラグIsEnableをtrueに設定するとともに、顔特徴点FacePointArray[42]に、取得した特徴点Pi(i=1−42)の座標を代入して、ステップS49に進む。
【0147】
ステップS49では、変数Countに、(変数Count+1)÷10の余りを代入する。この実施例では、10フレーム毎に、ウインクを検知するようにするため、変数Countに1加算した値を10で割っている。つまり、その余りが0である場合に、前回ウインクを検知してから(または、ウインク検知処理の開始から)、10フレームが経過したことになる。そして、ステップS51では、変数Countが0である場合には、フラグIsCheckをtrueに設定し、変数Countが0以外である場合には、フラグIsCheckをfalseに設定して、ウインク検知処理にリターンする。
【0148】
図12ないし図21は、図9に示したステップS13の面積計測処理を示すフロー図である。図12に示すように、CPUコア34は、面積計測処理を開始すると、ステップS71で、検知用のグレースケール画像(256×192dot)を取得し、画素値Image[256][192]に代入する。つまり、CPUコア34は、LCD14(またはLCD12)と同じ大きさについてのグレースケール画像を取得する。たとえば、5ビット(32階調)のグレースケール画像が取得される。ただし、グレースケール画像は、5ビットに限定される必要はなく、それよりも少ないビット数(低階調)でも、多いビット数(高階調)でも構わない。
【0149】
続くステップS73では、変数EyeLに、左目の特徴点の座標(x,y)を代入し、変数EyeRに、右目の特徴点の座標(x,y)を代入する。ただし、ステップS73においては、左目の特徴点(EyeL)は、その左目の黒目領域の中心点P13であり、右目の特徴点(EyeR)は、その右目の黒目領域の中心点P22である。
【0150】
なお、これ以降の面積計測処理においては、左目および右目のそれぞれの中心点P13およびP22を原点とするローカル座標が用いられる。また、各ローカル座標では、図面の右方向がX軸のプラス方向であり、図面の上方向がY軸のプラス方向である。
【0151】
次のステップS75では、変数EyeDistanceに、√{(EyeL.x−EyeR.x)2+(EyeL.y−EyeR.y)2}を代入する。ただし、変数EyeDistanceは、左目の黒目領域の中心と、右目の黒目領域の中心との距離である。また、EyeL.xは左目の特徴点の座標(変数EyeL)のx座標であり、EyeL.yは左目の特徴点の座標(変数EyeL)のy座標であり、EyeR.xは右目の特徴点の座標(変数EyeR)のx座標であり、そして、EyeR.yは右目の特徴点の座標(変数EyeR)のy座標である。以下、同様である。
【0152】
続いて、ステップS77では、ステップS75で得られた変数EyeDistanceを用いるなどして、各種変数が定義される。具体的には、変数searchWidthに定数A×EyeDistanceが設定され、変数searchTopに定数B×EyeDistanceが設定され、変数searchBottomに定数C×EyeDistanceが設定される。また、変数checkWidthに定数D×EyeDistanceが設定され、変数calcWidthに定数E×EyeDistanceが設定され、変数eyeLimitに定数F×EyeDistanceが設定され、変数eyeSkipに定数G×EyeDistanceが設定され、変数addBrightMaxには定数Hが設定される。
【0153】
ただし、変数searchWidthは、最も黒い色および最も明るい色を検出する範囲のうちの横方向(X軸方向)の範囲(横幅)を規定するための変数である。変数searchTopは、最も黒い色および最も明るい色を検出する範囲のうち、縦方向(Y軸方向)の上半分を規定するための変数である。変数searchBottomは、最も黒い色および最も明るい色を検出する範囲のうち、Y軸方向の下半分を規定するための変数であり、負の数で表わされる。図22(A)に示すように、変数searchWidth、変数searchTopおよび変数searchBottomは、目(ここでは、左目)の中心eyeLを基準として、上記最も黒い色および最も明るい色を検出する範囲(色検出範囲)を規定する。
【0154】
また、変数checkWidthは、黒い色の領域についての最も面積の大きい場所を検出する範囲のうちのX軸方向の範囲を規定するための変数である。変数calcWidthは、黒い色の領域についての面積を計算するX軸方向の幅を規定するための変数である。変数eyeLimitは、Y軸方向(縦)に黒い色のピクセルが連続する場合に、黒い色の面積の検出不能か否かを判定するための閾値を示す変数である。変数eyeSkipは、Y軸方向に白い色のピクセルが連続した場合に、黒い色のピクセルが連続していると擬制するかどうかを判定するための閾値を示す変数である。変数addBrightMaxは、左右の目の周囲の明るさが違っていた場合に、明るさを補正する場合の補正値の最大値を示す変数である。
【0155】
さらに、この実施例では、定数Aを「7」に設定し、定数Bを「3」に設定し、定数Cを「−8」に設定し、定数Dを「10」に設定し、定数Eを「5」に設定し、定数Fを「40」に設定し、定数Gを「2」に設定し、そして、定数Hを「17」に設定してある。
【0156】
図12に戻って、ステップS79では、画素値imageのうち、数1で示される範囲の色をチェックして、最大値を変数maxColLに代入し、最小値を変数minColLに代入する。つまり、左目の周囲の最も明るい色(maxColL)および最も暗い色(minColL)が検出される。
【0157】
[数1]
EyeL.x−searchWidth≦x<EyeL.x+searchWidth
EyeL.y+searchBottom≦y<EyeL.y+searchTop
また、ステップS81では、画素値imageのうち、数2で示される範囲の色をチェックして、最大値を変数maxColRに代入し、最小値を変数maxColRに代入する。つまり、右目の周囲の最も明るい色(maxColR)および最も暗い色(minColR)が検出される。
【0158】
[数2]
EyeR.x−searchWidth≦x<EyeR.x+searchWidth
EyeR.y+searchBottom≦y<EyeR.y+searchTop
図13に示すように、次のステップS83では、ステップS79およびステップS81で求めた変数maxColL,minColL,maxColR,minColRが数3を満たすかどうかを判断する。つまり、CPUコア34は、右目の最も明るい色よりも左目の最も明るい色の画素値が小さく、かつ、右目の最も暗い色よりも左目の最も暗い色の画素値が小さいかどうかを判断する。
【0159】
[数3]
maxColL<maxColR かつ minColL<minColR
ステップS83で“YES”であれば、つまり数3を満たす場合には、左目の周囲よりも右目の周囲の方が明るいと判断して、ステップS85で、変数colLimitRに、colLimitR+{(maxColR−maxcolL)またはaddBrightmaxの小さい方}を代入して、ステップS91に進む。つまり、右目の黒目領域の面積を計測する場合の黒い部分か白い部分かを判断するための閾値が補正される。ただし、ステップS85において、(maxColR−maxcolL)またはaddBrightmaxの小さい方をcolLimitRに加算するのは、補正幅の上限をaddBrightmaxとして、黒い部分か白い部分かを判断するための閾値が左右で極端に異なることを防ぐためである。
【0160】
一方、ステップS83で“NO”であれば、つまり数3を満たさない場合には、右目の周囲よりも左目の周囲の方が明るい、または左目の周囲の明るさと右目の周囲の明るさとが同程度であると判断して、ステップS87で、数4を満たすかどうかを判断する。つまり、CPUコア34は、左目の最も明るい色よりも右目の最も明るい色の画素値が小さく、かつ、左目の最も暗い色よりも右目の最も暗い色の画素値が小さいかどうかを判断する。
【0161】
[数4]
maxColR<maxColL かつ minColR<minColL
ステップS87で“NO”であれば、つまり数4を満たさない場合には、左目の周囲の明るさと右目の周囲の明るさとは同程度であると判断して、ステップS91に進む。一方、ステップS87で“YES”であれば、つまり数4を満たす場合には、右目の周囲よりも左目の周囲の方が明るいと判断して、ステップS89で、変数colLimitLに、colLimitL+{(maxColL−maxColR)またはaddBrightmaxの小さい方}を代入して、ステップS91に進む。つまり、左目の黒目領域の面積を計測する場合の黒い部分か白い部分かを判断するための閾値が補正される。ただし、ステップS89において、(maxColL−maxColR)またはaddBrightmaxの小さい方をcolLimitLに加算するのは、補正幅の上限をaddBrightmaxとして、黒い部分か白い部分かを判断するための閾値が左右で極端に異なることを防ぐためである。
【0162】
このように、CPUコア34は、左目の周囲の明るさまたは右目の周囲の明るさを補正するのは、個人差(個体差)や撮影状況(環境)の差異(ばらつき)を吸収するためである。引いては、正しくウインクを検出するためである。また、この実施例では、明るさの違いを正しく判定するために、左目の周囲および右目の周囲の最も明るい色と最も暗い色との両方に基づいて判定するようにしてあるが、最も明るい色同士または最も暗い色同士を比較することによっても、明るさを判定することは可能である。
【0163】
このように、明るさの違いによる閾値の補正を終了すると、CPUコア34は、ステップS91以降において、左目の黒目領域の面積を計測し(S91−S161)、その後、右目の黒目領域の面積を計測する(S163−S233)。
【0164】
ここで、図22(B)には、左目の黒目領域の面積を計測する場合の走査範囲(面積走査範囲)が示される。この面積走査範囲は、黒目領域の面積を検索する領域(検索領域)であり、上述した変数checkWidth,searchTop,searchBottomによって規定される。図22(B)では分かり難いが、走査する場合には、最も暗い色の画素を中心として、走査方向を上下に分けて、たとえば、面積走査範囲の左端(N=1)から順次、縦方向に黒色が連続するドット数をカウントする。これを列毎に繰り返し、右端すなわち最終列(N=2*checkWidth-1)まで実行する。そして、上下方向に連続するドット数をすべての列について合計した値を黒目領域の面積として決定する。図示は省略するが、右目の黒色領域の面積を計測する場合についても同様である。以下、具体的な処理についてフロー図を用いて説明する。
【0165】
図13に示すように、ステップS91では、変数I(走査する列の数)を初期化(I=0)する。続くステップS93では、変数CheckXに、EyeL.x−checkWidth+Iを代入する。つまり、走査の開始位置(X座標)が設定される。次に、ステップS95では、画素値imageのうち、数5で示される範囲の中で最小値になるyを求めて、変数CheckYに代入する。ただし、変数CheckXは着目する画素(ドット)のx座標であり、変数CheckYは着目する画素のy座標であり、そのうちの最も暗い色となる画素のy座標を求めるのである。
【0166】
[数5]
X=CheckX
EyeL.y+searchBottom≦Y<EyeL.y+searchTop
次のステップS97では、変数nLen,nLight,yOffsetのそれぞれに初期値(0)を設定し、図14に示すステップS99で、数6を満たすかどうかを判断する。ただし、変数nLenは、黒色のドットが縦に連続している数を示す変数である。また、変数nLightは、明るい色のドットが縦に連続している数を示す変数である。さらに、変数yOffsetは、サブルーチン(S99−S109)用の変数である。つまり、CPU34は、数6に従って、変数CheckYが面積走査範囲内であるかどうかを判断している。
【0167】
[数6]
0≦CheckY+yOffset<256
ステップS99で“NO”であれば、つまり数6を満たさない場合には、変数CheckYが面積走査範囲外であると判断して、ステップS111にそのまま進む。一方、ステップS99で“YES”であれば、つまり数6を満たす場合には、変数CheckYが面積走査範囲内であると判断して、ステップS101で、数7を満たすかどうかを判断する。つまり、着目している画素(ドット)の画素値image[CheckY+yOffset][CheckX]が、黒い部分であるか白い部分であるかを判別するのである。
【0168】
[数7]
Image[CheckY+yOffset][CheckX]<colLimitL
ステップS101で“YES”であれば、つまり数7を満たす場合には、着目する画素(ドット)が黒い部分であると判別して、ステップS103で、変数nLightを初期化して(nLight=0)、ステップS107に進む。一方、ステップS101で“NO”であれば、つまり数7を満たさない場合には、着目する画素(ドット)が白い部分であると判別して、ステップS105で、変数nLightをインクリメントして(nLight←nLight+1)、ステップS107に進む。
【0169】
ステップS107では、数8を満たすかどうかを判断する。つまり、縦方向に白い部分が連続する数(変数nLight)が黒い部分であると擬制するための閾値(変数eyeSkip)以上であるかどうかを判断することにより、黒目以外の白い部分であるかどうかを判定する。
【0170】
[数8]
nLight≧eyeSkip
ステップS107で“NO”であれば、つまり数8を満たさない場合には、ステップS109で、変数nLenをインクリメントするとともに(nLen←nLen+1)、変数yOffsetをインクリメントして(yOffset←yOffset+1)、ステップS99に戻る。つまり、次の画素について黒い部分であるか白い部分であるかを調べる。一方、ステップS107で“YES”であれば、つまり数8を満たす場合には、黒目以外の白い部分であると判断して、ステップS111で、面積走査範囲の下側の画素について走査するべく、変数nLingtを初期化するとともに(nLingt←0)、変数yOffsetを初期化して(yOffset←-1)、図15に示すステップS113で、上記の数6を満たすかどうかを判断する。つまり、変数CheckYが面積走査範囲内であるかどうかを判断する。
【0171】
ステップS113で“NO”であれば、つまり数6を満たさない場合には、そのままステップS125に進む。一方、ステップS113で“YES”であれば、つまり数6を満たす場合には、ステップS115で、上記の数7を満たすかどうかを判断する。つまり、着目する画素が黒い部分であるか白い部分であるかを判別する。ステップS115で“YES”であれば、つまり数7を満たす場合には、着目する画素が黒い部分であると判別して、ステップS117で、変数nLightを初期化して(nLight=0)、ステップS121に進む。一方、ステップS115で“NO”であれば、つまり数7を満たさない場合には、着目する画素が白い部分であると判別して、ステップS119で、変数nLightをインクリメントして(nLight←nLight+1)、ステップS121に進む。
【0172】
ステップS121では、上記の数8を満たすかどうかを判断する。つまり、黒目以外の白い部分であるかどうかを判定する。ステップS121で“NO”であれば、つまり数8を満たさない場合には、ステップS123で、変数nLenをインクリメントするとともに(nLen←nLen+1)、変数yOffsetをデクリメントして(yOffset←yOffset-1)、ステップS113に戻る。つまり、次の画素について黒い部分であるか白い部分であるかを調べる。一方、ステップS121で“YES”であれば、つまり数8を満たす場合には、黒目以外の白い部分であると判断して、ステップS125に進む。
【0173】
ステップS125では、数9を満たすかどうかを判断する。これは、変数nLenが変数eyeLimitを超えるかどうかを判断することにより、髪の毛が目にかかっていたり、睫毛の長いユーザが目を閉じていたりするような所望でない場合の検出結果を無効にするための処理である。つまり、所望でない場合には、黒目の部分としてカウントした変数nLenを面積の計測から除外するのである。
【0174】
[数9]
nLen≧eyeLimit
ステップS125で“NO”であれば、つまり数9を満たさない場合には、黒目の部分であると判断して、ステップS127で、変数LenArrey[I]に変数nLenの値を代入して、ステップS131に進む。つまり、今回調べた列(I列)において、黒い部分が連続する画素の数(LenArrey[I])が記憶される。一方、ステップS125で“YES”であれば、つまり数9を満たす場合には、黒目以外の黒い部分であると判断して、ステップS129で、変数LenArrey[I]に−1(無効値)を代入して、ステップS131に進む。
【0175】
ステップS131では、変数Iをインクリメントする(I=I+1)。そして、ステップS133では、数10を満たすかどうかを判断する。つまり、面積走査範囲のすべてについて走査したかどうかを判断する。
【0176】
[数10]
I>checkWidth×2−1
ステップS133で“NO”であれば、つまり数10を満たさない場合には、次の列を走査するべく、図13のステップS93に戻る。一方、ステップS133で“YES”であれば、つまり数10を満たす場合には、面積走査範囲のすべてについて走査したと判断して、図16に示すステップS135で、変数maxSizeLを初期化するとともに(maxSizeL←−1)、変数StartXを初期化する(StartX=0)。続いて、ステップS137では、変数Sizeを初期化して(Size←0)、ステップS139では、変数Iに変数StartXを代入する。ただし、変数maxSizeLは、面積の合計値(Size)の最大値である。また、変数StartXは、サブルーチン(S139−S157)用の変数である。さらに、変数Sizeは、変数chalcWidth分の面積の合計値である。
【0177】
そして、ステップS141では、数11を満たすかどうかを判断する。つまり、変数LenArray[I]が無効でないかどうかを判断するのである。
【0178】
[数11]
LenArray[I]≧0
ステップS141で“NO”であれば、つまり数11を満たさない場合には、ステップS143で、変数Sizeに無効値(-1)を代入して、ステップS151に進む。このようにして、一列でも無効値が含まれる場合には、今回の面積の計測処理を無効にするようにしてある。一方、ステップS141で“YES”であれば、つまり数11を満たす場合には、ステップS145で、変数Sizeに、Size+LenArray[I]を代入し、ステップS147で、変数Iをインクリメントして(I=I+1)、ステップS149に進む。ステップS149では、数12を満たすかどうかを判断する。つまり、変数Iが面積走査範囲外であるかどうかを判断する。
【0179】
[数12]
I>StartX+calcWidth−1
ステップS149で“NO”であれば、つまり数12を満たさない場合には、ステップS141に戻る。一方、ステップS149で“YES”であれば、つまり数12を満たす場合には、ステップS151に進む。ステップS151では、数13を満たすかどうかを判断する。つまり、面積の合計値の最大値が今回算出した面積の合計値よりも小さいかどうかを判断する。
【0180】
[数13]
maxSizeL<Size
ステップS151で“YES”であれば、つまり数13を満たす場合には、ステップS153で、変数maxSizeLに変数Sizeを代入して、ステップS155に進む。一方、ステップS151で“NO”であれば、つまり数13を満たさない場合には、ステップS155で、変数StartXをインクリメントする(StartX=StartX+1)。そして、ステップS157で、数14を満たすかどうかを判断する。つまり、変数StartXが面積走査範囲外であるかどうかを判断する。
【0181】
[数14]
StartX>checkWidth×2−calcWidth
ステップS157で“NO”であれば、つまり数14を満たしていない場合には、ステップS139に戻る。一方、ステップS157で“YES”であれば、つまり数14を満たしている場合には、図17に示すステップS159で、変数maxSizeが0未満であるかどうかを判断する。つまり、面積の合計値の最大値が無効であるかどうかを判断するのである。
【0182】
ステップS159で“YES”であれば、つまり変数maxSizeが0未満であれば、そのままステップS163に進む。一方、ステップS159で“NO”であれば、つまり変数maxSizeが0以上であれば、ステップS161で、変数maxSizeLを正規化する。これは、撮影された顔画像の縮尺に無関係な値に変換するためである。具体的には、数15に従って、変数maxSizeLは正規化される。
【0183】
[数15]
maxSizeL=maxSizeL/EyeDistance/EyeDistance
このようにして、左目の黒目領域の面積が求められる。続いて、右目の黒目領域の面積が求められるが、上述した左目の黒目領域の面積の計測方法と略同じであるため、重複した説明については簡単に説明することにする。
【0184】
図17に戻って、ステップS163では、変数Iを初期化する(I=0)。続くステップS165では、変数checkXに、EyeR.x−checkWidth+Iを代入する。次に、ステップS167では、画素値の数16で示される範囲の中で最小値になるyを求めて、変数checkYに代入する。
【0185】
[数16]
X=CheckX
EyeR.y+searchBottom≦Y<EyeR.y+searchTop
次のステップS169では、変数nLen,nLight,yOffsetのそれぞれに初期値(0)を設定し、図18に示すステップS171で、上記の数6を満たすかどうかを判断する。つまり、変数CheckYが面積走査範囲内であるかどうかを判断している。ステップS171で“NO”であれば、つまり数6を満たさない場合には、変数CheckYが面積走査範囲外であると判断して、ステップS183にそのまま進む。一方、ステップS171で“YES”であれば、つまり数6を満たす場合には、変数CheckYが面積走査範囲内でRと判断して、ステップS173で、数17を満たすかどうかを判断する。つまり、着目している画素(ドット)の画素値image[CheckY+yOffset][CheckX]が、黒い部分であるか白い部分であるかを判別するのである。
【0186】
[数17]
Image[CheckY+yOffset][CheckX]<colLimitR
ステップS173で“YES”であれば、つまり数17を満たす場合には、着目する画素が黒い部分であると判別して、ステップS175で、変数nLightを初期化して(nLight=0)、ステップS179に進む。一方、ステップS173で“NO”であれば、つまり数17を満たさない場合には、着目する画素が白い部分であると判別して、ステップS177で、変数nLightをインクリメントして(nLight←nLight+1)、ステップS179に進む。
【0187】
ステップS179では、上記の数8を満たすかどうかを判断する。つまり、縦方向に白い部分が連続する数(変数nLight)が黒い部分であると擬制するための閾値(変数eyeSkip)以上であるかどうかを判断することにより、黒目以外の白い部分であるかどうかを判定する。ステップS179で“NO”であれば、つまり数8を満たさない場合には、ステップS181で、変数nLenをインクリメントするとともに(nLen←nLen+1)、変数yOffsetをインクリメントして(yOffset←yOffset+1)、ステップS171に戻る。一方、ステップS179で“YES”であれば、つまり数8を満たす場合には、黒目以外の白い部分であると判断して、ステップS183で、面積走査範囲の下側の画素について走査するべく、変数nLingtを初期化するとともに(nLingt←0)、変数yOffsetを初期化して(yOffset←−1)、図19に示すステップS185で、上記の数6を満たすかどうかを判断する。つまり、変数CheckYが面積走査範囲内であるかどうかを判断する。
【0188】
ステップS185で“NO”であれば、つまり数6を満たさない場合には、そのままステップS197に進む。一方、ステップS185で“YES”であれば、つまり数6を満たす場合には、ステップS187で、上記の数17
を満たすかどうかを判断する。つまり、着目する画素が黒い部分であるか白い部分であるかを判別する。ステップS187で“YES”であれば、つまり数16を満たす場合には、着目する画素が黒い部分であると判別して、ステップS189で、変数nLightを初期化して(nLight=0)、ステップS193に進む。一方、ステップS187で“NO”であれば、つまり数16を満たさない場合には、着目する画素が白い部分であると判別して、ステップS191で、変数nLightをインクリメントして(nLight←nLight+1)、ステップS193に進む。
【0189】
ステップS193では、上記の数8を満たすかどうかを判断する。つまり、黒目以外の白い部分であるかどうかを判定する。ステップS193で“NO”であれば、つまり数8を満たさない場合には、ステップS195で、変数nLenをインクリメントするとともに(nLen←nLen+1)、変数yOffsetをデクリメントして(yOffset←yOffset−1)、ステップS185に戻る。つまり、次の画素について黒い部分であるか白い部分であるかを調べる。一方、ステップS193で“YES”であれば、つまり数8を満たす場合には、黒目以外の白い部分であると判断して、ステップS197に進む。
【0190】
ステップS197では、上記の数9を満たすかどうかを判断する。ステップS197で“NO”であれば、つまり数9を満たさない場合には、黒目の部分であると判断して、ステップS199で、変数LenArrey[I]に変数nLenの値を代入して、ステップS203に進む。一方、ステップS197で“YES”であれば、つまり数9を満たす場合には、黒目以外の黒い部分であると判断して、ステップS201で、変数LenArrey[I]に−1(無効値)を代入して、ステップS203に進む。
【0191】
ステップS203では、変数Iをインクリメントする(I=I+1)。そして、ステップS205では、上記の数10を満たすかどうかを判断する。つまり、面積走査範囲のすべてについて走査したかどうかを判断する。ステップS205で“NO”であれば、つまり数10を満たさない場合には、次の列を走査するべく、図17のステップS165に戻る。一方、ステップS205で“YES”であれば、つまり数10を満たす場合には、面積走査範囲のすべてについて走査したと判断して、図20に示すステップS207で、変数maxSizeRを初期化するとともに(maxSizeR←−1)、変数StartXを初期化する(StartX=0)。続いて、ステップS209では、変数Sizeを初期化して(Size←0)、ステップS211では、変数Iに変数StartXを代入する。
【0192】
そして、ステップS213では、上記の数11を満たすかどうかを判断する。つまり、変数LenArray[I]が無効でないかどうかを判断するのである。ステップS213で“NO”であれば、つまり数11を満たさない場合には、ステップS215で、変数Sizeに無効値(-1)を代入して、ステップS223に進む。一方、ステップS213で“YES”であれば、つまり数11を満たす場合には、ステップS217で、変数Sizeに、Size+LenArray[I]を代入し、ステップS219で、変数Iをインクリメントして(I=I+1)、ステップS221に進む。ステップS221では、上記の数12を満たすかどうかを判断する。
【0193】
ステップS221で“NO”であれば、つまり数12を満たさない場合には、ステップS213に戻る。一方、ステップS221で“YES”であれば、つまり数12を満たす場合には、ステップS223に進む。ステップS223では、上記の数18を満たすかどうかを判断する。
【0194】
[数18]
maxSizeR<Size
ステップS223で“YES”であれば、つまり数18を満たす場合には、ステップS225で、変数maxSizeRに変数Sizeを代入して、ステップS227に進む。一方、ステップS223で“NO”であれば、つまり数18を満たさない場合には、ステップS227で、変数StartXをインクリメントする(StartX=StartX+1)。そして、ステップS229で、上記の数14を満たすかどうかを判断する。つまり、変数StartXが走査する範囲を超えたかどうかを判断する。
【0195】
ステップS229で“NO”であれば、つまり数14を満たしていない場合には、ステップS211に戻る。一方、ステップS229で“YES”であれば、つまり数14を満たしている場合には、図21に示すステップS231で、変数maxSizeが0未満であるかどうかを判断する。ステップS231で“YES”であれば、つまり変数maxSizeが0未満であれば、そのまま図9に示したウインク検知処理にリターンする。一方、ステップS231で“NO”であれば、つまり変数maxSizeが0以上であれば、ステップS233で、変数maxSizeRを正規化して、ウインク検知処理にリターンする。なお、変数maxSizeRの正規化は、上記の変数maxSizeLの正規化と同様であり、具体的には、数19に従って、変数maxSizeRは正規化される。
【0196】
[数19]
maxSizeR=maxSizeR/EyeDistance/EyeDistance
この実施例によれば、左右の黒目領域の大きさを比較するので、片目を閉じる動作を認識することができる。また、黒目領域の大きさを比較するだけなので、処理負担を軽減することができる。
【0197】
なお、この実施例では、一例として黒目領域の面積を比較するようにしたが、これに限定される必要はない。たとえば、黒目領域のうち、黒い部分が連続する長さが最も長い列同士を左目と右目とで比較するようにしてもよい。また、左右の目の白目領域の大きさを表わす数値(面積や縦方向における最大長さ)を比較するようにしてもよい。
【0198】
また、この実施例では、一例として黒目領域の面積を比較するようにしたが、当該領域(虹彩と瞳孔とを含む領域)が他の色(茶色や青色など)であっても同様である。つまり、この明細書では、黒目領域は黒以外の色である場合も含む。
【0199】
さらに、この実施例では、撮影画像のグレースケール画像を用いて、黒目領域の面積を計測し、ウインクを検出するようにしたが、カラー画像を用いるようにしてもよい。かかる場合には、たとえば、白目領域と黒目領域との境界、または目の領域と皮膚との境界を、色の違いによって検出し、左右の目における黒目領域と白目領域との境界線の長さの違いや左右の目の領域の大きさの違いで、ウインクを検出することも可能である。
【0200】
さらにまた、この実施例では、カメラカートリッジをゲーム装置に着脱可能に設けるようにしたが、ゲーム装置に固定的に設けるようにしてもよい。または、顔画像データをゲーム装置とは別個独立に設けられたカメラから受信するようにしてもよい。かかる場合には、たとえば、ゲーム装置とカメラとを近距離無線により接続したり、ケーブルで接続したりすればよい。
【図面の簡単な説明】
【0201】
【図1】図1はこの発明のゲーム装置の一実施例を示す図解図である。
【図2】図2は図1に示すゲーム装置の電気的な構成を示すブロック図である。
【図3】図3は図1に示すゲーム装置の使用例を示す図解図である。
【図4】図4は図3に示すゲーム装置の第1のLCDおよび第2のLCDに表示されるゲーム画面の一例を示す図解図である。
【図5】図5は図3に示すゲーム装置の第1のLCDに表示されるゲーム画面の他の例を示す図解図である。
【図6】図6は撮影された顔画像から検出される特徴点を示す図解図である。
【図7】図7は図2に示すゲーム装置のRAMのメモリマップの一例を示す図解図である。
【図8】図8は図7に示すデータ記憶領域の具体的な内容を示す図解図である。
【図9】図9は図2に示すCPUコアのウインク検知処理の一部を示すフロー図である。
【図10】図10は図2に示すCPUコアのウインク検知処理の他の一部であって、図9に後続するフロー図である。
【図11】図11は図2に示すCPUコアの特徴点データの更新処理を示すフロー図である。
【図12】図12は図2に示すCPUコアの面積計測処理の一部を示すフロー図である。
【図13】図13は図2に示すCPUコアの面積計測処理の他の一部であって、図12に後続するフロー図である。
【図14】図14は図2に示すCPUコアの面積計測処理のその他の一部であって、図13に後続するフロー図である。
【図15】図15は図2に示すCPUコアの面積計測装置のさらに他の一部であって、図14に後続するフロー図である。
【図16】図16は図2に示すCPUコアの面積計測処理の他の一部であって、図15に後続するフロー図である。
【図17】図17は図2に示すCPUコアの面積計測処理のその他の一部であって、図16に後続するフロー図である。
【図18】図18は図2に示すCPUコアの面積計測処理のさらに他の一部であって、図17に後続するフロー図である。
【図19】図19は図2に示すCPUコアの面積計測処理の他の一部であって、図18に後続するフロー図である。
【図20】図20は図2に示すCPUコアの面積計測処理のその他の一部であって、図19に後続するフロー図である。
【図21】図21は図2に示すCPUコアの面積計測処理のさらに他の一部であって、図20に後続するフロー図である。
【図22】図22は面積計測処理における色検出範囲および面積走査範囲を示す図解図である。
【符号の説明】
【0202】
10 …ゲーム装置
12,14 …LCD
16,16a,16b …ハウジング
22 …操作スイッチ
24 …タッチパネル
26 …スティック
28 …メモリカード
28a …ROM
28b,42 …RAM
34 …CPUコア
36a,36b …スピーカ
44,46 …GPU
48 …I/F回路
50 …LCDコントローラ
52,54 …VRAM
60 …カメラカートリッジ
【技術分野】
【0001】
この発明は情報処理プログラムおよび情報処理装置に関し、特にたとえば、撮像手段を備え、この撮像手段により利用者の顔画像を取得する、情報処理プログラムおよび情報処理装置に関する。
【背景技術】
【0002】
背景技術の一例が特許文献1に開示される。この特許文献1の運転者の状態検出装置では、入力された運転者の顔画像が2値化され、2値化された画像内で眼球の存在領域が定められる。そして、その眼球の存在領域が走査され、連続黒色画素が検出されて、黒目部分が存在するかどうかの判定基準が設定された上で、目の開閉が検出される。
【特許文献1】特開平6−227278号
【発明の開示】
【発明が解決しようとする課題】
【0003】
しかし、特許文献1に開示される技術では、目の開閉を検出することができるが、片目だけを閉じる動作を検出することができない。
【0004】
それゆえに、この発明の主たる目的は、新規な、情報処理プログラムおよび情報処理装置を提供することである。
【0005】
また、この発明の他の目的は、片目だけを閉じる動作を検出することができる、情報処理プログラムおよび情報処理装置を提供することである。
【課題を解決するための手段】
【0006】
本発明は、上記の課題を解決するために、以下の構成を採用した。なお、括弧内の参照符号および補足説明等は、本発明の理解を助けるために後述する実施の形態との対応関係を示したものであって、本発明を何ら限定するものではない。
【0007】
第1の発明は、撮像手段を備え、撮像手段により利用者の顔画像を取得する情報処理装置のコンピュータで実行される情報処理プログラムであって、撮像手段により撮像された利用者の顔画像から、左右の目の領域の大きさを示す目領域値をそれぞれ算出する目領域値算出ステップと、目領域値算出ステップによって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する片目判定ステップとを、コンピュータに実行させる、情報処理プログラムである。
【0008】
第1の発明では、情報処理プログラムは、情報処理装置(10)のコンピュータで実行される。情報処理装置は、撮像手段(60)を備えており、この撮像手段によって利用者の顔画像を取得する。目領域値算出ステップ(34,S13)は、撮像手段により撮像された利用者の顔画像から、左右の目の領域(黒目の領域、白目の領域、または、それら両方を合わせた領域など)の大きさを示す目領域値をそれぞれ算出する。片目判定ステップ(34、S19,S23)は、目領域値算出ステップによって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する。
【0009】
第1の発明によれば、左右の目領域値を比較するので、片目を閉じているか否かを判定することができる。
【0010】
第2の発明は第1の発明に従属し、片目判定ステップは、左右の目に対するそれぞれの目領域値の比率に応じて片目が閉じたかどうかを判定する。
【0011】
第2の発明では、片目判定ステップは左右の目に対するそれぞれの目領域値の比率に応じて片目が閉じたかどうかを判定する。たとえば、一方の目領域の面積が、他方の目領域の面積の3分の2よりも小さいとき、当該一方の目を閉じていると判定することができる。
【0012】
第2の発明によれば、左右の目領域値の比率を求めて比較するだけなので、片目を閉じたかどうかの判定が容易である。
【0013】
第3の発明は第1または第2の発明に従属し、左右の目に対する検索領域をそれぞれ設定する検索領域設定ステップを、コンピュータにさらに実行させ、目領域値算出ステップは、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから目領域値を算出する。
【0014】
第3の発明では、検索領域設定ステップ(34,S77)は、左右の目に対する検索領域をそれぞれ設定する。目領域値算出ステップは、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから目領域値を算出する。つまり、顔画像の一部から左右の目領域値が算出される。
【0015】
第3の発明によれば、検索領域を設定するので、顔全体を検索する必要がない。つまり、処理の効率化を図ることができる。
【0016】
第4の発明は第3の発明に従属し、目領域値算出ステップは、撮像手段により撮像された利用者の顔画像から、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する黒目領域値算出ステップを含む。
【0017】
第4の発明では、目領域は、左右の目の黒目領域である。黒目領域値算出ステップは、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する。たとえば、黒目領域値は、黒目領域の面積や黒目領域の長さ(縦方向に最も長い部分)についての数値である。ただし、目の色は、黒色に限定される必要はなく、他の色(茶色や青色など)も含む。
【0018】
第4の発明によれば、黒目の領域の大きさを左右の目で比較するだけなので、比較的簡単な計算によって片目を閉じたかどうかを判断することができる。
【0019】
第5の発明は第4の発明に従属し、撮像手段により撮像された利用者の顔画像から左右の目の特徴点を取得する特徴点取得ステップを、コンピュータにさらに実行させ、検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を用いて左右の目に対数する検索領域のそれぞれを設定する。
【0020】
第5の発明では、特徴点取得ステップ(34,S43,S47)は、撮像手段により撮像された利用者の顔画像から左右の目の特徴点を取得する。検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を用いて検索領域のそれぞれを設定する。たとえば、右目と左目との距離を用いて、左右の黒目領域を検索する領域がそれぞれ設定される。
【0021】
第5の発明によれば、左右の目の特徴点を利用するので、確実に目の位置を認識して、黒目領域値を取得することができる。つまり、片目を閉じたことを正確に判定することができる。
【0022】
第6の発明は第5の発明に従属し、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから黒目基準値を算出する黒目基準値算出ステップを、コンピュータにさらに実行させ、黒目領域値算出ステップは、黒目基準値算出ステップによって算出された黒目基準値を閾値として黒目領域値を算出する。
【0023】
第6の発明では、黒目基準値算出ステップ(34,S79,S81,S83,S85,S87,S89)は、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから黒目基準値を算出する。黒目領域値算出ステップは、この黒目基準値を閾値として黒目領域値を算出する。たとえば、黒目基準値を用いて、黒目か白目かを判定する。
【0024】
第6の発明によれば、黒目基準値を閾値として黒目領域値を算出するので、個体差や撮影状況によるばらつきを無くして、正確に片目を閉じたことを判定することができる。
【0025】
第7の発明は第6の発明に従属し、黒目基準値は、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれにおける明度に関する値である。
【0026】
第7の発明では、黒目基準値は、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれにおける明度に関する値である。たとえば、左右の明るさの違いで、左右の黒目基準値が異なる値に設定される。
【0027】
第7の発明によれば、個体差や撮影状況によるばらつきを吸収することができる。
【0028】
第8の発明は第7の発明に従属し、黒目基準値算出ステップは、検索領域設定ステップによって設定されたすべての検索領域内で最も暗い色と最も明るい色との少なくとも一方を用いて黒目基準値を設定する。
【0029】
第8の発明では、黒目基準値算出ステップは、検索領域設定ステップによって設定されたすべての検索領域内で、最も暗い色と最も明るい色との少なくとも一方を用いて黒目基準値を設定する。たとえば、左目の検索領域のうちの最も暗い色(または明るい色)と、右目の検索領域のうちの最も暗い色(または明るい色)とを比較することにより明るさの違いが検出され、黒目基準値が設定される。または、最も暗い色同士の比較結果と、最も明るい色同士の比較結果とから明るさの違いが検出され、黒目基準値が設定される。
【0030】
第8の発明によれば、左右で一番明るい画素と一番暗い画素とを元に黒色かどうかを判別する基準値を設定するので、ノイズなどの影響を無くすことができる。
【0031】
第9の発明は第1の発明に従属し、撮像手段により撮像された利用者の顔画像をグレースケール化するグレースケール化ステップを、コンピュータにさらに実行させ、黒目領域値算出ステップは、グレースケール化ステップによってグレースケール化された顔画像から黒目領域値を算出する。
【0032】
第9の発明では、グレースケール化ステップ(34,S71)は、撮像手段により撮像された利用者の顔画像をグレースケール化する。つまり、顔画像のグレースケール画像が取得される。黒目領域算出ステップは、グレースケール化ステップによってグレースケール化された顔画像から黒目領域値を算出する。
【0033】
第9の発明によれば、顔画像をグレースケール化するので、黒目領域を容易に検出することができる。
【0034】
第10の発明は第9の発明に従属し、左右の目に対する検索領域をそれぞれ設定する検索領域設定ステップを、コンピュータにさらに実行させ、目領域算出ステップは、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから目領域値を算出する。
【0035】
第10の発明においても、第3の発明と同様に、処理の効率化を図ることができる。
【0036】
第11の発明は第10の発明に従属し、目領域値算出ステップは、撮像手段により撮像された利用者の顔画像から、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する黒目領域値算出ステップを含む。
【0037】
第11の発明では、第4の発明と同様に、目領域は、左右の目の黒目領域であり、黒目領域値算出ステップは、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する。
【0038】
第11の発明においても、第4の発明と同様に、比較的簡単な計算によって片目を閉じたかどうかを判断することができる。
【0039】
第12の発明は第11の発明に従属し、グレースケール化ステップによってグレースケール化された顔画像から左右の目の特徴点を取得する特徴点取得ステップを、コンピュータにさらに実行させ、検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を用いて左右の目に対する検索領域のそれぞれを設定する。
【0040】
第12の発明においても、第5の発明と同様に、確実に目の位置を認識して、黒目領域値を取得することができる。
【0041】
第13の発明は第12の発明に従属し、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれから黒目基準値を算出する黒目基準値算出ステップを、コンピュータにさらに実行させ、黒目領域値算出ステップは、黒目基準値算出ステップによって算出された黒目基準値を閾値として黒目領域値を算出する。
【0042】
第13の発明においても、第6の発明と同様に、個体差や撮影状況によるばらつきを無くして、正確に片目を閉じたことを判定することができる。
【0043】
第14の発明は第13の発明に従属し、黒目基準値は、検索領域設定ステップによって設定された左右の目に対する検索領域のそれぞれにおける明度に関する値である。
【0044】
第14の発明においても、第7の発明と同様に、個体差や撮影状況によるばらつきを吸収することができる。
【0045】
第15の発明は第14の発明に従属し、黒目基準値算出ステップは、検索領域設定ステップによって設定されたすべての検索領域内で最も暗い色と最も明るい色との少なくとも一方を用いて黒目基準値を設定する。
【0046】
第15の発明においても、第8の発明と同様に、ノイズなどの影響を無くすことができる。
【0047】
第16の発明は第5または第12の発明に従属し、検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を中心に、左右の目に対する検索領域をそれぞれ設定する。
【0048】
第16の発明では、検索領域設定ステップは、特徴点取得ステップによって取得された左右の目の特徴点を中心に、左右の目に対する検索領域をそれぞれ設定する。たとえば、特徴点は、左右の黒目領域のそれぞれの中心点に設定される。
【0049】
第16の発明によれば、左右の目の特徴点を中心に検索領域が設定されるので、確実に黒目領域を検索領域に収めることができる。
【0050】
第17の発明は第5または第12の発明に従属し、特徴点取得ステップによって取得された左右の目の特徴点間の距離を算出する距離算出ステップを、コンピュータにさらに実行させ、検索領域設定ステップは、距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、左右の目に対する検索領域をそれぞれ設定する。
【0051】
第17の発明では、距離算出ステップ(34,S75)は、特徴点取得ステップによって取得された左右の目の特徴点間の距離を算出する。検索領域設定ステップは、その特徴点間の距離を用いて、左右の目に対する検索領域をそれぞれ設定する。
【0052】
第17の発明によれば、左右の目の特徴点間の距離を用いて検索領域を設定するので、検索領域の設定が簡単である。また、そのような距離を用いることにより、検索領域に確実に黒目を収めることができる。
【0053】
第18の発明は第17の発明に従属し、距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、黒目領域値算出ステップによって算出された黒目領域値を正規化する正規化ステップを、コンピュータにさらに実行させ、片目判定ステップは、正規化ステップによって正規化された左右の目それぞれに対する黒目領域値を比較することにより片目を閉じたかどうかを判定する。
【0054】
第18の発明では、正規化ステップ(34,S161,S223)は、距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、黒目領域値算出ステップによって算出された黒目領域値を正規化する。片目判定ステップは、正規化ステップによって正規化された左右の目それぞれに対する黒目領域値を比較することにより片目を閉じたかどうかを判定する。
【0055】
第18の発明では、黒目領域値を左右の目の特徴点間の距離を用いて正規化するので、撮影された顔画像の縮尺に拘わらず、片目を閉じたかどうかを判定することができる。
【0056】
第19の発明は、第7または第14の発明に従属し、黒目領域値算出ステップは、検索領域設定ステップによって設定された検索領域内の第1方向に走査して、最も暗い画素を第1方向基準値として設定する第1方向基準値設定ステップと、第1方向基準値から続く黒目基準値より暗い画素の数を算出する画素数算出ステップとを含み、画素数算出ステップによって算出された暗い画素数を黒目領域値とする。
【0057】
第19の発明では、第1方向基準値設定ステップ(34,S95,S167)は、検索領域設定ステップによって設定された検索領域内の第1方向に走査して、最も暗い画素を第1方向基準値として設定する。画素数算出ステップ(34,S97−S123,S169−S195)は、第1方向基準値から続く黒目基準値より暗い画素の数を算出する。黒目領域値算出ステップは、画素数算出ステップによって算出された暗い画素数を黒目領域値とする。
【0058】
第19の発明によれば、最も暗い画素を中心にして第1方向に連続する暗い画素の数を算出するので、正確な基準で黒色が連続するラインを算出することができる。
【0059】
第20の発明は第19の発明に従属し、黒目領域値算出ステップは、第1方向に直交する第2方向に対して第1方向を順次ずらして、第1方向基準値設定ステップと画素数算出ステップとを繰り返し実行し、第1方向基準値から続く黒目基準値より暗い画素数を合算する画素数合算ステップを含み、画素数合算ステップによって合算された暗い画素数を黒目領域値とする。
【0060】
第20の発明では、画素数合算ステップは、第1方向の走査が終了すると、第1方向に直交する第2方向に対して第1方向を順次ずらして(34,S131,S203)、第1方向基準値設定ステップと画素数算出ステップとを繰り返し実行し、第1方向基準値から続く黒目基準値より暗い画素数を合算する。つまり、黒目領域値算出ステップは、黒目基準値より暗い画素が第1方向に連続する画素数を、第1方向に直交する第2方向にずらして順次算出し、それらすべてを合算した暗い画素数を黒目領域とする。
【0061】
第20の発明によれば、第1方向に連続する暗い画素のラインを第1方向とは直交する第2方向に順次ずらして算出し、その合計を求めるので、正確に黒目領域値を求めることができる。
【0062】
第21の発明は第19または第20の発明に従属し、黒目領域値算出ステップは、画素数算出ステップによって、第1方向基準値から続く黒目基準値より暗い画素の数が所定数以上に達したときには、無効値を黒目領域値として設定する。
【0063】
第21の発明では、黒目領域値算出ステップは、画素数算出ステップによって、第1方向基準値から続く黒目基準値より暗い画素の数が所定数以上に達したときには(S125またはS197で“YES”)、黒目ではなく、髪の毛や睫毛であると判断して、無効値を黒目領域として設定する(34,S129,S201)。
【0064】
第21の発明によれば、黒目領域値が所定数以上の場合には、黒目ではないと判断して、それを無効にするので、髪の毛が目にかかっていたり、睫毛の長い人が目を閉じていたりするような所望でない状態を、片目を閉じているかどうかの判定から除外することができる。
【0065】
第22の発明は第21の発明に従属し、特徴点取得ステップ、検索領域算出ステップ、黒目基準値算出ステップ、黒目領域値算出ステップは、コンピュータによって少なくとも2回繰り返し実行され、連続して黒目領域値に無効値が設定されていないときにのみ、片目判定ステップをコンピュータに実行させる。
【0066】
第22の発明では、情報処理プログラムは、特徴点取得ステップ、検索領域算出ステップ、黒目基準値算出ステップ、黒目領域値算出ステップを、コンピュータに少なくとも2回繰り返し実行させる。そして、情報処理プログラムは、連続して黒目領域値に無効値が設定されていないときにのみ(S17で“NO”)、片目判定ステップをコンピュータに実行させる。
【0067】
第22の発明によれば、複数回繰り返した結果から片目を閉じたかどうかを判定するので、安定した正しい判定を行なうことができる。
【0068】
第23の発明は第19または第20の発明に従属し、画素数算出ステップは、黒目基準値より明るい画素が所定数以上続いた場合には、第1方向基準値から当該明るい画素までの数を黒目領域値として設定する。
【0069】
第23の発明では、画素数算出ステップは、黒目基準値より明るい画素が所定数以上続いた場合には(S107,S121,S179,S193で“YES”)、第1方向基準値から当該明るい画素までの数を黒目領域値として設定する。つまり、黒目に含まれる白い部分を黒目と判断し、黒目と白目とを正確に区別するようにしてある。
【0070】
第23の発明によれば、黒目と白目とを正確に区別するので、黒目領域値を正しく算出することができる。
【0071】
第24の発明は第1の発明に従属し、片目判定ステップによって片目を閉じていることが判定された場合に、所定の処理を実行する処理ステップを、コンピュータにさらに実行させる。
【0072】
第24の発明では、情報処理プログラムは、片目判定ステップによって片目を閉じていることが判定された場合に(S19,S23で“YES”)、所定の処理を実行する処理ステップを、コンピュータにさらに実行させる。
【0073】
第24の発明によれば、ユーザが片目を閉じることにより、所定の処理が実行されるので、ユーザは手で操作を行う必要がない。
【0074】
第25の発明は、撮像手段を備え、撮像手段により利用者の顔画像を取得する情報処理装置であって、撮像手段により撮像された利用者の顔画像から、左右の目の領域の大きさを示す目領域値をそれぞれ算出する目領域値算出手段と、目領域値算出手段によって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する片目判定手段とを備える、情報処理装置である。
【0075】
第25の発明においても、第1の発明と同様に、片目を閉じている動作を検出することができる。
【発明の効果】
【0076】
この発明によれば、左右の目領域値を比較するので、その比較結果に応じて片目を閉じている動作を検出することができる。
【0077】
この発明の上述の目的,その他の目的,特徴および利点は、図面を参照して行う以下の実施例の詳細な説明から一層明らかとなろう。
【発明を実施するための最良の形態】
【0078】
図1を参照して、この発明の実施例であるゲーム装置10は、第1の液晶表示器(LCD)12および第2のLCD14を含む。LCD12およびLCD14は、所定の配置位置となるようにハウジング16に収納される。この実施例では、ハウジング16は、上側ハウジング16aと下側ハウジング16bとによって構成され、LCD12は上側ハウジング16aに収納され、LCD14は下側ハウジング16bに収納される。したがって、LCD12とLCD14とは縦(上下)に並ぶように近接して配置される。
【0079】
なお、この実施例では、表示器としてLCDを用いるようにしてあるが、LCDに代えて、EL(Electronic Luminescence)ディスプレイやプラズマディスプレイを用いるようにしてもよい。
【0080】
図1からも分かるように、上側ハウジング16aは、LCD12の平面形状よりも少し大きな平面形状を有し、一方主面からLCD12の表示面を露出するように開口部が形成される。一方、下側ハウジング16bは、その平面形状が上側ハウジング16aよりも横長に選ばれ、横方向の略中央部にLCD14の表示面を露出するように開口部が形成される。下側ハウジング16bのLCD14の左方には電源スイッチ18が設けられる。
【0081】
また、上側ハウジング16aには、LCD12を挟んで左右に、スピーカ36aおよび36b(図2)のための音抜き孔20aおよび20bが形成される。そして、下側ハウジング16bには、マイク(図示せず)のためのマイク孔20cが形成されるとともに、操作スイッチ22(22a,22b,22c,22d,22e,22Lおよび22R)が設けられる。
【0082】
また、上側ハウジング16aと下側ハウジング16bとは、上側ハウジング16aの下辺(下端)と下側ハウジング16bの上辺(上端)の一部とが回動可能に連結されている。したがって、たとえば、ゲームをプレイしない場合には、LCD12の表示面とLCD14の表示面とが対面するように、上側ハウジング16aを回動させて折りたたんでおけば、LCD12の表示面およびLCD14の表示面に傷がつくなどの破損を防止することができる。ただし、上側ハウジング16aと下側ハウジング16bとは、回動可能に連結せずに、それらを一体的(固定的)に設けたハウジング16を形成するようにしてもよい。
【0083】
操作スイッチ22は、方向指示スイッチ(十字スイッチ)22a,スタートスイッチ22b、セレクトスイッチ22c、動作スイッチ(Aボタン)22d、動作スイッチ(Bボタン)22e、動作スイッチ(Xボタン)22f、動作スイッチ(Yボタン)22g、動作スイッチ(Lボタン)22Lおよび動作スイッチ(Rボタン)22Rを含む。スイッチ22aは、下側ハウジング16bの一方主面であり、LCD14の左側に配置される。その他のスイッチ22b−22gは、下側ハウジング16bの一方主面であり、LCD14の右側に配置される。さらに、スイッチ22Lおよびスイッチ22Rは、それぞれ、上側ハウジング16aとの連結部を挟む下側ハウジング16bの上側面の左右角部に配置される。
【0084】
方向指示スイッチ22aは、ディジタルジョイスティックとして機能し、4つの押圧部の1つを操作することによって、ユーザないしプレイヤによって操作可能なプレイヤキャラクタ(またはプレイヤオブジェクト)の移動方向を指示したり、カーソルの移動方向を指示したりする等に用いられる。また、各押圧部には、特定の役割を割り当てることができ、4つの押圧部の1つを操作することによって、割り当てられた役割を指示(指定)することができる。
【0085】
スタートスイッチ22bは、プッシュボタンで構成され、ゲームを開始(再開)したり、一時停止(Pause)したりする等に用いられる。また、セレクトスイッチ22cは、プッシュボタンで構成され、ゲームモードの選択等に用いられる。
【0086】
動作スイッチ22dすなわちAボタンは、プッシュボタンで構成され、方向指示以外の動作、すなわち、プレイヤキャラクタに打つ(パンチ)、投げる、つかむ(取得)、乗る、ジャンプするなどの任意のアクションをさせることができる。たとえば、アクションゲームにおいては、ジャンプ、パンチ、武器を動かす等を指示することができる。また、ロールプレイングゲーム(RPG)やシミュレーションRPGにおいては、アイテムの取得、武器やコマンドの選択および決定等を指示することができる。さらに、方向指示スイッチ22aやセレクトスイッチ22cで選択された項目を決定することもできる。動作スイッチ22eすなわちBボタンは、プッシュボタンで構成され、セレクトスイッチ22cで選択したゲームモードの変更やAボタン22dで決定したアクションの取り消し等のために用いられる。
【0087】
動作スイッチ22fすなわちXボタン、および動作スイッチ22gすなわちYボタンは、プッシュボタンで構成され、Aボタン22dとBボタン22eだけでは、ゲーム進行ができないときに、補助的な操作に用いられる。ただし、Xボタン22fおよびYボタン22gは、Aボタン22dおよびBボタン22eと同様の操作に用いることも可能である。もちろん、ゲームプレイにおいてXボタン22fとYボタン22gとを必ずしも使用しなくてよい。
【0088】
動作スイッチ22L(左押しボタン)および動作スイッチ22R(右押しボタン)は、プッシュボタンで構成され、左押しボタン(Lボタン)22Lおよび右押しボタン(Rボタン)22Rは、Aボタン22dおよびBボタン22eと同様の操作に用いることができ、また、Aボタン22dおよびBボタン22eの補助的な操作に用いることができる。さらに、Lボタン22LおよびRボタン22Rは、方向スイッチ22a、Aボタン22d,Bボタン22e,Xボタン22f,Yボタン22gに割り当てられた役割を、他の役割に変更することができる。
【0089】
また、LCD14の上面には、タッチパネル24が装着される。タッチパネル24としては、たとえば、抵抗膜方式、光学式(赤外線方式)および静電容量結合式のいずれかの種類のものを用いることができる。また、タッチパネル24は、その上面をスティック26ないしはペン(スタイラスペン)或いは指(以下、これらを「スティック26等」という場合がある。)で、押圧したり、撫でたり、触れたりすることにより操作(タッチ入力)すると、スティック26等の操作位置の座標を検出して、検出した座標(検出座標)に対応する座標データを出力する。
【0090】
なお、この実施例では、LCD14(LCD12も同じ、または略同じ。)の表示面の解像度は256dot×192dotであり、タッチパネル24の検出精度も表示画面に対応して256dot×192dotとしてあるが、タッチパネル24の検出精度は表示画面の解像度よりも低くてもよく、高くてもよい。
【0091】
LCD12およびLCD14には異なるゲーム画面が表示されてもよい。たとえば、レースゲームでは一方のLCDに運転席からの視点による画面を表示し、他方のLCDにレース(コース)全体の画面を表示することができる。また、RPGでは、一方のLCDにマップやプレイヤキャラクタ等のキャラクタを表示し、他方のLCDにプレイヤキャラクタが所有するアイテムを表示することができる。さらに、一方のLCD(この実施例では、LCD14)にゲームの操作画面(ゲーム画面)を表示し、他方のLCD(この実施例では、LCD12)に当該ゲームに関する情報(得点やレベルなど)を含む他のゲーム画面を表示することができる。さらには、2つのLCD12およびLCD14を合わせて1つの画面として用いることにより、プレイヤキャラクタが倒さなければならない巨大な怪物(敵キャラクタ)を表示することもできる。
【0092】
したがって、プレイヤはスティック26等でタッチパネル24を操作することにより、LCD14の画面に表示されるプレイヤキャラクタ、敵キャラクタ、アイテムキャラクタ、操作オブジェクトなどの画像を指示(操作)したり、コマンドを選択(入力)したりすることができる。また、3次元ゲーム空間に設けられる仮想カメラ(視点)の方向(視線の向き)を変化させたり、ゲーム画面(マップ)のスクロール(徐々に移動表示)方向を指示したりすることもできる。
【0093】
なお、ゲームの種類によっては、タッチパネル24を用いることにより、その他の入力指示も可能である。たとえば、座標入力指示を入力したり、LCD14において文字,数字,記号等を手書き入力したりすることができる。
【0094】
このように、ゲーム装置10は、2画面分の表示部となるLCD12およびLCD14を有し、いずれか一方(この実施例では、LCD14)の上面にタッチパネル24が設けられるので、2画面(12,14)と2系統の操作部(22,24)とを有する構成になっている。
【0095】
また、この実施例では、スティック26は、たとえば下側ハウジング16bに設けられる収納部(図1では点線で示す)に収納することができ、必要に応じて取り出される。ただし、スティック26を設けない場合には、その収納部も設ける必要はない。
【0096】
さらに、ゲーム装置10はメモリカード(またはカートリッジ)28を含み、このメモリカード28は着脱自在であり、下側ハウジング16bの裏面ないしは上端(天面)に設けられる挿入部30a(図1では点線で示す)に挿入される。図1では省略するが、挿入部30aの奥部には、メモリカード28の挿入方向先端部に設けられるコネクタ(図示せず)と接合するためのコネクタ32a(図2参照)が設けられており、したがって、メモリカード28が挿入部30aに挿入されると、コネクタ同士が接合され、ゲーム装置10のCPUコア34(図2参照)がメモリカード28にアクセス可能となる。
【0097】
さらにまた、ゲーム装置10はカメラカートリッジ60を含み、このカメラカートリッジ60は着脱自在であり、下側ハウジング16bの裏面ないし下端(底面)に設けられる挿入部30b(図1では点線で示す)に挿入される。図1では省略するが、挿入部30bの奥部には、カメラカートリッジ60の挿入方向先端部に設けられるコネクタ(図示せず)と接合するためのコネクタ32b(図2参照)が設けられており、したがって、カメラカートリッジ60が挿入部30bに挿入されると、コネクタ同士が接合され、ゲーム装置10のCPUコア34(図2参照)がカメラカートリッジ60にアクセス可能となる。
【0098】
なお、図1では表現できないが、上側ハウジング16aの音抜き孔20aおよび20bと対応する位置であり、この上側ハウジング16aの内部にはスピーカ36aおよび36b(図2参照)が設けられる。
【0099】
また、図1では省略するが、たとえば、下側ハウジング16bの裏面側には、電池収容ボックスが設けられ、また、下側ハウジング16bの底面側には、音量スイッチ、外部拡張コネクタおよびイヤフォンジャックなどが設けられる。
【0100】
図2はゲーム装置10の電気的な構成を示すブロック図である。図2を参照して、ゲーム装置10は電子回路基板38を含み、この電子回路基板38には上述のCPUコア34等の回路コンポーネントが実装される。CPUコア34は、バス40を介して前述のコネクタ32aおよびコネクタ32bに接続されるとともに、RAM42、第1のグラフィック処理ユニット(GPU)44、第2のGPU46、入出カインターフェース回路(以下、「I/F回路」という。)48およびLCDコントローラ50が接続される。
【0101】
コネクタ32aには、上述したように、メモリカード28が着脱自在に接続される。メモリカード28は、ROM28aおよびRAM28bを含み、図示は省略するが、ROM28aおよびRAM28bは、互いにバスで接続され、さらに、コネクタ32aと接合されるコネクタ(図示せず)に接続される。したがって、上述したように、CPUコア34は、ROM28aおよびRAM28bにアクセスすることができるのである。
【0102】
ROM28aは、ゲーム装置10で実行すべきゲームのためのゲームプログラム、画像データ(文字やオブジェクトの画像、背景画像、アイテム画像、アイコン(ボタン)画像、メッセージ画像など)およびゲームに必要な音(音楽)のデータ(音データ)等を予め記憶する。RAM(バックアップRAM)28bは、そのゲームの途中データやゲームの結果データなどを記憶(セーブ)する。
【0103】
RAM42は、バッファメモリないしはワーキングメモリとして使用される。つまり、CPUコア34は、メモリカード28のROM28aに記憶されたゲームプログラム、画像データおよび音データ等をRAM42にロードし、ロードしたゲームプログラムを実行する。また、CPUコア34は、ゲームの進行に応じて一時的に発生するデータ(ゲームデータやフラグデータ)をRAM42に記憶しつつゲーム処理を実行する。
【0104】
なお、ゲームプログラム、画像データおよび音データ等は、ROM28aから一度に全部、または部分的かつ順次的に読み出され、RAM42に記憶(ロード)される。
【0105】
ただし、メモリカード28のROM28aには、ゲーム以外の他のアプリケーションについてのプログラムおよび当該アプリケーションの実行に必要な画像データが記憶される場合もある。また、必要に応じて、音(音楽)データが記憶されてもよい。かかる場合には、ゲーム装置10では、当該アプリケーションが実行される。
【0106】
また、コネクタ32bには、上述したように、カメラカートリッジ60が着脱自在に接続される。カメラカートリッジ60は、CCDイメージャやCMOSイメージャのような撮像装置を用いたカメラ機能を備え、撮影した画像のデータ(撮影画像データ)を、コネクタ32bおよびバスを介してCPUコア34に与える。CPUコア34は、カメラカートリッジ60からの撮影画像データをRAM42に記憶(一時記憶)する。なお、図1では、カメラカートリッジ60の筐体から露出して、撮像装置のレンズ60aが設けられる。
【0107】
GPU44およびGPU46は、それぞれ、描画手段の一部を形成し、たとえばシングルチップASICで構成され、CPUコア34からのグラフィックスコマンド(作画命令)を受け、そのグラフィックスコマンドに従って画像データを生成する。ただし、CPUコア34は、グラフィックスコマンドに加えて、画像データの生成に必要な画像生成プログラム(ゲームプログラムに含まれる。)をGPU44およびGPU46のそれぞれに与える。
【0108】
また、GPU44には、第1のビデオRAM(以下、「VRAM」という。)52が接続され、GPU46には、第2のVRAM54が接続される。GPU44およびGPU46が作画コマンドを実行するにあたって必要なデータ(画像データ:ポリゴンやテクスチャ等のデータ)は、GPU44およびGPU46が、それぞれ、第1のVRAM52および第2のVRAM54にアクセスして取得する。
【0109】
なお、CPUコア34は、描画に必要な画像データをGPU44およびGPU46を介して第1のVRAM52および第2のVRAM54に書き込む。GPU44はVRAM52にアクセスして描画のための画像データを作成し、GPU46はVRAM54にアクセスして描画のための画像データを作成する。
【0110】
VRAM52およびVRAM54は、LCDコントローラ50に接続される。LCDコントローラ50はレジスタ56を含み、レジスタ56はたとえば1ビットで構成され、CPUコア34の指示によって「0」または「1」の値(データ値)を記憶する。LCDコントローラ50は、レジスタ56のデータ値が「0」である場合には、GPU44によって作成された画像データをLCD12に出力し、GPU46によって作成された画像データをLCD14に出力する。また、LCDコントローラ50は、レジスタ56のデータ値が「1」である場合には、GPU44によって作成された画像データをLCD14に出力し、GPU46によって作成された画像データをLCD12に出力する。
【0111】
なお、LCDコントローラ50は、VRAM52およびVRAM54から直接画像データを読み出したり、GPU44およびGPU46を介してVRAM52およびVRAM54から画像データを読み出したりする。
【0112】
I/F回路48には、操作スイッチ22,タッチパネル24およびスピーカ36a,36bが接続される。ここで、操作スイッチ22は、上述したスイッチ22a,22b,22c,22d,22e,22g,22Lおよび22Rであり、操作スイッチ22が操作されると、対応する操作信号(操作データ)がI/F回路48を介してCPUコア34に入力される。また、タッチパネル24からの座標データがI/F回路48を介してCPUコア34に入力される。さらに、CPUコア34は、ゲーム音楽(BGM)、効果音またはゲームキャラクタの音声(擬制音)などのゲームに必要な音データをRAM42から読み出し、I/F回路48を介してスピーカ36a,36bから出力する。
【0113】
図3はこの実施例におけるゲーム装置10の使用例を示す図解図である。図1および図3から分かるように、図3では、図1に示すゲーム装置10を反時計周りに約90°回転した状態で、ユーザないしプレイヤ(以下、単に「ユーザ」という。)が両手で把持している。したがって、LCD12およびLCD14は横並びに配置される。このようにして、カメラカートリッジ60でユーザの顔を撮影するとともに、当該ユーザがLCD12およびLCD14に表示される画面を見て仮想ゲーム等のアプリケーションを実行できるようにしてある。
【0114】
図4は、上述のゲーム装置10を用いて仮想ゲーム等のアプリケーションを実行する場合に、図3に示した状態で、LCD12に表示される画面100およびLCD14に表示される画面200の例を示す。ただし、図4においては、簡単のため、LCD12およびLCD14の表示面のみを示してある。画面100は、その上部に表示領域102を含み、表示領域102には、たとえば、ユーザに対する質問の内容がテキスト表示される。
【0115】
また、画面200は、その中央上部に表示領域202を含み、この表示領域202には、画像(この実施例では、ユーザの顔画像)が表示される。顔画像は、上述したカメラカートリッジ60で撮影されたユーザの顔画像であり、その顔画像の鏡像が表示領域202に表示される。また、表示領域202の下方には、上記表示領域102に表示された質問に回答するための選択肢がボタン画像204およびボタン画像206のそれぞれにテキスト表示される。
【0116】
このようなアプリケーションでは、ユーザが片目を閉じる動作を行うことにより、ボタン画像(204,206)を押す(オンする)などの操作が可能である。つまり、ユーザは、操作スイッチ22の操作やタッチパネル24のタッチ入力(タッチ操作)に代えて、片目を閉じる動作によってコマンドを入力することができるのである。
【0117】
たとえば、図4に示す例では、画面100の表示領域102に表示される質問に対して、左目または右目を閉じることにより、ボタン画像204またはボタン画像206を選択(オン)して、回答することができる。ただし、カメラカートリッジ60によって、ユーザの顔画像が撮影され、片目を閉じる動作が認識される必要がある。ユーザの顔画像が撮影されているか否かをユーザが容易に判断できるようにするために、画面200の表示領域202にカメラカートリッジ60で撮影されている画像を表示するようにしてある。
【0118】
図5(A)および図5(B)には、画面100および画面200の他の例が示される。図5(A)に示す画面100では、その上部に表示領域110にユーザに対する指示ないし通知(メッセージ)がテキスト表示される。また、図5(A)に示す画面200では、表示領域202の下方にボタン画像208が表示される。かかる場合には、ユーザが左目または右目を閉じることにより、ボタン画像208をオンして、画面100に表示された指示ないしメッセージを見た(理解した)旨を入力することができる。
【0119】
また、図5(B)に示す画面100では、その全体にゲーム画面の背景(マップ)が表示され、その中央下部にプレイヤキャラクタ120が表示される。一方、図5(B)に示す画面200では、表示領域202の下方にボタン画像210およびボタン画像212が設けられる。かかる場合には、ユーザは、左目または右目を閉じることにより、ボタン画像210またはボタン画像212をオンして、プレイヤキャラクタ120の進行方向(左または右)を指示することができる。
【0120】
このように、片目を閉じる動作によってアプリケーションを操作することができる。ここで、片目を閉じる動作の検出方法について簡単に説明することにする。図6は、撮影されたユーザの顔画像およびその特徴点Pi(i=1,2,…,41,42)を示す図解図である。ただし、図6では、RAM42に展開される画像をカメラ座標系で示し、また、画像を展開する領域(展開領域)は、後述するように、LCD14の大きさに相当する領域がRAM42に確保される。図6からも分かるように、展開領域の左上の頂点がカメラ座標の原点Oである。また、カメラ座標系では、図面の右方向がX軸のプラス方向であり、図面の下方向がY軸のプラス方向である。
【0121】
ユーザの顔画像の特徴点Piの位置は、カメラカートリッジ60によって撮影されたユーザの顔画像に対して、エッジ検出等の画像処理を施すことによって検出される。特徴点Piが検出されると、この特徴点Piを用いて、撮影画像の一部を走査することにより、左目および右目の黒目の領域(黒目領域)についての面積がそれぞれ求められる。そして、右目と左目との黒目領域の面積の比較結果(比率)に応じて、片目(左目または右目)を閉じているかどうかを判断するようにしてある。以下、この実施例では、片目を閉じる動作をウインクと言うことがあるが、同時に両目を閉じる動作は含まない。
【0122】
図7は、図2に示したRAM42のメモリマップの一例を示す図解図である。図7に示すように、RAM42はプログラム記憶領域70およびデータ記憶領域72を含む。プログラム記憶領域70には、仮想ゲームなどのアプリケーションプログラム(情報処理プログラム)が記憶され、この情報処理プログラムは、メイン処理プログラム70a、画像生成プログラム70b、画像表示プログラム70c、画像更新プログラム70d、ウインク検知プログラム70eおよびコマンド処理プログラム70fなどによって構成される。また、ウインク検知プログラム70eは、特徴点検出プログラム700および面積計測プログラム702などを含む。
【0123】
メイン処理プログラム70aは、アプリケーションのメインルーチンを処理するためのプログラムである。画像生成プログラム70bは、ポリゴンデータやテクスチャデータなどを用いて、アプリケーションを実行するために必要な画像(アプリケーション画像)を生成するためのプログラムである。画像表示プログラム70cは、画像生成プログラム70bに従って生成されたアプリケーション画像をLCD12およびLCD14に表示するためのプログラムである。画像更新プログラム70dは、LCD12およびLCD14に表示される画面100および画面200を更新するためのプログラムである。
【0124】
ウインク検知プログラム70eは、ユーザのウインクを検知するとともに、閉じている目を検出するためのプログラムである。特徴点検出プログラム700は、一定時間(この実施例では、10フレーム:フレームは画面更新単位時間(1/60秒))毎に、カメラカートリッジ60によって撮影(撮像)されたユーザの顔画像に対して、エッジ検出等の画像処理を施すことによって、顔画像における42個の特徴点Piを検出および更新するためのプログラムである。面積計測プログラム702は、特徴点検出プログラム700に従って検出された特徴点Piを用いて、右目の黒目領域の面積および左目の黒目領域の面積を、それぞれ計測するためのプログラムである。
【0125】
コマンド処理プログラム70fは、ウインク検知プログラム70eに従ってウインクおよび閉じている目が検出されたとき、閉じている目に応じた処理を実行するためのプログラムである。
【0126】
なお、図示は省略するが、情報処理プログラムは、音出力プログラムやバックアッププログラムなども含む。音出力プログラムは、図示しない音(音楽)データを用いて、アプリケーションを実行する場合に必要な音(音楽)を生成および出力するためのプログラムである。バックアッププログラムは、ユーザの指示やアプリケーションの実行中に発生するイベントに応じて、作業中のデータ(途中データ)または作業後のデータ(結果データ)を、メモリカード28のRAM28bに保存(セーブ)するためのプログラムである。
【0127】
図8は図7に示したデータ記憶領域72の具体的な内容の一例を示す図解図である。図8に示すように、データ記憶領域72には、特徴点データ72a、今回の左目の黒目領域の面積データ72b、今回の右目の黒目領域の面積データ72c、前回の左目の黒目領域の面積データ72dおよび前回の右目の黒目領域の面積データ72eが記憶される。また、特徴点取得フラグ72f、ウインク検知実行フラグ72g、左目処理フラグ72hおよび右目処理フラグ72iが記憶される。
【0128】
特徴点データ72aは、特徴点検出プログラム70fに従って検出されたすべての特徴点Piについての座標データである。今回の左目の黒目領域の面積データ72bは、左目の黒目領域について今回計測された面積についてのデータである。今回の右目の黒目領域の面積データ72cは、右目の黒目領域について今回計測された面積についてのデータである。前回の左目の黒目領域の面積データ72dは、右目の黒目領域について前回計測された面積についてのデータである。前回の右目の黒目領域について前回計測された面積についてのデータである。
【0129】
特徴点取得フラグ72fは、撮影画像データから特徴点Piを取得できたか否かを示すフラグであり、たとえば、1ビットのレジスタで構成される。撮影画像データから特徴点Piを取得できた場合には、特徴点取得フラグ(IsEnable)72fが成立(true)され、レジスタにデータ値「1」が設定される。一方、撮影画像データから特徴点Piを取得できない場合には、特徴点取得フラグ72fが不成立(false)され、レジスタにデータ値「0」が設定される。
【0130】
ウインク検知実行フラグ72gは、ウインクの有無を実際に検知するか否かを示すフラグであり、たとえば、1ビットのレジスタで構成される。この実施例では、一定時間(10フレーム)毎に、ウインク検知実行フラグ(IsCheck)72gが成立され、レジスタにデータ値「1」が設定される。それ以外では、ウインク検知実行フラグ72gが不成立され、レジスタにデータ値「0」が設定される。
【0131】
左目処理フラグ72hは、左目のウインク処理を実行するかどうかを示すフラグであり、たとえば、1ビットのレジスタで構成される。この左目処理フラグ(Lexe)72hは、ウインクが検知され、左目が閉じられていることが判断されたときに成立され、レジスタにデータ値「1」が設定される。それ以外では、左目処理フラグ72hは不成立され、レジスタにデータ値「0」が設定される。
【0132】
右目処理フラグ72iは、右目のウインク処理を実行するかどうかを示すフラグであり、たとえば、1ビットのレジスタで構成される。この右目処理フラグ(Rexe)72iは、ウインクが検知され、右目が閉じられていることが判断されたときに成立され、レジスタにデータ値「1」が設定される。それ以外では、右目処理フラグ72iは不成立され、レジスタにデータ値「0」が設定される。
【0133】
なお、図示は省略するが、画像データ、音データなどの他のデータ、他のフラグ、カウンタなどもデータ記憶領域72に記憶される。
【0134】
具体的には、図2に示したCPUコア34が図9および図10に示すウインク検知処理を実行する。図9に示すように、CPUコア34がウインク検知処理を開始すると、ステップS1で、変数、カウンタおよびフラグを初期化する。具体的には、変数maxSizeL,maxSizeR,preMaxSizeL,preMaxSizeRのそれぞれに初期値(−1)を代入する。ただし、これらの変数の初期値(−1)は、無効(値)を意味する。また、変数Countに初期値(0)を代入する。そして、フラグIsEnable,IsCheck,Lexe,Rexeを初期値(false)に設定する。
【0135】
ただし、変数maxSizeLは、今回の左目の黒目領域の面積データ72bであり、変数maxSizeRは、今回の右目の黒目領域の面積データ72cであり、変数preMaxSizeLは、前回の左目の黒目領域の面積データ72dであり、そして、変数preMaxSizeRは、前回の右目の黒目領域の面積データ72eである。また、変数countは、フレーム数のカウント値であり、一定値(9)になると、リセット(0)される。上述したように、フラグIsEnableは、特徴点Piを取得できたか否かを示す特徴点取得フラグ72fであり、フラグIsCheckは、ウインクの検知を行うか否かを示すウインク検知実行フラグ72gであり、フラグLexeは、左目のウインク処理を実行するか否かを示す左目処理フラグ72hであり、そして、フラグRexeは、右目のウインク処理を実行するか否かを示す右目処理フラグ72iである。
【0136】
次に、ステップS3では、後述する特徴点データの更新処理(図11参照)を実行する。続くステップS5では、フラグIsCheckがtrueであるかどうかを判断する。つまり、CPUコア34は、今回ウインクの検知を行うかどうかを判定する。ステップS5で“NO”であれば、つまりフラグIsCheckがfalseであれば、今回ウインクの検知を行わないと判定して、図10に示すステップS27に進む。一方、ステップS5で“YES”であれば、つまりフラグIsCheckがtrueであれば、今回ウインクの検知を行うと判定して、ステップS7で、変数preMaxSizeLに変数maxSizeLを代入するとともに、変数preMaxSizeRに変数maxSizeRを代入する。つまり、CPUコア34は、今回の左目の黒目領域の面積データ72bのコピーを前回の左目の黒目領域の面積データ72dとしてデータ記憶領域72に記憶するとともに、今回の右目の黒目領域の面積データ72cのコピーを前回の右目の黒目領域の面積データ72eとしてデータ記憶領域72に記憶する。
【0137】
そして、ステップS9で、フラグIsEnableがtrueであるかどうかを判断する。つまり、CPUコア34は、特徴点Piを取得できたかどうかを判定する。ステップS9で“NO”であれば、つまりフラグIsEnableがfalseであれば、特徴点Piを取得できていないと判断して、ステップS11で、変数maxSizeLおよび変数maxSizeRのそれぞれに−1(無効値)を代入して、ステップS27に進む。一方、ステップS9で“YES”であれば、つまりフラグIsEnableがtrueであれば、特徴点Piを取得できたと判断して、ステップS13で、後述する面積計測処理(図12−図21参照)を実行して、ステップS15に進む。
【0138】
ステップS15では、変数minLに、変数preMaxSizeLおよび変数maxSizeLのうち小さい方を代入し、変数maxLに、変数preMaxSizeLおよび変数maxSizeLのうち大きい方を代入し、変数minRに、変数preMaxSizeRおよび変数maxSizeRのうち小さい方を代入し、変数minRに、変数preMaxSizeRおよび変数maxSizeRのうち大きい方を代入する。次のステップS17では、変数minLまたは変数minRが0よりも小さいかどうかを判断する。つまり、CPUコア34は、変数minLまたは変数minRが−1(無効値)であるかどうかを判断する。
【0139】
ステップS17で“YES”であれば、つまり変数minLまたは変数minRが0より小さければ、ウインクを検知することができないと判断して、ステップS27に進む。一方、ステップS17で“NO”であれば、つまり変数minLおよびminRが0以上であれば、ウインクを検知することができると判断して、図10に示すステップS19に進む。
【0140】
図10に示すように、ステップS19では、変数maxLが変数minR×2/3よりも小さいかどうかを判断する。つまり、CPUコア34は、左目を閉じたかどうかを判断する。ステップS19で“YES”であれば、つまり変数maxLが変数minR×2/3よりも小さければ、ステップS21で、左目のウインク処理についてのフラグLexeをtrueに設定して、ウインク検知処理を終了する。一方、ステップS19で“NO”であれば、つまり変数maxLが変数minR×2/3以上であれば、ステップS23で、変数maxRが変数minL×2/3よりも小さいかどうかを判断する。つまり、CPUコア34は、右目を閉じたかどうかを判断する。
【0141】
ステップS23で“YES”であれば、つまり変数maxRが変数minL×2/3よりも小さければ、ステップS25で、右目のウインク処理についてのフラグRexeをtrueに設定して、ウインク検知処理を終了する。一方、ステップS23で“NO”であれば、つまり変数maxRが変数minL×2/3以上であれば、ステップS27で、ウインク検知を終了するかどうかを判断する。ここでは、CPUコア34は、ユーザの指示やアプリケーションのイベントの発生によって、ウインク検知を終了するかどうかを判断する。ステップS27で“NO”であれば、つまりウインク検知を終了しない場合には、図9に示したステップS3に戻る。一方、ステップS27で“YES”であれば、つまりウインク検知を終了する場合には、ウインク検知処理を終了する。
【0142】
なお、図示は省略するが、左目のウインク処理のフラグLexeまたは右目のウインク処理のフラグRexeがtrueである場合には、図4および図5を用いて説明したように、アプリケーションにおいて、そのウインクに従った処理が実行される。
【0143】
また、ステップS19およびS23の判断処理において使用した数式は、経験的に得られたものであるが、これに限定される必要はない。左目の黒目領域の面積と右目の黒目領域の面積との比率で、ウインクを検知している点に着目されたい。
【0144】
図11は図9に示したステップS3の特徴点データの更新処理を示すフロー図である。図11を参照して、CPUコア34は、特徴点データの更新処理を開始すると、ステップS41で、特徴点取得処理を終了したかどうかを判断する。なお、図示は省略したが、ウインク検知処理が開始され、初期化処理(S1)が実行されるときに、特徴点取得処理も開始される。この特徴点取得処理は、ウインク検知処理とは別に実行される。
【0145】
ステップS41で“NO”であれば、つまり特徴点取得処理を終了していなければ、そのままステップS49に進む。一方、ステップS41で“YES”であれば、つまり特徴点取得処理を終了すれば、ステップS43で、特徴点Piを取得できたかどうかを判断する。つまり、CPUコア34は、特徴点取得処理の結果、特徴点データ72aがRAM42に記憶(更新)されたかどうかを判断するのである。
【0146】
ステップS43で“NO”であれば、つまり特徴点Piを取得できていない場合には、特徴点の取得(更新)に失敗したと判断して、ステップS45で、フラグIsEnableをfalseに設定して、ステップS49に進む。一方、ステップS43で“YES”であれば、つまり特徴点Piを取得できた場合には、ステップS47で、フラグIsEnableをtrueに設定するとともに、顔特徴点FacePointArray[42]に、取得した特徴点Pi(i=1−42)の座標を代入して、ステップS49に進む。
【0147】
ステップS49では、変数Countに、(変数Count+1)÷10の余りを代入する。この実施例では、10フレーム毎に、ウインクを検知するようにするため、変数Countに1加算した値を10で割っている。つまり、その余りが0である場合に、前回ウインクを検知してから(または、ウインク検知処理の開始から)、10フレームが経過したことになる。そして、ステップS51では、変数Countが0である場合には、フラグIsCheckをtrueに設定し、変数Countが0以外である場合には、フラグIsCheckをfalseに設定して、ウインク検知処理にリターンする。
【0148】
図12ないし図21は、図9に示したステップS13の面積計測処理を示すフロー図である。図12に示すように、CPUコア34は、面積計測処理を開始すると、ステップS71で、検知用のグレースケール画像(256×192dot)を取得し、画素値Image[256][192]に代入する。つまり、CPUコア34は、LCD14(またはLCD12)と同じ大きさについてのグレースケール画像を取得する。たとえば、5ビット(32階調)のグレースケール画像が取得される。ただし、グレースケール画像は、5ビットに限定される必要はなく、それよりも少ないビット数(低階調)でも、多いビット数(高階調)でも構わない。
【0149】
続くステップS73では、変数EyeLに、左目の特徴点の座標(x,y)を代入し、変数EyeRに、右目の特徴点の座標(x,y)を代入する。ただし、ステップS73においては、左目の特徴点(EyeL)は、その左目の黒目領域の中心点P13であり、右目の特徴点(EyeR)は、その右目の黒目領域の中心点P22である。
【0150】
なお、これ以降の面積計測処理においては、左目および右目のそれぞれの中心点P13およびP22を原点とするローカル座標が用いられる。また、各ローカル座標では、図面の右方向がX軸のプラス方向であり、図面の上方向がY軸のプラス方向である。
【0151】
次のステップS75では、変数EyeDistanceに、√{(EyeL.x−EyeR.x)2+(EyeL.y−EyeR.y)2}を代入する。ただし、変数EyeDistanceは、左目の黒目領域の中心と、右目の黒目領域の中心との距離である。また、EyeL.xは左目の特徴点の座標(変数EyeL)のx座標であり、EyeL.yは左目の特徴点の座標(変数EyeL)のy座標であり、EyeR.xは右目の特徴点の座標(変数EyeR)のx座標であり、そして、EyeR.yは右目の特徴点の座標(変数EyeR)のy座標である。以下、同様である。
【0152】
続いて、ステップS77では、ステップS75で得られた変数EyeDistanceを用いるなどして、各種変数が定義される。具体的には、変数searchWidthに定数A×EyeDistanceが設定され、変数searchTopに定数B×EyeDistanceが設定され、変数searchBottomに定数C×EyeDistanceが設定される。また、変数checkWidthに定数D×EyeDistanceが設定され、変数calcWidthに定数E×EyeDistanceが設定され、変数eyeLimitに定数F×EyeDistanceが設定され、変数eyeSkipに定数G×EyeDistanceが設定され、変数addBrightMaxには定数Hが設定される。
【0153】
ただし、変数searchWidthは、最も黒い色および最も明るい色を検出する範囲のうちの横方向(X軸方向)の範囲(横幅)を規定するための変数である。変数searchTopは、最も黒い色および最も明るい色を検出する範囲のうち、縦方向(Y軸方向)の上半分を規定するための変数である。変数searchBottomは、最も黒い色および最も明るい色を検出する範囲のうち、Y軸方向の下半分を規定するための変数であり、負の数で表わされる。図22(A)に示すように、変数searchWidth、変数searchTopおよび変数searchBottomは、目(ここでは、左目)の中心eyeLを基準として、上記最も黒い色および最も明るい色を検出する範囲(色検出範囲)を規定する。
【0154】
また、変数checkWidthは、黒い色の領域についての最も面積の大きい場所を検出する範囲のうちのX軸方向の範囲を規定するための変数である。変数calcWidthは、黒い色の領域についての面積を計算するX軸方向の幅を規定するための変数である。変数eyeLimitは、Y軸方向(縦)に黒い色のピクセルが連続する場合に、黒い色の面積の検出不能か否かを判定するための閾値を示す変数である。変数eyeSkipは、Y軸方向に白い色のピクセルが連続した場合に、黒い色のピクセルが連続していると擬制するかどうかを判定するための閾値を示す変数である。変数addBrightMaxは、左右の目の周囲の明るさが違っていた場合に、明るさを補正する場合の補正値の最大値を示す変数である。
【0155】
さらに、この実施例では、定数Aを「7」に設定し、定数Bを「3」に設定し、定数Cを「−8」に設定し、定数Dを「10」に設定し、定数Eを「5」に設定し、定数Fを「40」に設定し、定数Gを「2」に設定し、そして、定数Hを「17」に設定してある。
【0156】
図12に戻って、ステップS79では、画素値imageのうち、数1で示される範囲の色をチェックして、最大値を変数maxColLに代入し、最小値を変数minColLに代入する。つまり、左目の周囲の最も明るい色(maxColL)および最も暗い色(minColL)が検出される。
【0157】
[数1]
EyeL.x−searchWidth≦x<EyeL.x+searchWidth
EyeL.y+searchBottom≦y<EyeL.y+searchTop
また、ステップS81では、画素値imageのうち、数2で示される範囲の色をチェックして、最大値を変数maxColRに代入し、最小値を変数maxColRに代入する。つまり、右目の周囲の最も明るい色(maxColR)および最も暗い色(minColR)が検出される。
【0158】
[数2]
EyeR.x−searchWidth≦x<EyeR.x+searchWidth
EyeR.y+searchBottom≦y<EyeR.y+searchTop
図13に示すように、次のステップS83では、ステップS79およびステップS81で求めた変数maxColL,minColL,maxColR,minColRが数3を満たすかどうかを判断する。つまり、CPUコア34は、右目の最も明るい色よりも左目の最も明るい色の画素値が小さく、かつ、右目の最も暗い色よりも左目の最も暗い色の画素値が小さいかどうかを判断する。
【0159】
[数3]
maxColL<maxColR かつ minColL<minColR
ステップS83で“YES”であれば、つまり数3を満たす場合には、左目の周囲よりも右目の周囲の方が明るいと判断して、ステップS85で、変数colLimitRに、colLimitR+{(maxColR−maxcolL)またはaddBrightmaxの小さい方}を代入して、ステップS91に進む。つまり、右目の黒目領域の面積を計測する場合の黒い部分か白い部分かを判断するための閾値が補正される。ただし、ステップS85において、(maxColR−maxcolL)またはaddBrightmaxの小さい方をcolLimitRに加算するのは、補正幅の上限をaddBrightmaxとして、黒い部分か白い部分かを判断するための閾値が左右で極端に異なることを防ぐためである。
【0160】
一方、ステップS83で“NO”であれば、つまり数3を満たさない場合には、右目の周囲よりも左目の周囲の方が明るい、または左目の周囲の明るさと右目の周囲の明るさとが同程度であると判断して、ステップS87で、数4を満たすかどうかを判断する。つまり、CPUコア34は、左目の最も明るい色よりも右目の最も明るい色の画素値が小さく、かつ、左目の最も暗い色よりも右目の最も暗い色の画素値が小さいかどうかを判断する。
【0161】
[数4]
maxColR<maxColL かつ minColR<minColL
ステップS87で“NO”であれば、つまり数4を満たさない場合には、左目の周囲の明るさと右目の周囲の明るさとは同程度であると判断して、ステップS91に進む。一方、ステップS87で“YES”であれば、つまり数4を満たす場合には、右目の周囲よりも左目の周囲の方が明るいと判断して、ステップS89で、変数colLimitLに、colLimitL+{(maxColL−maxColR)またはaddBrightmaxの小さい方}を代入して、ステップS91に進む。つまり、左目の黒目領域の面積を計測する場合の黒い部分か白い部分かを判断するための閾値が補正される。ただし、ステップS89において、(maxColL−maxColR)またはaddBrightmaxの小さい方をcolLimitLに加算するのは、補正幅の上限をaddBrightmaxとして、黒い部分か白い部分かを判断するための閾値が左右で極端に異なることを防ぐためである。
【0162】
このように、CPUコア34は、左目の周囲の明るさまたは右目の周囲の明るさを補正するのは、個人差(個体差)や撮影状況(環境)の差異(ばらつき)を吸収するためである。引いては、正しくウインクを検出するためである。また、この実施例では、明るさの違いを正しく判定するために、左目の周囲および右目の周囲の最も明るい色と最も暗い色との両方に基づいて判定するようにしてあるが、最も明るい色同士または最も暗い色同士を比較することによっても、明るさを判定することは可能である。
【0163】
このように、明るさの違いによる閾値の補正を終了すると、CPUコア34は、ステップS91以降において、左目の黒目領域の面積を計測し(S91−S161)、その後、右目の黒目領域の面積を計測する(S163−S233)。
【0164】
ここで、図22(B)には、左目の黒目領域の面積を計測する場合の走査範囲(面積走査範囲)が示される。この面積走査範囲は、黒目領域の面積を検索する領域(検索領域)であり、上述した変数checkWidth,searchTop,searchBottomによって規定される。図22(B)では分かり難いが、走査する場合には、最も暗い色の画素を中心として、走査方向を上下に分けて、たとえば、面積走査範囲の左端(N=1)から順次、縦方向に黒色が連続するドット数をカウントする。これを列毎に繰り返し、右端すなわち最終列(N=2*checkWidth-1)まで実行する。そして、上下方向に連続するドット数をすべての列について合計した値を黒目領域の面積として決定する。図示は省略するが、右目の黒色領域の面積を計測する場合についても同様である。以下、具体的な処理についてフロー図を用いて説明する。
【0165】
図13に示すように、ステップS91では、変数I(走査する列の数)を初期化(I=0)する。続くステップS93では、変数CheckXに、EyeL.x−checkWidth+Iを代入する。つまり、走査の開始位置(X座標)が設定される。次に、ステップS95では、画素値imageのうち、数5で示される範囲の中で最小値になるyを求めて、変数CheckYに代入する。ただし、変数CheckXは着目する画素(ドット)のx座標であり、変数CheckYは着目する画素のy座標であり、そのうちの最も暗い色となる画素のy座標を求めるのである。
【0166】
[数5]
X=CheckX
EyeL.y+searchBottom≦Y<EyeL.y+searchTop
次のステップS97では、変数nLen,nLight,yOffsetのそれぞれに初期値(0)を設定し、図14に示すステップS99で、数6を満たすかどうかを判断する。ただし、変数nLenは、黒色のドットが縦に連続している数を示す変数である。また、変数nLightは、明るい色のドットが縦に連続している数を示す変数である。さらに、変数yOffsetは、サブルーチン(S99−S109)用の変数である。つまり、CPU34は、数6に従って、変数CheckYが面積走査範囲内であるかどうかを判断している。
【0167】
[数6]
0≦CheckY+yOffset<256
ステップS99で“NO”であれば、つまり数6を満たさない場合には、変数CheckYが面積走査範囲外であると判断して、ステップS111にそのまま進む。一方、ステップS99で“YES”であれば、つまり数6を満たす場合には、変数CheckYが面積走査範囲内であると判断して、ステップS101で、数7を満たすかどうかを判断する。つまり、着目している画素(ドット)の画素値image[CheckY+yOffset][CheckX]が、黒い部分であるか白い部分であるかを判別するのである。
【0168】
[数7]
Image[CheckY+yOffset][CheckX]<colLimitL
ステップS101で“YES”であれば、つまり数7を満たす場合には、着目する画素(ドット)が黒い部分であると判別して、ステップS103で、変数nLightを初期化して(nLight=0)、ステップS107に進む。一方、ステップS101で“NO”であれば、つまり数7を満たさない場合には、着目する画素(ドット)が白い部分であると判別して、ステップS105で、変数nLightをインクリメントして(nLight←nLight+1)、ステップS107に進む。
【0169】
ステップS107では、数8を満たすかどうかを判断する。つまり、縦方向に白い部分が連続する数(変数nLight)が黒い部分であると擬制するための閾値(変数eyeSkip)以上であるかどうかを判断することにより、黒目以外の白い部分であるかどうかを判定する。
【0170】
[数8]
nLight≧eyeSkip
ステップS107で“NO”であれば、つまり数8を満たさない場合には、ステップS109で、変数nLenをインクリメントするとともに(nLen←nLen+1)、変数yOffsetをインクリメントして(yOffset←yOffset+1)、ステップS99に戻る。つまり、次の画素について黒い部分であるか白い部分であるかを調べる。一方、ステップS107で“YES”であれば、つまり数8を満たす場合には、黒目以外の白い部分であると判断して、ステップS111で、面積走査範囲の下側の画素について走査するべく、変数nLingtを初期化するとともに(nLingt←0)、変数yOffsetを初期化して(yOffset←-1)、図15に示すステップS113で、上記の数6を満たすかどうかを判断する。つまり、変数CheckYが面積走査範囲内であるかどうかを判断する。
【0171】
ステップS113で“NO”であれば、つまり数6を満たさない場合には、そのままステップS125に進む。一方、ステップS113で“YES”であれば、つまり数6を満たす場合には、ステップS115で、上記の数7を満たすかどうかを判断する。つまり、着目する画素が黒い部分であるか白い部分であるかを判別する。ステップS115で“YES”であれば、つまり数7を満たす場合には、着目する画素が黒い部分であると判別して、ステップS117で、変数nLightを初期化して(nLight=0)、ステップS121に進む。一方、ステップS115で“NO”であれば、つまり数7を満たさない場合には、着目する画素が白い部分であると判別して、ステップS119で、変数nLightをインクリメントして(nLight←nLight+1)、ステップS121に進む。
【0172】
ステップS121では、上記の数8を満たすかどうかを判断する。つまり、黒目以外の白い部分であるかどうかを判定する。ステップS121で“NO”であれば、つまり数8を満たさない場合には、ステップS123で、変数nLenをインクリメントするとともに(nLen←nLen+1)、変数yOffsetをデクリメントして(yOffset←yOffset-1)、ステップS113に戻る。つまり、次の画素について黒い部分であるか白い部分であるかを調べる。一方、ステップS121で“YES”であれば、つまり数8を満たす場合には、黒目以外の白い部分であると判断して、ステップS125に進む。
【0173】
ステップS125では、数9を満たすかどうかを判断する。これは、変数nLenが変数eyeLimitを超えるかどうかを判断することにより、髪の毛が目にかかっていたり、睫毛の長いユーザが目を閉じていたりするような所望でない場合の検出結果を無効にするための処理である。つまり、所望でない場合には、黒目の部分としてカウントした変数nLenを面積の計測から除外するのである。
【0174】
[数9]
nLen≧eyeLimit
ステップS125で“NO”であれば、つまり数9を満たさない場合には、黒目の部分であると判断して、ステップS127で、変数LenArrey[I]に変数nLenの値を代入して、ステップS131に進む。つまり、今回調べた列(I列)において、黒い部分が連続する画素の数(LenArrey[I])が記憶される。一方、ステップS125で“YES”であれば、つまり数9を満たす場合には、黒目以外の黒い部分であると判断して、ステップS129で、変数LenArrey[I]に−1(無効値)を代入して、ステップS131に進む。
【0175】
ステップS131では、変数Iをインクリメントする(I=I+1)。そして、ステップS133では、数10を満たすかどうかを判断する。つまり、面積走査範囲のすべてについて走査したかどうかを判断する。
【0176】
[数10]
I>checkWidth×2−1
ステップS133で“NO”であれば、つまり数10を満たさない場合には、次の列を走査するべく、図13のステップS93に戻る。一方、ステップS133で“YES”であれば、つまり数10を満たす場合には、面積走査範囲のすべてについて走査したと判断して、図16に示すステップS135で、変数maxSizeLを初期化するとともに(maxSizeL←−1)、変数StartXを初期化する(StartX=0)。続いて、ステップS137では、変数Sizeを初期化して(Size←0)、ステップS139では、変数Iに変数StartXを代入する。ただし、変数maxSizeLは、面積の合計値(Size)の最大値である。また、変数StartXは、サブルーチン(S139−S157)用の変数である。さらに、変数Sizeは、変数chalcWidth分の面積の合計値である。
【0177】
そして、ステップS141では、数11を満たすかどうかを判断する。つまり、変数LenArray[I]が無効でないかどうかを判断するのである。
【0178】
[数11]
LenArray[I]≧0
ステップS141で“NO”であれば、つまり数11を満たさない場合には、ステップS143で、変数Sizeに無効値(-1)を代入して、ステップS151に進む。このようにして、一列でも無効値が含まれる場合には、今回の面積の計測処理を無効にするようにしてある。一方、ステップS141で“YES”であれば、つまり数11を満たす場合には、ステップS145で、変数Sizeに、Size+LenArray[I]を代入し、ステップS147で、変数Iをインクリメントして(I=I+1)、ステップS149に進む。ステップS149では、数12を満たすかどうかを判断する。つまり、変数Iが面積走査範囲外であるかどうかを判断する。
【0179】
[数12]
I>StartX+calcWidth−1
ステップS149で“NO”であれば、つまり数12を満たさない場合には、ステップS141に戻る。一方、ステップS149で“YES”であれば、つまり数12を満たす場合には、ステップS151に進む。ステップS151では、数13を満たすかどうかを判断する。つまり、面積の合計値の最大値が今回算出した面積の合計値よりも小さいかどうかを判断する。
【0180】
[数13]
maxSizeL<Size
ステップS151で“YES”であれば、つまり数13を満たす場合には、ステップS153で、変数maxSizeLに変数Sizeを代入して、ステップS155に進む。一方、ステップS151で“NO”であれば、つまり数13を満たさない場合には、ステップS155で、変数StartXをインクリメントする(StartX=StartX+1)。そして、ステップS157で、数14を満たすかどうかを判断する。つまり、変数StartXが面積走査範囲外であるかどうかを判断する。
【0181】
[数14]
StartX>checkWidth×2−calcWidth
ステップS157で“NO”であれば、つまり数14を満たしていない場合には、ステップS139に戻る。一方、ステップS157で“YES”であれば、つまり数14を満たしている場合には、図17に示すステップS159で、変数maxSizeが0未満であるかどうかを判断する。つまり、面積の合計値の最大値が無効であるかどうかを判断するのである。
【0182】
ステップS159で“YES”であれば、つまり変数maxSizeが0未満であれば、そのままステップS163に進む。一方、ステップS159で“NO”であれば、つまり変数maxSizeが0以上であれば、ステップS161で、変数maxSizeLを正規化する。これは、撮影された顔画像の縮尺に無関係な値に変換するためである。具体的には、数15に従って、変数maxSizeLは正規化される。
【0183】
[数15]
maxSizeL=maxSizeL/EyeDistance/EyeDistance
このようにして、左目の黒目領域の面積が求められる。続いて、右目の黒目領域の面積が求められるが、上述した左目の黒目領域の面積の計測方法と略同じであるため、重複した説明については簡単に説明することにする。
【0184】
図17に戻って、ステップS163では、変数Iを初期化する(I=0)。続くステップS165では、変数checkXに、EyeR.x−checkWidth+Iを代入する。次に、ステップS167では、画素値の数16で示される範囲の中で最小値になるyを求めて、変数checkYに代入する。
【0185】
[数16]
X=CheckX
EyeR.y+searchBottom≦Y<EyeR.y+searchTop
次のステップS169では、変数nLen,nLight,yOffsetのそれぞれに初期値(0)を設定し、図18に示すステップS171で、上記の数6を満たすかどうかを判断する。つまり、変数CheckYが面積走査範囲内であるかどうかを判断している。ステップS171で“NO”であれば、つまり数6を満たさない場合には、変数CheckYが面積走査範囲外であると判断して、ステップS183にそのまま進む。一方、ステップS171で“YES”であれば、つまり数6を満たす場合には、変数CheckYが面積走査範囲内でRと判断して、ステップS173で、数17を満たすかどうかを判断する。つまり、着目している画素(ドット)の画素値image[CheckY+yOffset][CheckX]が、黒い部分であるか白い部分であるかを判別するのである。
【0186】
[数17]
Image[CheckY+yOffset][CheckX]<colLimitR
ステップS173で“YES”であれば、つまり数17を満たす場合には、着目する画素が黒い部分であると判別して、ステップS175で、変数nLightを初期化して(nLight=0)、ステップS179に進む。一方、ステップS173で“NO”であれば、つまり数17を満たさない場合には、着目する画素が白い部分であると判別して、ステップS177で、変数nLightをインクリメントして(nLight←nLight+1)、ステップS179に進む。
【0187】
ステップS179では、上記の数8を満たすかどうかを判断する。つまり、縦方向に白い部分が連続する数(変数nLight)が黒い部分であると擬制するための閾値(変数eyeSkip)以上であるかどうかを判断することにより、黒目以外の白い部分であるかどうかを判定する。ステップS179で“NO”であれば、つまり数8を満たさない場合には、ステップS181で、変数nLenをインクリメントするとともに(nLen←nLen+1)、変数yOffsetをインクリメントして(yOffset←yOffset+1)、ステップS171に戻る。一方、ステップS179で“YES”であれば、つまり数8を満たす場合には、黒目以外の白い部分であると判断して、ステップS183で、面積走査範囲の下側の画素について走査するべく、変数nLingtを初期化するとともに(nLingt←0)、変数yOffsetを初期化して(yOffset←−1)、図19に示すステップS185で、上記の数6を満たすかどうかを判断する。つまり、変数CheckYが面積走査範囲内であるかどうかを判断する。
【0188】
ステップS185で“NO”であれば、つまり数6を満たさない場合には、そのままステップS197に進む。一方、ステップS185で“YES”であれば、つまり数6を満たす場合には、ステップS187で、上記の数17
を満たすかどうかを判断する。つまり、着目する画素が黒い部分であるか白い部分であるかを判別する。ステップS187で“YES”であれば、つまり数16を満たす場合には、着目する画素が黒い部分であると判別して、ステップS189で、変数nLightを初期化して(nLight=0)、ステップS193に進む。一方、ステップS187で“NO”であれば、つまり数16を満たさない場合には、着目する画素が白い部分であると判別して、ステップS191で、変数nLightをインクリメントして(nLight←nLight+1)、ステップS193に進む。
【0189】
ステップS193では、上記の数8を満たすかどうかを判断する。つまり、黒目以外の白い部分であるかどうかを判定する。ステップS193で“NO”であれば、つまり数8を満たさない場合には、ステップS195で、変数nLenをインクリメントするとともに(nLen←nLen+1)、変数yOffsetをデクリメントして(yOffset←yOffset−1)、ステップS185に戻る。つまり、次の画素について黒い部分であるか白い部分であるかを調べる。一方、ステップS193で“YES”であれば、つまり数8を満たす場合には、黒目以外の白い部分であると判断して、ステップS197に進む。
【0190】
ステップS197では、上記の数9を満たすかどうかを判断する。ステップS197で“NO”であれば、つまり数9を満たさない場合には、黒目の部分であると判断して、ステップS199で、変数LenArrey[I]に変数nLenの値を代入して、ステップS203に進む。一方、ステップS197で“YES”であれば、つまり数9を満たす場合には、黒目以外の黒い部分であると判断して、ステップS201で、変数LenArrey[I]に−1(無効値)を代入して、ステップS203に進む。
【0191】
ステップS203では、変数Iをインクリメントする(I=I+1)。そして、ステップS205では、上記の数10を満たすかどうかを判断する。つまり、面積走査範囲のすべてについて走査したかどうかを判断する。ステップS205で“NO”であれば、つまり数10を満たさない場合には、次の列を走査するべく、図17のステップS165に戻る。一方、ステップS205で“YES”であれば、つまり数10を満たす場合には、面積走査範囲のすべてについて走査したと判断して、図20に示すステップS207で、変数maxSizeRを初期化するとともに(maxSizeR←−1)、変数StartXを初期化する(StartX=0)。続いて、ステップS209では、変数Sizeを初期化して(Size←0)、ステップS211では、変数Iに変数StartXを代入する。
【0192】
そして、ステップS213では、上記の数11を満たすかどうかを判断する。つまり、変数LenArray[I]が無効でないかどうかを判断するのである。ステップS213で“NO”であれば、つまり数11を満たさない場合には、ステップS215で、変数Sizeに無効値(-1)を代入して、ステップS223に進む。一方、ステップS213で“YES”であれば、つまり数11を満たす場合には、ステップS217で、変数Sizeに、Size+LenArray[I]を代入し、ステップS219で、変数Iをインクリメントして(I=I+1)、ステップS221に進む。ステップS221では、上記の数12を満たすかどうかを判断する。
【0193】
ステップS221で“NO”であれば、つまり数12を満たさない場合には、ステップS213に戻る。一方、ステップS221で“YES”であれば、つまり数12を満たす場合には、ステップS223に進む。ステップS223では、上記の数18を満たすかどうかを判断する。
【0194】
[数18]
maxSizeR<Size
ステップS223で“YES”であれば、つまり数18を満たす場合には、ステップS225で、変数maxSizeRに変数Sizeを代入して、ステップS227に進む。一方、ステップS223で“NO”であれば、つまり数18を満たさない場合には、ステップS227で、変数StartXをインクリメントする(StartX=StartX+1)。そして、ステップS229で、上記の数14を満たすかどうかを判断する。つまり、変数StartXが走査する範囲を超えたかどうかを判断する。
【0195】
ステップS229で“NO”であれば、つまり数14を満たしていない場合には、ステップS211に戻る。一方、ステップS229で“YES”であれば、つまり数14を満たしている場合には、図21に示すステップS231で、変数maxSizeが0未満であるかどうかを判断する。ステップS231で“YES”であれば、つまり変数maxSizeが0未満であれば、そのまま図9に示したウインク検知処理にリターンする。一方、ステップS231で“NO”であれば、つまり変数maxSizeが0以上であれば、ステップS233で、変数maxSizeRを正規化して、ウインク検知処理にリターンする。なお、変数maxSizeRの正規化は、上記の変数maxSizeLの正規化と同様であり、具体的には、数19に従って、変数maxSizeRは正規化される。
【0196】
[数19]
maxSizeR=maxSizeR/EyeDistance/EyeDistance
この実施例によれば、左右の黒目領域の大きさを比較するので、片目を閉じる動作を認識することができる。また、黒目領域の大きさを比較するだけなので、処理負担を軽減することができる。
【0197】
なお、この実施例では、一例として黒目領域の面積を比較するようにしたが、これに限定される必要はない。たとえば、黒目領域のうち、黒い部分が連続する長さが最も長い列同士を左目と右目とで比較するようにしてもよい。また、左右の目の白目領域の大きさを表わす数値(面積や縦方向における最大長さ)を比較するようにしてもよい。
【0198】
また、この実施例では、一例として黒目領域の面積を比較するようにしたが、当該領域(虹彩と瞳孔とを含む領域)が他の色(茶色や青色など)であっても同様である。つまり、この明細書では、黒目領域は黒以外の色である場合も含む。
【0199】
さらに、この実施例では、撮影画像のグレースケール画像を用いて、黒目領域の面積を計測し、ウインクを検出するようにしたが、カラー画像を用いるようにしてもよい。かかる場合には、たとえば、白目領域と黒目領域との境界、または目の領域と皮膚との境界を、色の違いによって検出し、左右の目における黒目領域と白目領域との境界線の長さの違いや左右の目の領域の大きさの違いで、ウインクを検出することも可能である。
【0200】
さらにまた、この実施例では、カメラカートリッジをゲーム装置に着脱可能に設けるようにしたが、ゲーム装置に固定的に設けるようにしてもよい。または、顔画像データをゲーム装置とは別個独立に設けられたカメラから受信するようにしてもよい。かかる場合には、たとえば、ゲーム装置とカメラとを近距離無線により接続したり、ケーブルで接続したりすればよい。
【図面の簡単な説明】
【0201】
【図1】図1はこの発明のゲーム装置の一実施例を示す図解図である。
【図2】図2は図1に示すゲーム装置の電気的な構成を示すブロック図である。
【図3】図3は図1に示すゲーム装置の使用例を示す図解図である。
【図4】図4は図3に示すゲーム装置の第1のLCDおよび第2のLCDに表示されるゲーム画面の一例を示す図解図である。
【図5】図5は図3に示すゲーム装置の第1のLCDに表示されるゲーム画面の他の例を示す図解図である。
【図6】図6は撮影された顔画像から検出される特徴点を示す図解図である。
【図7】図7は図2に示すゲーム装置のRAMのメモリマップの一例を示す図解図である。
【図8】図8は図7に示すデータ記憶領域の具体的な内容を示す図解図である。
【図9】図9は図2に示すCPUコアのウインク検知処理の一部を示すフロー図である。
【図10】図10は図2に示すCPUコアのウインク検知処理の他の一部であって、図9に後続するフロー図である。
【図11】図11は図2に示すCPUコアの特徴点データの更新処理を示すフロー図である。
【図12】図12は図2に示すCPUコアの面積計測処理の一部を示すフロー図である。
【図13】図13は図2に示すCPUコアの面積計測処理の他の一部であって、図12に後続するフロー図である。
【図14】図14は図2に示すCPUコアの面積計測処理のその他の一部であって、図13に後続するフロー図である。
【図15】図15は図2に示すCPUコアの面積計測装置のさらに他の一部であって、図14に後続するフロー図である。
【図16】図16は図2に示すCPUコアの面積計測処理の他の一部であって、図15に後続するフロー図である。
【図17】図17は図2に示すCPUコアの面積計測処理のその他の一部であって、図16に後続するフロー図である。
【図18】図18は図2に示すCPUコアの面積計測処理のさらに他の一部であって、図17に後続するフロー図である。
【図19】図19は図2に示すCPUコアの面積計測処理の他の一部であって、図18に後続するフロー図である。
【図20】図20は図2に示すCPUコアの面積計測処理のその他の一部であって、図19に後続するフロー図である。
【図21】図21は図2に示すCPUコアの面積計測処理のさらに他の一部であって、図20に後続するフロー図である。
【図22】図22は面積計測処理における色検出範囲および面積走査範囲を示す図解図である。
【符号の説明】
【0202】
10 …ゲーム装置
12,14 …LCD
16,16a,16b …ハウジング
22 …操作スイッチ
24 …タッチパネル
26 …スティック
28 …メモリカード
28a …ROM
28b,42 …RAM
34 …CPUコア
36a,36b …スピーカ
44,46 …GPU
48 …I/F回路
50 …LCDコントローラ
52,54 …VRAM
60 …カメラカートリッジ
【特許請求の範囲】
【請求項1】
撮像手段を備え、前記撮像手段により利用者の顔画像を取得する情報処理装置のコンピュータで実行される情報処理プログラムであって、
前記撮像手段により撮像された利用者の顔画像から、左右の目の領域の大きさを示す目領域値をそれぞれ算出する目領域値算出ステップと、
前記目領域値算出ステップによって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する片目判定ステップとを、前記コンピュータに実行させる、情報処理プログラム。
【請求項2】
前記片目判定ステップは、前記左右の目に対するそれぞれの目領域値の比率に応じて片目が閉じたかどうかを判定する、請求項1記載の情報処理プログラム。
【請求項3】
前記左右の目に対する検索領域をそれぞれ設定する検索領域設定ステップを、前記コンピュータにさらに実行させ、
前記目領域値算出ステップは、前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれから前記目領域値を算出する、請求項1または2記載の情報処理プログラム。
【請求項4】
前記目領域値算出ステップは、前記撮像手段により撮像された利用者の顔画像から、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する黒目領域値算出ステップを含む、請求項3記載の情報処理プログラム。
【請求項5】
前記撮像手段により撮像された利用者の顔画像から左右の目の特徴点を取得する特徴点取得ステップを、前記コンピュータにさらに実行させ、
前記検索領域設定ステップは、前記特徴点取得ステップによって取得された左右の目の特徴点を用いて前記左右の目に対する検索領域のそれぞれを設定する、請求項4記載の情報処理プログラム。
【請求項6】
前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれから黒目基準値を算出する黒目基準値算出ステップを、前記コンピュータにさらに実行させ、
前記黒目領域値算出ステップは、前記黒目基準値算出ステップによって算出された黒目基準値を閾値として前記黒目領域値を算出する、請求項5記載の情報処理プログラム。
【請求項7】
前記黒目基準値は、前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれにおける明度に関する値である、請求項6記載の情報処理プログラム。
【請求項8】
前記黒目基準値算出ステップは、前記検索領域設定ステップによって設定されたすべての検索領域内で最も暗い色と最も明るい色との少なくとも一方を用いて前記黒目基準値を設定する、請求項7記載の情報処理プログラム。
【請求項9】
前記撮像手段により撮像された利用者の顔画像をグレースケール化するグレースケール化ステップを、前記コンピュータにさらに実行させ、
前記目領域値算出ステップは、前記グレースケール化ステップによってグレースケール化された顔画像から目領域値を算出する、請求項1記載の情報処理プログラム。
【請求項10】
前記左右の目に対する検索領域をそれぞれ設定する検索領域設定ステップを、前記コンピュータにさらに実行させ、
前記目領域値算出ステップは、前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれから前記目領域値を算出する、請求項9記載の情報処理プログラム。
【請求項11】
前記目領域値算出ステップは、前記撮像手段により撮像された利用者の顔画像から、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する黒目領域値算出ステップを含む、請求項10記載の情報処理プログラム。
【請求項12】
前記グレースケール化ステップによってグレースケール化された顔画像から左右の目の特徴点を取得する特徴点取得ステップを、前記コンピュータにさらに実行させ、
前記検索領域設定ステップは、前記特徴点取得ステップによって取得された左右の目の特徴点を用いて前記左右の目に対する検索領域のそれぞれを設定する、請求項11記載の情報処理プログラム。
【請求項13】
前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれから黒目基準値を算出する黒目基準値算出ステップを、前記コンピュータにさらに実行させ、
前記黒目領域値算出ステップは、前記黒目基準値算出ステップによって算出された黒目基準値を閾値として前記黒目領域値を算出する、請求項12記載の情報処理プログラム。
【請求項14】
前記黒目基準値は、前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれにおける明度に関する値である、請求項13記載の情報処理プログラム。
【請求項15】
前記黒目基準値算出ステップは、前記検索領域設定ステップによって設定されたすべての検索領域内で最も暗い色と最も明るい色との少なくとも一方を用いて前記黒目基準値を設定する、請求項14記載の情報処理プログラム。
【請求項16】
前記検索領域設定ステップは、前記特徴点取得ステップによって取得された左右の目の特徴点を中心に、前記左右の目に対する検索領域をそれぞれ設定する、請求項5または12記載の情報処理プログラム。
【請求項17】
前記特徴点取得ステップによって取得された左右の目の特徴点間の距離を算出する距離算出ステップを、前記コンピュータにさらに実行させ、
前記検索領域設定ステップは、前記距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、左右の目に対する検索領域をそれぞれ設定する、請求項5または12記載の情報処理プログラム。
【請求項18】
前記距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、前記黒目領域値算出ステップによって算出された黒目領域値を正規化する正規化ステップを、前記コンピュータにさらに実行させ、
前記片目判定ステップは、前記正規化ステップによって正規化された左右の目それぞれに対する黒目領域値を比較することにより片目を閉じたかどうかを判定する、請求項17記載の情報処理プログラム。
【請求項19】
前記黒目領域値算出ステップは、
前記検索領域設定ステップによって設定された検索領域内の第1方向に走査して、最も暗い画素を第1方向基準値として設定する第1方向基準値設定ステップと、
前記第1方向基準値から続く前記黒目基準値より暗い画素の数を算出する画素数算出ステップとを含み、
前記画素数算出ステップによって算出された暗い画素数を前記黒目領域値とする、請求項7または14記載の情報処理プログラム。
【請求項20】
前記黒目領域値算出ステップは、前記第1方向に直交する第2方向に対して第1方向を順次ずらして、前記第1方向基準値設定ステップと前記画素数算出ステップとを繰り返し実行し、前記第1方向基準値から続く前記黒目基準値より暗い画素数を合算する画素数合算ステップを含み、
前記画素数合算ステップによって合算された暗い画素数を前記黒目領域値とする、請求項19記載の情報処理プログラム。
【請求項21】
前記黒目領域値算出ステップは、前記画素数算出ステップによって、前記第1方向基準値から続く前記黒目基準値より暗い画素の数が所定数以上に達したときには、無効値を前記黒目領域値として設定する、請求項19または20記載の情報処理プログラム。
【請求項22】
前記特徴点取得ステップ、前記検索領域算出ステップ、前記黒目基準値算出ステップ、前記黒目領域値算出ステップは、前記コンピュータによって少なくとも2回繰り返し実行され、連続して前記黒目領域値に無効値が設定されていないときにのみ、前記片目判定ステップを前記コンピュータに実行させる、請求項21記載の情報処理プログラム。
【請求項23】
前記画素数算出ステップは、前記黒目基準値より明るい画素が所定数以上続いた場合には、前記1方向基準値から当該明るい画素までの数を前記黒目領域値として設定する、請求項19または20記載の情報処理プログラム。
【請求項24】
前記片目判定ステップによって片目を閉じていることが判定された場合に、所定の処理を実行する処理ステップを、前記コンピュータにさらに実行させる、請求項1記載の情報処理プログラム。
【請求項25】
撮像手段を備え、前記撮像手段により利用者の顔画像を取得する情報処理装置であって、
前記撮像手段により撮像された利用者の顔画像から、左右の目の領域の大きさを示す目領域値をそれぞれ算出する目領域値算出手段と、
前記目領域値算出手段によって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する片目判定手段とを備える、情報処理装置。
【請求項1】
撮像手段を備え、前記撮像手段により利用者の顔画像を取得する情報処理装置のコンピュータで実行される情報処理プログラムであって、
前記撮像手段により撮像された利用者の顔画像から、左右の目の領域の大きさを示す目領域値をそれぞれ算出する目領域値算出ステップと、
前記目領域値算出ステップによって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する片目判定ステップとを、前記コンピュータに実行させる、情報処理プログラム。
【請求項2】
前記片目判定ステップは、前記左右の目に対するそれぞれの目領域値の比率に応じて片目が閉じたかどうかを判定する、請求項1記載の情報処理プログラム。
【請求項3】
前記左右の目に対する検索領域をそれぞれ設定する検索領域設定ステップを、前記コンピュータにさらに実行させ、
前記目領域値算出ステップは、前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれから前記目領域値を算出する、請求項1または2記載の情報処理プログラム。
【請求項4】
前記目領域値算出ステップは、前記撮像手段により撮像された利用者の顔画像から、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する黒目領域値算出ステップを含む、請求項3記載の情報処理プログラム。
【請求項5】
前記撮像手段により撮像された利用者の顔画像から左右の目の特徴点を取得する特徴点取得ステップを、前記コンピュータにさらに実行させ、
前記検索領域設定ステップは、前記特徴点取得ステップによって取得された左右の目の特徴点を用いて前記左右の目に対する検索領域のそれぞれを設定する、請求項4記載の情報処理プログラム。
【請求項6】
前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれから黒目基準値を算出する黒目基準値算出ステップを、前記コンピュータにさらに実行させ、
前記黒目領域値算出ステップは、前記黒目基準値算出ステップによって算出された黒目基準値を閾値として前記黒目領域値を算出する、請求項5記載の情報処理プログラム。
【請求項7】
前記黒目基準値は、前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれにおける明度に関する値である、請求項6記載の情報処理プログラム。
【請求項8】
前記黒目基準値算出ステップは、前記検索領域設定ステップによって設定されたすべての検索領域内で最も暗い色と最も明るい色との少なくとも一方を用いて前記黒目基準値を設定する、請求項7記載の情報処理プログラム。
【請求項9】
前記撮像手段により撮像された利用者の顔画像をグレースケール化するグレースケール化ステップを、前記コンピュータにさらに実行させ、
前記目領域値算出ステップは、前記グレースケール化ステップによってグレースケール化された顔画像から目領域値を算出する、請求項1記載の情報処理プログラム。
【請求項10】
前記左右の目に対する検索領域をそれぞれ設定する検索領域設定ステップを、前記コンピュータにさらに実行させ、
前記目領域値算出ステップは、前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれから前記目領域値を算出する、請求項9記載の情報処理プログラム。
【請求項11】
前記目領域値算出ステップは、前記撮像手段により撮像された利用者の顔画像から、左右の目の黒目領域の大きさを示す黒目領域値をそれぞれ算出する黒目領域値算出ステップを含む、請求項10記載の情報処理プログラム。
【請求項12】
前記グレースケール化ステップによってグレースケール化された顔画像から左右の目の特徴点を取得する特徴点取得ステップを、前記コンピュータにさらに実行させ、
前記検索領域設定ステップは、前記特徴点取得ステップによって取得された左右の目の特徴点を用いて前記左右の目に対する検索領域のそれぞれを設定する、請求項11記載の情報処理プログラム。
【請求項13】
前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれから黒目基準値を算出する黒目基準値算出ステップを、前記コンピュータにさらに実行させ、
前記黒目領域値算出ステップは、前記黒目基準値算出ステップによって算出された黒目基準値を閾値として前記黒目領域値を算出する、請求項12記載の情報処理プログラム。
【請求項14】
前記黒目基準値は、前記検索領域設定ステップによって設定された前記左右の目に対する検索領域のそれぞれにおける明度に関する値である、請求項13記載の情報処理プログラム。
【請求項15】
前記黒目基準値算出ステップは、前記検索領域設定ステップによって設定されたすべての検索領域内で最も暗い色と最も明るい色との少なくとも一方を用いて前記黒目基準値を設定する、請求項14記載の情報処理プログラム。
【請求項16】
前記検索領域設定ステップは、前記特徴点取得ステップによって取得された左右の目の特徴点を中心に、前記左右の目に対する検索領域をそれぞれ設定する、請求項5または12記載の情報処理プログラム。
【請求項17】
前記特徴点取得ステップによって取得された左右の目の特徴点間の距離を算出する距離算出ステップを、前記コンピュータにさらに実行させ、
前記検索領域設定ステップは、前記距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、左右の目に対する検索領域をそれぞれ設定する、請求項5または12記載の情報処理プログラム。
【請求項18】
前記距離算出ステップによって算出された左右の目の特徴点間の距離を用いて、前記黒目領域値算出ステップによって算出された黒目領域値を正規化する正規化ステップを、前記コンピュータにさらに実行させ、
前記片目判定ステップは、前記正規化ステップによって正規化された左右の目それぞれに対する黒目領域値を比較することにより片目を閉じたかどうかを判定する、請求項17記載の情報処理プログラム。
【請求項19】
前記黒目領域値算出ステップは、
前記検索領域設定ステップによって設定された検索領域内の第1方向に走査して、最も暗い画素を第1方向基準値として設定する第1方向基準値設定ステップと、
前記第1方向基準値から続く前記黒目基準値より暗い画素の数を算出する画素数算出ステップとを含み、
前記画素数算出ステップによって算出された暗い画素数を前記黒目領域値とする、請求項7または14記載の情報処理プログラム。
【請求項20】
前記黒目領域値算出ステップは、前記第1方向に直交する第2方向に対して第1方向を順次ずらして、前記第1方向基準値設定ステップと前記画素数算出ステップとを繰り返し実行し、前記第1方向基準値から続く前記黒目基準値より暗い画素数を合算する画素数合算ステップを含み、
前記画素数合算ステップによって合算された暗い画素数を前記黒目領域値とする、請求項19記載の情報処理プログラム。
【請求項21】
前記黒目領域値算出ステップは、前記画素数算出ステップによって、前記第1方向基準値から続く前記黒目基準値より暗い画素の数が所定数以上に達したときには、無効値を前記黒目領域値として設定する、請求項19または20記載の情報処理プログラム。
【請求項22】
前記特徴点取得ステップ、前記検索領域算出ステップ、前記黒目基準値算出ステップ、前記黒目領域値算出ステップは、前記コンピュータによって少なくとも2回繰り返し実行され、連続して前記黒目領域値に無効値が設定されていないときにのみ、前記片目判定ステップを前記コンピュータに実行させる、請求項21記載の情報処理プログラム。
【請求項23】
前記画素数算出ステップは、前記黒目基準値より明るい画素が所定数以上続いた場合には、前記1方向基準値から当該明るい画素までの数を前記黒目領域値として設定する、請求項19または20記載の情報処理プログラム。
【請求項24】
前記片目判定ステップによって片目を閉じていることが判定された場合に、所定の処理を実行する処理ステップを、前記コンピュータにさらに実行させる、請求項1記載の情報処理プログラム。
【請求項25】
撮像手段を備え、前記撮像手段により利用者の顔画像を取得する情報処理装置であって、
前記撮像手段により撮像された利用者の顔画像から、左右の目の領域の大きさを示す目領域値をそれぞれ算出する目領域値算出手段と、
前記目領域値算出手段によって算出された左右の目に対するそれぞれの目領域値を比較することにより片目を閉じたかどうかを判定する片目判定手段とを備える、情報処理装置。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【公開番号】特開2009−3730(P2009−3730A)
【公開日】平成21年1月8日(2009.1.8)
【国際特許分類】
【出願番号】特願2007−164483(P2007−164483)
【出願日】平成19年6月22日(2007.6.22)
【出願人】(000233778)任天堂株式会社 (1,115)
【Fターム(参考)】
【公開日】平成21年1月8日(2009.1.8)
【国際特許分類】
【出願日】平成19年6月22日(2007.6.22)
【出願人】(000233778)任天堂株式会社 (1,115)
【Fターム(参考)】
[ Back to top ]