LoginSignup
3
1

Blenderでレンズの歪み補正データ(STmap)を作成してみる

Posted at

物理的なカメラを利用したことがある人は分かるかと思いますが
一般的に現実で真っすぐなものを撮っても レンズの歪みで画像で直線にはなりません。
補正する方法は色々あるようですが Blenderの利用して補正データ作成する例を考察したいと思います

歪み画像による画像マッピング

3Dでのテクスチャを張り付けるのUVマップを使うかと思います
これは「3D面上のここに 画像のここを対応づける」という情報ですが
画面の大きさを1.0とした割合の値の座標(UV座標)で表されます。

UVmap
また、色の画像データもBlender内では各色0-1.0の値として扱われています
ここでUV座標指定に色画像を挟むと・・・
23122601.gif
色情報をUVの座標値と解釈した座標の色を取得した画像が作成され 歪んだ画像を作ることができます
これ自体を「UVマッピング」と言ったり「STmap」と言ったりするようです
(画像左下が挟み込んだ画像で 圧縮で乱れていますがもっと滑らかな画像です)

ここではBlenderでの用語ではないですが歪ませるための画像を STmap と呼称します

このSTmapをうまく作れれば レンズの歪みの補正ができそうです
今回は広角のアクションカムでの撮影画像で試してみます

補正データのマッピング

こちらが補正をするために市松模様を撮影した画像です
image.png
周辺部分が特に大きく歪んでいますね

撮影時に市松模様の実際の大きさとカメラの距離を計測しておいて
3Dソフト上でこれと全く同じものをモデリングして
正確に対応付けされたSTmapを作れれば 理論上は歪みが補正できることになります

まずはグリッド間隔と同じメッシュを作成して
UVマッピングで撮影画像の市松模様とメッシュのUVを合わせる作業をします
image.png
3Dビューのテクスチャマッピングで市松模様が真っすぐになれば終了です

STmapの出力

撮影画像と同じカメラ位置からレンダリングすることで補正用のSTmapを作成します。

まずはレンダリング解像度とカメラの画角を設定です
このカメラビューに映った範囲が最終出力に映る範囲ということで これが補正後の画像の出力解像度や範囲に関係します。
image.png
画像がボケたり 市松模様が欠けている部分は利用できないので 撮影画像よりレンダリング範囲は狭くなります
今回は横方向の画角70度 4000*2000の解像度に設定しました

メッシュのマテリアルでこのようにUVマップの位置ベクトルを色情報として入力する設定にすると
メッシュ上の点がどのUV座標を利用しているかを表す画像になります
image.png
標準では1つピクセルに対して僅かにずらした位置をサンプリングして滑らかにする処理が
入っているので値を0にすることでオフにしています

これをレンダリングしてOpenEXRで保存します。

STmapの利用

コンポジターのノードには色の対応付けで歪める利用できるUVマッピングノードがあります
image.png
UVマッピングの 「画像」の入力に変形させたい画像を「UV」の入力にSTmap画像を接続します
出力画像の解像度はSTmapの大きさになります。

ここで画像ビューアーのエディタを表示しておいて表示画像をViewer Nodeにすると
変換結果が表示されて 結果画像の保存もできます
また、Node Wranglerアドオンを利用している場合にはサイドバーのノードタブに
「Save This Image」のボタンが出るので そこからアクティブなビューアーノードの画像を保存する操作もできます

また、Blenderでは冒頭のようにシェーダー上でUV値を歪めることができるので
私は 以前に記事にした カメラプロジェクションアドオン を併用して
カメラから見た方向が正確な位置へ投影してデリングのガイドとすることができます
こちらについては いずれ別の機会に解説したいと思います

個人的な手順の整理のために書いたニッチな内容ですが
何かのお役に立てば幸いです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1