3Dグラフィックス

開発技術

Distortion Correction【映像の歪みを補正する】

概要

エクサでは、プラネタリウムや科学館、博物館の大型投影施設に向けたシステム構築等の実績を通じて 特殊な面への投影システムの開発に取り組んでいます。ここでは、その要素技術の一つ、映像の歪み補正について紹介します。

投影面が「曲面」のように歪んでいる場合、プロジェクタで投影した映像は歪んで見えてしまいます。 この歪みを取り除くことができれば、人間の目には歪みの無い自然な映像が映るはずです。この処理を「歪み補正」といいます。 歪みを補正する手段には、プロジェクタ組み込みの歪み補正機能を利用する、ハードウェア的な手段と、 ソフトウェアで歪みを補正した映像を出力する、ソフトウェア的な手段があります。ソフトウェア的に歪みを補正するためには、 視点から見える投影面(ビュースクリーン)のピクセルを追跡し、プロジェクタから見える投影面(プロジェクタスクリーン)に、 そのピクセルをマッピングする必要があります。

つまり、歪みを補正するためには、ピクセルの位置を移動させる情報が必要になる訳です。そこで、本稿では、 ビュースクリーンからプロジェクタスクリーンへのピクセル位置のマッピング情報を埋め込んだ、 「DistortionMap」を利用して、ソフトウェア的に歪みを補正する方法について説明していきます。この「DistortionMap」を プロジェクタで投影する元映像を歪ませる処理系として利用すれば、投影面の形状や、視点・プロジェクタのパラメタにかかわらず、 理論的にはどのような場合でも歪み補正が可能になります。「DistortionMap」はPNGやJPGなど、通常の画像として出力することが可能です。 本稿では、ピクセル単位で歪みを補正する方法について具体的に説明していきます。

最初に歪み補正の原理を説明します。続いて2次元で歪みを補正する方法論、3次元で歪みを補正する方法論、 DistortionMapのフォーマットと定義について説明します。

歪み補正とは?

プロジェクタは、「平面」に映像を投影する為の機器です。プロジェクタで投影した映像を真正面から見ると、 長方形の歪みのない映像として目に映ります。しかし斜めから見ると、手前が大きく、奥は小さく、 台形の歪んだ映像としては見えてしまいます。真正面から見たとしても、プロジェクタを斜めに置くと、 同様に歪んだ映像として見えてしまいます。また、投影面自体が「曲面」の様に歪んでいる場合は、プロジェクタ位置、 視点位置に関係なく、どこから映しても、どこから見ても、投影される映像は歪んで見えてしまいます。

この歪みを、プロジェクタや視点の位置、投影面の形状などを考慮して取り除くことができれば、人間の目には歪みの無い、 自然な映像が映るはずです。この処理を「歪み補正(Image Distortion)」といいます。歪み補正の処理では、 投影面に映像を投影した時に平面となるように、あらかじめ歪ませた映像を計算し、投影面に投影することになります(図1)。 歪みは、ハードウェア的に、あるいはソフトウェア的に補正することが可能です。


図1 歪み補正のイメージ図

2次元での歪み補正

歪みの有り無しに関わらず、プロジェクタが投影する映像が視点からどのように見えるかどうかは、視点の位置やプロジェクタの位置、 投影面の形状に影響されます。 図2に、2次元的に、視点/プロジェクタ/投影面を配置した例を示します。青丸がプロジェクタ位置、赤丸が視点位置です。 青色、赤色の3角形は、それぞれ、プロジェクタ投影領域、視野領域になります。湾曲した灰色の円弧は投影面です。 プロジェクタから見える(投影する)映像はプロジェクタスクリーンに結像し、視点から見える映像は、ビュースクリーンに結像します。

まず、プロジェクタからそのまま映像を投影した場合はどうなるでしょうか。ここでは、プロジェクタから、プロジェクタスクリーン上で 等間隔に並んでいるプロジェクタ投影点Pを投影するとします。この点は、投影面上の、結像点Iに像を結びます。 そしてその結像点は、ビュースクリーン上に視点から見た投影点Vとして像を結びます。結果として、 プロジェクタで等間隔に投影した投影点は、視点からは、外側に歪んだ点として見えてしまいました。

それでは、視点から見たビュースクリーン上の投影点が、歪み無く等間隔に並ぶようにするためには、 プロジェクタからはどのような点を投影すれば良いでしょうか。答えは簡単です。視点位置から見てビュースクリーン上で等間隔に並んだ点を追跡し、 それをプロジェクタで投影すれば良いだけです。

まず、視点から見てビュースクリーン上で等間隔に並んだ視点から見た投影点V'を定義します。 この点と視点位置とを結ぶ直線が、投影面と交わる点を結像点I'とします。 更に、この結像点とプロジェクタ位置とを結ぶ直線が、 プロジェクタスクリーンと 交わる点をプロジェクタ投影点P'とします。

