以下、添付図面を参照し、本発明の好適な実施形態について詳細に説明する。
[第1の実施形態]
本実施形態で用いるCG(コンピュータグラフィックス)画像(仮想空間画像)には、予め設定されたクロマキー色を有する画素群で構成されている領域(クロマキー領域)が存在している。そして本実施形態では、ユーザの右目に提示するために生成したCG画像(仮想空間画像)と現実空間画像とをクロマキー合成したものを、このユーザの右目に対して提示する。更に、左目に提示するために生成したCG画像(仮想空間画像)と現実空間画像とをクロマキー合成したものを、このユーザの左目に対して提示する。
そして本実施形態では、係る構成を前提として、次のような構成を有していることを特徴とする。即ち、一方の目に提示する為に生成したCG画像中のクロマキー領域と非クロマキー領域との境界部分に、クロマキー処理時にエラー箇所が生じても、それぞれの目に提示するCG画像は類似しているという性質を利用し、それぞれの目に対して良好なクロマキー合成結果を提示する。
図1は、本実施形態に係るシステムを、ユーザが使用している様子を示す図である。係るシステムの構成自体は、周知のMR(Mixed Reality)システムである。
図1において1000は、画像処理装置としてのビデオシースルー型のHMD(ヘッドマウントディスプレイ)であり、周知の頭部装着型表示装置で構成することができる。2000は、係るHMD1000を頭部に装着しているユーザである。HMD1000の詳細な構成については後述するが、HMD1000には、ユーザ2000の右目に画像を提示するための画面、左目に画像を提示するための画面が設けられている。従ってユーザ2000は、右目、左目でそれぞれの画面を見ることで、それぞれの目に対応した画像を眼前に見ることができる。
3000はコンピュータ(計算機)であり、ユーザ2000の右目に提示する為のCG画像(右目用CG画像)、左目に提示する為のCG画像(左目用CG画像)を生成する。そして生成したそれぞれのCG画像を無線でHMD1000に送信する。なお、CG画像を送信する際、無線帯域を小さくするために、送信するそれぞれのCG画像を圧縮してから送信する。圧縮されたCG画像はHMD1000側で伸張してから用いる。
ここで、計算機3000によって圧縮された状態で右目用CG画像、左目用CG画像を、無線でHMD1000に送信し、HMD1000側でこれらのCG画像を受信して取り扱う場合、取り扱うCG画像にノイズが重畳されている(画像情報の欠損も含む)ケースが生じうる。これは上述の通り、無線でCG画像を送信したり、圧縮されたCG画像を伸張したりすることに起因する。特に、CG画像中には上述の通り、クロマキー領域が存在している。従って、係るクロマキー領域と非クロマキー領域との境界部分にノイズが生じる(境界部分にエラー箇所が生じる)と、このCG画像を現実空間画像とクロマキー合成しても、係る境界部分における合成結果にもノイズが生じてしまう。
本実施形態では、右目用CG画像と左目用CG画像とが類似した画像であるという性質を利用し、例え一方側のCG画像におけるクロマキー領域と非クロマキー領域との境界部分にエラー箇所が生じても、他方のCG画像を用いて係るエラー箇所を補正する。これにより、良好なクロマキー合成結果を得ることにある。
図3は、一般的なクロマキー合成処理を説明する図である。図3において300は現実空間画像である。301はCG画像で、斜線部分はクロマキー領域である。302は、CG画像301と現実空間画像300とをクロマキー合成したことで得られる画像(合成画像)である。即ち、CG画像301を現実空間画像300上に重ね合わせる場合に、クロマキー領域については透過させて合成させたものが、合成画像302となる。
図4は、HMD1000の機能構成を示すブロック図である。図4に示す如く、HMD1000は大まかにはCG画像受信部1010、左目カメラ1001、右目カメラ1002、クロマキー合成部1100、左目LCD(液晶画面)1003、右目LCD1004により構成されている。
図2は、HMD1000の外観例を示す図である。図2に示す如く、左目LCD1003、右目LCD1004のそれぞれの近傍位置にはそれぞれ、左目カメラ1001、右目カメラ1002が装着されている。左目カメラ1001、右目カメラ1002はそれぞれ、現実空間の動画像を撮像するものであり、撮像した各フレームの画像は、図4に示すクロマキー合成部1100に入力される。
先ず、図4に示したHMD1000の構成のうち、CG画像受信部1010について説明する。
図4に示す如く、CG画像受信部1010は、無線画像受信部1011、左目伸張部1012、右目伸張部1013により構成されている。
計算機3000(外部装置)から無線で送信された、右目用CG画像(圧縮済み)、左目用CG画像(圧縮済み)は、無線画像受信部1011で受信される。無線画像受信部1011は受信した右目用CG画像、左目用CG画像をそれぞれ、右目伸張部1013、左目伸張部1012に転送する。
ここで、上述の通り、無線画像受信部1011が受信した右目用CG画像、左目用CG画像には、無線通信に起因したノイズが重畳されている可能性がある。また、無線画像受信部1011は、無線通信によって受信した情報に欠損が生じた場合には、周知の技術で係る欠損を補間したりするので、計算機3000から送信したCG画像と、無線画像受信部1011から送出されるCG画像とには差が生じうる。
左目伸張部1012は、圧縮済みの左目用CG画像を伸張し、伸張後の左目用CG画像を、後段の左目色判定部1101、左目画像切り替え部1109に送出する。右目伸張部1013も同様に、圧縮済みの右目用CG画像を伸張し、伸張後の右目用CG画像を、後段の右目色判定部1102、右目画像切り替え部1111に送出する。
ここで、上述の通り、左目伸張部1012、右目伸張部1013のそれぞれが伸張したCG画像には、画像伸張に起因するノイズが重畳されている可能性がある。
次に、クロマキー合成部1100について説明する。図4に示す如く、クロマキー合成部1100は、左目色判定部1101、右目色判定部1102、対応点検出部1103、左目傾き検出部1104、右目傾き検出部1105、誤り判定部1106、補正箇所判定部1107を有している。更に、クロマキー合成部1100は、左目マスク補正部1108、左目画像切り替え部1109、右目マスク補正部1110、右目画像切り替え部1111を有する。
最初に、クロマキー合成部1100の基本的な動作、即ち、CG画像に対するノイズを考慮せずに、従来通りのクロマキー合成処理を行う場合の、クロマキー合成部1100の動作について、図4,5を用いて説明する。図5は、クロマキー合成部1100が行うクロマキー合成処理を示す図である。
左目伸張部1012から送出された伸張済みの左目用CG画像は上述の通り、左目色判定部1101、左目画像切り替え部1109に対して送出される。
左目色判定部1101は、伸張済みの左目用CG画像を構成する各画素の画素値を参照し、参照した画素値が、予め設定されたクロマキー色を示すか否かをチェックする。そして、クロマキー色を示す画素値を有する画素に対してはビット「1」を割り当て、クロマキー色を示さない画素値を有する画素に対してはビット「0」を割り当てる。
例えば、画素値が8ビットで構成されている場合、クロマキー色をR=0,G=0,B>250と規定しても良い。この場合、左目色判定部1101は、左目用CG画像を構成する各画素のうち、R=0、G=0、B>250を満たす画素値を有する画素に対してはビット「1」を割り当て、満たさない画素値を有する画素に対してはビット「0」を割り当てる。即ち、左目色判定部1101は、左目用CG画像においてクロマキー領域内の画素の画素値を「1」、クロマキー領域外の画素の画素値を「0」に置き換えた2値画像を生成することになる。以下ではこの2値画像を「マスク画像」と呼称する。尚、このマスク画像は、必ずしも1画面分持つ必要は無く、処理に必要な数ライン分のバッファに選択用画像として記憶することでも充分である。
図5において500はCG画像であり、斜線部分がクロマキー領域である。従ってこの場合、斜線部分を構成する各画素に対してはビット「1」を割り当て、斜線部分以外を構成する各画素に対してはビット「0」を割り当てる。503は、係るビットの集合で構成されているマスク画像である。
一方、右目色判定部1102には、右目伸張部1013から送出された、伸張済みの右目用CG画像が入力されるので、右目色判定部1102は左目色判定部1101と同様の処理を行い、右目用CG画像に対応するマスク画像を生成する。
左目色判定部1101が生成したマスク画像は対応点検出部1103、左目マスク補正部1108に入力され、右目色判定部1102が生成したマスク画像(マスク画像)は対応点検出部1103、右目マスク補正部1110に入力される。ここではクロマキー合成処理の基本的な説明を行っているので、左目マスク補正部1108、右目マスク補正部1110による補正処理は行わないものとする。従って、左目マスク補正部1108は、受けたマスク画像をそのまま左目画像切り替え部1109に送出するし、右目マスク補正部1110は、受けたマスク画像をそのまま右目画像切り替え部1111に送出する。
一方、左目カメラ1001は上述の通り、ユーザ2000の左目に対して提示する現実空間の動画像を撮像するためのものであり、撮像した各フレームの画像(現実空間画像)は順次、左目画像切り替え部1109に入力される。また、右目カメラ1002は上述の通り、ユーザ2000の右目に対して提示する現実空間の動画像を撮像するためのものであり、撮像した各フレームの画像(現実空間画像)は順次、右目画像切り替え部1111に入力される。図5において、501は、カメラによって撮像された現実空間画像である。
左目画像切り替え部1109は、左目色判定部1101から受けたマスク画像を用いて、左目伸張部1012から受けた左目用CG画像と、左目カメラ1001から受けた現実空間画像とのクロマキー合成を行う。即ち、クロマキー合成によって生成する合成画像のx(1≦x≦X)番目の画素として、左目用CG画像のx番目の画素を用いるのか、現実空間画像のx番目の画素を用いるのかを、マスク画像のx番目の画素に対するビット値に基づいて決定する。ここでXは左目用CG画像(右目用CG画像、合成画像についても同じ)の全画素数を示す。
マスク画像におけるx番目の画素のビット値が「1」である場合には、合成画像におけるx番目の画素として、現実空間画像におけるx番目の画素を用いる。一方、マスク画像におけるx番目の画素のビット値が「0」である場合には、合成画像におけるx番目の画素として、左目用CG画像におけるx番目の画素を用いる。このようにして、マスク画像を構成する各ビット値に応じて、左目用CG画像、現実空間画像から選択的に画素を選択し、合成画像における画素とすることで、合成画像を生成することができる。なお、係るクロマキー合成処理については周知のものであるので、これ以上の説明は省略する。
図5において504はクロマキー合成による合成画像である。
一方、右目画像切り替え部1111は左目画像切り替え部1109と同様の処理を行う。即ち、右目色判定部1102から受けたマスク画像を用いて、右目伸張部1013から受けた右目用CG画像と、右目カメラ1002から受けた現実空間画像とのクロマキー合成を行う。
そして、左目画像切り替え部1109によって生成した合成画像は左目LCD1003に送出し、右目画像切り替え部1111によって生成した合成画像は右目LCD1004に送出する。これによりユーザ2000の左目、右目の眼前に、それぞれの目に対応する合成画像が表示されることになる。そして係る合成画像は、右目用、左目用の何れであっても、CG画像におけるクロマキー領域が、現実空間画像において対応する領域に置き換わったものとなる。
次に、クロマキー領域と非クロマキー領域との境界部分にエラー箇所が発生しても、右目用CG画像と左目用CG画像とは類似した画像であるという性質を利用し、良好なクロマキー合成結果を得る為のクロマキー合成部1100の動作について説明する。
図6は、CG画像(左目用CG画像、右目用CG画像の何れでも良い)中の画像情報が欠損したことにより、このCG画像上にノイズが重畳された例を示す図である。図6に示す如く、CG画像中のポット600の取っ手の一部分近傍を拡大すると、クロマキー領域の一部(黒塗り部分)における画像情報が欠損しており、欠損した部分を構成する各画素の画素値は、R=0、G=0、B>250とはなっていない。即ち、係る部分は、クロマキー領域ではなくなっている。
従って、係るCG画像と現実空間画像とのクロマキー合成を行うと、この黒塗り部分の部分は、CG画像の画素値がそのまま残り、合成画像上でノイズ(エラー箇所)として残ることになる。本実施形態では、係るエラー箇所を補正し、良好なクロマキー合成結果を得ることを目的とする。より具体的には、左目用CG画像と右目用CG画像とを比較し、一方側にエラー箇所があれば、他方のCG画像を用いてこのエラー箇所を補正する。
ここで、本実施形態に係るエラー箇所の補正方法について簡単に説明する。図7は、エラー箇所の補正について説明する図である。図7において790は左目用CG画像から生成したマスク画像(左目用マスク画像)において、クロマキー領域と隣接する非クロマキー領域の一部分(画素群)である。また、780は右目用CG画像から生成したマスク画像(右目用マスク画像)において、クロマキー領域と隣接する非クロマキー領域の一部分(画素群)である。画素群780中において斜線部分で示している画素群は、エラー箇所である。
先ず、画素群790のうちクロマキー領域と接する画素720における、境界部分の傾き(700で示す直線の傾き)を求める。そして、画素群780において、画素720と位置的に対応する画素(対応画素)における、境界部分の傾き(701で示す直線の傾き)を求める。ここで、左目用CG画像と右目用CG画像とは類似している画像であるので、それぞれの傾きはほぼ同じであると考えるのが自然である。従って、それぞれの傾きに大きな差がある場合、左目用CG画像、右目用CG画像の何れかにエラー箇所があると考えるのが自然である。
更に、左目用CG画像、右目用CG画像の何れにエラー箇所があるのかを判定するためには、画素720よりも前に、画素群790のうちクロマキー領域と接する画素として選択された1以上の画素のそれぞれについて求めた傾きを参照する。そして、画素720について求めた傾きと、画素720より1つ前に選択された画素について求めた傾きとの差、画素720について求めた傾きと、画素720より2つ前に選択された画素について求めた傾きとの差、というように、幾つかの差を求める。そして、差の変化が予め定めた変化以上であるのかをチェックする。
同様に、対応画素よりも前に、画素群780のうちクロマキー領域と接する画素として選択された1以上の画素のそれぞれについて求めた傾きを参照する。そして、対応画素について求めた傾きと、対応画素より1つ前に選択された画素について求めた傾きとの差、対応画素について求めた傾きと、対応画素より2つ前に選択された画素について求めた傾きとの差、というように、幾つかの差を求める。そして、差の変化が予め定めた変化以上であるのかをチェックする。
そして、画素群790側でのチェックと、画素群780側でのチェックとを行った結果、差の変化が予め定めた変化以上であると判定した方に、エラー箇所があると判断する。図7では、画素群780側にエラー箇所がある。従ってこの場合、対応画素における傾きが、直線700の傾きとなるように、エラー箇所を補正する。
以下では、係る処理をより具体的に説明する。なお、以下説明する動作は、上記基本的な動作に加えて行うものである。
対応点検出部1103は、左目色判定部1101、右目色判定部1102からそれぞれ送出された左目用マスク画像、右目用マスク画像を受ける。そして、一方のマスク画像上の非クロマキー領域(ビット値が「0」の領域)において、クロマキー領域(ビット値が「1」の領域)と隣接する部分を構成している各画素と位置的に対応する、他方のマスク画像上の画素位置(対応位置)を特定する。対応点検出部1103が行う画素位置特定処理については従来から様々な手法が提案されており、本実施形態では何れの手法を用いても良いのであるが、例えば、以下説明するような手法を用いても良い。
先ず、以下の点を仮定する。
・ 左目カメラ1001、右目カメラ1002は理想的に並行に配置されており、エピポーラ線は左右の画像の同じライン上にある。
・ CG画像においてクロマキー領域以外の領域(即ち仮想物体の画像)は画面の端にかからない。
このような仮定を前提とすることで、左目用マスク画像、右目用マスク画像をライン毎に比較するだけで、対応する画素の検出を行うことができる。
対応点検出部1103は、右目用マスク画像、左目用マスク画像を受けると先ず、それぞれのマスク画像で同じラインを参照し、ライン上における非クロマキー領域を特定する。
図8は、右目用マスク画像、左目用マスク画像のそれぞれで同じラインを参照した場合に、ライン上における非クロマキー領域を特定する処理を説明する図である。なお、図8を用いて後述する処理は右目用マスク画像、左目用マスク画像の何れに対しても同じであるので、係る説明では右目用マスク画像を例に取り説明する。
図8(a)は、右目用マスク画像800の一例を示す図である。図8(a)では、右目用マスク画像800は横サイズを640画素としている。右目用マスク画像800において810,820はそれぞれ非クロマキー領域(ビット値が「0」の領域)であり、それ以外の領域はクロマキー領域(ビット値が「1」の領域)である。
対応点検出部1103は、右目用マスク画像800中のライン830を処理する場合、先ず、ライン830を構成する各画素を一方から順に参照する。そして、非クロマキー領域の開始位置、終了位置(画素値が「0」である画素が連続して配されている画素列の開始位置、終了位置)を検出する。
図8(b)は、ライン830を構成する各画素の分布を示す図である。図8(b)に示す如く、非クロマキー領域を構成する画素群は、x=60〜180、340〜500に分布している。従って、図8(c)に示す如く、ライン830上では、x=60〜180に非クロマキー領域が存在していることを示すために、開始位置の欄には「60」を登録し、対応する終了位置の欄には「180」を登録する。同様に、もう1つの非クロマキー領域がx=340〜500に存在していることを示すために、開始位置の欄には「340」を登録し、対応する終了位置の欄には「500」を登録する。
このように、非クロマキー領域毎に、その開始位置と終了位置とをセットにして登録する。係るテーブルは、ライン毎に生成されるものであるので、例えば、右目用マスク画像800のライン数が480であったとすると、係るテーブルは480個生成されることになる。しかし、非クロマキー領域が存在しないラインについては係るテーブルは作成されないので、この場合には、作成されるテーブルの数は480よりも少なくなる。
なお、図8(c)では、テーブル形式で開始位置と終了位置とを登録しているが、データの管理形態についてはこれに限定するものではない。
上述の通り、対応点検出部1103は、係る処理を左目用マスク画像についても行うので、結果として、図8(c)に例示したテーブルが、左目用マスク画像に対しても生成されることになる。ここで、右目用マスク画像について生成したテーブルを右目用テーブル、左目用マスク画像について生成したテーブルを左目用テーブルと呼称する。
この場合、右目用テーブルにおいてm(m≧1)行目に登録されている開始位置、終了位置で特定される非クロマキー領域と、左目用テーブルにおいてm行目に登録されている開始位置、終了位置で特定される非クロマキー領域とは対応しているものとして扱う。そして、対応点検出部1103は、左目用テーブルのm行目に登録されている開始位置、終了位置を左目傾き検出部1104に送出すると共に、右目用テーブルのm行目に登録されている開始位置、終了位置を右目傾き検出部1105に送出する。
以下の説明ではm=nの場合について説明する。
左目傾き検出部1104は、左目用テーブルのn行目に登録されている開始位置、終了位置を受けると、開始位置、終了位置における、クロマキー領域と非クロマキー領域との境界部分の傾きを求める。ここで、左目傾き検出部1104が行う処理の詳細について、図9を用いて説明する。
図9は、非クロマキー領域(斜線で示した部分)を構成する各画素と、クロマキー領域を構成する各画素と、を示す図である。同図において900は、左目用テーブルのn行目に登録されている開始位置で特定される画素位置であるとする。901は、画素900とx座標値が同じ1ライン上の位置からx座標値が小さい方向に画素値を参照した場合に、参照した画素値が「1」となる1つ手前の位置における画素である。902は、画素900とx座標値が同じ2ライン上の位置からx座標値が小さい方向に画素値を参照した場合に、参照した画素値が「1」となる1つ手前の位置における画素である。
ここで、画素900の位置における傾きを求めるためには、先ず、画素900の位置と画素901の位置とを通る直線の傾きを求めると共に、画素900の位置と画素902の位置とを通る直線の傾きを求める。そしてそれぞれの傾きの平均値を求め、求めた平均値を、画素900の位置における傾きとしている。このようにして、左目傾き検出部1104は、開始位置における傾きを求めることができる。
次に、終了位置における傾きを求める処理について説明する。先ず、左目用テーブルのn行目に登録されている終了位置で特定される画素(画素P)とx座標値が同じ1ライン上の位置からx座標値が大きい方向に画素値を参照した場合に、参照した画素値が「1」となる1つ手前の位置における画素(画素Q)を特定する。次に、画素Pとx座標値が同じ2ライン上の位置からx座標値が大きい方向に画素値を参照した場合に、参照した画素値が「1」となる1つ手前の位置における画素(画素R)を特定する。そして、画素Pの位置と画素Qの位置とを通る直線の傾きを求めると共に、画素Pの位置と画素Rの位置とを通る直線の傾きを求める。そしてそれぞれの傾きの平均値を求め、求めた平均値を、画素Pの位置における傾きとする。
ここで、図9における画素901,902や、上記画素Q、画素Rといった、開始位置から求める2画素、終了位置から求める2画素の特定方法について、図10を用いて説明する。
図10(a)は、左目用テーブルのn行目に登録されている開始位置で特定される画素位置とx座標値が同じ1ライン上の位置、終了位置で特定される画素位置とx座標値が同じ1ライン上の位置が共に、クロマキー領域内の画素である場合を示す図である。図10(a)において1091は、左目用テーブルのn行目に登録されている開始位置で特定される画素位置、1093は、左目用テーブルのn行目に登録されている終了位置で特定される画素位置を示す。
図10(b)は、左目用テーブルのn行目に登録されている開始位置で特定される画素位置とx座標値が同じ1ライン上の位置、終了位置で特定される画素位置とx座標値が同じ1ライン上の位置が共に、非クロマキー領域内の画素である場合を示す図である。図10(b)において1081は、左目用テーブルのn行目に登録されている開始位置で特定される画素位置、1083は、左目用テーブルのn行目に登録されている終了位置で特定される画素位置を示す。
左目傾き検出部1104は先ず、左目用マスク画像において、左目用テーブルのn行目に登録されている開始位置で特定される画素位置とx座標値が同じ1ライン上の位置の画素の画素値が「1」であるか「0」であるのかをチェックする。係るチェックの結果、「1」である場合、即ち、左目用テーブルのn行目に登録されている開始位置で特定される画素位置とx座標値が同じ1ライン上の位置の画素がクロマキー領域に含まれている場合には、次の処理を行う。即ち、図10(a)に示す如く、先ず、画素位置1091とx座標値が同じ1ライン上の位置からx座標値が大きい方向に画素値を参照する。そして、参照した画素値が「0」となった最初の位置1092における画素を、「画素S1」として特定する。一方、係るチェックの結果、「0」である場合、即ち、左目用テーブルのn行目に登録されている開始位置で特定される画素位置とx座標値が同じ1ライン上の位置の画素が非クロマキー領域に含まれている場合には、次の処理を行う。即ち、図10(b)に示す如く、先ず、画素位置1081とx座標値が同じ1ライン上の位置からx座標値が小さい方向に画素値を参照する。そして、参照した画素値が「1」となる1つ手前の位置1082における画素を、「画素S1」として特定する。
次に左目傾き検出部1104は先ず、左目用マスク画像において、左目用テーブルのn行目に登録されている終了位置で特定される画素位置とx座標値が同じ1ライン上の位置の画素の画素値が「1」であるか「0」であるのかをチェックする。係るチェックの結果、「1」である場合、即ち、左目用テーブルのn行目に登録されている終了位置で特定される画素位置とx座標値が同じ1ライン上の位置の画素がクロマキー領域に含まれている場合には、次の処理を行う。即ち、図10(a)に示す如く、画素位置1093とx座標値が同じ1ライン上の位置からx座標値が小さい方向に画素値を参照した場合に、参照した画素値が「0」となった最初の位置1094における画素を、「画素E1」として特定する。一方、係るチェックの結果、「0」である場合、即ち、左目用テーブルのn行目に登録されている終了位置で特定される画素位置とx座標値が同じ1ライン上の位置の画素が非クロマキー領域に含まれている場合には、次の処理を行う。即ち、図10(b)に示す如く、画素位置1083とx座標値が同じ1ライン上の位置からx座標値が大きい方向に画素値を参照した場合に、参照した画素値が「1」となる1つ手前の位置1084における画素を、「画素E1」として特定する。
同様にして、左目用テーブルのn行目に登録されている開始位置で特定される画素位置とx座標値が同じ2ライン上の位置の画素の画素値が「1」であるか「0」であるのかに応じて、x座標値が小さい方向、大きい方向の何れかの方向に画素値を参照する。そして同様にして画素S2を特定する。また、左目用テーブルのn行目に登録されている終了位置で特定される画素位置とx座標値が同じ2ライン上の位置の画素の画素値が「1」であるか「0」であるのかに応じて、x座標値が小さい方向、大きい方向の何れかの方向に画素値を参照する。そして同様にして画素E2を特定する。
そして、左目傾き検出部1104は、左目用テーブルのn行目に登録されている開始位置で特定される画素と画素S1とを通る直線の傾きVSL1を求める。更に左目傾き検出部1104は、左目用テーブルのn行目に登録されている開始位置で特定される画素と画素S2とを通る直線の傾きVSL2を求める。そして、傾きVSL1と傾きVSL2との平均値VSL3を、左目用テーブルのn行目に登録されている開始位置(注目位置)におけるクロマキー領域と非クロマキー領域との境界部分の傾きとして求める。
同様に、左目傾き検出部1104は、左目用テーブルのn行目に登録されている終了位置で特定される画素と画素E1とを通る直線の傾きVEL1を求める。更に左目傾き検出部1104は、左目用テーブルのn行目に登録されている終了位置で特定される画素と画素E2とを通る直線の傾きVEL2を求める。そして、傾きVEL1と傾きVEL2との平均値VEL3を、左目用テーブルのn行目に登録されている終了位置におけるクロマキー領域と非クロマキー領域との境界部分の傾きとして求める。
そして、VSL1〜VSL3、VEL1〜VEL3を誤り判定部1106に対して出力する。
一方、右目傾き検出部1105は、左目傾き検出部1104と同様の処理を行い、右目用マスク画像から、それぞれ傾きVSL1〜VSL3に対応する傾きVSR1〜VSR3、傾きVEL1〜VEL3に対応する傾きVER1〜VER3を求める。そして求めた傾きVSR1〜VSR3、傾きVER1〜VER3を、誤り判定部1106に送出する。
誤り判定部1106は、傾きVSL3と傾きVSR3との差が閾値(ここでは例として10度)以上であるか否かをチェックする。係るチェックの結果、差が10度以上であれば、左目用CG画像、右目用CG画像の何れかにエラー箇所が存在するものと判断する。一方、傾きVSL3と傾きVSR3との差が閾値よりも小さければ、左目用CG画像、右目用CG画像の何れにもエラー箇所は存在しないものと判断する。
もちろん、右目用CG画像、左目用CG画像の何れかにエラー箇所が存在するか否かをチェックするための基準については係るものに限定するものではなく、様々なものが考え得る。また、他の基準を用いる場合、そのために求めるべき情報についてはもちろん、適宜求める必要がある。
誤り判定部1106は、右目用CG画像、左目用CG画像の何れかにエラー箇所が存在したか否かを示すフラグ情報と共に、VSL1〜VSL3,VSR1〜VSR3を補正箇所判定部1107に送出する。
補正箇所判定部1107は、係るフラグ情報を参照し、右目用CG画像、左目用CG画像の何れにエラー箇所が存在しているのかをチェックする。本実施形態では、クロマキー領域と非クロマキー領域との境界部分を曲線(直線を含む)と見なした場合に、曲線の形状が滑らかな方が、エラー箇所のない画像であると判断する。もちろん、係る判断基準は一例であり、他の判断基準を用いても良い。
本実施形態に係る補正箇所判定部1107は、誤り判定部1106から受けたフラグ値を参照し、係るフラグ値が「エラー箇所は存在しない」旨を示している場合には、何も処理は行わない。
一方、補正箇所判定部1107は、誤り判定部1106から受けたフラグ値が「エラー箇所は存在する」旨を示している場合には、傾きVSL1と傾きVSL2とがなす角度を求めると共に、傾きVSR1と傾きVSR2とがなす角度を求める。そして求めたそれぞれの角度のうち、角度が大きい方のマスク画像にエラー箇所が存在すると判断する。係る判断の結果、左目用マスク画像にエラー箇所が存在すると判断した場合には、傾きVSR1(VSR2でも良い)を、左目マスク補正部1108に送出する。一方、右目用マスク画像にエラー箇所が存在すると判断した場合には、傾きVSL1(VSL2でも良い)を、右目マスク補正部1110に送出する。
左目マスク補正部1108は、補正箇所判定部1107から傾きVSR1を受けると、左目用マスク画像において、画素S1のラインの1つ下のライン上における画素群のうち画素S1を通り、傾きVSR1を有する直線が通る画素(補正開始画素)を特定する。そして補正開始画素のx座標値が、左目用テーブルのn行目に登録されている開始位置のx座標値よりも小さい場合には、補正開始画素、補正開始画素と左目用テーブルのn行目に登録されている開始位置の画素との間の各画素、の画素値を「0」にする。一方、補正開始画素のx座標値が、左目用テーブルのn行目に登録されている開始位置のx座標値よりも大きい場合には、左目用テーブルのn行目に登録されている開始位置における画素、及びこの画素と補正開始画素との間の各画素の画素値を「1」にする。
図11は、左目用テーブルのn行目に登録されている開始位置のラインを補正する処理を説明する図である。同図において1192は画素S1、1199は、左目用テーブルのn行目に登録されている開始位置で特定される画素である。1198は補正開始画素である。上述の通り、左目用テーブルのn行目に登録されている開始位置のラインを構成する各画素のうち、画素1192を通り、傾きVSR1を有する直線が通る画素が、補正開始画素1198となっている。従ってこの場合、補正開始画素1198から画素1199までの間(補正開始画素1198を含む)の画素値を「0」とする。
一方、右目マスク補正部1110は、用いる傾きが異なるのみで、基本的には左目マスク補正部1108と同様の処理を行う。
また、誤り判定部1106は、傾きVEL3と傾きVER3との差が10度以上であるか否かをチェックする。係るチェックの結果、差が10度以上であれば、左目用CG画像、右目用CG画像の何れかにエラー箇所が存在するものと判断する。もちろん、右目用CG画像、左目用CG画像の何れかにエラー箇所が存在するか否かをチェックするための基準については係るものに限定するものではなく、様々なものが考え得る。また、他の基準を用いる場合、そのために求めるべき情報についてはもちろん、適宜求める必要がある。
誤り判定部1106は、右目用CG画像、左目用CG画像の何れかにエラー箇所が存在したか否かを示すフラグ情報と共に、VEL1〜VEL3,VER1〜VER3を補正箇所判定部1107に送出する。
補正箇所判定部1107は、右目用CG画像、左目用CG画像の何れにエラー箇所が存在しているのかをチェックする。本実施形態では、クロマキー領域と非クロマキー領域との境界部分を曲線(直線を含む)と見なした場合に、曲線の形状が滑らかな方が、エラー箇所のない画像であると判断する。もちろん、係る判断基準は一例であり、他の判断基準を用いても良い。
本実施形態に係る補正箇所判定部1107は、誤り判定部1106から受けたフラグ値を参照し、係るフラグ値が「エラー箇所は存在しない」旨を示している場合には、何も処理は行わない。
一方、補正箇所判定部1107は、誤り判定部1106から受けたフラグ値が「エラー箇所は存在する」旨を示している場合には、傾きVEL1と傾きVEL2とがなす角度を求めると共に、傾きVER1と傾きVER2とがなす角度を求める。そして求めたそれぞれの角度のうち、角度が大きい方のマスク画像にエラー箇所が存在すると判断する。係る判断の結果、左目用マスク画像にエラー箇所が存在すると判断した場合には、傾きVER1(VER2でも良い)を、左目マスク補正部1108に送出する。一方、右目用マスク画像にエラー箇所が存在すると判断した場合には、傾きVEL1(VEL2でも良い)を、右目マスク補正部1110に送出する。
また左目マスク補正部1108は、補正箇所判定部1107から傾きVER1を受けると、左目用マスク画像において、画素E1のラインの1つ下のライン上の画素群のうち画素E1を通り、傾きVER1を有する直線が通る画素(補正開始画素)を特定する。
そして補正開始画素のx座標値が、左目用テーブルのn行目に登録されている終了位置のx座標値よりも小さい場合には、左目用テーブルのn行目に登録されている終了位置における画素、及びこの画素と補正開始画素との間の各画素の画素値を「1」にする。一方、補正開始画素のx座標値が、左目用テーブルのn行目に登録されている終了位置のx座標値よりも大きい場合には、補正開始画素、補正開始画素と左目用テーブルのn行目に登録されている終了位置の画素との間の各画素の画素値を「0」にする。
一方、右目マスク補正部1110は、用いる傾きが異なるのみで、基本的には左目マスク補正部1108と同様の処理を行う。
以上の処理によりマスク画像におけるエラー箇所を補正することができるので、後は上述したように、このマスク画像を用いてクロマキー合成処理を行っても、合成結果にエラー箇所が生じることはない。
そして以上説明した処理を、左目用テーブル、右目用テーブルの全ての行について行うと、次のラインについて、同様の処理を繰り返す。
なお、本実施形態では、マスク画像についてのみ補正したが、係る補正の段階で、CG画像についても補正すると、より好ましい。例えば、左目用マスク画像に対して画素値を補正した画素が、係る補正の結果、非クロマキー領域に含まれた場合には、係る画素に対応する左目用CG画像中の画素(左画素)に対応する右目用CG画像中の画素の画素値を、左画素の画素値にコピーする。
図21は、HMD1000が、現実空間画像とCG画像とをクロマキー合成したものを、ユーザ2000の右目、左目に対して提示する為に行うメインの処理のフローチャートである。
先ず、ステップS2101では、左目画像切り替え部1109、右目画像切り替え部1111はそれそれ、左目カメラ1001、右目カメラ1002から送出された、左目用の現実空間画像、右目用の現実空間画像を取得する。
次にステップS2102では、無線画像受信部1011が、圧縮された右目用CG画像、左目用CG画像を受信(取得)する。
ステップS2103では、右目伸張部1013は、圧縮された右目用CG画像を伸張し、左目伸張部1012は、圧縮された左目用CG画像を伸張する。
ステップS2104では、左目色判定部1101は、左目用マスク画像を生成し、右目色判定部1102は、右目用マスク画像を生成する。
ステップS2105では、マスク画像の補正に係る一連の処理を行う。ステップS2105における処理の詳細については後述する。
ステップS2106では、右目画像切り替え部1111は、右目用マスク画像を用いて、ステップS2101で取得した右目用の現実空間画像と、ステップS2103で伸張した右目用CG画像とのクロマキー合成を行う。係る右目用マスク画像は、右目マスク補正部1110により補正されたマスク画像、若しくは補正されていないマスク画像である。更にステップS2106では、左目画像切り替え部1109は、左目用マスク画像を用いて、ステップS2101で取得した左目用の現実空間画像と、ステップS2103で伸張した左目用CG画像とのクロマキー合成を行う。係る左目用マスク画像は、左目マスク補正部1108により補正されたマスク画像、若しくは補正されていないマスク画像である。
次にステップS2107では、左目画像切り替え部1109は、クロマキー合成後の合成画像を左目LCD1003に送出することで、左目LCD1003にこの合成画像を表示させる。更にステップS2107では、右目画像切り替え部1111は、クロマキー合成後の合成画像を右目LCD1004に送出することで、右目LCD1004にこの合成画像を表示させる。
そして、本処理の終了条件が満たされない限りは処理はステップS2108を介してステップS2101に戻り、次のフレームについて以降の処理を行う。
図22は、上記ステップS2105における処理の詳細を示すフローチャートである。なお、図22のフローチャートに従った処理の詳細については上述したとおりであるので、以下では簡単に説明する。
先ず、ステップS2201では、以下の処理で用いる変数nを1にセットする。係る変数nは、右目用テーブル、左目用テーブルにおいて処理対象とする行を指し示す為のものであるので、ステップS2201における処理は、対応点検出部1103が行うのが好ましい。しかし本ステップにおける処理の主体は、対応点検出部1103に限定するものではない。
次に、ステップS2202では、以下の処理で用いる変数lを1にセットする。係る変数lは、右目用マスク画像、左目用マスク画像を構成する各ラインのうち、処理対象とするラインを指し示すためのものであるので、ステップS2202における処理は、対応点検出部1103が行うのが好ましい。しかし、本ステップにおける処理の主体は、対応点検出部1103に限定するものではない。
次にステップS2203では、対応点検出部1103は、左目用マスク画像のlライン目について、左目用テーブルを作成すると共に、右目用マスク画像のlライン目について、右目用テーブルを作成する。
次にステップS2204では、対応点検出部1103は、右目用テーブル、左目用テーブルにおいてn行目に登録している開始位置、終了位置を取得する。そして、右目用テーブルから取得した開始位置、終了位置を右目傾き検出部1105に送出すると共に、左目用テーブルから取得した開始位置、終了位置を左目傾き検出部1104に送出する。
次にステップS2205では、左目傾き検出部1104は上述した処理を行い、傾きVSL1〜VSL3、VEL1〜VEL3を求める。そして求めた傾きVSL1〜VSL3、VEL1〜VEL3を誤り判定部1106に対して出力する。また、本ステップでは更に、右目傾き検出部1105は上述した処理を行い、傾きVSR1〜VSR3、VER1〜VER3を求める。そして求めた傾きVSR1〜VSR3、VER1〜VER3を誤り判定部1106に対して出力する。
次にステップS2206では、誤り判定部1106は、傾きVSL3と傾きVSR3との差が10度以上であるか否かをチェックする。係るチェックの結果、差が10度以上であれば、誤り判定部1106は、右目用CG画像、左目用CG画像の何れかにエラー箇所が存在したか否かを示すフラグ情報と共に、VSL1〜VSL3,VSR1〜VSR3を補正箇所判定部1107に送出する。そして、処理をステップ2207に進める。一方、差が10度未満であれば、処理をステップS2210に進める。
ステップS2207では、補正箇所判定部1107は、傾きVSL1と傾きVSL2とがなす角度θ1を求めると共に、傾きVSR1と傾きVSR2とがなす角度θ2を求める。
次にステップS2208では、補正箇所判定部1107は、θ1とθ2との大小比較を行い、θ1>θ2である場合には、傾きVSR1(VSR2でも良い)を、左目マスク補正部1108に送出し、処理をステップS2208に進める。一方、θ1≦θ2である場合には、補正箇所判定部1107は傾きVSL1(VSL2でも良い)を、右目マスク補正部1110に送出し、処理をステップS2209に進める。
ステップS2208では、左目マスク補正部1108は、左目用マスク画像において、画素S1のラインの1つ下のライン上における画素群のうち、画素S1を通り、傾きVSR1を有する直線が通る画素(補正開始画素)を特定する。そして補正開始画素のx座標値が、左目用テーブルのn行目に登録されている開始位置のx座標値よりも小さい場合には、補正開始画素、補正開始画素と左目用テーブルのn行目に登録されている開始位置の画素との間の各画素の画素値を「0」にする。一方、補正開始画素のx座標値が、左目用テーブルのn行目に登録されている開始位置のx座標値よりも大きい場合には、左目用テーブルのn行目に登録されている開始位置における画素、及びこの画素と補正開始画素との間の各画素の画素値を「1」にする。このようにして、ステップS2208では、左目用マスク画像を補正する。
一方、ステップS2209では、右目マスク補正部1110は、用いる傾きが異なるのみで、基本的には左目マスク補正部1108と同様の処理を行う。これにより、右目用マスク画像を補正する。
次にステップS2210では、誤り判定部1106は、傾きVEL3と傾きVER3との差が10度以上であるか否かをチェックする。係るチェックの結果、差が10度以上であれば、誤り判定部1106は、右目用CG画像、左目用CG画像の何れかにエラー箇所が存在したか否かを示すフラグ情報と共に、VEL1〜VEL3,VER1〜VER3を補正箇所判定部1107に送出する。そして、処理をステップS2211に進める。一方、差が10度未満である場合には、処理をステップS2215に進める。
ステップS2211では、補正箇所判定部1107は、傾きVEL1と傾きVEL2とがなす角度θ3を求めると共に、傾きVER1と傾きVER2とがなす角度θ4を求める。
次にステップS2212では、補正箇所判定部1107は、θ3とθ4との大小比較を行い、θ3>θ4である場合には、傾きVER1(VER2でも良い)を、左目マスク補正部1108に送出し、処理をステップS2213に進める。一方、θ3≦θ4である場合には、補正箇所判定部1107は傾きVEL1(VEL2でも良い)を、右目マスク補正部1110に送出し、処理をステップS2214に進める。
ステップS2213では、左目マスク補正部1108は、左目用マスク画像において、画素E1のラインの1つ下のライン上における画素群のうち、画素E1を通り、傾きVER1を有する直線が通る画素(補正開始画素)を特定する。そして補正開始画素のx座標値が、左目用テーブルのn行目に登録されている終了位置のx座標値よりも小さい場合には、左目用テーブルのn行目に登録されている終了位置における画素、及びこの画素と補正開始画素との間の各画素の画素値を「1」にする。一方、補正開始画素のx座標値が、左目用テーブルのn行目に登録されている終了位置のx座標値よりも大きい場合には、補正開始画素、補正開始画素と左目用テーブルのn行目に登録されている終了位置の画素との間の各画素の画素値を「0」にする。このようにして、ステップS2213では、左目用マスク画像を補正する。
一方、ステップS2214では、右目マスク補正部1110は、用いる傾きが異なるのみで、基本的には左目マスク補正部1108と同様の処理を行う。これにより、右目用マスク画像を補正する。
次にステップS2215では、対応点検出部1103は、n=N(Nは右目用テーブル、左目用テーブルにおける全行数)である、即ち、右目用テーブル、左目用テーブルの全ての行についてステップS2204以降の処理を行ったか否かをチェックする。係るチェックの結果、n=Nである場合には、処理をステップS2217に進める。一方、n<Nである場合には、処理をステップS2216に進める。
ステップS2216では、対応点検出部1103は、変数nの値を1つインクリメントする。そして、ステップS2204以降の処理を行う。
一方、ステップS2217では、対応点検出部1103は、l=L(Lは右目用マスク画像、左目用マスク画像の総ライン数)である。即ち、右目用マスク画像、左目用マスク画像の全てのラインについてステップS2203以降の処理を行ったか否かをチェックする。係るチェックの結果、l=Lである場合には、図22に示したフローチャートに従った処理を終了し、上記ステップS2106にリターンする。一方、l<Lである場合には、処理をステップS2218に進める。
ステップS2218では、対応点検出部1103は、変数lの値を1つインクリメントする。そして、ステップS2203以降の処理を行う。
以上の説明により、本実施形態によれば、左右のCG画像の類似性を利用し、一方のCG画像にエラー箇所があっても、クロマキー領域と非クロマキー領域との境界線を正しく検出し、クロマキー合成に必要なクロマキー色の検出を良好に行うことが出来る。
なお、本実施形態では、マスク画像を補正することで、クロマキー合成の補正を実現した。だがクロマキー合成の補正は、必ずしもマスク画像を補正して行う必要はない。即ち、エラー箇所が存在するCG画像を補正することや、クロマキー合成の結果得られる画像を補正することでも、エラー箇所が存在するCG画像から、欠損を補正したクロマキー合成を行うことが出来る。
なお、CG画像を直接補正する手法や、クロマキー合成の結果得られる画像を補正する手法においても、本実施形態は同じように適用可能であり、同様にエラー箇所を補正したクロマキー合成を行うことが出来る。
[第2の実施形態]
本実施形態では、右目用CG画像、左目用CG画像の視差を用いて、エラー箇所を補正する。なお、本実施形態以下で説明する様々な判断基準については一例であり、当業者であれば、適宜変形しうるものである。
図12は、右目用CG画像と左目用マスク画像との間の視差について説明する図である。図12において12010は左目用マスク画像、12020は右目用マスク画像である。それぞれのマスク画像には非クロマキー領域1298,1299が含まれており、それぞれマスク画像中における位置は若干ずれている。係るずれが視差である。12030は、左目用マスク画像12010と右目用マスク画像12020とを重ね合わせた場合に得られる画像である。係る画像12030に示す如く、左目用マスク画像12010中における非クロマキー領域1298、右目用マスク画像12020中における非クロマキー領域1299のそれぞれの位置は若干ずれてる。
本実施形態では、右目用マスク画像におけるクロマキー領域と非クロマキー領域との境界部分と、左目用マスク画像においてこの境界部分に対応する対応境界部分と、の位置的な差をライン毎に検出することで、エラー箇所が存在するか否かをチェックする。
図14は、本実施形態に係るHMD1000の機能構成を示すブロック図である。なお、図14において、図4と同じ部分については同じ番号を付けており、その説明は省略する。
視差計算部1201は、対応点検出部1103から左目用テーブルのn行目に登録されている開始位置、終了位置、右目用テーブルのn行目に登録されている開始位置、終了位置、を受ける。
そして、左目用テーブルのn行目に登録されている開始位置から、右目用テーブルのn行目に登録されている開始位置を引いた値(位置差)を「視差DSi」として求める。また、第1の実施形態で説明したような処理を行うことで、左目用マスク画像、右目用マスク画像における画素S1,S2を求める。そして、左目用マスク画像における画素S1の位置から、右目用マスク画像における画素S1の位置を引いた値を「視差DS(i−1)」として求める。更に、左目用マスク画像における画素S2の位置から、右目用マスク画像における画素S2の位置を引いた値を「視差DS(i−2)」として求める。
また、視差計算部1201は、左目用テーブルのn行目に登録されている終了位置から、右目用テーブルのn行目に登録されている終了位置を引いた値を「視差DEi」として求める。また、第1の実施形態で説明したような処理を行うことで、左目用マスク画像、右目用マスク画像における画素E1,E2を求める。そして、左目用マスク画像における画素E1の位置から、右目用マスク画像における画素E1の位置を引いた値を「視差DE(i−1)」として求める。更に、左目用マスク画像における画素E2の位置から、右目用マスク画像における画素E2の位置を引いた値を「視差DE(i−2)」として求める。
そして視差計算部1201は、求めたDSi、DS(i−1)、DS(i−2)、DEi、DE(i−1)、DE(i−2)のデータを、後段の誤り判定部1202に送出する。
また、視差計算部1201は、上記左目傾き検出部1104,右目傾き検出部1105が行うものとして第1の実施形態で説明した処理を行う。即ち、視差計算部1201は、VSL1〜VSL3、VEL1〜VEL3、VSR1〜VSR3、VER1〜VER3、を求める。そして、求めたこれらを補正箇所判定部1203に対して出力する。
誤り判定部1202は、受けた視差のデータに基づいて、左目用CG画像と右目用CG画像の何れかにエラー箇所があるのか否かをチェックする。
本実施形態では、図13に示す如く、右目用CG画像と左目用CG画像とにおいて、ライン毎の視差は滑らかに変化するものであるという前提に基づき、もしあるラインで急激に視差が変化している場合には、係るラインにエラー箇所があるものと判断する。図13は、視差に基づいてマスク画像を補正する処理を説明する図である。
より詳しくは、誤り判定部1202は、DSiとDS(i−1)との差の値x、DS(i−1)とDS(i−2)との差の値y、を求め、値xと値yとの差の値(変化量)の絶対値が10以上であるのか否かをチェックする。そして、この絶対値が10以上であれば、左目用CG画像、右目用CG画像の何れかにエラー箇所が存在するものと判断する。
そしてエラー箇所が存在したか否かの判断結果を示すフラグ情報を作成し、補正箇所判定部1203に送出する。
補正箇所判定部1203は、誤り判定部1202からのフラグ情報を参照し、係るフラグ情報が「左目用CG画像、右目用CG画像の何れかにエラー箇所が存在する」という旨を示している場合には、何れのCG画像にエラー箇所があるのかをチェックする。係るチェック処理は、第1の実施形態と同様にして行う。従って補正箇所判定部1203は、視差計算部1201から受けたVSL1〜VSL3、VSR1〜VSR3、のデータを用いて、補正箇所判定部1107が行った処理と同様の処理を行う。
そして、補正箇所判定部1203は、左目用マスク画像にエラー箇所があると判断した場合には、DS(i−1)、DS(i−2)のデータを視差計算部1201から取得する。そして取得したデータを用いて、2×DS(i−1)−DS(i−2)を求め、求めた値を補正視差のデータとして左目マスク補正部1208に送出する。一方、右目用マスク画像にエラー箇所があると判断した場合には、2×DS(i−1)−DS(i−2)の値を補正視差のデータとして右目マスク補正部1210に送出する。
左目マスク補正部1208は、対応点検出部1103から右目用テーブルのn行目に登録されている開始位置(p)を取得し、左目用マスク画像上のp+2×DS(i−1)−DS(i−2)の位置における補正開始画素として求める。そして補正開始画素のx座標値が、左目用テーブルのn行目に登録されている開始位置のx座標値よりも小さい場合には、補正開始画素、補正開始画素と左目用テーブルのn行目に登録されている開始位置の画素との間の各画素の画素値を「0」にする。一方、補正開始画素のx座標値が、左目用テーブルのn行目に登録されている開始位置のx座標値よりも大きい場合には、左目用テーブルのn行目に登録されている開始位置における画素、及びこの画素と補正開始画素との間の各画素の画素値を「1」にする。
一方、右目マスク補正部1210は、対応点検出部1103から左目用テーブルのn行目に登録されている開始位置(p)を取得し、右目用マスク画像上のp−2×DS(i−1)+DS(i−2)の位置における補正開始画素として求める。そして補正開始画素のx座標値が、右目用テーブルのn行目に登録されている開始位置のx座標値よりも小さい場合には、補正開始画素、補正開始画素と右目用テーブルのn行目に登録されている開始位置の画素との間の各画素の画素値を「0」にする。一方、補正開始画素のx座標値が、左目用テーブルのn行目に登録されている開始位置のx座標値よりも大きい場合には、右目用テーブルのn行目に登録されている開始位置における画素、及びこの画素と補正開始画素との間の各画素の画素値を「1」にする。
また、誤り判定部1202は、DEiとDE(i−1)との差の値x、DE(i−1)とDE(i−2)との差の値y、を求め、値xと値yとの差の値の絶対値が10以上であるのか否かをチェックする。そして、この絶対値が10以上であれば、左目用CG画像、右目用CG画像の何れかにエラー箇所が存在するものと判断する。
そしてエラー箇所が存在したか否かの判断結果を示すフラグ情報を作成し、補正箇所判定部1203に送出する。
補正箇所判定部1203は、誤り判定部1202からのフラグ情報を参照し、係るフラグ情報が「左目用CG画像、右目用CG画像の何れかにエラー箇所が存在する」という旨を示している場合には、何れのCG画像にエラー箇所があるのかをチェックする。係るチェック処理は、第1の実施形態と同様にして行う。従って補正箇所判定部1203は、視差計算部1201から受けたVSL1〜VSL3、VSR1〜VSR3、のデータを用いて、補正箇所判定部1107が行った処理と同様の処理を行う。
そして、補正箇所判定部1203は、左目用マスク画像にエラー箇所があると判断した場合には、DE(i−1)、DE(i−2)のデータを視差計算部1201から取得する。そして取得したデータを用いて、2×DE(i−1)−DE(i−2)を求め、求めた値を補正視差のデータとして左目マスク補正部1208に送出する。一方、右目用マスク画像にエラー箇所があると判断した場合には、2×DE(i−1)−DE(i−2)の値を補正視差のデータとして右目マスク補正部1210に送出する。
左目マスク補正部1208は、図15に示す如く、対応点検出部1103から右目用テーブルのn行目に登録されている終了位置(q)を取得し、左目用マスク画像上のq+2×DE(i−1)−DE(i−2)の位置における補正開始画素として求める。そして補正開始画素のx座標値が、左目用テーブルのn行目に登録されている終了位置のx座標値よりも小さい場合には、左目用テーブルのn行目に登録されている終了位置における画素、及びこの画素と補正開始画素との間の各画素の画素値を「1」にする。一方、補正開始画素のx座標値が、左目用テーブルのn行目に登録されている終了位置のx座標値よりも大きい場合には、補正開始画素、補正開始画素と左目用テーブルのn行目に登録されている終了位置の画素との間の各画素の画素値を「0」にする。
一方、右目マスク補正部1210は、対応点検出部1103から左目用テーブルのn行目に登録されている開始位置(p)を取得し、右目用マスク画像上のp−2×DS(i−1)+DS(i−2)の位置における補正開始画素として求める。そして補正開始画素のx座標値が、左目用テーブルのn行目に登録されている終了位置のx座標値よりも小さい場合には、左目用テーブルのn行目に登録されている終了位置における画素、及びこの画素と補正開始画素との間の各画素の画素値を「1」にする。一方、補正開始画素のx座標値が、左目用テーブルのn行目に登録されている終了位置のx座標値よりも大きい場合には、補正開始画素、補正開始画素と左目用テーブルのn行目に登録されている終了位置の画素との間の各画素の画素値を「0」にする。
以上のようにして、左目用マスク画像、右目用マスク画像を補正する。
そして以降の処理については第1の実施形態と同様である。
第1の実施形態では、左右の画像の輪郭線の傾きを比較し、欠損を発見してクロマキー合成時に補正を行っていた。視差の少ない左右の画像が似通ったものである時には、良好に動作する。しかし視差の比較的大きい左右の画像が比較的異なったものであるときには、必ずしも正常に動作しない。
本実施形態では、視差の連続性を利用しているため、左右の輪郭線が異なって見えるようなときも(例えば片目の正面に物体があるようなときも)ある程度までは補正を行える。その点で、第1の実施形態よりも優れた特性を発揮する。
しかし物体が重なり合っているような場合には視差の不連続が生じており、必ずしも正常に動作しない。そのような画像を扱う場合には、本実施形態は不適である。
本実施形態では、マスク画像を補正することで、クロマキー合成の補正を実現した。だがクロマキー合成の補正は、必ずしもマスク画像を補正して行う必要はない。
欠損のあるCG画像を補正することや、クロマキー合成の結果得られる画像を補正することでも、欠損のある入力画像から、欠損を補正したクロマキー合成を行うことが出来る。
CG画像を直接補正する手法や、クロマキー合成の結果得られる画像を補正する手法においても、本実施形態は同じように適用可能であり、同様に欠損を補正したクロマキー合成を行うことが出来る。
[第3の実施形態]
本実施形態では、各フレームの左目用CG画像を用いて、注目フレームにおける左目用CG画像におけるエラー箇所を補正する。同様に、各フレームの右目用CG画像を用いて、注目フレームにおける右目用CG画像におけるエラー箇所を補正する。
本実施形態では、図16に示す如く、隣接(連続)するフレームの画像同士は比較的類似しているという前提の元に、前フレームの画像と大きく異なる箇所が生じた注目フレームの画像にはエラー箇所が存在すると判断する。そして、係る注目フレームの画像に対するマスク画像を補正する。
第1,2の実施形態では、ステレオ画像の類似性を利用してエラー箇所の有無を判断していたので、近くの物体を撮影している場合には、右目に対する画像と左目に対する画像とでは大きく異なる箇所が発生することが考えられる。従ってこのような場合には、良好な補正を行えないことがあった。
本実施形態では、隣接する各フレームの画像を用いてエラー箇所の有無を判断するために、そのような制約は無く、近くの物体を撮影している場合にも、問題なく入力画像の欠損を補正したクロマキー合成を行うことが出来る。
ただし、隣接する各フレームの画像に類似性が期待できるのはカメラが大きな移動をしない場合であり、カメラの位置姿勢が変化している場合には、必ずしもステレオ画像の類似性を利用した補正よりよい結果が得られるとは限らない。
図17は、観察者の左目の目に対してクロマキー合成結果の画像を提示するためのHMD1000の機能構成例を示すブロック図である。なお、以下の説明では、観察者の左目に対してクロマキー合成結果の画像を提示するための一連の処理について説明するので、右目に対してクロマキー合成結果の画像を提示するための構成は図17では省略している。しかし本実施形態でも観察者の右目、左目に対して同じ一連の処理によりクロマキー合成結果の画像を提示するので、以下の説明より、観察者の右目に対してクロマキー合成結果の画像を提示するための構成、及び処理については当業者であれば容易に相当し得る。
CG画像受信部1010は、図4に示したものと同じである。しかし、上述の通り、以下では左目に対してクロマキー合成結果の画像を提示するための処理について説明するので、図17では、CG画像受信部1010の構成のうち、左目に対する構成しか図示していない。
次に、クロマキー合成部1300について説明する。上述の通り、クロマキー合成部1300についても、図17では、左目に対してクロマキー合成結果の画像を提示するための構成しか図示していない。右目に対してもクロマキー合成結果の画像を提示するためには、図17に示したクロマキー合成部1300の構成と同じものを右目用として更にクロマキー合成部1300に追加する必要がある。その場合、もちろん、カメラ、LCDについても第1の実施形態と同様に、右目用に用意し、クロマキー合成部1300に接続する必要がある。
クロマキー合成部1300には、伸張された左目用CG画像が入力され、入力された左目用CG画像は、色判定部1301、画像切り替え部1309に入力される。
色判定部1301は、図4に示した左目色判定部1101や右目色判定部1102が行う処理と同様の処理を行い、マスク画像を生成する。生成したマスク画像は、後段の画像FIFO1312、対応点検出部1303、マスク補正部1308に入力される。画像FIFO1312は、1フレーム分のマスク画像を保持するものであり、周知の通り、先に保持したものから順に出力する。従って、画像FIFO1312からは、1フレーム前のマスク画像が出力されることになる。画像FIFO1312から出力された1フレーム前のマスク画像は、対応点検出部1303に入力される。
対応点検出部1303は、色判定部1301から出力されたマスク画像(現在フレームマスク画像)と、画像FIFO1312から出力されたマスク画像(前フレームマスク画像)を受ける。そして、図4に示した対応点検出部1103が行うものとして第1の実施形態で説明した処理において、左目用マスク画像、右目用マスク画像を、現在フレームマスク画像、前フレームマスク画像に置き換えた処理を行う。もちろん、一方のマスク画像上の非クロマキー領域において、クロマキー領域と隣接する部分を構成している各画素と位置的に対応する、他方のマスク画像上の画素位置を特定する為の処理についてはこれに限定するものではない。
前フレーム傾き検出部1304、現在フレーム傾き検出部1305は何れも、図4に示した左目傾き検出部1104、右目傾き検出部1105と同様の処理を行う。即ち、前フレーム傾き検出部1304は、対応点検出部1303が前フレームマスク画像について生成したテーブル(前フレームマスク画像テーブル)を用いて、左目傾き検出部1104や右目傾き検出部1105と同様の処理を行う。これにより、クロマキー領域と非クロマキー領域との境界部分の傾きを求める。一方、現在フレーム傾き検出部1305は、対応点検出部1303が現在フレームマスク画像について生成したテーブル(現在フレームマスク画像テーブル)を用いて、左目傾き検出部1104や右目傾き検出部1105と同様の処理を行う。これにより、クロマキー領域と非クロマキー領域との境界部分の傾きを求める。
誤り判定部1306は、前フレーム傾き検出部1304、現在フレーム傾き検出部1305から受けた傾きのデータを用いて、図4に示した誤り判定部1106と同様の処理を行う。即ち、前フレームマスク画像、現在フレームマスク画像の何れかにエラー箇所が存在するか否かをチェックする。
また、誤り判定部1306は、現在フレームマスク画像についてエラー箇所の数をカウントする。そして、現在フレームマスク画像の全てのラインについてエラー箇所の数をカウントした結果、あるカウント値以上(例えば10以上)である場合は、現在フレームマスク画像に対する最終的な判断結果として「エラー無し」と判断する。そして、その旨を示すフラグ情報を後段のマスク補正部1308に送出する。これは、シーンチェンジ等、1フレーム前の画像から現在のフレームが大きく変化した場合に対応するためである。
マスク補正部1308は、図4に示した左目マスク補正部1108や右目マスク補正部1110と同様の処理で、色判定部1301から受けた現在フレームマスク画像に対するエラー箇所の補正処理を行う。
画像切り替え部1309は、用いるマスク画像が現在フレームマスク画像である以外は、図4に示した左目画像切り替え部1109や右目画像切り替え部1111と同様の処理を行う。
以上の処理により、各フレームの画像の類似性を利用し、欠損のある入力画像においても、クロマキー色とCGオブジェクトの境界線を正しく検出し、クロマキー合成に必要なクロマキー色の検出を良好に行うことが出来る。
第1,2の実施形態では、ステレオ画像の類似性を利用して、欠損のある入力画像におけるクロマキー合成時に補正を行っていた。そのため近くの物体を撮影しているような場合には、ステレオ画像に類似性が乏しくなるため良好な結果を得られない。本実施形態では、近くの物体を撮影しているような場合にも、各フレームの画像の類似性を利用しているため、良好な補正を行うことができる。
但し、本実施形態は、カメラの位置姿勢が変化している場合など、各フレームの画像に類似性が乏しい場合には良好な結果を得ることはできない。
[第4の実施形態]
本実施形態では、上記実施形態のように必ずマスク画像の補正を行うものではなく、無線による圧縮済みのCG画像の受信時にエラーが検出されたか否か、視差の量はいかほどか等の情報を用いて、マスク画像の補正を行うか否かを判断する。なお、本実施形態ではマスク画像の補正は、第1の実施形態で説明した方法により行うものとする。
本実施形態の特徴の1つに、無線で圧縮済みのCG画像を受信した場合に、係る受信のための通信時にエラーが生じたか否かにより、マスク画像の補正を行うか否かを判断することにある。
上記実施形態のように、必ずマスク画像の補正を行うようにすると、副作用が生じて悪影響が出ることがある。従って、通信にエラーが生じた場合にマスク画像の補正を行うことにより、不要な補正を避けることができ、副作用の少ない補正を実現することが出来る。
本実施形態のもう1つの特徴は、視差の量を考慮して、マスク画像の補正を行うか否かを判断する。補正の際には、左右の画像の類似性を利用している。しかし左右の画像は視差があるため、少しずつ異なっている。一般的には、遠くに見えるものほど左右の画像は同じように見え、近くのものほど異なって見えることが多い。そこで、輪郭線の傾きを比較して補正するか判断する際、遠くの物体については傾きが少し異なっていても補正が必要と判断し、近くの物体については傾きが大きく異なっていなければ補正しないと判断した方が適切な補正ができる。近くの物体か遠くの物体かは、視差が大きいか小さいかで判断できる。そこで視差の量を考慮して補正を行うかどうか判断することで、不要な補正を避けることができ、副作用の少ない補正を実現することが出来る。
図18は、本実施形態に係るHMD1000の機能構成を示すブロック図である。図18において、図4と同じ部分については同じ番号を付けており、その説明は省略する。
無線画像受信部1911は、無線画像受信部1011と同様に、計算機3000から無線で送信された圧縮済みの左目用CG画像と圧縮済みの右目用CG画像を受信し、それぞれを左目伸張部1012、右目伸張部1013に送出する。そして更に無線画像受信部1911は、係る受信の為の通信にエラーが生じたか否かをチェックする。係るチェックについては周知の技術であるので、これについての説明は省略する。無線画像受信部1911によるチェック結果を示すフラグ情報(通信エラーが生じているか否かを示すフラグ情報)は左目マスク補正部1408、右目マスク補正部1410に送出される。
左目マスク補正部1408、右目マスク補正部1410は、係るフラグ情報を受け、受けたフラグ情報が、通信にエラーが生じている旨を示している場合にはそれぞれ、左目マスク補正部1108、右目マスク補正部1110が行う上述の処理を行う。一方、係るフラグ情報が、通信にエラーは生じていない旨を示している場合には、左目マスク補正部1408、右目マスク補正部1410の動作を禁止する。
これにより、通信エラーがないにもかかわらず、不要なマスク画像の補正を行うことを避けることが出来る。
更に、視差計算部1401は、上記視差計算部1201と同様の処理を行い、現在処理対象としているラインに対する視差を求める。そして、「求めた視差の値の絶対値+3」を誤り判定部1406に送出する。
誤り判定部1106は、傾きVSL3と傾きVSR3との差が係る閾値(求めた視差の値の絶対値+3)以上であるか否かをチェックする。そして係るチェックの結果、差が閾値以上であれば、左目用CG画像、右目用CG画像の何れかにエラー箇所が存在するものと判断する。もちろん、視差を用いた閾値の算出方法については係る式に限定するものではないが、視差が大きいほど閾値を大きくし、視差が小さいほど閾値が小さくなるように、閾値の増減を制御することが好ましい。
これにより、視差の少ない遠距離の物体に関しては輪郭線の傾きが少しでも異なっていたら欠損があると判定し、視差の大きい近距離の物体に関しては輪郭線の傾きがある程度あっても欠損がないと判定する。
以上の処理を行うことにより、通信時にエラーが検出されたかどうか、視差の量がどのくらいあるかの情報を使って、クロマキー合成の際に補正を行うかどうか判断することができる。そのため不要な補正を避けることができ、副作用の少ない補正を実現することが出来る。
なお、本実施形態では、補正にステレオ画像の類似性を利用したが、補正に各フレームの画像の類似性を利用しても良い。
[第5の実施形態]
本実施形態では、HMD1000の動きを検出する。そして係る検出の結果、動きがあると判断される場合には第1の実施形態に係る構成でマスク画像を補正する処理を行い、動きがないと判断される場合には第3の実施形態に係る構成でマスク画像を補正する処理を行う。
HMD1000の動きを検出する方法には様々なものがあるが、本実施形態では、HMD1000には加速度センサを取り付ける。そして、係る加速度センサによる計測結果が示す加速度がある閾値以上であれば、「動いている」と判断し、閾値よりも小さければ、「動いていない」と判断する。
第1の実施形態で説明したステレオ画像の類似性を利用した補正は、左右の画像を同時に撮影しているため、HMDが速い動きをしても問題なく補正を行うことが出来る。しかし、左右の画像は同一ではないため、場合によっては正しく補正できない問題がある。
第3の実施形態において説明した、各フレームの画像の類似性を利用した補正は、HMDが動いていない場合には隣接する各フレームの画像の類似性が高く、正しく補正できることが期待できる。しかしHMDが動いている場合には、前のフレームと現在のフレームに類似性が低くなり、正しく補正できない問題がある。
そこでHMDに動きがあるかどうかで上記2つの補正方法を切り換えることで、よりよい精度で補正を行う。
図19は、本実施形態に係るHMD1000の外観例を示す図である。同図に示す如く、本実施形態に係るHMD1000には、加速度センサ1905が取り付けられている。
図20は、本実施形態に係るHMD1000の機能構成を示すブロック図である。図20において、図4と同じ部分については同じ番号を付けており、その説明は省略する。
クロマキー合成部1501は、図4に示したクロマキー合成部1100に相当する。クロマキー合成部1502、1503はそれぞれ、図17に示したクロマキー合成部1300の構成を有する左目用のもの、右目用のものに相当する。
画像切り替え部1504は、加速度センサ1905による計測結果(加速度)を受けると、係る加速度と、予め設定されている閾値との大小比較処理を行う。そして係る大小比較処理の結果、加速度が閾値以上であれば、「動いている」と判断し、クロマキー合成部1501から出力される画像を後段の左目LCD1003,右目LCD1004に送出する。一方、加速度が閾値よりも小さければ、「動いていない」と判断し、クロマキー合成部1502,1503から出力される画像を後段の左目LCD1003、右目LCD1004に送出する。
以上の処理を行うことにより、HMDに動きがある時にはステレオ画像の類似性を用いて欠損のある画像を補正したクロマキー合成を行い、HMDの動きがない場合には各フレームの画像の類似性を用いて補正を行うことが出来る。
このような構成をとることで、近くの物体を撮影しているときにも適用可能な各フレームの画像を利用した補正と、撮像系に動きがある場合にも適用可能なステレオ画像を利用した補正の両方の利点を活かした補正を行うことが出来る。
[その他の実施形態]
また、本発明の目的は、以下のようにすることによって達成されることはいうまでもない。即ち、前述した実施形態の機能を実現するソフトウェアのコンピュータプログラムを記録した記録媒体(または記憶媒体)を、システムあるいは装置に供給する。係る記憶媒体は言うまでもなく、コンピュータ読み取り可能な記憶媒体である。そして、そのシステムあるいは装置のコンピュータ(またはCPUやMPU)が記録媒体に格納されたプログラムコードを読み出し実行する。この場合、記録媒体から読み出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記録した記録媒体は本発明を構成することになる。
また、コンピュータが読み出したプログラムコードを実行することにより、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているオペレーティングシステム(OS)などが実際の処理の一部または全部を行う。その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
さらに、記録媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張カードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれたとする。その後、そのプログラムコードの指示に基づき、その機能拡張カードや機能拡張ユニットに備わるCPUなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれることは言うまでもない。
本発明を上記記録媒体に適用する場合、その記録媒体には、先に説明したフローチャートに対応するプログラムコードが格納されることになる。