CGcompo

3D、コンポジット、マッチムーブ、カメラ、撮影について色々書きます。

カメラの話をしよう!・レンズディストーション編

第八弾・レンズディストーション編

特に実写合成時での、トラッキング、コンポジット時におけるレンズディストーションの扱い方、考え方についてまとめました。
レンズディストーションと画角の関係性は?


・歪みの種類
Lens distortion
レンズディストーションには主に樽型と糸巻き、又はそれらが複合的に起きている陣笠型といわれる歪曲収差ということは以前の記事でも書きました。
これらを補正しようとした時問題になるのが最近増えてきたアクションカム等の超広角レンズや魚眼レンズの歪みです。これらの補正には通常のレンズとは別の補正モデル、係数が本来必要でソフトによって対応が異なります。同じようなパラメータを持っていても内部の計算式が異なるためソフトによって対応が異なります(実質的に殆どのソフトが対応していません)。


例えばGopro素材をNukeなどでも見ため的には補正出来ても、元に戻すため反転したディストーション値をを入れると元に戻りません。一見補正できているように見えても画面端で歪みが残っていたり破綻していることもあります。
本来ちゃんと補正できていればUndistortion>Distortionとした時多少の画像の劣化は発生するもののもとに戻ります。

なので、超広角レンズ等を使う場合で、合成後も元のディストーションを保持したい場合は事前検証をしていないとトラブルの元となります。合成後も歪みを取り除いたり弱める又は擬似で付け直す場合は、見た目除去でも問題が無いかもしれませんが。

※魚眼レンズの場合一定の画角をを超えるとそもそもレンズディストーションとしての補正ではなくHDRIのパノラマ展開のような考えかたになります。なので、魚眼レンズなどの特殊なレンズの場合CGでレンダリングする段階でディストーションを加えたり、パノラマ(equirectangular)レンダリングでないと対応できない場合があります。


・レンズディストーションの補正
補正方法は色々ありますが1番正確なのは補正用に事前にテストグリッドを撮影することです。

グリッドに歪みがあるとNGです、画角いっぱいにグリッドを収めます(基本的にディストーションは画面端で強くなるのでそこにグリッドが映っていないと補正精度が下がります)

このグリッドを使いトラッキングソフトやコンポジットソフトで歪みを補正(キャリブレーション)してその値を本番素材に使います。
もちろんレンズごとに歪みは異なるので使う全てのレンズ分作業する必要があります。

※注意
カメラ(センサーサイズ)が変わると画角(使われるレンズの範囲)も変わるのでディストーションに違いが出ます。
REDのように撮影解像度でセンサーをクロップして使うカメラの場合も注意が必要です。

グリッドは格子状がよいのか、チェッカーボードが良いのか、ドットがよいのか、撮影方法は解析、補正するソフトによって異なります。
ソフトによってはグリッドが用意されていたりします。

Nuke>LensDistortionノード、半自動(Line Analysis)、自動解析補正(Grid Analysis、Image Analysis)、チェッカーかグリッドに対応
Syntheyes>グリッドのトラッキングによる自動解析補正、専用のドットのグリッドが用意されています。チュートリアル
PFTrack>半自動補正。チェッカー、格子
MochaPro>半自動補正、ラインの判断出来るチェッカーや格子など
などなど

Syntheyesの補正のようにグリッドをカメラを動かしながら撮影してのという補正は他のトラッキングソフトの自動解析による補正と同じなので他でも可能ですね。NukeのLensDistortionノードのImage Analysisもこれに該当。

グリッドがきれいに撮影出来ていればNukeの自動補正はボタン一発なので簡単に補正できます。


事前に補正した値をプリセット化することで同じレンズ+カメラの組み合わせに対して使用することが出来ます。
LensDistortionノード(Nuke)を使いプリセット化やSTMapによるプリセット化(最後に説明)することで
データの共有が可能になります。


グリッドがちゃんと撮影出来ていれば良いのですが撮影されていない場合トラッキングソフトの自動補正に頼る場合もあります。
実質仕事でもトラッキン後に自動補正する方が多いです。
※素材の尺が短かかったり、カメラワークによってはうまく自動解析出来ないことや全然違う値を出してしまうこともあります。



TIPS

