以前、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次元復元などと同様にピンホールカメラモデルの仮定がベースにあるようだ。

ただ、fSpyは画像認識で自動処理するわけではなく、ある程度人力で入力した情報を基にカメラ情報を計算してくれるツール。やや力技だけど、目的を達成するがモチベーションがハッキリしていて良いね。
基礎知識
カメラマッチング
カメラマッチング(またはカメラキャリブレーション)とは、画像内の特定の特徴からカメラパラメーターを推定するプロセスのことです。fSpyは、ユーザー定義のコントロールポイントに基づいて静止画像から撮影カメラの焦点距離、3D空間上の向き・位置の近似値を計算します。計算したカメラパラメーターは、3Dモデリングツールなどの他のアプリで使用できます。
消失点 (Vanishing points)
消失点 (Vanishing points)とは、3D空間上の平行な線全てが交わる視点画像内の点のことです。例えば、以下の画像の線路のレールは現実世界では平行であり、1つの消失点で交わります。
fSpyは消失点の位置を使ってカメラパラメーターを推定します。画像上から3D空間での平行線に対応する特徴を手掛かりに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オプションを無効にして下さい。
3Dグリッド
3D原点をドラッグし、その軸が画像上の線と一致するかでキャリブレーションの精度を確認できます。3Dガイドメニューには、追加で視覚的に補助する機能があります。
消失点の方向
座標軸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 (タイルの幅)に設定され、新しいコントロールが表示されました。
原点からx軸方向の点線は、reference distanceがその軸に沿って測定されていることを示します。赤い短い線分がreference distance handlesで、ドラッグしてreference distanceを指定できます。この例では、reference distanceがタイルの幅と等しくなるように配置されています。
主点 (principal point)
カメラのレンズの真ん中を直進する光線を想像してください。この光線がセンサー(またはフィルム)に当たる点を主点と呼びます。通常、この点は画像の中点と一致します。画像が非対称にトリミングされているなど、場合によっては主点が別の場所にある可能性もあります。
主点の位置がわかっている場合は、主点メニューから手動を選択し、黄色の制御点を主点の位置にドラッグします。位置がわかっている場合は、principal pointメニューからmanualを選択し、黄色の制御点を主点の位置にドラッグして下さい。
主点の位置が不明な場合(および単一消失点モードでない場合)、3番目の垂直方向の消失点を与えると主点を計算できます。principal pointメニューからfrom third vanishing pointを選択すると、3番目の消失点コントロールが表示されます。3番目の消失点を指定すると、計算された主点が黄色の円として表示されます。制御点を移動し過ぎない限り、計算された主点は画像の中点近くになるはずです。
消失点が1つの画像を扱う
ここまで、このチュートリアルでは少なくとも2つの垂直方向の消失点に基づいてカメラのキャリブレーションを実行してきました。しかし、画像から消失点を1つしか特定できない場合はどうでしょうか?
いくつかの追加情報を与えれば、引き続きカメラパラメーターを計算するできます。設定パネルの上部にあるNumber of vanishing pointsメニューから1を選択すると、この動作を確認できます。2番目の消失点コントロールが変更され、左側のパネルに新しい設定が表示されます。
消失点が1つしかない場合、fSpyでは以下をユーザー入力で補います。
- カメラの焦点距離
- 消失点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
関連記事
libigl:軽量なジオメトリ処理ライブラリ
ZBrushでアヴァン・ガメラを作ってみる 爪とトゲを追加
タダでRenderManを体験する方法
ZBrushでアヴァン・ガメラを作ってみる 脚のポーズ調整
フィーリングに基づくタマムシの質感表現
UnityでLight Shaftを表現する
CLO:服飾デザインツール
この本読むよ
ZBrushCoreのTransposeとGizmo 3D
素敵なパーティクル
ゴジラ三昧
この連休でZBrushの スキルアップを…
uGUI:Unityの新しいGUI作成システム
Siggraph Asia 2009 カンファレンスの詳細
ZBrushでアヴァン・ガメラを作ってみる 壊れたデータの救...
ラクガキの立体化 進捗
ZBrushで仮面ライダー3号を造る 仮面編 Clay Po...
オープンソースの物理ベースレンダラ『Mitsuba』をMay...
OpenCV 3.1のsfmモジュールを試す
SSII2014 チュートリアル講演会の資料
リアルタイム レイトレーシングAPI『DirectX Ray...
続・ディープラーニングの資料
ZBrushでアヴァン・ガメラを作ってみる 口のバランス調整
Boost オープンソースライブラリ
OpenCV3.3.0でsfmモジュールのビルドに成功!
After Effects全エフェクトの解説(6.5)
日立のフルパララックス立体ディスプレイ
ZBrush キャラクター&クリーチャー
トランスフォーマーロストエイジのメイキング
Accord.NET Framework:C#で使える機械学...
オープンソースのロボットアプリケーションフレームワーク『RO...
FCN (Fully Convolutional Netwo...
グローバルイルミネーションに手を出す前に、やり残したことがあ...
Raytracing Wiki
ドラマ『ファーストクラス』のモーショングラフィックス
Composition Rendering:Blenderに...
Mayaのシェーディングノードの区分
ManimML:機械学習の概念を視覚的に説明するためのライブ...
3DCGのモデルを立体化するサービス
BGSLibrary:OpenCVベースの背景差分ライブラリ
HTML5・WebGLベースのグラフィックスエンジン『Goo...
trimesh:PythonでポリゴンMeshを扱うライブラ...













コメント