(ゲーム装置の構成)
以下、本発明の一実施形態に係るゲーム装置について説明する。ゲーム装置10は携帯型のゲーム装置である。図1および図2A〜Dに示されるように、ゲーム装置10は、下側ハウジング11および上側ハウジング21を有する。下側ハウジング11と上側ハウジング21とは、開閉可能(折り畳み可能)に接続されている。
(下側ハウジングの説明)
図1および図2A〜Dに示すように、下側ハウジング11には、下側LCD(Liquid Crystal Display:液晶表示装置)12、タッチパネル13、各操作ボタン14A〜14L、アナログスティック15、LED16A〜16B、挿入口17、および、マイクロフォン用孔18が設けられる。
タッチパネル13は、下側LCD12の画面上に装着されている。下側ハウジング11の上側面には、タッチペン28を収納するための挿入口17(図1および図2Dに示す点線)が設けられている。
下側ハウジング11の内側面(主面)には、十字ボタン14A(方向入力ボタン14A)、ボタン14B、ボタン14C、ボタン14D、ボタン14E、電源ボタン14F、セレクトボタン14J、HOMEボタン14K、およびスタートボタン14Lが、設けられる。
アナログスティック15は、方向を指示するデバイスである。
下側ハウジング11の内側面には、マイクロフォン用孔18が設けられる。マイクロフォン用孔18の下部には後述する音声入力装置としてのマイク42(図3参照)が設けられる。
図2BおよびDに示されるように、下側ハウジング11の上側面には、Lボタン14GおよびRボタン14Hが設けられている。また、図2Aに示されるように、下側ハウジング11の左側面には、ゲーム装置10が備えるスピーカ43(図3参照)の音量を調整するための音量ボタン14Iが設けられる。
図2Aに示されるように、下側ハウジング11の左側面には開閉可能なカバー部11Cが設けられる。このカバー部11Cの内側には、ゲーム装置10とデータ保存用外部メモリ45とを電気的に接続するためのコネクタが設けられる。
図2Dに示されるように、下側ハウジング11の上側面には、外部メモリ44を挿入するための挿入口11Dが設けられる。
図1および図2Cに示されるように、下側ハウジング11の下側面にはゲーム装置10の電源のON/OFF状況をユーザに通知する第1LED16A、下側ハウジング11の右側面にはゲーム装置10の無線通信の確立状況をユーザに通知する第2LED16Bが設けられる。ゲーム装置10は他の機器との間で無線通信を行うことが可能であり、下側ハウジング11の右側面には、この無線通信の機能を有効/無効にする無線スイッチ19が設けられる(図2C参照)。
(上側ハウジングの説明)
図1および図2に示すように、上側ハウジング21には、上側LCD(Liquid Crystal Display:液晶表示装置)22、外側撮像部23(外側撮像部(左)23aおよび外側撮像部(右)23b)、内側撮像部24、3D調整スイッチ25、および、3Dインジケータ26が設けられる。
上側LCD22は、立体視可能な画像を表示することが可能な表示装置である。具体的には、パララックスバリア方式の裸眼立体視可能な表示装置である。上側LCD22は、視差バリアを用いてユーザの左目に左目用画像をユーザの右目に右目用画像を視認させることにより、ユーザにとって立体感のある画像(立体視画像)を表示することができる。また、上側LCD22は、上記視差バリアを無効にすることが可能であり、視差バリアを無効にした場合は、画像を平面的に表示することができる。このように、上側LCD22は、立体視画像を表示する立体表示モードと、画像を平面的に表示する(平面視画像を表示する)平面表示モードとを切り替えることが可能な表示装置である。この表示モードの切り替えは、例えば、後述する3D調整スイッチ25によって行われる。
外側撮像部23は、上側ハウジング21の外側面21Dに設けられた2つの撮像部(23aおよび23b)の総称である。外側撮像部(左)23aと外側撮像部(右)23bとは、ゲーム装置10が実行するプログラムによって、ステレオカメラとして使用することが可能である。
内側撮像部24は、上側ハウジング21の内側面21Bに設けられ、当該内側面の内向きの法線方向を撮像方向とする撮像部である。
3D調整スイッチ25は、スライドスイッチであり、上述のように上側LCD22の表示モードを切り替えるために用いられるスイッチである。また、3D調整スイッチ25は、上側LCD22に表示された立体視可能な画像(立体画像)の立体感を調整するために用いられる。3D調整スイッチ25のスライダ25aは、所定方向(上下方向)の任意の位置にスライド可能であり、当該スライダ25aの位置に応じて上側LCD22の表示モードが設定される。また、スライダ25aの位置に応じて、立体画像の見え方が調整される。
3Dインジケータ26は、上側LCD22が立体表示モードか否かを示すLEDである。
また、上側ハウジング21の内側面には、スピーカ孔21Eが設けられる。後述するスピーカ43からの音声がこのスピーカ孔21Eから出力される。
(ゲーム装置10の内部構成)
次に、図3を参照して、ゲーム装置10の内部の電気的構成について説明する。図3に示すように、ゲーム装置10は、上述した各部に加えて、情報処理部31、メインメモリ32、外部メモリインターフェイス(外部メモリI/F)33、データ保存用外部メモリI/F34、データ保存用内部メモリ35、無線通信モジュール36、ローカル通信モジュール37、リアルタイムクロック(RTC)38、加速度センサ39、電源回路40、およびインターフェイス回路(I/F回路)41等の電子部品を備えている。
情報処理部31は、所定のプログラムを実行するためのCPU(Central Processing Unit)311、画像処理を行うGPU(Graphics Processing Unit)312、VRAM(Video RAM)313を含む。CPU311は、ゲーム装置10内のメモリ(例えば外部メモリI/F33に接続された外部メモリ44やデータ保存用内部メモリ35)に記憶されているプログラムを実行することによって、当該プログラムに応じた処理を実行する。なお、CPU311によって実行されるプログラムは、他の機器との通信によって他の機器から取得されてもよい。GPU312は、CPU311からの命令に応じて画像を生成し、VRAM313に描画する。VRAM313に描画された画像は、上側LCD22及び/又は下側LCD12に出力され、上側LCD22及び/又は下側LCD12に当該画像が表示される。
外部メモリI/F33は、外部メモリ44を着脱自在に接続するためのインターフェイスである。また、データ保存用外部メモリI/F34は、データ保存用外部メモリ45を着脱自在に接続するためのインターフェイスである。
メインメモリ32は、情報処理部31(のCPU311)のワーク領域やバッファ領域として用いられる揮発性の記憶装置である。
外部メモリ44は、情報処理部31によって実行されるプログラム等を記憶するための不揮発性の記憶装置である。外部メモリ44は、例えば読み取り専用の半導体メモリで構成される。
データ保存用外部メモリ45は、不揮発性の読み書き可能なメモリ(例えばNAND型フラッシュメモリ)で構成され、任意のデータを保存するために用いられる。
データ保存用内部メモリ35は、読み書き可能な不揮発性メモリ(例えばNAND型フラッシュメモリ)で構成され、所定のデータを格納するために用いられる。例えば、データ保存用内部メモリ35には、無線通信モジュール36を介した無線通信によってダウンロードされたデータやプログラムが格納される。
無線通信モジュール36は、例えばIEEE802.11b/gの規格に準拠した方式により、無線LANに接続する機能を有する。また、ローカル通信モジュール37は、所定の通信方式(例えば独自プロトコルによる通信や、赤外線通信)により同種のゲーム装置との間で無線通信を行う機能を有する。
加速度センサ39は、3軸(xyz軸)方向に沿った直線方向の加速度(直線加速度)の大きさを検出する。情報処理部31は、加速度センサ39が検出した加速度を示すデータ(加速度データ)を受信して、ゲーム装置10の姿勢や動きを検出することができる。
RTC38は、時間をカウントして情報処理部31に出力する。情報処理部31は、RTC38によって計時された時間に基づき現在時刻(日付)を計算する。電源回路40は、ゲーム装置10が有する電源(充電式電池)からの電力を制御し、ゲーム装置10の各部品に電力を供給する。
I/F回路41には、タッチパネル13、マイク42およびスピーカ43が接続される。I/F回路41は、マイク42およびスピーカ43(アンプ)の制御を行う音声制御回路と、タッチパネルの制御を行うタッチパネル制御回路とを含む。音声制御回路は、音声信号に対するA/D変換およびD/A変換を行ったり、音声信号を所定の形式の音声データに変換したりする。タッチパネル制御回路は、タッチパネル13からの信号に基づいて所定の形式のタッチ位置データを生成して情報処理部31に出力する。情報処理部31は、タッチ位置データを取得することにより、タッチパネル13に対して入力が行われた位置を知ることができる。
操作ボタン14は、上記各操作ボタン14A〜14Lからなり、操作ボタン14から情報処理部31へは、各操作ボタン14A〜14Iに対する入力状況(押下されたか否か)を示す操作データが出力される。
下側LCD12および上側LCD22は情報処理部31に接続される。具体的には、情報処理部31は、上側LCD22のLCDコントローラ(図示せず)と接続され、当該LCDコントローラに対して視差バリアのON/OFFを制御する。上側LCD22の視差バリアがONになっている場合、情報処理部31のVRAM313に格納された右目用画像と左目用画像とが、上側LCD22に出力される。より具体的には、LCDコントローラは、右目用画像について縦方向に1ライン分の画素データを読み出す処理と、左目用画像について縦方向に1ライン分の画素データを読み出す処理とを交互に繰り返すことによって、VRAM313から右目用画像と左目用画像とを読み出す。これにより、右目用画像および左目用画像が、画素を縦に1ライン毎に並んだ短冊状画像に分割され、分割された右目用画像の短冊状画像と左目用画像の短冊状画像とが交互に配置された画像が、上側LCD22の画面に表示される。そして、上側LCD22の視差バリアを介して当該画像がユーザに視認されることによって、ユーザの右目に右目用画像が、ユーザの左目に左目用画像が視認される。以上により、上側LCD22の画面には立体視可能な画像が表示される。
外側撮像部23および内側撮像部24は、情報処理部31の指示に従って画像を撮像し、撮像した画像データを情報処理部31に出力する。
3D調整スイッチ25は、スライダ25aの位置に応じた電気信号を情報処理部31に送信する。
情報処理部31は、3Dインジケータ26の点灯を制御する。例えば、情報処理部31は、上側LCD22が立体表示モードである場合、3Dインジケータ26を点灯させる。
(画像処理の概要)
次に、図4〜図72を参照して、ゲーム装置10において実行される画像処理の概要を説明する。ゲーム装置10において実行される画像処理には、画像認識処理と画像生成処理が含まれている。
画像認識処理は、カメラ(外側撮像部(左)23aまたは外側撮像部(右)23b)によって撮像された画像(実写画像)に含まれているマーカーの位置を検出するための処理である。画像生成処理は、画像認識処理の結果を利用して、上側LCD22に表示すべき画像を生成するための処理である。
ゲーム装置10のCPU311は、画像認識処理の結果を利用して、現実世界におけるマーカーの周辺(例えば、マーカーの上)に仮想オブジェクトがあたかも実在しているかのような画像を上側LCD22に表示することができる。例えば、図4の例では、ゲーム装置10の上側LCD22に、机に置かれたマーカー50上に犬を模した仮想オブジェクト60があたかも実在しているかのような画像が表示されている。このような画像は、カメラによって撮像された実写画像に、仮想オブジェクト60の画像(仮想空間画像)を合成することによって得られる。仮想空間画像は、仮想空間に配置された仮想カメラに基づいて描画され、仮想空間における仮想カメラと仮想オブジェクトの位置関係(相対的な位置および姿勢)は、現実空間におけるカメラ(外側撮像部(左)23aまたは外側撮像部(右)23b)とマーカー50との位置関係に一致するようにリアルタイムに制御される。これにより、仮想オブジェクト60があたかも現実空間に実在しているかのような画像が得られる。
図5に示すように、マーカー50は四角形であって、外周に沿った白領域と、白領域に囲まれた黒領域を有しており、黒領域の内部には所定の内部図形(ここでは一例として矢印)が描かれている。なお、本実施形態では図5のようなマーカー50を用いているが、これは単なる一例に過ぎず、他の形状、模様、色のマーカーを用いても良い。例えば、外周に沿った黒領域の内部に、白領域が設けられていてもよい。また、白領域や黒領域の代わりに、別の色の領域を設けてもよい。ただし、後述する輪郭検出処理のためには、コントラストが高い色の組み合わせを用いることが好ましい。
図6は、カメラ(外側撮像部(左)23aまたは外側撮像部(右)23b)によって撮像された画像(実写画像)の一例である。実写画像は、例えば、512画素(水平方向)×384画素(垂直方向)で構成される。
図6に示すような実写画像からマーカー50の位置を検出するために、本実施形態では、以下のような処理が行われる。
(1)輪郭検出処理
(2)頂点検出処理
(3)粗判別処理
(4)図柄判別処理
(5)マーカー位置補正処理
(輪郭検出処理)
まず、輪郭検出処理について説明する。輪郭検出処理は、実写画像において、マーカー50に描かれている図柄の輪郭(図5に示した白領域と黒領域の境界線)を検出するための処理である。
本実施形態では、実写画像において、まず(16,16)の座標で示される画素を注目画素として、当該注目画素の輝度値と、当該注目画素から数えて左に8個目の画素(8,16)の輝度値とに基づいて、当該2つの画素の間のどこかにエッジ(左側が白領域で右側が黒領域となるようなエッジ)が存在するかどうかを判定する(判定方法の詳細は後述する)。そして、エッジが存在しないと判定された場合には、図7に示すように、現在の注目画素(16,16)から数えて右に8個目の画素(24,16)を新たな注目画素として、当該注目画素の輝度値と、当該注目画素から数えて左に8個目の画素(すなわち、直前の注目画素(16,16))の輝度値とに基づいて、当該2つの画素の間のどこかにエッジが存在するかどうかを判定する。以降、注目画素を順次更新しつつ同様の処理を行う。なお、Y座標値が16であるラインについての処理が終わると、そこから数えて下に16本目のライン(すなわちY座標値が32であるライン)について、同様の処理を行う。なお、このような注目画素の選び方は単なる一例に過ぎず、これに限定されるものではない。
以下の説明では、注目画素を画素P(n)と表し、注目画素から見て左にk個目の画素を画素P(n−k)と表し、注目画素から見て右にk個目の画素を画素P(n+k)と表す。また、注目画素の輝度値をL(n)と表し、注目画素から見て左にk個目の画素の輝度値をL(n−k)と表し、注目画素から見て右にk個目の画素の輝度値をL(n+k)と表す。
図8に示すように、注目画素(すなわち画素P(n))と、注目画素から見て左に8個目の画素(すなわち画素P(n−8))との間のどこかにエッジが存在するかどうかは、L(n−8)とL(n)とに基づいて判定される。具体的には、L(n−8)−L(n)が所定値以上かどうかによって判定される。そして、L(n−8)−L(n)が所定値以上である場合には、それらの画素の間のどこかにエッジが存在すると判定される。なお、本実施形態では、各画素の輝度値は0〜255の値で表されるものとし、上記所定値は60であるとする。なお、これらの数字は単なる一例に過ぎず、これらに限定されるものではない。
画素P(n)と画素P(n−8)の間のどこかにエッジが存在すると判定された場合には、続いて、これらの2つの画素またはこれらの近傍(周辺)の画素の輝度値に基づいて、エッジの位置を検出するために用いられるエッジ判定閾値が計算される。以下、図9〜図12を参照して、エッジ判定閾値の計算方法を説明する。
まず、図9〜図12に示すように、画素P(n−8)またはその近傍の画素の輝度値に基づいて、白領域輝度値Lwが決定される。以下、白領域輝度値Lwの決定方法の一例を説明する。
まず、画素P(n−9)の輝度値が、画素P(n−8)の輝度値よりも小さいかどうかを判定し、小さい場合には、画素P(n−8)の輝度値が白領域輝度値Lwとなる。例えば、図9,図11および図12の例では、画素P(n−9)の輝度値は210であり、画素P(n−8)の輝度値は220であるので、画素P(n−8)の輝度値である220が白領域輝度値Lwとなる。
画素P(n−9)の輝度値が、画素P(n−8)の輝度値以上である場合には、続いて、画素P(n−10)の輝度値が、画素P(n−9)の輝度値よりも小さいかどうかを判定し、小さい場合には、画素P(n−9)の輝度値が白領域輝度値Lwとなる。
画素P(n−9)の輝度値が、画素P(n−8)の輝度値以上であり、かつ、画素P(n−10)の輝度値が、画素P(n−9)の輝度値以上である場合には、続いて、画素P(n−11)の輝度値が、画素P(n−10)の輝度値よりも小さいかどうかを判定し、小さい場合には、画素P(n−9)の輝度値が白領域輝度値Lwとなる。例えば、図10の例では、画素P(n−11)の輝度値は210であり、画素P(n−10)の輝度値は220であるので、画素P(n−10)の輝度値である220が白領域輝度値Lwとなる。
上記のような処理は、画素P(n−8)から左方向に向けて、画素の輝度値を順次参照して輝度値の極大値(最初に現れる極大値)を見つける処理だと言い換えることができる。さらには、画素P(n−8)とその周辺の画素の輝度値の中から極大値を検出する処理だと言い換えることもできる。このような処理を行うことによって、図10に示すように、画素P(n−8)が、マーカー50の白領域と黒領域の境界(実写画像においては灰色で表示される)に位置しているような場合でも、マーカー50の白領域の輝度値を、白領域輝度値Lwとして正しく設定することができる。
なお、本実施形態では、上記のようにして白領域輝度値Lwを決定しているが、これは単なる一例に過ぎず、白領域輝度値Lwの決定方法はこれに限定されない。例えば、画素P(n−8)の輝度値と、その周辺の画素のいずれかの輝度値とを比較し、当該周辺の画素の輝度値の方が大きい場合に、当該周辺の画素の輝度値に基づいて白領域輝度値Lwを計算するようにしてもよい。また、例えば、画素P(n−8)から左方向に向けて、画素の輝度値を順次参照して輝度値の極大値(最初に現れる極大値)を見つける処理の途中で、参照画素の輝度値が所定値(例えば250)を超えた場合に、輝度値の極大値を見つける処理を中断して、当該参照画素の輝度値に基づいて白領域輝度値Lwを計算するようにしてもよい。
次に、図9〜図12に示すように、画素P(n)またはその近傍の画素の輝度値に基づいて、黒領域輝度値Lbが決定される。以下、黒領域輝度値Lbの決定方法の一例を説明する。
まず、画素P(n+2)の輝度値が、画素P(n)の輝度値以下かどうかを判定し、画素P(n)の輝度値以下である場合には、画素P(n)の輝度値が黒領域輝度値Lbとなる。例えば、図9および図10の例では、画素P(n+2)の輝度値は100であり、画素P(n)の輝度値は100であるので、画素P(n)の輝度値である100が黒領域輝度値Lbとなる。
画素P(n+2)の輝度値が、画素P(n)の輝度値よりも大きい場合には、続いて、白領域輝度値Lwから画素P(n+2)の輝度値を引いた結果の値(すなわち、Lw−L(n+2))が上記所定値(すなわち、60)以上であるかどうかを判定する。そして、当該結果の値が60以上である場合には、画素P(n+2)の輝度値が黒領域輝度値Lbとなり、当該結果の値が60未満である場合には、画素P(n)の輝度値が黒領域輝度値Lbとなる。
例えば、図11の例では、画素P(n)の輝度値は20であり、画素P(n+2)の輝度値は100であり、白領域輝度値Lwは220である。そして、Lw−L(n+2)=120であるので、画素P(n+2)の輝度値である100が黒領域輝度値Lbとなる。ところで、エッジ強調処理(輪郭強調処理、シャープネス処理)が施された実写画像では、図11に示すように、白領域に隣接する黒領域画素の輝度値が、本来の黒領域の輝度値よりも著しく小さい値になっていることがある。そこで、本実施形態では、このような場合でも適切な黒領域輝度値Lbを決定できるように、上記のような条件を満たす場合には、画素P(n+2)の輝度値を黒領域輝度値Lbとしている。
一方、図12の例では、画素P(n)の輝度値は100であり、画素P(n+2)の輝度値は210であり、白領域輝度値Lwは220である。そして、Lw−L(n+2)=10であるので、画素P(n)の輝度値である100が黒領域輝度値Lbとなる。
なお、本実施形態では、上記のようにして黒領域輝度値Lbを決定しているが、これは単なる一例に過ぎず、黒領域輝度値Lbの決定方法はこれに限定されない。
上記のようにして白領域輝度値Lwおよび黒領域輝度値Lbが決定されると、続いて、これらの白領域輝度値Lwおよび黒領域輝度値Lbに基づいて、エッジ判定閾値が計算される。本実施形態では、白領域輝度値Lwと黒領域輝度値Lbの平均値を、エッジ判定閾値として決定する。例えば、図9〜図12の例では、いずれも、エッジ判定閾値は160となる。ただし、これは単なる一例に過ぎず、エッジ判定閾値の計算方法はこれに限定されない。
上記のようにしてエッジ判定閾値が決定されると、当該エッジ判定閾値を用いて、画素P(n)と画素P(n−8)の間のどこにエッジが存在するかを検出する。具体的には、エッジ判定閾値よりも大きい輝度値を有する画素は白領域だと判定され、エッジ判定閾値よりも小さい輝度値を有する画素は黒領域だと判定される。そして、白領域と黒領域の境界をエッジだと判定する。なお、本実施形態では、白領域に隣接する黒領域画素を、エッジ上に位置する(またはエッジに隣接する)「エッジ画素」として検出する。例えば、図9の例では、画素P(n−5)がエッジ画素であると判定され、図10の例では、画素P(n−7)がエッジ画素であると判定され、図11の例では、画素P(n)がエッジ画素であると判定され、図12の例では、画素P(n−6)がエッジ画素であると判定される。なお、他の実施形態では、黒領域に隣接する白領域画素を、エッジ上に位置する「エッジ画素」として検出してもよい。
実写画像の各画素には、当該画素がエッジ画素であるか否かを示すフラグ(エッジフラグ)が対応付けられており、エッジ画素であると判定された画素については、エッジフラグがオンになる。
上記のようにして検出されたエッジ画素のことを、以下の説明では「起点エッジ画素」と称する。起点エッジ画素は、マーカー50に描かれている図柄の輪郭(図5に示した白領域と黒領域の境界線)の一部であると推測される。もし起点エッジ画素がマーカー50に描かれている図柄の輪郭の一部であった場合には、この起点エッジ画素を起点として隣接するエッジ画素を順次辿っていくことによって、マーカー50に描かれている図柄(図5に示した白領域と黒領域の境界線)の輪郭を検出することができる。
以下、起点エッジ画素を起点として隣接するエッジ画素を順次辿っていく処理(エッジ辿り処理)について説明する。
まず、図13に示すように、起点エッジ画素を基準として、左下隣接画素→下隣接画素→右下隣接画素→右隣接画素→右上隣接画素→上隣接画素→左上隣接画素という順番で(すなわち、起点エッジ画素を中心として左隣接画素から反時計回りに)黒領域画素を探索し、最初に検出された黒領域画素を、起点エッジ画素に続く新たなエッジ画素として検出する。各隣接画素が黒領域画素であるか否かの判定は、起点エッジ画素を検出したときに利用されたエッジ判定閾値に基づいて行われ、より具体的には、隣接画素の輝度値がエッジ判定閾値よりも小さい場合に、当該隣接画素は黒領域画素だと判定される。
例えば、図14の例では、左下隣接画素が新たなエッジ画素として検出され、図15の例では、右隣接画素が新たなエッジ画素として検出される。
エッジ辿り処理において起点エッジ画素を起点として順次検出されるエッジ画素は、一連のエッジ画素として、それらの座標値がメインメモリ32に順次記憶される。なお、以下の説明では、エッジ辿り処理において最後に検出されたエッジ画素のことを「先頭エッジ画素」と称し、先頭エッジ画素の直前に検出されたエッジ画素のことを「2番目エッジ画素」と称す。
先頭エッジ画素に続く新たなエッジ画素は、先頭エッジ画素を中心として、当該先頭エッジ画素から見て2番目エッジ画素の方向から反時計回りに135度ずれた方向にある隣接画素を始点として(他の実施形態では、反時計回りに45度ずれた方向にある隣接画素、または、反時計回りに90度ずれた方向にある隣接画素を始点としてもよい)、反時計回りに黒領域画素を探索することによって行われる。そして、当該探索において最初に検出された黒領域画素が、新たなエッジ画素(すなわち、新たな先頭エッジ画素)として検出される。
例えば、図16に示すように、2番目エッジ画素が先頭エッジ画素の右上隣接画素である場合には、先頭エッジ画素を中心として左隣接画素から反時計回りに黒領域画素が探索される。よって、図17の例では、先頭エッジ画素の下隣接画素が、新たなエッジ画素として検出される。
また例えば、図18に示すように、2番目エッジ画素が先頭エッジ画素の左隣接画素である場合には、先頭エッジ画素を中心として右下隣接画素から反時計回りに黒領域画素が探索される。よって、図19の例では、先頭エッジ画素の右隣接画素が、新たなエッジ画素として検出される。
上記のような処理が繰り返されることによって、新たなエッジ画素が順次検出され、最終的に、先頭エッジ画素が起点エッジ画素に到達することによって、黒領域の輪郭の検出が完了する(すなわち、黒領域の輪郭を示す一連のエッジ画素群に関するデータがメインメモリ32に格納される)ことになる。
なお、本実施形態では、エッジ辿り処理において新たなエッジ画素が検出される度に、当該新たなエッジ画素が、すでに検出されている一連のエッジ画素群に含まれているか否かを前述のエッジフラグに基づいて判断する。そして、新たなエッジ画素が、すでに検出されている一連のエッジ画素群に含まれていると判定されることが3回連続した場合には、エッジ辿り処理を中断するようにしている。
例えば、図20に示すように、新たなエッジ画素が、すでに検出されている一連のエッジ画素群に含まれていると判定されることが2回だけ連続する場合には、エッジ辿り処理が中断されることはない。
しかしながら、図21に示すように、新たなエッジ画素が、すでに検出されている一連のエッジ画素群に含まれていると判定されることが3回連続した場合には、エッジ辿り処理が中断される。これは、図21に示すような黒領域は、マーカー50に描かれている図柄の輪郭ではない(すなわち、マーカー50以外の物体の輪郭である)可能性が高いからである。また、もし仮にマーカー50に描かれている図柄の輪郭であったとしても、後述するパターンマッチング処理等が正常に行えない可能性が高いからである。これにより、無駄な処理を回避することができる。なお、3回という回数は単なる一例に過ぎず、他の回数であってもよい。
なお、上記の説明では、起点エッジ画素を始点として、黒領域の輪郭を反時計回りに辿っていく例を説明したが、他の実施形態では、起点エッジ画素を始点として、黒領域の輪郭を時計回りに辿っていくようにしても構わない。
上記のように、輪郭抽出処理では、白領域輝度値Lwと黒領域輝度値Lbが決定され、これらの白領域輝度値Lwおよび黒領域輝度値Lbに基づいて、エッジ判定閾値が計算される。よって、実写画像の明るさが全体的または部分的に変化して、それに応じて実写画像におけるマーカー50の白領域および黒領域の輝度が変化したとしても、適切なエッジ判定閾値を用いて輪郭抽出処理を行うことができる。これにより、マーカー50の認識精度が向上する。
なお、上記輪郭抽出処理では、画素の輝度値に基づいて輪郭を抽出しているが、輝度値に限らず、他の任意の画素値(典型的には色値)に基づいて輪郭を検出してもよい。
また、上記輪郭抽出処理では、まず、水平方向に離れた2つの画素(画素P(n)と画素P(n−8))の間にエッジが存在するかどうかを判定しているが、2つの画素の選び方はこれに限らない。例えば、垂直方向に離れた2つの画素の間にエッジが存在するかどうかを判定するようにしてもよいし、斜め方向に離れた2つの画素の間にエッジが存在するかどうかを判定するようにしてもよい。
また、上記輪郭抽出処理では、L(n−8)−L(n)が所定値以上である場合に、画素P(n)と画素P(n−8)の間にエッジが存在すると判定している(この場合、左側が白領域であり、右側が黒領域であるようなエッジを見つけることができる)が、他の実施形態では、L(n−8)−L(n)の絶対値が所定値以上である場合に、画素P(n)と画素P(n−8)の間にエッジが存在すると判定してもよい。この場合、左側が白領域であり、右側が黒領域であるようなエッジだけでなく、左側が黒領域であり、右側が白領域であるようなエッジも見つけることができる。
また、上記輪郭抽出処理では、起点エッジ画素を検出したときに利用されたエッジ判定閾値を上記エッジ辿り処理において用いているが、他の実施形態では、当該エッジ判定閾値を、実写画像における任意の領域(例えば、実写画像の全体)からエッジ画素を検出するために用いてもよい。例えば、起点エッジ画素を含むラインの1つ下のラインのエッジ画素や、起点エッジ画素を含む輪郭とは別の輪郭のエッジ画素などを、上記エッジ判定閾値に基づいて検出するようにしてもよい。
(頂点検出処理)
次に、頂点検出処理について説明する。頂点検出処理とは、実写画像におけるマーカー50の黒領域の4頂点を検出する処理であって、以下の処理から成る。
・直線算出処理
・直線統合処理
・直線選出処理
・頂点算出処理
直線算出処理では、前述の輪郭検出処理においてメインメモリ32に格納された、黒領域の輪郭を示す一連のエッジ画素群に関するデータに基づいて、複数の直線が算出される。以下、図22〜図36を参照して、直線算出処理について詳細に説明する。
メインメモリ32に格納された一連のエッジ画素群に関するデータにおいては、複数のエッジ画素が順序付けられている。以下の説明では、便宜上、黒領域の輪郭を反時計回りに辿っていく方向(すなわち、黒領域から白領域の方向を見たときの左方向)を前方と称し、黒領域の輪郭を時計回りに辿っていく方向(すなわち、黒領域から白領域の方向を見たときの右方向)を後方と称する。
まず、図22に示すように、起点エッジ画素Pe(0)から、当該起点エッジ画素Pe(0)より4つ前方のエッジ画素Pe(4)までの5つのエッジ画素Pe(0)〜Pe(4)に基づいて最初の直線Li(0−4)が生成され、当該直線Li(0−4)を示すデータがメインメモリ32に格納される。なお、複数のエッジ画素に基づいて直線を生成する方法としては種々の方法を採用し得るが、本実施形態では最小自乗法により生成するものとする。
次に、図23に示すように、直線Li(0−4)のすぐ前方の5つのエッジ画素Pe(5)〜Pe(9)に基づいて、例えば最小自乗法により、仮直線が生成され、直線Li(0−4)と仮直線とが同一直線上にあるかどうかを判定する。当該判定は、例えば、直線Li(0−4)に対する仮直線の角度に基づいて行われる。本実施形態では、図24に示すように、直線Li(0−4)に対する仮直線の角度(反時計回り方向を正とする)が−30°から+30°までの範囲である場合には、直線Li(0−4)と仮直線が同一直線上にあると判定される。なお、−30°および+30°という値は単なる一例に過ぎず、これに限定されない。
直線Li(0−4)と仮直線が同一直線上にあると判定されると、直線Li(0−4)に対応するエッジ画素Pe(0)〜Pe(4)と、仮直線に対応するエッジ画素Pe(5)〜Pe(9)の10個のエッジ画素に基づいて、例えば最小自乗法により、図25に示す直線Li(0−9)が計算され、メインメモリ32に格納されている直線Li(0−4)を示すデータが、直線Li(0−9)を示すデータへと更新される。このような処理を繰り返すことによって、直線が順次更新(延長)されていく。なお、本実施形態では、5つのエッジ画素毎に仮直線を生成しているが、これは単なる一例に過ぎず、これに限定されない。
図26の例では、直線Li(0−14)に対する仮直線(すなわち、直線Li(0−14)の前方の5つのエッジ画素Pe(15)〜Pe(19)に基づいて生成された仮直線)の角度が+30°を超えているので、直線Li(0−14)と仮直線の交点付近において黒領域が凸角となっている(すなわち、直線Li(0−14)と仮直線の交点付近において黒領域が外側に尖っている)と判定される(図24参照)。この場合、仮直線は、直線Li(0−14)とは異なる新たな直線であると判定され、当該仮直線に対応する新たな直線Li(15−19)が生成される(図27参照)。この場合、直線Li(0−14)を示すデータはメインメモリ32にそのまま保持され、直線Li(15−19)を示すデータがメインメモリ32に新たに格納される。
続いて、図28に示すように、直線Li(15−19)と、その前方の5つのエッジ画素Pe(20)〜Pe(24)に基づいて生成された仮直線とが同一直線上にあるかどうかを判定する。そして、同一直線上にあると判定されると、図29に示すように、エッジ画素Pe(15)〜Pe(24)に基づいて、直線Li(15−19)が直線Li(15−24)へと更新される。
以上のような処理を繰り返すことによって、最終的には、図30に示すように複数の直線(図30の例では直線A〜直線Fの6本の直線)が算出される。なお、この中には、直線Dのように短い直線も含まれ得る。
このように、直線算出処理では、一連のエッジ画素のうち、同一直線上にある一部のエッジ画素から各直線が算出される。
なお、上記直線算出処理では、起点エッジ画素Pe(0)を起点として直線を生成および更新しているが、これに限らず、起点エッジ画素Pe(0)以外の任意のエッジ画素を起点として直線を生成および更新してもよい。
また、上記直線算出処理では、反時計回りに直線を生成および更新しているが、これに限らず、時計回りに直線を生成および更新してもよい。
また、上記直線算出処理では、すでに生成された直線と、それに隣接する仮直線とが同一直線上にあるかどうかを判定し、同一直線上であると判定された場合に、これらの直線および仮直線に対応する複数のエッジ画素に基づいて直線を算出していれるが、他の実施形態では、まず多数の仮直線を生成した後に、これらの多数の仮直線のうち、同一直線上にある複数の仮直線に対応する複数のエッジ画素に基づいて直線を算出してもよい。
ところで、図31に示すように、実写画像においてマーカー50の黒領域の一辺に部分的に重なるように黒い物体が表示されている場合には、直線算出処理において、直線Aおよび直線Bが生成された後、図32に示すように、直線Bと、当該直線Bの前方の仮直線とが同一直線上かどうかが判定される。直線Bに対する仮直線の角度は−30°よりも小さいので、直線Bと仮直線の交点付近において黒領域が凹角となっている(すなわち、直線Bと仮直線の交点付近において黒領域が内側に凹んでいる)と判定される(図24参照)。マーカー50の黒領域の輪郭には凹角は存在しない(すなわち凸角のみ存在する)ため、このような凹角が検出された場合には、仮直線は、マーカー以外の物体の輪郭の一部を示していると予想される。
上記のように、直線算出処理において凹角が検出された場合には、直線を更新(延長)または新たに生成する処理を実行できないと判定される。そして、黒領域に対して反時計回りに直線を更新(延長)および新たに生成する処理を中断し、次に、それまでの方向とは逆方向(すなわち時計回り)に直線を更新(延長)および新たに生成する処理を開始する。例えば、図31の例では、起点エッジ画素から時計回りに、直線Aを後方に向かって延長する処理、および新たな直線を生成する処理を実行する。その結果、図33に示すように、図31の直線Aは直線A’へと更新され、さらに、直線C〜直線Eが順次生成される。なお、直線Eの後端では凹角が検出されるため、その時点で直線算出処理は終了する。結果として、直線A’,直線B〜直線Eの5本の直線が算出される。
さらに他の例として、図34に示すように、実写画像においてマーカー50の黒領域の一辺に部分的に重なるように白い物体が表示されている場合には、直線算出処理において、直線A〜直線Cが生成された後、凹角が検出される。そして、起点エッジ画素から時計回りに、直線Aを後方に向かって延長する処理、および新たな直線を生成する処理が開始され、直線Aは直線A’へと更新され、さらに、直線D〜直線Gが順次生成される。結果として、直線A’,直線B〜直線Gの7本の直線が算出される。
さらに他の例として、図35に示すように、実写画像においてマーカー50の黒領域の一頂点に重なるように黒い物体が表示されている場合には、結果的に、直線A’,直線B〜直線Dの4本の直線が算出される。
さらに他の例として、図36に示すように、実写画像においてマーカー50の黒領域の一頂点に重なるように白い物体が表示されている場合には、結果的に、直線A’,直線B〜直線Fの6本の直線が算出される。
直線算出処理が完了すると、続いて直線統合処理が行われる。直線統合処理とは、直線算出処理において算出された複数の直線のうち、同一直線上にある同一方向の複数の直線を1つの直線に統合する処理である。
例えば図30の例では、直線Aと直線Fが、同一直線上にあり、かつ同一方向を向いているので、図37に示すように、これらの2つの直線が1つの直線A+Fへと統合される。
また、例えば図33の例では、直線Bと直線Eが、同一直線上にあり、かつ同一方向を向いているので、図38に示すように、これらの2つの直線が1つの直線B+Eへと統合される。
また、例えば図34の例では、直線Bと直線Fが、同一直線上にあり、かつ同一方向を向いているので、図39に示すように、これらの2つの直線が1つの直線B+Fへと統合される。
直線統合処理が完了すると、続いて直線選出処理が行われる。直線選出処理とは、直線算出処理および直線統合処理を経て最終的に残った複数の直線から、マーカー50の黒領域の4辺に対応する直線を選択する処理である。
本実施形態では、最終的に残った複数の直線のうち、長さがより長い4本の直線(すなわち、最も長い直線と2番目に長い直線と3番目に長い直線と4番目に長い直線)を、マーカー50の黒領域の4辺に対応する直線として選出する。以下の説明では、選出された4つの直線のそれぞれを、これらの中の任意の直線から反時計回りに、第1直線,第2直線,第3直線および第4直線と称す。
例えば図37の例では、直線A+F,直線B〜直線Eの5本の直線から、直線A+F,直線B,直線Cおよび直線Eが、直線選出処理において選出される(図40参照)。
また、例えば図39の例では、直線A’,直線B+F,直線C〜直線E,直線Gの6本の直線から、直線A’,直線B+F,直線Eおよび直線Dが、直線選出処理において選出される。
また、例えば図36の例では、直線A’,直線B〜直線Fの6本の直線から、直線A’,直線B,直線Eおよび直線Dが、直線選出処理において選出される(図41参照)。
なお、図35および図38の例では4本の直線しか存在しないので、直線選出処理ではそれらの4本の直線が選出される。
なお、上記直線選出処理では4本の直線を選出しているが、これは、マーカー50の黒領域が四角形だからである。したがって、もしもマーカー50の黒領域が例えば六角形である場合には、直線選出処理では6本の直線を選出することになる。
直線選出処理が完了すると、続いて頂点算出処理が行われる。頂点算出処理では、直線選出処理において選出された4つの直線(第1直線〜第4直線)に基づいて、マーカー50の黒領域の4頂点の位置が算出される。
具体的には、第1直線と第2直線の交点の位置が、マーカー50の黒領域の第1頂点の位置として算出され、第2直線と第3直線の交点の位置が、マーカー50の黒領域の第2頂点の位置として算出され、第3直線と第4直線の交点の位置が、マーカー50の黒領域の第3頂点の位置として算出され、第4直線と第1直線の交点の位置が、マーカー50の黒領域の第4頂点の位置として算出される。
例えば図40の例では、図42のように第1頂点〜第4頂点の位置が算出される。また例えば図41の例では、図43のように第1頂点〜第4頂点の位置が算出される。
以上のようにして、直線算出処理,直線統合処理,直線選出処理および頂点算出処理を経て、実写画像におけるマーカー50の黒領域の4頂点が検出される。
このようにして検出された頂点の位置は、同一直線上にある複数のエッジ画素に基づいて生成された直線の交点として計算されるので、非常に高精度である。例えば、一連のエッジ画素のうちのいずれかのエッジ画素を頂点として決定する場合には、環境光等の影響によって頂点の位置がぶれてしまうが、上記のようにして検出された頂点の位置は、多数のエッジ画素に基づいて計算されているため、そのようなブレは生じない。
(粗判別処理)
次に、粗判別処理について説明する。粗判別処理とは、後述する図柄判別処理に先立って、頂点検出処理によって検出された4頂点がマーカー50の4頂点であるか否かを、それらの4頂点の位置関係に基づいて判別する処理である。
本実施形態では、以下に示す除外条件A〜Dを満たした場合に、頂点検出処理によって検出された4頂点がマーカー50の4頂点ではないと判定する。
(除外条件A)いずれかの隣り合う2頂点の距離が近すぎる場合
具体的には、第1頂点と第2頂点の間の距離が所定の閾値(第1の最小許容距離)よりも小さい場合、または、第2頂点と第3頂点の間の距離が第1の最小許容距離よりも小さい場合、または、第3頂点と第4頂点の間の距離が第1の最小許容距離よりも小さい場合、または、第4頂点と第1頂点の間の距離が第1の最小許容距離よりも小さい場合である。例えば、図44の例では、第1頂点と第2頂点の距離が近すぎるため、第1頂点〜第4頂点はマーカー50の4頂点ではないと判定される。
(除外条件B)いずれかの頂点と当該頂点に隣接しない2辺のいずれかとの距離が近すぎる場合
具体的には、第1頂点と第3直線との距離が所定の閾値(第2の最小許容距離)よりも小さい場合、または、第1頂点と第4直線との距離が第2の最小許容距離よりも小さい場合、または、第2頂点と第4直線との距離が第2の最小許容距離よりも小さい場合、または、第2頂点と第1直線との距離が第2の最小許容距離よりも小さい場合、または、第3頂点と第1直線との距離が第2の最小許容距離よりも小さい場合、または、第3頂点と第2直線との距離が第2の最小許容距離よりも小さい場合、または、第4頂点と第2直線との距離が第2の最小許容距離よりも小さい場合、または、第4頂点と第3直線との距離が第2の最小許容距離よりも小さい場合である。例えば、図45の例では、第1頂点と第3直線の距離が近すぎるため、第1頂点〜第4頂点はマーカー50の4頂点ではないと判定される。
(除外条件C)いずれかの対向する2辺の直線(ベクトル)が概ね同一方向の場合
具体的には、第1直線(第4頂点から第1頂点を結ぶベクトル)と第3直線(第2頂点から第3頂点を結ぶベクトル)が概ね同一方向である場合、または、第2直線(第1頂点から第2頂点を結ぶベクトル)と第4直線(第4頂点から第1頂点を結ぶベクトル)が概ね同一方向である場合である。例えば、図44の例では、第1直線(第4頂点から第1頂点を結ぶベクトル)と第3直線(第2頂点から第3頂点を結ぶベクトル)が概ね同一方向であるため、第1頂点〜第4頂点はマーカー50の4頂点ではないと判定される。なお、2つのベクトルが概ね同一方向であるかどうかは、例えば、図24に示すように、2つのベクトルのなす角度に基づいて判定することができる。
(除外条件D)凹角が含まれている場合
具体的には、第1頂点〜第4頂点のいずれかの頂点が凹角である場合である。例えば、図47の例では、第2頂点が凹角であるため、第1頂点〜第4頂点はマーカー50の4頂点ではないと判定される。
なお、本実施形態では上記除外条件A〜除外条件Dに基づいて粗判別処理を行っているが、これは単なる一例に過ぎず、これらの除外条件のうちの1つまたは複数を用いてもよいし、これらの除外条件とは異なる除外条件を用いてもよい。
上記除外条件A〜除外条件Dのいずれかを満たしている場合、頂点検出処理によって検出された4頂点は、マーカー50の4頂点ではないと判定され、後述する図柄判別処理の処理対象から除外される。これにより、図柄判別処理に要する処理負担が軽減される。
(図柄判別処理)
次に、図柄判別処理について説明する。図柄判別処理は、頂点検出処理で検出された4頂点で囲まれる領域に表示されている図柄が、マーカー50に描かれている図柄と同一か否かを判別するための処理である。
図柄判別処理では、マーカー50に描かれている図柄に基づいて予め生成されたパターン定義データを用いて、頂点検出処理で検出された4頂点で囲まれる領域に表示されている図柄が、マーカー50に描かれている図柄と同一か否かを判別する。
パターン定義データは、マーカー50に描かれている図柄を表すデータであって、本実施形態では、図48に示すように、マーカー50の各辺を16等分することによって生成される格子の交点をサンプル点(S(1,1)〜S(15,15))とし、マーカー50上の各サンプル点の画素値を定義したデータである(図49参照)。なお、本実施形態では、マーカー50の各辺を16分割しているが、これは単なる一例に過ぎず、16分割に限定されない。また、本実施形態では、マーカー50の各辺を等分することによって生成される格子の交点をサンプル点としているが、他の実施形態では、格子によって区切られた各四角形の中心をサンプル点としてもよい。
本実施形態では、マーカー50の左上頂点に最も近い交点をサンプル点S(1,1)とし、マーカー50の左下頂点に最も近い交点をサンプル点S(1,15)とし、マーカー50の右上頂点に最も近い交点をサンプル点S(15,1)とし、マーカー50の右下頂点に最も近い交点をサンプル点S(15,15)としている。
なお、図49の例では、画素値の欄に「黒」または「白」と定義されているが、他の実施形態では、色値(RGB値)や輝度値などで定義されていてもよい。
図50は、マーカー50を含む実写画像を示している。当該実写画像に対して、前述した輪郭検出処理および頂点検出処理が行われることによって、第1頂点〜第4頂点の位置が算出される。
図51は、実写画像において、第1頂点〜第4頂点によって囲まれる四角形の各辺を16等分することによって、これらの頂点によって囲まれる領域内のサンプル点の位置を決定する例を示している。
図柄判別処理では、実写画像におけるサンプル点の画素値と、パターン定義データとを照合(例えば、相関係数を計算するなど)することによって、実写画像における第1頂点〜第4頂点によって囲まれる領域に表示されている図柄が、マーカー50に描かれている図柄と同一か否かを判別する。しかしながら、図51に示すような方法で実写画像におけるサンプル点を決定した場合には、正確な判別ができないという問題がある。例えば、パターン定義データにおけるサンプル点S(8,2)の画素値は「黒」であるのに対して、図51の実写画像におけるサンプル点S(8,2)の画素値は「白」となっている。また、パターン定義データにおけるサンプル点S(8,13)の画素値は「白」であるのに対して、図51の実写画像におけるサンプル点S(8,13)の画素値は「黒」となっている。その結果、図50の実写画像にはマーカー50が含まれていない、と誤って判別されてしまう可能性がある。
上記のような問題を解消するためには、実写画像におけるサンプル点の位置の決定方法を工夫する必要がある。以下では、実写画像におけるサンプル点の位置の決定方法の他の例(第1の決定方法および第2の決定方法)を説明する。
まず、図52〜図58を参照して、実写画像におけるサンプル点の位置を決定するための第1の決定方法を説明する。
第1の決定方法では、第1頂点〜第4頂点によって囲まれる四角形において、対向する2辺が平行(概ね平行である場合も含む)であれば、それらの2辺については16等分し、対向する2辺が平行でなければ、それらの2辺については不均等に16分割することによって、こうして生成される格子の交点をサンプル点とする。
例えば、図52の例では、第1頂点と第4頂点を結ぶ辺と、第2頂点と第3頂点を結ぶ辺とは平行であるので、第1頂点と第4頂点を結ぶ辺と、第2頂点と第3頂点を結ぶ辺は、それぞれ16等分される。一方、第1頂点と第2頂点を結ぶ辺と、第4頂点と第3頂点を結ぶ辺とは平行でないので、第1頂点と第2頂点を結ぶ辺と、第4頂点と第3頂点を結ぶ辺は、16等分ではなく、不均等に16分割される。すなわち、図52に示すように、第1頂点と第2頂点を結ぶ辺を16分割する各点(以下、分割点と称す)は、当該辺を16等分した場合と比較して、第1頂点側にシフトしている。また、第4頂点と第3頂点を結ぶ辺を16分割する各分割点は、当該辺を16等分した場合と比較して、第4頂点側にシフトしている。
以下、図52における第1頂点と第2頂点を結ぶ辺上、および第4頂点と第3頂点を結ぶ辺上の分割点の決定方法の一例を、図53〜図55を参照して説明する。
なお、以下の説明では、第1頂点と第2頂点を結ぶ辺を16分割する15個の分割点を、第1頂点に近い方から順番に、第1分割点M1,第2分割点M2,第3分割点M3,・・・,第15分割点M15と称する。同様に、第4頂点と第3頂点を結ぶ辺を16分割する15個の分割点を、第4頂点に近い方から順番に、第1分割点N1,第2分割点N2,第3分割点N3,・・・,第15分割点N15と称する。
まず、図53に示すように、第8分割点M8および第8分割点N8が決定される。具体的には、まず、第1頂点と第4頂点の間の距離と、第2頂点と第3頂点の間の距離が計算される。そして、第1頂点と第4頂点の間の距離をaとし、第2頂点と第3頂点の間の距離をbとしたときに、第1頂点と第2頂点の間をa:bの比率で分割する点と、第4頂点と第3頂点の間をa:bの比率で分割する点が計算される。そして、計算された前者の点が第8分割点M8として決定され、計算された後者の点が第8分割点N8として決定される。この結果、第8分割点M8は、第1頂点と第2頂点の中点よりも第1頂点に近い位置に決定され、第8分割点N8は、第4頂点と第3頂点の中点よりも第4頂点に近い位置に決定される。
次に、図54に示すように、第4分割点M4および第4分割点N4が決定される。具体的には、まず、第8分割点M8と第8分割点N8の間の距離が計算される。そして、当該距離をcとしたときに、第1頂点と第8分割点M8の間をa:cの比率で分割する点と、第4頂点と第8分割点N8の間をa:cの比率で分割する点が計算される。そして、計算された前者の点が第4分割点M4として決定され、計算された後者の点が第4分割点N4として決定される。この結果、第4分割点M4は、第1頂点と第8分割点M8の中点よりも第1頂点に近い位置に決定され、第4分割点N4は、第4頂点と第8分割点N8の中点よりも第4頂点に近い位置に決定される。
次に、図55に示すように、第2分割点M2および第2分割点N2が決定される。具体的には、まず、第4分割点M4と第4分割点N4の間の距離が計算される。そして、当該距離をdとしたときに、第1頂点と第4分割点M4の間をa:dの比率で分割する点と、第4頂点と第4分割点N4の間をa:dの比率で分割する点が計算される。そして、計算された前者の点が第2分割点M2として決定され、計算された後者の点が第2分割点N2として決定される。この結果、第2分割点M2は、第1頂点と第4分割点M4の中点よりも第1頂点に近い位置に決定され、第2分割点N2は、第4頂点と第4分割点N4の中点よりも第4頂点に近い位置に決定される。
以下、同様にして、他の分割点(第1分割点M1,第3分割点M3,第5分割点M5〜第7分割点M7,第9分割点M9〜第15分割点M15,第1分割点N1,第3分割点N3,第5分割点N5〜第7分割点N7,第9分割点N9〜第15分割点N15)が決定され、最終的に、図52に示すようなサンプル点が決定される。
なお、第1の決定方法では、第1頂点〜第4頂点によって囲まれる四角形において、対向する2辺が平行であれば、それらの2辺については16等分するようにしている。以下、図56〜図58を参照して、その理由を説明する。
実写画像において図56に示すような第1頂点〜第4頂点が検出された場合、第1頂点と第4頂点を結ぶ辺と、第2頂点と第3頂点を結ぶ辺とは平行になっている。このような場合、もし仮に、図53〜図55に示した方法を用いてそれらの辺を16分割したとすると、図57に示すように、第1頂点と第4頂点を結ぶ辺を分割する分割点は、全体的に第1頂点寄りに位置し、第2頂点と第3頂点を結ぶ辺を分割する分割点は、全体的に第2頂点寄りに位置することになる。
しかしながら、実写画像においてマーカー50が図56に示すような形状で表示されている場合(すなわち、第1頂点と第4頂点を結ぶ辺と、第2頂点と第3頂点を結ぶ辺とが平行である場合)には、カメラから第1頂点までの距離と、カメラから第4頂点までの距離とは、ほぼ同じである。同様に、カメラから第2頂点までの距離と、カメラから第3頂点までの距離とは、ほぼ同じである。したがって、このような場合には、図58に示すように、第1頂点と第4頂点を結ぶ辺と、第2頂点と第3頂点を結ぶ辺を16等分する方が、サンプル点の位置をより適切な位置に決定することができる。
次に、図59および図60を参照して、実写画像におけるサンプル点の位置を決定するための第2の決定方法を説明する。
第2の決定方法では、図59に示すように、まず、頂点検出処理で検出された4頂点によって囲まれる四角形の対向する2辺を延長して、それら2辺の交点(第1消失点および第2消失点)が計算される。以下の説明では、頂点検出処理で検出された4頂点のうち、第1消失点と第2消失点を結ぶ直線(第1直線)に最も近い頂点を頂点Aと称し、当該頂点から反時計回りに頂点B,頂点C,頂点Dと称する。
次に、頂点Cを通り、かつ第1消失点と第2消失点を結ぶ直線(第1直線)に平行な直線(第2直線)を計算する。そして、頂点Aおよび頂点Bを通る直線と、第2直線との交点(第1点)と、頂点Aおよび頂点Dを通る直線と、第2直線との交点(第2点)とを計算する。
次に、図60に示すように、第1点から頂点Cまでを16等分する15個の分割点を計算し、これらの分割点と第2消失点とを結ぶ。同様に、頂点Cから第2点までを16等分する15個の分割点を計算し、これらの分割点と第1消失点とを結ぶ。そして、このようにして生成される交点が、実写画像におけるサンプル点として決定される。
本願の発明者による検証結果によると、第2の決定方法を採用することで、第1の決定方法よりも適切に実写画像におけるサンプル点を決定できることが確認された。しかしながら、第1の決定方法であっても、図51に示した方法と比べて大きく有利であるので、第1の決定方法を採用するか、第2の決定方法を採用するかは、要求される検出精度や、マーカー50の図柄の複雑さ等の条件を考慮して、設計者が適宜に決定すればよい。
上記の第1の決定方法や第2の決定方法のように、少なくとも1組の対向する2辺の各辺を不均等に分割して実写画像におけるサンプル点を決定することによって、図51に示した方法と比較して、より正確にマーカー50を判別することができる。
なお、対向する2辺の各辺を不均等に分割する方法としては、上記の第1の決定方法や第2の決定方法に限らず、他の方法を採用してもよい。
なお、頂点検出処理で検出された第1頂点〜第4頂点のどの頂点が、マーカー50の左上頂点,左下頂点,右下頂点,右上頂点のどの頂点に対応しているかは、頂点検出処理の直後には分からない。したがって、第1頂点が左上頂点に対応している場合と、第1頂点が左下頂点に対応している場合と、第1頂点が右下頂点に対応している場合と、第1頂点が右上頂点に対応している場合の4つの場合が考えられるので、図柄判別処理では、これらの4つの場合について、それぞれ、パターン定義データとの照合が行われる。その結果、実写画像における左上頂点の座標と、左下頂点の座標と、右下頂点の座標と、右上頂点の座標が検出され、これらがマーカー位置情報としてメインメモリ32に記憶される。
ところで、ゲーム装置10では、カメラからリアルタイムに順次取得される実写画像に基づいて、上記のような輪郭検出処理、頂点検出処理、粗判別処理および図柄判別処理を、所定の周期(例えば、60分の1秒の周期)で繰り返し実行する。これにより、実写画像におけるマーカー50の位置をリアルタイムに検出することができる。
しかしながら、マーカー50に対する光の当たり具合などの原因により、実写画像にマーカー50が表示されているにもかかわらず、実写画像におけるマーカー50の輪郭および頂点の検出に一時的に失敗することがあり得る。マーカー50の輪郭および頂点の検出に一時的に失敗すると、例えば図4に示す状態において、ユーザがゲーム装置10を移動させていないにもかかわらず仮想オブジェクト60が一時的に消えることになり、仮想オブジェクト60が頻繁に消えたり出現したりすると、ユーザの興味がそがれてしまうことになる。
本実施形態では、上記のような好ましくない現象(意図しないマーカー位置の変動)を防止するために、現在の実写画像からマーカー50の輪郭および頂点の検出に失敗した場合には、直前の実写画像から検出されたマーカー50の頂点(またはサンプル点)の位置に基づいて、現在の実写画像に対して図柄判別処理を行う。なお、「現在の実写画像」とは、現在処理中の実写画像を意味するものであって、必ずしもカメラで撮像された最新の実写画像を意味するものではない。
具体的に説明すると、現在の実写画像からマーカー50の輪郭および頂点の検出に失敗した場合には、図61に示すように、直前の実写画像から検出されたマーカー50の4頂点(または、それらの4頂点から決定されたサンプル点)の位置を、メインメモリ32に記憶されているマーカー位置情報から取得する。そして、図62に示すように、直前の実写画像から検出されたマーカー50の4頂点の位置に基づいて、現在の実写画像におけるサンプル点の位置を決定し、こうして決定したサンプル点(または、前回の図柄判別処理において決定されたサンプル点)の画素値を用いて、図柄判別処理が行われる。そして、当該図柄判別処理の結果、現在の実写画像において、直前の実写画像と同じ位置にマーカー50が存在すると判定された場合には、直前の実写画像におけるマーカー50の4頂点の座標を、現在の実写画像に対応するマーカー位置情報としてメインメモリ32に記憶する。
上記のような処理により、ユーザがゲーム装置10を移動させていない場合には、実写画像におけるマーカー50の輪郭および頂点の検出に一時的に失敗したとしても、マーカー50の位置を検出することが可能となる。したがって、前述のように、ユーザがゲーム装置10を移動させていないにもかかわらず仮想オブジェクト60が頻繁に消えたり出現したりするような現象の発生を防止することができる。
なお、現在の実写画像におけるマーカー50の位置は、直前の実写画像におけるマーカー50の位置から少しずれている可能性がある。そこで、他の実施形態では、直前の実写画像におけるマーカー50の位置だけでなく、直前の実写画像におけるマーカー50の位置の近傍の範囲を対象として、図柄判別処理を行うようにしてもよい。例えば、直前の実写画像から検出されたマーカー50の4頂点の位置を少しずつずらしながら図柄判別処理を複数回実行し、それらの結果のうち、パターン定義データとの類似度が最も高い4頂点の位置を、現在の実写画像におけるマーカー50の4頂点の位置として決定してもよい。
なお、本実施形態では、現在の実写画像からマーカー50の輪郭および頂点の検出に失敗した場合に、直前の実写画像から検出されたマーカー50の頂点(またはサンプル点)の位置に基づいて、現在の実写画像に対して図柄判別処理を行っているが、これに限らず、現在の実写画像以前の他の任意の実写画像から検出されたマーカー50の頂点(またはサンプル点)の位置に基づいて(すなわち、メインメモリ32にすでに記憶されている、他の任意の実写画像に対応するマーカー位置情報に基づいて)、現在の実写画像に対して図柄判別処理を行ってもよい。
なお、本実施形態では、現在の実写画像からマーカー50の輪郭および頂点の検出に失敗した場合に、直前の実写画像から検出されたマーカー50の頂点(またはサンプル点)の位置に基づいて、現在の実写画像に対して図柄判別処理を行っているが、このような処理は、図48〜図60に示したようなパターンマッチング手法を用いて図柄判別処理を行う場合に限らず、公知の他の任意のパターンマッチング手法を用いて図柄判別処理を行う場合にも効果的である。
(マーカー位置補正処理)
次に、マーカー位置補正処理について説明する。マーカー位置補正処理とは、図柄判別処理において検出されたマーカー50の位置(すなわち、マーカー50の黒領域の4頂点の位置)を適宜に補正する処理である。
マーカー位置補正処理について具体的に説明する前に、まず、マーカー位置補正処理を行わなければ、どういう不具合が発生し得るかについて説明する。
前述したように、実写画像におけるマーカー50の位置は、実写画像に対する輪郭検出処理結果に基づいて検出される。この輪郭検出処理では、エッジ判定閾値と各画素の輝度値とを比較することによってエッジ画素を検出している。ここで、エッジ判定閾値に非常に近い輝度値を有する画素があった場合、例えば、或る実写画像においては、その画素は黒領域だと判定され、次の実写画像においては、その画素が白領域だと判定されることがある。これは、カメラ(すなわちゲーム装置10)を全く動かしていない場合にも起こり得る。環境光等の影響で、各画素の輝度値は時間的にわずかに変動し得るからである。こうして、輪郭検出処理の結果が変動すると、最終的に検出される、実写画像におけるマーカー50の位置も変動するため、例えば、図4に示した仮想オブジェクト60の位置や向きが、ユーザがゲーム装置10を動かしていないにもかかわらず変動することになってしまう。すなわち、仮想空間画像がぶれているように見えてしまう。このような好ましくない現象を防ぐ(または緩和する)ために、本実施形態では、マーカー位置補正処理が行われる。
マーカー位置補正処理では、まず、直前の実写画像から検出されたマーカー50の位置と、現在の実写画像から検出されたマーカー50の位置とに基づいて、実写画像におけるマーカー50の移動量を計算する。図63を参照して、実写画像におけるマーカー50の移動量の計算方法の一例を説明する。
図63に示すように、直前の実写画像から検出されたマーカー50の左上頂点をVp1、左下頂点をVp2、右下頂点をVp3、右上頂点をVp4とし、現在の実写画像から検出されたマーカー50の左上頂点をVc1、左下頂点をVc2、右下頂点をVc3、右上頂点をVc4とする。そして、Vp1とVc1の距離をaとし、Vp2とVc2の距離をbとし、Vp3とVc3の距離をcとし、Vp4とVc4の距離をdとすると、実写画像におけるマーカー50の移動量は、a^2+b^2+c^2+d^2となる(“^”は累乗を示す)。
なお、上記の計算方法は単なる一例に過ぎず、実写画像におけるマーカー50の移動量の計算方法は、これに限定されない。
実写画像におけるマーカー50の移動量が算出されると、次に、当該移動量に基づいて、図柄判別処理において検出されたマーカー50の位置を補正する。図64を参照して、マーカー50の位置の補正方法について説明する。
マーカー50の移動量がD1未満である場合には、現在の実写画像におけるマーカー50の各頂点Vc(図63のVc1〜Vc4)の位置が、前回検出された各頂点Vp(図63のVp1〜Vp4)の位置へとそれぞれ補正される。なお、D1は、所定の閾値であって、後述するように、実写画像上でのマーカー50の大きさに応じて、その値は変化する。
マーカー50の移動量がD1以上、D2未満である場合には、現在の実写画像におけるマーカー50の各頂点Vc(図63のVc1〜Vc4)の位置が、Vp×A+Vc×(1−A)により計算される位置へと補正される。なお、D2は、D1よりも大きい所定の閾値であって、後述するように、実写画像上でのマーカー50の大きさに応じて、その値は変化する。また、Aは、0よりも大きく、1よりも小さい所定値であって、後述するように、マーカー50の動きベクトルに応じて、その値は変化する。
マーカー50の移動量がD2以上である場合には、現在の実写画像におけるマーカー50の各頂点Vc(図63のVc1〜Vc4)の位置の補正は行われない。
上記のように、マーカー50の移動量がD1未満である場合(すなわち、マーカー50の移動量が非常に小さい場合)には、直前の実写画像におけるマーカー50の位置から、マーカー50が全く移動していないものとして扱われる。よって、上記のような、意図しないマーカー位置の変動を防止することができ、その結果として、仮想空間画像のぶれを防止することができる。
また、マーカー50の移動量がD1以上、D2未満である場合(すなわち、マーカー50の移動量が小さい場合)には、図65に示すように、直前の実写画像におけるマーカー50の位置と現在の実写画像におけるマーカー50の位置とを結ぶ線分上の位置(すなわち、VpからVcまでの線分を(1−A):Aの比率で内分する点)に、マーカー50の位置が補正される。よって、上記のような、意図しないマーカー位置の変動を緩和することができ、その結果として、仮想空間画像のぶれを緩和することができる。また、マーカー50の移動量がD1未満である場合とは異なり、補正後のマーカー50の位置は、直前の実写画像におけるマーカー50の位置よりも、現在の実写画像におけるマーカー50の位置に近い位置となるため、ユーザがゲーム装置10を小さく(またはゆっくりと)動かした場合に、意図しないマーカー位置の変動を緩和しつつも、ゲーム装置10の動きに応じてマーカー50の位置(すなわち、仮想オブジェクト60の位置)が更新される。
なお、マーカー50の移動量がD2以上である場合(すなわち、マーカー50の移動量が大きい場合)には、マーカー50の位置の補正は行われない。よって、ユーザがゲーム装置10を急激に大きく動かした場合に、そのようなゲーム装置10の急激な動きに即座に反応してマーカー50の位置が更新されるので、例えば図4における仮想オブジェクト60がマーカー50から大きくずれて表示されてしまうことはない。
次に、上記の閾値D1およびD2の決定方法について説明する。
前述のように、上記の閾値D1およびD2は、実写画像におけるマーカー50の移動量がどの程度か(すなわち、非常に小さいか、小さいか、大きいか)を判断するための閾値であるが、これらの閾値は、実写画像上でのマーカー50の大きさに応じて変更するのが好ましい。以下、図66および図67を参照して、その理由を説明する。
図66は、実写画像上でのマーカー50の大きさが大きいとき(すなわち、現実世界において、マーカー50の位置がカメラに近いとき)に、仮想オブジェクト60を直前のマーカー位置に表示した例である。ここで、直前のマーカー位置と現在のマーカー位置との距離(実写画像上での距離)はDであるとする。この場合、ユーザにとって、仮想オブジェクト60は現在のマーカー位置から大きくずれていないように見える。
図67は、実写画像上でのマーカー50の大きさが小さいとき(すなわち、現実世界において、マーカー50の位置がカメラから遠いとき)に、仮想オブジェクト60を直前のマーカー位置(すなわち、直前の実写画像におけるマーカー50の位置)に表示した例である。ここでも、直前のマーカー位置と現在のマーカー位置との距離(実写画像上での距離)は図66と同じくDであるとする。この場合、ユーザにとって、仮想オブジェクト60は現在のマーカー位置から大きくずれているように見える。
図66および図67から明らかなように、直前のマーカー位置と現在のマーカー位置との距離(実写画像上での距離)が同じであっても、実写画像上でのマーカー50の大きさが小さいほど、ユーザにとって、直前のマーカー位置と現在のマーカー位置とが大きくずれているように見える。
そこで、図68に示すように、実写画像上でのマーカー50の大きさが大きい場合にはD1の値を大きくし、実写画像上でのマーカー50の大きさが小さい場合にはD1の値を小さくするのが好ましい。すなわち、実写画像上でのマーカー50の大きさが小さいほど、D1の値を小さくするのが好ましい。
同様に、図69に示すように、実写画像上でのマーカー50の大きさが大きい場合にはD2の値を大きくし、実写画像上でのマーカー50の大きさが小さい場合にはD2の値を小さくするのが好ましい。すなわち、実写画像上でのマーカー50の大きさが小さいほど、D2の値を小さくするのが好ましい。
なお、実写画像上のマーカー50の大きさの計算方法としては、種々の方法が考えられる。例えば、実写画像上のマーカー50の面積を、実写画像上のマーカー50の大きさとして計算してもよい。他の実施形態では、実写画像上のマーカー50の2つの対角線の外積の大きさを、実写画像上のマーカー50の大きさとして計算してもよい。さらに他の実施形態では、実写画像上のマーカー50の4頂点を内包する円の直径を、実写画像上のマーカー50の大きさとして計算してもよい。さらに他の実施形態では、実写画像上のマーカー50のX軸方向の幅およびY軸方向の幅に基づいて、実写画像上のマーカー50の大きさを計算してもよい。
次に、上記の所定値Aの決定方法について説明する。
前述のように、マーカー50の移動量がD1以上、D2未満である場合には、図65に示すように、直前の実写画像におけるマーカー50の位置と現在の実写画像におけるマーカー50の位置とを結ぶ線分を(1−A):Aの比率で内分する点に、マーカー50の位置が補正される。
ここで、Aの値を小さい値(例えば、0.1)に固定した場合には、直前の実写画像におけるマーカー50の位置とほぼ同じ位置に、マーカー50の位置が補正されることになる。したがって、応答性が低下し、実写画像におけるマーカー50の位置が変化しても、仮想オブジェクト60の位置はそれほど変化しないことになる。よって、例えば、ユーザがゲーム装置10を所望の方向へゆっくりと継続的に動かしたときに、仮想オブジェクト60がマーカー50からはっきりとずれて見えてしまうという問題がある。
逆に、Aの値を大きい値(例えば、0.9)に固定した場合には、現在の実写画像におけるマーカー50の位置とほぼ同じ位置に、マーカー50の位置が補正されることになる。したがって、応答性は向上するものの、前述したような意図しないマーカー位置の変動を緩和する効果が大きく損なわれてしまうという問題がある。
本実施形態では、上記のような2つの問題点を両方とも解決するために、マーカー50の動きベクトルに応じてAの値を変化させている。
具体的には、或る実写画像におけるマーカー50の位置(例えば、マーカー50の各頂点の位置)と、その直前の実写画像におけるマーカー50の位置とに基づいて、マーカー50がどの方向へ移動したかを示す動きベクトルを順次計算してメインメモリ32に順次記憶する。そして、新たに計算された動きベクトルと、メインメモリ32に記憶されている過去に計算された動きベクトルとに基づいて、実写画像においてマーカー50が一定方向(概ね一定方向であってもよい)に継続して移動しているかどうかを判定し、一定方向に継続して移動している場合にはAの値を大きくし、そうでない場合にはAの値を小さくする。
上記のようにAの値を変化させることにより、例えば、ユーザがゲーム装置10を所望の方向へゆっくりと継続的に動かしている間は応答性が向上するので、仮想オブジェクト60がマーカー50から大きくずれて見えてしまうことがない。また、それ以外の状況では応答性が低下するので、前述したような意図しないマーカー位置の変動を緩和する効果が十分に発揮される。
なお、本実施形態では、図64のように、マーカー50の移動量がD1未満の場合と、D1以上、D2未満の場合と、D2以上の場合とで、マーカー50の位置(例えば4頂点の位置)の補正方法を変えているが、これは単なる一例に過ぎず、マーカー50の位置の補正方法はこれに限定されない。
例えば、他の実施形態として、図70に示すように、マーカー50の移動量がD3未満の場合には、現在の実写画像に基づいて検出されたマーカー50の位置を、直前の実写画像におけるマーカー50の位置へと補正し、D3以上の場合には、現在の実写画像に基づいて検出されたマーカー50の位置を補正せずにそのまま用いるようにしてもよい。これにより、意図しないマーカー位置の変動を防止することができる。なお、D3は、所定の閾値であって、実写画像上でのマーカー50の大きさに応じて、その値が変化してもよい。
また、さらに他の実施形態として、図71に示すように、マーカー50の移動量がD4未満の場合には、現在の実写画像に基づいて検出されたマーカー50の位置を、直前の実写画像におけるマーカー50の位置と現在の実写画像におけるマーカー50の位置とを結ぶ線分を(1−A):Aの比率で内分する点へと補正し、D4以上の場合には、現在の実写画像に基づいて検出されたマーカー50の位置を補正せずにそのまま用いるようにしてもよい。これにより、意図しないマーカー位置の変動を緩和することができる。なお、D4は、所定の閾値であって、実写画像上でのマーカー50の大きさに応じて、その値が変化してもよい。
なお、マーカー位置補正処理では、前述のように、マーカー50の移動量やマーカー50の動きベクトルを用いて処理を行っているが、実写画像に同一図柄の複数のマーカーが含まれている場合には、それらのどのマーカーがどこに移動したのかをそれぞれ判別する必要がある。例えば、図72に示すように、直前の実写画像から互いに同一図柄の複数のマーカー(マーカーA,マーカーB)が検出され、現在の実写画像から、それらと同一図柄の複数のマーカー(第1マーカー,第2マーカー)が検出された場合、それらの対応関係を判別する必要がある。
本実施形態では、直前の実写画像から検出された各マーカーの代表点から、現在の実写画像から検出された各マーカーの代表点までの距離をそれぞれ計算し、当該距離が所定の閾値よりも小さい場合に、それらの2つのマーカーが互いに対応していると判定する。マーカーの代表点としては、例えば、マーカーの4頂点の座標を平均することによって得られる座標を利用することができる。
図72を参照して具体的に説明すると、まず、マーカーAの代表点から第1マーカーまでの距離を計算し、当該距離が所定の閾値(当該閾値は、実写画像上でのマーカーAまたは第1マーカーの大きさが大きくなるほど、大きくなるようにするのが好ましい)よりも小さい場合には、マーカーAと第1マーカーとが対応していると判定する。
同様に、マーカーAの代表点から第2マーカーまでの距離を計算し、当該距離が所定の閾値(当該閾値は、実写画像上でのマーカーAまたは第2マーカーの大きさが大きくなるほど、大きくなるようにするのが好ましい)よりも小さい場合には、マーカーAと第2マーカーとが対応していると判定する。
また同様に、マーカーBの代表点から第1マーカーまでの距離を計算し、当該距離が所定の閾値(当該閾値は、実写画像上でのマーカーBまたは第1マーカーの大きさが大きくなるほど、大きくなるようにするのが好ましい)よりも小さい場合には、マーカーBと第1マーカーとが対応していると判定する。
また同様に、マーカーBの代表点から第2マーカーまでの距離を計算し、当該距離が所定の閾値(当該閾値は、実写画像上でのマーカーBまたは第2マーカーの大きさが大きくなるほど、大きくなるようにするのが好ましい)よりも小さい場合には、マーカーBと第2マーカーとが対応していると判定する。
上記のようにしてマーカーの対応関係を判別することによって、実写画像に同一図柄の複数のマーカーが含まれている場合でも、各マーカーの移動量や動きベクトルを計算することができる。
なお、実写画像に異なる図柄の複数のマーカーが含まれている場合には、それらの図柄に基づいてマーカーの対応関係を判別することができる。
なお、上記マーカー位置補正処理では、直前の実写画像から検出されたマーカー50の位置と、現在の実写画像から検出されたマーカー50の位置とに基づいて、実写画像におけるマーカー50の移動量を計算しているが、これに限らず、例えば、現在の実写画像以前に取得された任意の実写画像(例えば、現在の実写画像の2つ前に取得された実写画像など)から検出されたマーカー50の位置と、現在の実写画像から検出されたマーカー50の位置とに基づいて、実写画像におけるマーカー50の移動量を計算してもよい。
以上のように、輪郭検出処理、頂点検出処理、粗判別処理、図柄判別処理およびマーカー位置補正処理を経て、実写画像からマーカー50の位置(例えば、マーカー50の黒領域の4頂点の位置)が検出される。そして、こうして検出されたマーカー50の位置に基づいて、現実空間におけるカメラ(外側撮像部(左)23aまたは外側撮像部(右)23b)とマーカー50との位置関係が計算され、この計算結果に基づいて、仮想空間における仮想カメラと仮想オブジェクト60の位置関係が設定される。そして、当該仮想カメラに基づいて仮想空間画像が生成されて、カメラによって撮像された実写画像に仮想空間画像が合成されて、当該合成された画像が上側LCD22に表示される。
次に、画像認識プログラムに基づいてCPU311によって実行される画像認識処理の流れを具体的に説明する。
図73は、メインメモリ32に格納されるプログラムおよびデータを示している。
メインメモリ32には、画像認識プログラム70、画像生成プログラム71、仮想オブジェクトデータ72、仮想カメラデータ73、パターン定義データ74、実写画像データ75、エッジ判定閾値76、エッジ画素情報77、直線情報78、頂点情報79、マーカー位置情報80、動きベクトル情報81および各種変数82が記憶される。
画像認識プログラム70は、実写画像からマーカーを検出するためのコンピュータプログラムであり、画像生成プログラム71は、画像認識プログラムに基づいて検出されたマーカーの位置に基づいて実写画像に仮想空間画像を合成するためのコンピュータプログラムである。これらのプログラムは、データ保存用内部メモリ35からメインメモリ32にロードされてもよいし、外部メモリ44からメインメモリ32にロードされてもよいし、無線通信モジュール36またはローカル通信モジュール37を通じてサーバ装置や他のゲーム装置からメインメモリ32にロードされてもよい。なお、画像生成プログラム71に基づいてCPU311によって実行される画像生成処理については、公知技術を用いればよく、本発明との関連性も低いため、本明細書では詳細な説明を省略する。また、画像認識プログラム70および画像生成プログラム71が、1つの画像処理プログラムとして構成されてもよい。
仮想オブジェクトデータ72は、仮想空間に配置される仮想オブジェクト60に関する形状や色や模様等に関するデータである。
仮想カメラデータ73は、仮想空間に配置される仮想カメラの位置や姿勢等に関するデータである。
パターン定義データ74は、マーカー50を判別するために用いられる、マーカー50の図柄を示すデータであり、予め記憶されている(図49)。
実写画像データ75は、カメラ(外側撮像部(左)23aまたは外側撮像部(右)23b)によって撮像された実写画像の画像データである。
エッジ判定閾値76は、輪郭検出処理において、実写画像の各画素がエッジ画素であるか否かを判定するための閾値である。
エッジ画素情報77は、輪郭検出処理において、エッジ画素であると判定された画素に関する情報である。
直線情報78は、直線算出処理において生成および更新される直線に関する情報である。
頂点情報79は、頂点算出処理において算出される頂点に関する情報である。
マーカー位置情報80は、頂点検出処理によって生成され、マーカー位置補正処理によって必要に応じて更新される、実写画像におけるマーカー50の位置(マーカー50の黒領域の4頂点の位置)を示す情報である。マーカー位置情報80には、現在の実写画像から検出されたマーカー50の位置を示す情報(80a)だけでなく、直前の実写画像から検出されたマーカー50の位置を示す情報(80b)も含まれる。
動きベクトル情報81は、マーカー50が移動した方向を示す動きベクトルを示す情報である。
各種変数82は、画像認識プログラム70や画像生成プログラム71の実行時に利用される各種変数(例えば、白領域輝度Lw、黒領域輝度Lb、閾値D1、閾値D2、所定値Aなど)である。
まず、図74を参照して、画像認識プログラムに基づいてCPU311によって実行される画像認識処理全体の流れを説明する。
ステップS1において、CPU311は、カメラ(外側撮像部(左)23aまたは外側撮像部(右)23b)によって撮像された実写画像を取得して、メインメモリ32に格納する。
ステップS2において、CPU311は、輪郭検出処理を行う。輪郭検出処理の具体的な流れについては、図75を参照して後述する。
ステップS3において、CPU311は、ステップS2の輪郭検出処理において輪郭が検出されたかどうかを判断し、輪郭が検出された場合には処理はステップS4に進み、そうでない場合には処理はステップS9に進む。
ステップS4において、CPU311は、頂点検出処理を行う。頂点検出処理の具体的な流れについては、図76を参照して後述する。
ステップS5において、CPU311は、ステップS4の頂点検出処理において頂点が検出されたかどうかを判断し、頂点が検出された場合には処理はステップS6に進み、そうでない場合には処理はステップS9に進む。
ステップS6において、CPU311は、粗判別処理を行う。粗判別処理の具体的な流れについては、図77を参照して後述する。
ステップS7において、CPU311は、ステップS6の粗判別処理の結果に基づいて、マーカー50の候補となるような頂点が存在するかどうかを判断し、マーカー50の候補となるような頂点が検出された場合には処理はステップS8に進み、そうでない場合には処理はステップS12に進む。
ステップS8において、CPU311は、図柄判別処理を行う。図柄判別処理の具体的な流れについては、図78を参照して後述する。
ステップS9において、CPU311は、直前の実写画像におけるマーカー50の位置(すなわち、直前の実写画像において検出された頂点の位置または直前の実写画像において決定されたサンプル点の位置)に基づいて、図柄判別処理を行う。
ステップS10において、CPU311は、ステップS8またはステップS9の図柄判別処理においてマーカー50が検出されたかどうかを判断し、頂点が検出された場合には処理はステップS11に進み、そうでない場合には処理はステップS12に進む。
ステップS11において、CPU311は、マーカー位置補正処理を行う。マーカー位置補正処理の具体的な流れについては、図79を参照して後述する。
ステップS12において、CPU311は、画像認識処理を終了するかどうかを判断し、画像認識処理を続行する場合にはステップS1に戻り、画像認識処理を終了する場合には画像認識プログラムの実行を終了する。
次に、図75を参照して、画像認識プログラムに基づいてCPU311によって実行される輪郭検出処理の流れを説明する。
ステップS21において、CPU311は、注目画素P(n)を決定する。
ステップS22において、CPU311は、L(n−8)−L(n)が60以上かどうかを判定し、60以上である場合にはステップS23に進み、そうでない場合にはステップS34に進む。
ステップS23において、CPU311は、変数kに初期値として8を代入する。
ステップS24において、CPU311は、L(n−k−1)がL(n−k)よりも小さいかどうかを判定し、L(n−k−1)がL(n−k)よりも小さい場合にはステップS25に進み、そうでない場合にはステップS26に進む。
ステップS25において、CPU311は、変数kをインクリメントする。
ステップS26において、CPU311は、L(n−k)を白領域輝度値Lwとして決定する。
ステップS27において、CPU311は、L(n)がL(n+2)よりも小さいかどうかを判定し、L(n)がL(n+2)よりも小さい場合にはステップS28に進み、そうでない場合には処理はステップS30に進む。
ステップS28において、CPU311は、Lw−L(n+2)が60以上かどうかを判定し、60以上である場合にはステップS29に進み、そうでない場合にはステップS30に進む。
ステップS29において、CPU311は、L(n+2)を黒領域輝度値Lbとして決定する。
ステップS30において、CPU311は、L(n)を黒領域輝度値Lbとして決定する。
ステップS31において、CPU311は、LwとLbの平均値をエッジ判定閾値として決定する。
ステップS32において、CPU311は、エッジ判定閾値に基づいて起点エッジ画素を検出する。当該起点エッジ画素の座標は、エッジ画素情報としてメインメモリ32に格納される。
ステップS33において、CPU311は、起点エッジ画素を起点として隣接するエッジ画素を順次辿っていくエッジ辿り処理を実行する。当該エッジ辿り処理で順次検出されるエッジ画素の座標は、エッジ画素情報としてメインメモリ32に順次格納される。
ステップS34において、CPU311は、次の注目画素が存在するかどうかを判定し、存在する場合にはステップS21に戻り、そうでない場合には(すなわち、実写画像の全ての注目画素候補についての処理が完了した場合には)輪郭検出処理を終了する。
次に、図76を参照して、画像認識プログラムに基づいてCPU311によって実行される頂点検出処理の流れを説明する。
ステップS41において、CPU311は、最初の直線(すなわち、起点エッジ画素Pe(0)からエッジ画素Pe(5)までを結んだベクトルV(0−5)に対応する直線Li(0−5))を生成し、当該直線を示すデータをメインメモリ32に格納する。
ステップS42において、CPU311は、生成された直線と、当該直線に続くベクトルとが同一直線上にあるかどうかを、直線に対するベクトルの角度に基づいて判定する(図24参照)。そして、同一直線上にあると判定された場合には、ステップS43に進み、そうでない場合にはステップS44に進む。
ステップS43において、CPU311は、直線を更新する。具体的には、直線の後端からベクトルの先端までに含まれるサンプルエッジ画素に基づいて、最小自乗法により直線を算出し、当該算出結果に応じて直線を更新する(すなわち、メインメモリ32に格納されている当該直線を示すデータを更新する)。
ステップS44において、CPU311は、直線と、当該直線に続くベクトルとの交点において黒領域が凸角となっているかどうかを、直線に対するベクトルの角度に基づいて判定する(図24参照)。そして、凸角となっていると判定された場合にはステップS45に進み、そうでない場合にはステップS47に進む。
ステップS45において、CPU311は、ベクトルに対応する直線を新たに生成し、当該新たに生成した直線を示すデータをメインメモリ32に新たに格納する。
ステップS46において、CPU311は、黒領域の輪郭を一周し終えた(すなわち、起点エッジ画素に戻ってきた)かどうかを判断し、一周し終えた場合にはステップS49に進み、そうでない場合にはステップS42に戻る。
ステップS47において、CPU311は、直線算出処理(すなわちステップS42〜ステップS46の処理)が反時計回りに行われているかどうかを判断し、反時計回りに行われている場合にはステップS48に進み、そうでない場合にはステップS49に進む。なお、本実施形態では、直線算出処理は最初に反時計回りで開始されるものとする。
ステップS48において、CPU311は、直線算出処理を反時計回りから時計回りへと変更する。
ステップS49において、CPU311は、メインメモリ32に格納されている複数の直線を表すデータに基づいて、それらの複数の直線の中に、同一直線上かつ同一方向の複数の直線が存在するかどうかを判断する。そして、同一直線上かつ同一方向の複数の直線が存在する場合にはステップS50に進み、そうでない場合にはステップS51に進む。
ステップS50において、CPU311は、同一直線上かつ同一方向の複数の直線を、1つの直線に統合し、メインメモリ32に格納されている複数の直線に関するデータを更新する。
ステップS51において、CPU311は、メインメモリ32に格納されている複数の直線に関するデータに基づいて、これら複数の直線の中から4つの直線を選出する。具体的には、各直線の長さを計算し、最も長い直線と2番目に長い直線と3番目に長い直線と4番目に長い直線を選出する。
ステップS52において、CPU311は、上記4つの直線の交点の位置を計算することによって、黒領域の4つの頂点の位置を算出する。そして、当該4つの頂点の位置をメインメモリ32に格納して、頂点検出処理を終了する。
次に、図77を参照して、画像認識プログラムに基づいてCPU311によって実行される粗判別処理の流れを説明する。
ステップS61において、CPU311は、頂点検出処理において検出された4頂点が、除外条件Aを満たすかどうかを判断する。除外条件Aとは、前述したように、いずれかの隣り合う2頂点の距離が近すぎる場合である。そして、除外条件Aを満たす場合にはステップS65に進み、そうでない場合にはステップS62に進む。
ステップS62において、CPU311は、頂点検出処理において検出された4頂点が、除外条件Bを満たすかどうかを判断する。除外条件Bとは、前述したように、いずれかの頂点と当該頂点に隣接しない2辺のいずれかとの距離が近すぎる場合である。そして、除外条件Bを満たす場合にはステップS65に進み、そうでない場合にはステップS63に進む。
ステップS63において、CPU311は、頂点検出処理において検出された4頂点が、除外条件Cを満たすかどうかを判断する。除外条件Cとは、前述したように、いずれかの対向する2辺の直線が概ね同一方向である場合である。そして、除外条件Cを満たす場合にはステップS65に進み、そうでない場合にはステップS64に進む。
ステップS64において、CPU311は、頂点検出処理において検出された4頂点が、除外条件Dを満たすかどうかを判断する。除外条件Dとは、前述したように、凹角が含まれている場合である。そして、除外条件Dを満たす場合にはステップS65に進み、そうでない場合には粗判別処理を終了する。
ステップS65において、CPU311は、頂点検出処理において検出された4頂点を、図柄判別処理の処理対象から除外する(例えば、当該4頂点に関するデータをメインメモリ32から削除する)。そして、粗判別処理を終了する。
次に、図78を参照して、画像認識プログラムに基づいてCPU311によって実行される図柄判別処理の流れを説明する。
ステップS71において、CPU311は、頂点検出処理で検出された4頂点で囲まれる四角形の4辺のうち、いずれか対向する2辺を選択する。
ステップS72において、CPU311は、ステップS71で選択した2辺が平行(概ね平行である場合も含む)であるかどうかを判定し、平行である場合にはステップS73に進み、そうでない場合にはステップS74に進む。
ステップS73において、CPU311は、ステップS71で選択した2辺のそれぞれを16等分する。
ステップS74において、CPU311は、ステップS71で選択した2辺のそれぞれを不均等に(例えば、図53〜図55に示す方法で)16分割する。
ステップS75において、CPU311は、頂点検出処理で検出された4頂点で囲まれる四角形の4辺のうち、ステップS71において選択しなかった方の対向する2辺を選択する。
ステップS76において、CPU311は、ステップS75で選択した2辺が平行(概ね平行である場合も含む)であるかどうかを判定し、平行である場合にはステップS77に進み、そうでない場合にはステップS78に進む。
ステップS77において、CPU311は、ステップS75で選択した2辺のそれぞれを16等分する。
ステップS78において、CPU311は、ステップS75で選択した2辺のそれぞれを不均等に(例えば、図53〜図55に示す方法で)16分割する。
ステップS79において、CPU311は、頂点検出処理で検出された4頂点で囲まれる四角形の4辺を分割することによって決定されたサンプル点の画素値と、パターン定義データにおいて定義されているサンプル点の画素値とに基づいて、これらの類似度を表す相関係数を計算する。
ステップS80において、CPU311は、ステップS79において計算された相関係数に基づいて、頂点検出処理で検出された4頂点で囲まれる領域に表示されている図柄と、マーカー50の図柄とが一致するか否か判別する。そして、図柄が一致する場合にはステップS81に進み、そうでない場合には図柄判別処理を終了する。
ステップS81において、CPU311は、実写画像におけるマーカー50の4頂点(左上頂点,左下頂点,右下頂点,右上頂点)の座標を、マーカー位置情報としてメインメモリ32に記憶する。
次に、図79を参照して、画像認識プログラムに基づいてCPU311によって実行されるマーカー位置補正処理の流れを説明する。
ステップS91において、CPU311は、実写画像上でのマーカー50の大きさを計算し、その結果をメインメモリ32に格納する。
ステップS92において、CPU311は、現在の実写画像から検出されたマーカーと同一のマーカーが直前の実写画像に存在したかどうかを判断し、存在した場合にはステップS93に進み、そうでない場合にはマーカー位置補正処理を終了する(すなわち、現在の実写画像から検出されたマーカーの位置を補正せずにそのまま利用する)。なお、現在の実写画像から検出されたマーカーと同一のマーカーが直前の実写画像に存在したかどうかどうかは、例えば、ステップS91で計算されたマーカー50の大きさに基づいて、図72を参照して説明したような方法によって、判断することができる。
ステップS93において、CPU311は、ステップS91で計算されたマーカー50の大きさに基づいて、閾値D1およびD2を計算し(図68、図69)、メインメモリ32に格納する。
ステップS94において、CPU311は、マーカー50の移動量がD1未満かどうかを判断し、D1未満である場合にはステップS95に進み、そうでない場合にはステップS96に進む。
ステップS95において、CPU311は、図柄判別処理において検出されたマーカー50の位置を、前回検出されたマーカーの位置へと補正する。そして、マーカー位置補正処理を終了する。
ステップS96において、CPU311は、マーカー50の移動量がD2未満かどうかを判断し、D2未満である場合にはステップS97に進み、そうでない場合にはマーカー位置補正処理を終了する(すなわち、現在の実写画像から検出されたマーカーの位置を補正せずにそのまま利用する)。
ステップS97において、CPU311は、マーカー50の動きベクトルを計算し、当該動きベクトルと過去の動きベクトルとに基づいて所定値Aを決定する。具体的には、これらの動きベクトルに基づいて、実写画像においてマーカー50が一定方向に継続して移動しているかどうかを判定し、一定方向に継続して移動している場合にはAの値を大きくし、そうでない場合にはAの値を小さくする。ここで計算された動きベクトルは、動きベクトル情報81としてメインメモリ32に格納される。
ステップS98において、CPU311は、直前の実写画像におけるマーカー50の位置と現在の実写画像におけるマーカー50の位置とを結ぶ線分を(1−A):Aの比率で内分する点に、マーカー50の位置を補正する。そして、マーカー位置補正処理を終了する。
(変形例)
なお、上記実施形態では、(1)輪郭検出処理、(2)頂点検出処理、(3)粗判別処理、(4)図柄判別処理、および(5)マーカー位置補正処理に関して、それぞれ、具体的な処理方法を説明したが、これらの処理のうちの1以上の処理を、公知技術で置き換えても構わない。
また、画像認識処理の処理対象となる画像は、カメラからリアルタイムに順次取得される実写画像に限らず、例えば、過去にカメラによって撮像されてデータ保存用内部メモリ35等に保存されている画像であってもよいし、他の装置から受信した画像であってもよいし、外部記憶媒体を通じて取得した画像であってもよい。
また、画像認識処理の認識対象は、マーカー50の黒領域に限らず、画像に含まれる任意の物体(例えば、人の顔や手など)または図柄であってもよい。
また、画像認識処理の処理結果は、AR技術に限らず、任意の他の用途にも利用することができる。
また、本実施形態では、ゲーム装置10において画像処理(画像認識処理および画像生成処理)を実行しているが、これに限らず、据え置き型ゲーム装置、パーソナルコンピュータ、携帯電話などの任意の情報処理装置(または情報処理システム)において画像処理を実行してもよい。
また、本実施形態では、上記画像処理を1台のゲーム装置10において実行しているが、他の実施形態では、互いに通信可能な複数の情報処理装置によって分担して実行してもよい。
また、本実施形態では、画像認識プログラム等を1つのCPU311によって実行しているが、他の実施形態では、画像認識プログラム等を複数のCPU311によって分担して実行してもよい。
また、本実施形態では、画像認識プログラム等に基づいてCPU311によって上記画像処理が実行されるが、他の実施形態では、画像処理の一部をCPU311以外のハードウェアによって実現してもよい。
また、上記実施形態では、カメラによって撮像された実写画像に仮想空間画像を合成して上側LCD22に表示している(ビデオシースルー方式)が、これに替えて、透過型の表示画面に仮想オブジェクトを表示し、当該透過型の表示画面を通じて見える実世界にあたかも仮想オブジェクトが実在するかのようにユーザに視認されるような光学シースルー方式を採用してもよい。