【CEDEC2024 フォローアップ】高品質なフォトグラメトリデータを取得するためのハードウェア&ソフトウェア開発


こんにちは、スキャンエンジニアの湯です。CEDEC2024では「高品質なフォトグラメトリデータを取得するためのハードウェア&ソフトウェア開発」というタイトルで講演しました。ご参加ありがとうございました。

本講演では、Cygamesスキャンスタジオの設備や、スキャンスタジオで開発したハードウェアとソフトウェアについて紹介しました。
ハードウェアについては、被写体までの距離を保つための距離計と、ストロボのオーバーヒートを軽減する制御ユニットを開発し、持ちやすい撮影リグを設計しました。ソフトウェアについては、ストロボを使った撮影での光の減衰を補正する手法と交差偏光撮影の色補正手法を提案しました。

以下が講演資料になります。

フォローアップ記事では、光の減衰を補正する手法(輝度補正)と交差偏光撮影の色補正手法を数学的に検証し、提案手法の有効性について補足をしていきたいと思います。

輝度補正について

光の減衰を補正する、または「ストロボ光の反射がカメラに到達する量」という輝度を補正することを考える時に、講演では理想の逆二乗の法則モデルを使って説明しました。しかし、理想のモデルは光が点光源で均等に拡散する場合ですので、実際にスキャンする時に使うストロボとは違います。果たして逆二乗の法則が成立するかについて計測し、検証します。
例としてGodox AR400を使います。検証の手順が以下になります。

  1. 普段のフォトグラメトリで使っているカメラ設定でカラーチェッカーを撮影します。少しずつ後方に下がりながら何枚か撮って、視差のために横からも撮ります。絞りはF16、シャッタースピードは1/200秒で、ダイナミックレンジのためISO感度を100にします。AR400の出力は1/4です。
  2. 写真をリニアワークフローに適した現像をしてから、RealityCaptureでアライメントとメッシュ生成をします。
  3. シーンのスケールを定義し、DepthMapを書き出します。
  4. 撮影したカラーチェッカーのライトグレーパッチをNukeなどで測ります。
  5. RealityCaptureのアライメントでまっすぐの一列になっている画像から取得したRGB値とそのセットとなるDepth値からデータを作ります。データのyをパッチのRGB値、xをDepth値とします。
  6. 逆二乗の法則に沿って、データxとyに曲線 「 y = a * x **-2 + e 」でカーブフィッティングします。ノイズeの結果と相対誤差を確認します。

RealityCaptureのアライメントとカーブフィッティングの結果が以下です。

a = 218.508, 標準誤差 = 0.423, 相対誤差 = 0.00196 e = 0.000808, 標準誤差 = 0.0001, 相対誤差 = 0.124

a = 218.508, 標準誤差 = 0.423, 相対誤差 = 0.00196
e = 0.000808, 標準誤差 = 0.0001, 相対誤差 = 0.124

逆二乗の曲線が綺麗にデータにフィッティングしたのがわかります。

環境光などのノイズが0.000808で、被写体からかなり離れていなければ無視できる程度でした。

輝度補正の環境光について

次に、シャッタースピード1/25秒で疑似的に少し明るい環境で撮影して、同じ手順で検証してみました。
RealityCaptureのアライメントとカーブフィッティングの結果が以下です。

a = 206.133, 標準誤差 = 1.282, 相対誤差 = 0.00622 e = 0.00252, 標準誤差 = 0.000423, 相対誤差 = 0.168

a = 206.133, 標準誤差 = 1.282, 相対誤差 = 0.00622
e = 0.00252, 標準誤差 = 0.000423, 相対誤差 = 0.168

ノイズを表すeの数値が上がって、環境光の影響が出ているのがわかります。

さらに明るい環境で撮影する場合はノイズが増えるため、それを考慮した輝度補正が必要になります。

ストロボの配光特性(照射角度)について

上記の二つの検証はフレームの中心にカラーチェッカーを置いて撮影した結果でした。しかし、フォトグラメトリは画像の周辺部分も使いますので、撮影した画像を使って画像の周辺ではどれぐらい光が減衰したのかを確認しました。(レンズの周辺減光を補正しています。) 以下がカラーチェッカーを中心と周辺に置いて撮影した例です。

RealityCaptureのアライメントとカーブフィッティングの結果が以下です。

 

赤い点がライトグレーのパッチを画像の周辺において撮影した結果です。パッチが暗くなっていて、逆二乗のカーブから少し外れているのがわかります。カーブから外れた点はDepthMapだけでは輝度補正しきれないところになります。

色補正について

