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


スポンサーリンク

関連記事

デザインのリファイン再び
ZBrushでアヴァン・ガメラを作ってみる 爪とトゲを追加
PureRef:リファレンス画像専用ビューア
スターウォーズ エピソードVIIの予告編
HD画質の無駄遣い
Mitsuba 3:オープンソースの研究向けレンダラ
OpenAR:OpenCVベースのマーカーARライブラリ
iPhone欲しいなぁ
Autodesk CompositeとAutodesk MatchMoverが無料
素敵なパーティクル
自前Shaderの件 解決しました
書籍『イラストで学ぶ ディープラーニング』
Virtual Network Computing
CycleGAN:ドメイン関係を学習した画像変換
TorchStudio:PyTorchのための統合開発環境とエコシステム
畳み込みニューラルネットワーク (CNN: Convolutional Neural Network...
hloc:SuperGlueで精度を向上させたSfM実装
Leap MotionでMaya上のオブジェクトを操作できるプラグイン
Boost オープンソースライブラリ
Point Cloud Utils:Pythonで3D点群・Meshを扱うライブラリ
BlenderのPython環境にPyTorchをインストールする
日本でMakersは普及するだろうか?
ラクガキの立体化 背中の作り込み・手首の移植
『ローグ・ワン/スター・ウォーズ・ストーリー』"あのキャラクター"のメイキング
Ambient Occlusionを解析的に求める
布地のシワの法則性
PSPNet (Pyramid Scene Parsing Network):ディープラーニングによ...
Kaolin:3Dディープラーニング用のPyTorchライブラリ
色んな三面図があるサイト
Regard3D:オープンソースのStructure from Motionツール
Russian3DScannerのトポロジー転送ツール『WrapX』
COLMAP:オープンソースのSfM・MVSツール
シン・ゴジラのファンアート
viser:Pythonで使える3D可視化ライブラリ
Kinect for Windows V2のプレオーダー開始
3DCG Meetup #4に行ってきた
MB-Lab:Blenderの人体モデリングアドオン
ZBrushでゴジラ2001を作ってみる 目元だけ作り込んでバランスを見る
OpenMayaRender
ZBrush 4R8 リリース!
PythonでMayaのShapeノードプラグインを作る
サンプルコードにも間違いはある?

コメント