撮影時グリッドを忘れた場合は近場のドアや窓、障子やタイルなど平面が保たれていてグリッド上の物を撮影しおくとOKです。
最悪カットの撮影素材の中にグリッドの代わりになる人工的なパースのととのった物があればそちらで補正可能です。

カメラによってはセンサーがレンズの光軸の中心に無い時があります。そのようなときはセンターも合わせて補正する必要があります。また、センターの補正値はトラッキング時も使用した方が良い場合があり、トラッキング後のCGカメラではFilm Offsetと言った値が変わることになります。

ズームレンズの場合焦点距離でディストーションの値も変化するので注意が必要です。(ある程度間隔的な焦点距離で補正値を用意して近い値を使ったり。値をアニメーションさせたり)

アクションカム等は各種付属の専用ソフトで補正出来る場合もあります。
またGoproやDJI製品の補正プリセットがPremiere CCに付属していたりします。
※いずれも歪みの除去を目的としたもので戻したりCGに適用したりは出来ません。

国内導入はほぼ無い3D-Equalizerには複数のレンズ補正モデルを搭載しており超広角レンズ等にも対応出来ます。実は同じ補正値をFusionが扱えます。FusionからSTMapを書き出してNukeで使うということも。(Fusion内で自動補正はついてません)
※エフェクトの機能的にはSTMapではなくDistortion Mapになっています。STMapとしては使えません。
※3D-Equalizerのサイトで無償でレンズディストーションの追加、除去ツール(Warp4)が公開されていますが基本3D-Equalizerからパラメータを引き継いで使うようなツールで操作性は良くないです。






・補正の必要性
ここまで書いておいてなんですが、トラッキングの仕事でも結構な割合でディストーションの補正をしない事があります。
理由はそれでもズレが生じない、後作業に影響が無いと判断した場合です。
このような判断をする場合グリッドがない場合が多く、補正をすることで逆に後工程で手間になる場合があります。
※後工程とは>ディストーション補正した下絵が各3D担当者に渡っているか?コンポ担当者にディストーション情報がちゃんと伝わっているか?など


逆に補正をする時はどのような時か?
グリッドが撮影されており補正を要求された時。
明らかにディストーションが分かる時。
セットエクステンション(CGで背景の拡張合成する時セットとCGが密接に絡む)時。
トラッキング段階でずれ、接地の滑り等が発生した時。
ガイドモデル(比較的正確)とのズレが出る時。

実際最近のレンズは歪みが少ないものが多く、キャラ合成等であれば補正しなくても問題の起きない事が多いと思います。



TIPS
たまにする方法としてトラッキングでカメラの解析をする時、解析では自動計算でレンズ補正し、下絵には反映させない方法です。歪みがそこまで無いがガイドモデルとズレが出る、3D上でポイントの位置がちょっとずれるといった場合に有効な事があります。





・補正後と補正前、画角の関係性
みなさんディストーション補正することで発生する悩み事があるかと思います。
補正をした場合画的に見えている視野範囲=画角が変わるけど、どうすればよいか?
補正によってはみ出したり縮んだ部分の視野範囲は考慮すべき?

lensdis_03.jpg


補正によって変わる画角、これはほとんどのレンズで補正後が本来レンズの持っている画角となります。
※初めに説明したアクションカムや魚眼レンズのような画角が焦点距離でなく170°のようなFOV(視野)表記のレンズの場合は以下の説明に当てはまりません。これらは補正前の映っている範囲含めた画角になります。


どうしてそうなる?
これはレンズの設計の考え方になります。画角は焦点距離とセンサーサイズにより決まります。
ここで大事なのが焦点距離です、
lensdis_04.jpg
センサーと焦点距離の関係を表したものです。わかりやすく仮に被写体をセンサーの10倍のサイズの平面とした時、これが画角いっぱいに収まる距離は焦点距離の10倍になります(カメラとの距離ではなくレンズの前側主点からの距離)
焦点距離と画角の関係性はこういうことになるので、本来の設計段階の理想的画角としてはディストーションの無い状態が理想となります。
※あくまで理想値であって設計段階での許容値等もあるのでレンズによって違いはあるかと思います。

lens4.jpg

