fSpy:1枚の写真からカメラパラメーターを割り出すツール

以前、BLAMという、静止画から撮影カメラの位置やパースを割り出す(つまりカメラキャリブレーションする)Blenderアドオンがあった。
fSpyはその後継となるスタンドアローンアプリで、Windows, Mac, Linuxで使用できる。(読み方はエフスパイで良いのか?)

カメラ情報をBlenderにインポートするためのアドオンfSpy-Blenderも別途用意されている。

fSpy

fSpyは、静止画像のカメラマッチングを行うオープンソースのクロスプラットフォームアプリです。

背景

以前、BLAMという静止画像カメラキャリブレーション用Blenderアドオンを開発しました。BLAMは、UIが稚拙だったにもかかわらず、Blenderのコミュニティで人気を得ました。fSpyは、BLAMの機能をスタンドアローンアプリの形でより多くのユーザーに提供するものです。

計算したカメラパラメーターを他のアプリケーションで使用する

fSpyで計算したカメラパラメーターは3Dカメラの概念を持っているため、カメラパラメーターの設定方法を提供しているアプリケーションなら理論上どんなアプリケーションでもfSpyのパラメーターを使用できるはずです。
Blenderユーザーの方は、公式のfSpyインポーターアドオンをご利用下さい。専用のインポーターの無いアプリケーションで使用する場合は、fSpyからカメラパラメーターを手動でコピーして下さい。

他のアプリケーション用のインポーター開発に興味ありますか? それなら、fSpyプロジェクトのファイル形式の仕様が良い出発点となるはずです。

Blenderへのインポート

Blenderユーザー向けには公式のfSpyインポーターアドオンを用意しています。カメラパラメーターをBlenderに設定し、オプションでBlenderカメラの背景画像を設定することができます。
使い方はこちらのマニュアルをお読みください。

GitHubでソースコードも公開されており、コードはGPLライセンス。


スポンサーリンク


basics (基礎知識?)を読んでみると、基本的には3次元復元などと同様にピンホールカメラモデルの仮定がベースにあるようだ。
2D→3D復元技術で使われる用語まとめ
2次元の画像から3次元の情報を復元するプログラムを本格的に実装してみようと思って、まずはOpenGVから触り始めたんだけど、オイラの基礎知識が乏し過ぎて苦戦中。 まだOpenGVに同梱されているtestコードをいじってみている段階。オイラは...


ただ、fSpyは画像認識で自動処理するわけではなく、ある程度人力で入力した情報を基にカメラ情報を計算してくれるツール。やや力技だけど、目的を達成するがモチベーションがハッキリしていて良いね。

基礎知識

カメラマッチング

カメラマッチング(またはカメラキャリブレーション)とは、画像内の特定の特徴からカメラパラメーターを推定するプロセスのことです。fSpyは、ユーザー定義のコントロールポイントに基づいて静止画像から撮影カメラの焦点距離、3D空間上の向き・位置の近似値を計算します。計算したカメラパラメーターは、3Dモデリングツールなどの他のアプリで使用できます。

消失点 (Vanishing points)

消失点 (Vanishing points)とは、3D空間上の平行な線全てが交わる視点画像内の点のことです。例えば、以下の画像の線路のレールは現実世界では平行であり、1つの消失点で交わります。

平行な線路のレールは全て消失点で交わる



fSpyは消失点の位置を使ってカメラパラメーターを推定します。画像上から3D空間での平行線に対応する特徴を手掛かりに2つの線分を配置し、線分から消失点を指定します。以下の画像は、2つの線分とその交点で示される消失点を表しています。

2つの線分を使用して消失点を指定する



線分がほとんど平行だと消失点の位置を正確に計算できません。線分同士の角度が大きいほど上手く消失点を計算できます。

線分同士の角度が大きいほど正確な消失点が計算できる


垂直方向 (Perpendicular directions)

fSpyでの消失点は、3D空間上の垂直方向に対応するものを想定しています。つまり、違いに直角の方向です。

垂直方向の消失点(左)と非垂直方向の消失点(右)


制約

fSpyは、ピンホールカメラのようなプロセスから得られる透視画像でのみ機能します。以下の条件を満たす画像でのみ正常に機能します。

  • 歪みのない標準(またはそれに近い)レンズで撮影された写真
  • パースペクティブカメラでレンダリングされた3D画像