交差偏光で撮影する時はレンズの前とストロボの前にそれぞれ一枚の偏光フィルターを偏光の方向が交差するように配置することで、被写体に映っている鏡面反射を除去します。その結果、フォトグラメトリでハイライトが入らないテクスチャを生成することができます。講演では、交差偏光と平行偏光の平均画像が偏光フィルターなしで撮影した画像に近似するとしましたが、そのことについて検証します。

交差偏光(Cross-Polarization)で撮ったのが被写体の約半分のDiffuseで、平行偏光(Parallel-Polarization)は約半分のDiffuseと約全部のSpecularです。それを式で表すとこのようになります。

  • IntensityCrossPolarization = 1/2 * IntensityDiffuse
  • IntensityParallelPolarization = 1/2 * IntensityDiffuse + IntensitySpecular

その二枚の画像から平均を取って作った画像をMixedとします。二枚の画像の差分はIntensitySpecularになります。IntensityMixedは半分のDiffuseと半分のSpecularから構成されて、DiffuseはIntensityCrossPolarization と比例します。

 

講演では、Mixedを色補正してカラーチェッカー公称値との色差を確認しました。ここでは偏光フィルター無しの補正結果と比較したいと思います。左の画像は偏光フィルター無しの補正結果で、右はMixedの結果です。色差ΔEの結果が近いのがわかります。

 

他もう一つの方法で検証したいと思います。冒頭で説明した式をもとに、撮影した画像からIntensityDiffuseとIntensitySpecularを計算し、Rを色補正行列、ReferenceValueをカラーチェッカーの公称値、SをSpecularの倍率係数とします。IntensityDiffuseとIntensitySpecularの組み合わせの倍率パターンから、色補正後のもっとも公称値に近いパターンを出します。

以下の目的関数を最小化するRとSを求めました。

  • f(R, S) = ( IntensityDiffuse + S * IntensitySpecular) * R – ReferenceValue

結果Rは3×3の色補正行列で、Sは0.993でほぼ1でした。これでMixedが公称値に近いという前提の色補正は問題がなかったというのがわかりました。

色補正の行列計算について

講演では事前に交差偏光から平均画像への変換行列Pを最小二乗法(Nuke-mmColorTargetなど)で求めてから、Pの疑似逆行列を本番撮影で交差偏光から公称値への変換行列Qと乗算することで、最終の色補正行列Rを出すと説明しました。計算式を書くとこのようになります。

事前:

  • 1/2 * ( PreCrossPolarization + PreParallelPolarization ) = PreMixed
  • PreCrossPolarization * P = PreMixed

本番:

  • CrossPolarization * Q = ReferenceValue

事前と本番の撮影環境が近い場合、事前の補正行列Pは本番のCrossPolarizationでも同じく使えます:

  • CrossPolarization * P = Mixed

Mixedは偏光フィルター無しに近いことから:

  • Mixed * R = ReferenceValue
  • R = Mixed-1 * ReferenceValue
  • R = ( CrossPolarization * P)-1 * ( CrossPolarization * Q )
  • R = P-1 * Q

これが講演で話した色補正行列計算の詳細です。
色補正の行列Rを使って撮影した画像(カラーチェッカー)を補正した結果が以下の左の画像になります。さらにアルベドテクスチャが欲しい場合はブラックポイント、ホワイトポイント補正するとアルベド値に近い結果になりますが(右画像、公称値との差分)、素材と撮影環境によってずれてしまう場合がありますのでリファレンス写真や計測値を見ながら調整する必要があります。

 

輝度補正と色補正のパイプラインについて

講演で説明した輝度補正と色補正を取り入れて、以下のようなパイプラインを提案しました。

 

TextureLayerの画像を生成するのに、RealityCaptureのアライメントとメッシュ生成が必要です。RealityCaptureから書き出したDepthMap(DistanceToObject)と色補正に使ったカラーチェッカーまでの距離(DistanceToColorChecker)から輝度補正し、次に交差偏光と平行偏光から計算した色補正行列Rと乗算します。最終的に2つの補正を1つシンプルな計算式にまとめることができます。

  • RGB’ = RGB * ( DistanceToObject / DistanceToColorChecker ) ** 2 * R

最後に

今回の講演ではストロボと交差偏光を使ったフォトグラメトリ撮影とデータ処理を改善する手法を紹介しました。フォローアップ記事では、講演で説明した光の減衰を補正する輝度補正手法と交差偏光撮影の色補正手法について、数学的な検証を通じてその有効性を確認しました。これらの手法を取り入れることで、より高品質なフォトグラメトリデータの取得が可能となり、リアルな3Dモデルの生成に寄与することが期待されます。そして我々Cygamesは今後もさらなる技術の進化と共に、より精度の高いデータ取得方法を模索し続けてまいります。