この様に、視点から追跡して位置を決めた投影点をプロジェクタから投影すれば、結果として、 視点から見た投影点は歪みのない等間隔に並んだ点として見えることになります。


図2 歪みの無い投影面の計算

3次元での歪み補正

前項では、2次元での歪み補正の方法を説明しましたが、3次元でも原理は全く同じです。視点やプロジェクタの位置、 投影面の形状を定義し、視点から見える各ピクセルを追跡して歪み補正を行うことになります。 以降では3次元での具体的な歪み補正の方法について説明していきます。

投影面・プロジェクタ投影領域・視野領域の定義

まず、歪み補正の処理に大きく影響する、プロジェクタの位置と投影領域、視点の位置と視野領域、投影面の形状を 定義していきます。 投影面の形状には、平面状、キューブ状、円柱状、球状など様々なものがあります。ここでは、ドーム状の球面を投影面として話を進めていきます。

プロジェクタの投影領域や、視点からの視野領域は、ドームを内側から見る形で、プロジェクタ位置からの投影方向、 視点位置からの視線方向に広がることになります(図3)。これらの領域は、以下のパラメータにより定義される錐台(Frustum)の形状をしています(図4)。

  • near:近くのクリッピング面
  • far:遠くのクリップ面
  • fov:縦方向の視野角
  • aspect:アスペクト比(縦横比)
  • h_tilting:水平方向のあおり角
  • v_tilting:垂直方向のあおり角

これらのパラメータにより定義したプロジェクタ投影領域、視野領域を、更に平行移動、回転してその最終的な位置や方向を決めることになります。


図3 プロジェクタ投影領域・視野領域

図4 錘台(Frustum)

ピクセルの追跡

ま次に、プロジェクタで歪みのない映像を投影するための処理を行います。そのためには、前述した2次元での処理と同様に、 ビュースクリーン上のピクセルを追跡し、最終的にプロジェクタスクリーンに投影されるピクセルを決める必要があります。 ここでは、プロジェクタスクリーン、ビュースクリーンともに4×4ピクセルの解像度を持つこととします。図5にビュースクリーン上のピクセルを示します。

まずビュースクリーンの各ピクセルを投影面(ドーム)に射影します。例えば、赤枠で囲んだピクセルは、 視点位置からそのピクセルの中心点にのびる 直線(赤色の線)と、ドームとが交差する点に射影されます。 この手順でビュースクリーンの全ピクセルをドームに射影した結果は、図5の「ドームに射影したビュースクリーン」のようになります。 これで、ビュースクリーンのピクセルをドームに射影できました。


図5 ビュースクリーンのピクセル

続いて、ドームに射影したピクセルが、プロジェクタスクリーンに どのように射影されるかを考えてみます。 まずドームに射影したビュースクリーンのピクセルを、プロジェクタスクリーンに射影します(図6)。例えば、赤枠で囲んだピクセルは、 そのピクセルの中心点からプロジェクタ位置にのびる直線(赤色の線)と、プロジェクタスクリーンの平面が交差する点に射影されます。

この手順で、ドームに射影したビュースクリーンの全ピクセルを プロジェクタスクリーンに射影した結果は、 図6の「プロジェクタスクリーンに射影したピクセル」のようになります。これで、ビュースクリーンのピクセルをプロジェクタスクリーンに射影できました。


図6 プロジェクタスクリーンに射影したピクセル

この時点では、まだプロジェクタスクリーンのピクセルは決まっていません。これらのピクセルは、プロジェクタスクリーンに射影したピクセルから、 最近傍のピクセルをピックアップして決定します(ニアレストネイバー)(図7)。

例えばピクセルP32の値には、プロジェクタスクリーンに射影した ピクセルのうち、中心点に最も近いP21'の値を利用します。 この手順で補完したプロジェクタスクリーンのピクセルは図7のようになります。これで、プロジェクタスクリーンのピクセル値が決まりました。


図7 プロジェクタスクリーンのピクセル

歪み補正跡

さて、これでプロジェクタスクリーンのピクセル値を算出できましたが、これらのピクセルの値は何を意味するのでしょうか。 以降では、このことについて説明していきます。

プロジェクタから、図8の「プロジェクタ投影映像」ような256×256ピクセルの映像を投影するとします。 この映像は視点位置みるとビュースクリーン一杯に表示されるので、ビュースクリーンのピクセルと考えることができます。 これまでと同じ条件で、これらのピクセルを視点位置から追跡すると、プロジェクタスクリーンに射影されるピクセル、 つまり最終的にプロジェクタが投影する映像は、図8の「歪み補正後のプロジェクタ投影映像」のようになります。 これは、プロジェクタで投影した元映像「プロジェクタ投影映像」(ビュースクリーンのピクセル)の各ピクセルを 引き延ばし、移動させたことを意味します。