以下のような画像ではfSpyが上手く機能しません。

  • 魚眼レンズなど、歪みの激しいレンズで撮影した写真
  • 透視制御などでパースペクティブが改ざんされた画像
  • 平行投影カメラでレンダリングされた3D画像
  • ステッチされたパノラマ画像

チュートリアルもある↓

チュートリアル

このチュートリアルでは、このアプリに含まれるサンプルプロジェクトについて説明します。先に進む前に基礎知識を確認してください。

消失点と3次元の原点

FileメニューからOpen example projectを選択し、サンプルプロジェクトを開いて下さい。アプリのメインウィンドウは3つのセクションで構成されています。左側に設定、中央に画像パネル、右側にキャリブレーション結果が表示されます。

サンプルプロジェクトを開くと最初に表示されるのがこちらです。

サンプルプロジェクトを開いた初期状態



四角形ポリゴンの角は、現実世界の長方形の角に合わせられています。エッジには1, 2の番号が付いており、それぞれが消失点に対応しています。各消失点の位置は、赤い線と青い線で示されています。ポリゴンの4つの制御点が2つの垂直方向の消失点を定義します。これはカメラの焦点距離・向きを決定するのに十分な数です。XYZの座標軸が付いた白い制御点は3次元の原点を表し、カメラの位置を定義します。これが、5つの制御点のみを使用した最も単純なキャリブレーション方法です。

制御点のいずれかをドラッグし、カメラパラメーターが更新される様子を確認してください。Shiftキーを押しながらドラッグすると精度が上がります。

4角形ポリゴンコントロールは簡単に使用できますが、必ずしも実用的なわけではありません。各消失点の制御点を個別に移動したい場合は、左側の設定パネルでrectangle modeオプションを無効にして下さい。

rectangle modeをオフにし、消失点コントロールを個別に移動する



スポンサーリンク

3Dグリッド

3D原点をドラッグし、その軸が画像上の線と一致するかでキャリブレーションの精度を確認できます。3Dガイドメニューには、追加で視覚的に補助する機能があります。

3DのBoxガイド


消失点の方向

座標軸x、y、zはそれぞれ赤、緑、青で色分けされています。消失点コントロールはそれぞれ、色で指定された軸の方向に消失点を定義します。軸を消失点に割り当てるには、左側の設定パネルのVanishing point axesセクションのメニューを使用します。消失点軸の割り当ては、例えば外部アプリケーションでカメラパラメーターを使用する際に役立ちます。外部アプリケーションでは、上方向に対応する軸の規則が異なる場合があります。

基準となる距離(reference distance)を指定する

2つの消失点と3D原点の位置を与えると、カメラの向きと位置を計算できます。デフォルトでは、カメラから3D原点までの距離は適切な固定値に設定されています。ただし、fSpyでは画像内のオブジェクトのサイズに基づいてこの距離を計算することもできます。

先に進む前に、サンプルプロジェクトを再度開き、行った変更をリセットして下さい。今度は消失点1, 2の軸をそれぞれ-x, -zに設定して下さい。ここで、壁のタイル1つの幅が20cmであると分かっていることとします。
座標軸を見ると、測定したい距離はx軸に沿っているため、reference distanceメニューからalong the x axisを選択します。reference distanceフィールドが0.2m (タイルの幅)に設定され、新しいコントロールが表示されました。

reference distanceを指定する



原点からx軸方向の点線は、reference distanceがその軸に沿って測定されていることを示します。赤い短い線分がreference distance handlesで、ドラッグしてreference distanceを指定できます。この例では、reference distanceがタイルの幅と等しくなるように配置されています。

主点 (principal point)

カメラのレンズの真ん中を直進する光線を想像してください。この光線がセンサー(またはフィルム)に当たる点を主点と呼びます。通常、この点は画像の中点と一致します。画像が非対称にトリミングされているなど、場合によっては主点が別の場所にある可能性もあります。
主点の位置がわかっている場合は、主点メニューから手動を選択し、黄色の制御点を主点の位置にドラッグします。位置がわかっている場合は、principal pointメニューからmanualを選択し、黄色の制御点を主点の位置にドラッグして下さい。

手動で指定された主点(オレンジの制御点)



主点の位置が不明な場合(および単一消失点モードでない場合)、3番目の垂直方向の消失点を与えると主点を計算できます。principal pointメニューからfrom third vanishing pointを選択すると、3番目の消失点コントロールが表示されます。3番目の消失点を指定すると、計算された主点が黄色の円として表示されます。制御点を移動し過ぎない限り、計算された主点は画像の中点近くになるはずです。