これが分かると視野範囲に関しても基本は、広がったりしたエリアは考慮せず(クロップされた状態)で補正後も元の解像度を保持しておく方が撮影時の焦点距離をそのまま入れれるので作業での悩みが減ります。はみ出した分を考慮したりする場合その分焦点距離(画角)を解像度のパーセンテージで計算してあげる必要が出ます。また、CGレンダーの解像度をどうするか?と言った不要な悩みも生じてしまいます。
※そもそもトラッキングソフトのレンズディストーション補正で補正した場合このような処理になっているかと思います。
※事前補正する場合まれにマーカーが少なく、画面外に必要なマーカーが出てしまう時は広がったエリアを含んだ解像度で処理したほうが良い場合があります。※事前に補正処理をした素材を扱う場合


元の解像度を保持しておくことでトラッキングカットでカットバイのレンダー解像度の設定が不要で、CGレンダーの時は一律オーバースキャンしてレンダー作業が出来ます。

以下、Nukeでの例
トラッキング、CGでの下絵はディストーション除去後も元の解像度(上の図で赤の枠エリア)で作業。CGレンダーを110%のオーバースキャンでレンダリング
Reformatノードでresize type>none とし、preserve bounding boxにチェックを入れる。
これでオーバースキャン分がbboxとして画面外に保持している状態となります。
これに対して事前に解析したディストーションを掛けることで実写と合わせれます。
利点としては、フルCG、実写合成等のカットが混同した場合でも同じノード構成で作業が可能となる事です。
lensdis_05.jpg



TIPS
CGソフトによってオーバースキャンに対応していない場合があります。そのようなときはレンダリングに使うCGカメラの焦点距離かセンサーサイズに対してオーバースキャンのパーセンテージを掛けてあげることで画角が広がり、同等の結果となります。

オーバースキャンしておく事で別の利点が発生します。
・画面外の光源の影響によるグローやフレア処理がきれいに出来る。
・ガブレを入れる余裕が出る(基本フルCGに限りますが)。





・STMapフロー
STMapとはディストーション情報を持ったUVイメージとなります。
各カメラトラッキングソフトやMochaPro等からディストーション情報をNukeやFLAME,SMOKE、 Fusion、Avid等のコンポジットソフト(AEは非対応)や編集ソフトに渡すときに使用できます。

多くのソフト間で共通の値をやり取り出来ることはもちろんですが、Nuke等でアクションカム等の超広角レンズ等にも対応出来ることも利点の一つです(対応出来るソフトでSTMapを書きだした場合)。

またREDのように解像度によってセンサークロップするようなカメラでもセンサーをフルで使う解像度でSTMapを作っておいてそのSTMapを解像度に応じてのクロップ具合と同様にクロップしてあげることで解像度毎に補正値が不要に出来たり。(運用的にやったことはないのであくまで”理論的に出来るはず”です)

作り方
STMapはSyntheyesやPFTrack、MochaProといったトラッキングソフトやNukeのLensDistortionノード等かディストーション補正後に書き出すことが出来ます。
※歪み除去用(Undistortion)と戻しorCG等に歪み追加用(Distortion)でそれぞれUV画像を書き出す必要があります。
※一部ソフト(MochaPro等)でEXRで書き出すと16bit halfでしか出せない場合がありますが、使用時ジャギーが発生するので使えません。Mochaの場合だとTIFで書き出すと32bitのlinearで書きだされ、ジャギーもでません。


Nukeでのノード構成例(CGに実写の歪みを加えて合成)。※コンポのフローによってどう扱うか異なります。
STMapは補正後広がったエリアの情報も含むため解像度が大きくなります(樽型収差の場合)そのため事前にオーバースキャンの説明と同様にReformat”resize type>none とし、preserve bounding boxにチェック”を挟む必要があります。
STMap.jpg




参考にしたサイト
http://www.edmundoptics.jp/resources/application-notes/imaging/distortion/
http://www.cybernet.co.jp/optical/course/hitorigoto/lecture07.html
http://cweb.canon.jp/ef/special/lens/dictionary/sa/index.html


以上、カメラの話をしよう!・レンズディストーション編 でした。
関連記事

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://cgcompo.blog134.fc2.com/tb.php/71-3978e244
この記事にトラックバックする(FC2ブログユーザー)
; //

//