例えば図8のように、プロジェクタスクリーンの位置(256,256)のピクセルには、元映像の位置(190,140)のピクセルの値を移動して格納しています。 つまりは、「プロジェクタスクリーン位置」に持ってくる「元映像のピクセル位置」さえ決まれば、歪ませた映像を出力できる訳です。


図8 元映像ピクセルの移動

プロジェクタスクリーン各ピクセルの、「プロジェクタスクリーン位置」は明確なので結果としてプロジェクタスクリーンの各ピクセルには、 「元画像のピクセル位置」を埋めておけば良いことになります。つまり、視点位置から、元映像の256×256分のピクセル位置を埋めた ビュースクリーンのピクセルを追跡し、そのピクセルをプロジェクタスクリーンに射影すれば良いわけです。

ビュースクリーンのピクセルを図9のように定義します。RGB成分のG成分に水平方向の位置情報、B成分に垂直方向の位置情報を埋めています。 このピクセルを視点から追跡し、プロジェクタスクリーンに射影した結果は図9の「プロジェクタスクリーンのピクセル」のようになります。 これらのピクセルから元映像のピクセル位置情報を取りだし、元映像のピクセル値を格納すると、結果として図9の「歪み補正後のプロジェクタ投影映像」 ような映像がプロジェクタから投影されます。

このように、視点から追跡したプロジェクタスクリーンのピクセルを利用し、元映像を歪ませることで、歪みを補正した映像を生成することができます。 この、歪み補正の処理に必要不可欠な「プロジェクタスクリーンのピクセル」を、以降では、歪み補正用マップ:DistortionMapと呼ぶことにします。


図9 歪み補正

DistortionMapの生成

さて、前項までで、ピクセルを追跡して歪み補正を行う方法を説明してきました。この「ピクセル」には256の情報(0~255)を格納することができます。 しかし、逆に考えると、256の情報しか格納することができません。つまり、前述したDistortionMapの仕組みでは、 解像度が256×256以下の場合にしか対応できないことになります。解像度が512×512の場合、縦横512の位置の情報を、 256の情報しか持てないピクセルでは表現しきれない訳です。分解能が256×256であると表現することもできます。

プロジェクタで投影する映像の解像度は、一般的に1024×768ですので、これでは出力する映像が粗くなってしまいます。そこで、 256×256より大きい解像度に対応できるようDistortionMapを改造してみることにします。

図10に4096×4096の分解能を持つDistortionMapを示します。このDistortionMapは、全体を256×256解像度の16×16のブロックに区切り、 R成分にそのブロックの通し番号を格納しています。各ブロックのG成分B成分には、水平/垂直方向の位置情報を格納しています。 元画像のピクセルの位置は、図10の関数で算出することができます。この関数は、元映像のピクセル位置を0.0~1.0の間に正規化して算出するので、 プロジェクタスクリーンがどのような解像度であっても、元画像のピクセルを取得することができます。


図10 4096×4096分解能 DistortionMap

図11に、4096×4096のDistortionMapを利用し、実際に歪み補正を行った例を示します。プロジェクタスクリーンの解像度は1024×768であるとします。 今までと同様に、ビュースクリーンのピクセルを視点から追跡し、プロジェクタスクリーンに 射影した結果は、図11の「プロジェクタスクリーンのピクセル」のようになります。このプロジェクタスクリーンのピクセルから各ピクセル値を取りだし、 元映像をマッピングしていきます。

例えば、プロジェクタスクリーン位置(0,768)のピクセル値はRGB(178,141,110)です。この値を前述した元映像ピクセル位置変換関数fで処理すると、 プロジェクタスクリーン解像度を0~1に正規化した値、(0.221,0774)を得ます。この値にプロジェクタスクリーンの実際の解像度1024×768を 掛け合わると、最終的な元映像のピクセル位置(216,594)を導出できます。


図11 DistortionMapによる歪み補正(4096×4096)

このように、DistortionMapを、プロジェクタで投影する元映像を歪ませる処理系として利用すれば、投影面の形状や、 視点・プロジェクタのパラメタにかかわらず、理論的にはどのような場合でも歪み補正が可能になります。

まとめ

本稿では、ビュースクリーンからプロジェクタスクリーンへのピクセル位置のマッピング情報を埋め込んだ、「DistortionMap」を利用して、 ソフトウェア的に歪みを補正する方法について説明しました。この「DistortionMap」を プロジェクタで投影する元映像を歪ませる処理系として利用しすれば、投影面の形状や、視点・プロジェクタのパラメタにかかわらず、 理論的にはどのような場合でも歪み補正が可能になります。「DistortionMap」はPNGやJPGなど、通常の画像として出力することが可能です。

次回は、この仕組みをOpenGLを利用して実装してみることにします。エクサは、この「DistortionMap」を利用した案件を多数手がけています。 我々にお手伝いできることがあれば、何なりとお申し付け下さい。

TOP