3番目の消失点(オレンジの円)から計算した主点


消失点が1つの画像を扱う

単一の消失点でのキャリブレーション



ここまで、このチュートリアルでは少なくとも2つの垂直方向の消失点に基づいてカメラのキャリブレーションを実行してきました。しかし、画像から消失点を1つしか特定できない場合はどうでしょうか?
いくつかの追加情報を与えれば、引き続きカメラパラメーターを計算するできます。設定パネルの上部にあるNumber of vanishing pointsメニューから1を選択すると、この動作を確認できます。2番目の消失点コントロールが変更され、左側のパネルに新しい設定が表示されます。

消失点が1つしかない場合、fSpyでは以下をユーザー入力で補います。

  1. カメラの焦点距離
  2. 消失点1, 2間の方向

設定パネルのカメラデータセクションでカメラの焦点距離を指定できます。このサンプルプロジェクトの写真は、Canon 60Dで24mmレンズを使用して撮影したものです。

単一消失点モードでは、消失点2の制御は単一の線分となります。この線分は消失点1と消失点2の間の方向、または消失点1の軸を中心とした回転の定義と同等です。

結果を比べる

右側のパネルに計算された様々なカメラパラメーターが表示されます。サンプルプロジェクトを再度開くと、焦点距離が26mmと推定されていることがわかります。これは実際の値の24mmにかなり近い値です。この誤差の原因としては、レンズの歪みや、一見直角に見える角度が実際には90度でない可能性などが考えられます。





https://3dnchu.com/archives/fspy-oss/
https://www.cgradproject.com/archives/6065/
https://lookbackmargin.home.blog/2019/10/15/install-fspy/
https://modelinghappy.com/archives/26424


スポンサーリンク

関連記事

CGレンダラ研究開発のためのフレームワーク『Lightmetrica (ライトメトリカ)』
MeshLab:3Dオブジェクトの確認・変換に便利なフリーウェア
ガメラ生誕50周年
PeopleSansPeople:機械学習用の人物データをUnityで生成する
COLMAP:オープンソースのSfM・MVSツール
天体写真の3D動画
U-Net:ディープラーニングによるSemantic Segmentation手法
リアルタイム レイトレーシングAPI『DirectX Raytracing (DXR)』
iPhoneで3D写真が撮れるアプリ『seene』
Microsoft Mathematics:数学の学習支援ツール
プロシージャル手法に特化した本が出てるみたい(まだ買わないけど)
Point Cloud Utils:Pythonで3D点群・Meshを扱うライブラリ
映画『ゴジラ-1.0』 メイキング情報まとめ
SSD (Single Shot Multibox Detector):ディープラーニングによる一般...
ちょっと凝り過ぎなWebキャンペーン:全日本バーベイタム選手権 (MITSUBISHI KAGAKU...
OpenCV3.3.0でsfmモジュールのビルドに成功!
ZBrushでアマビエを作る その2
TVML (TV program Making language)
Paul Debevec
オープンソースの物理ベースレンダラ『Mitsuba』をMayaで使う
ZBrushで仮面ライダー3号を造る 仮面編 DynaMesh
Faceshiftで表情をキャプチャしてBlender上でMakeHumanのメッシュを動かすデモ
JavaによるCGプログラミング入門サイト (日本語)
ZBrushでカスタムUIを設定する
ZBrush 4R7
Autodesk Mementoでゴジラを3次元復元する
ZBrushで仮面ライダー3号を造る 仮面編 Dam Standardブラシでディティールを彫る
UnityからROSを利用できる『ROS#』
ArUco:OpenCVベースのコンパクトなARライブラリ
ラクガキの立体化 進捗
ZBrushでアヴァン・ガメラを作ってみる パーツ分割
読みやすくて高速なディープラーニングのフレームワーク『Caffe』
MFnMeshクラスのsplit関数
Texturing & Modeling A Procedural ApproachをGoo...
バージョン管理の履歴を可視化するツール『Gource』
参考書
オープンソースのテクスチャマッピングシステム『Ptex』
白組による『シン・ゴジラ』CGメイキング映像が公開された!
DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵...
ZBrushで仮面ライダー3号を造る 仮面編 PolyGroup作成に再挑戦
OpenCVで動画の手ぶれ補正
prosper

コメント