CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

単一画像からの消失点推定技術の紹介

こんにちは。テックラボの高橋です。

最近単一画像からのカメラ位置を推定する方法について調べていたところ、fSpyというアプリケーションを知りました。 こちらは手動で消失点を設定してあげることでBlender等で画像のカメラの位置を取り込んでくれるアプリです。 カメラの向きがわかると、背景画像に対して自然にVFXのような合成をすることができるみたいですね。

www.youtube.com

しかし、人間が目で消失点を判断できるのですから、最近の技術だったら機械的に消失点の位置が求められるのではないでしょうか?

調査してみると、何本か実現できそうな技術を取り扱っている論文がありました。 今回は2023年に公開されたVanishing Point Estimation in Uncalibrated Images with Prior Gravity Directionに沿って、消失点を用いたカメラ姿勢の推定に取り組んでいきたいと思います。

消失点とカメラの回転

消失点は透視図法を用いた際に画面上で並行な直線が交わる点です。

https://en.wikipedia.org/wiki/Vanishing_point

美術の授業で習う1点透視、2点透視とか呼ばれるやつですね。縦方向の消失点も加えると、ひとつの画像には3点の消失点が存在します。

もし消失点を得ることができれば、以下の式を用いてカメラの姿勢、つまり回転を計算することができます。


R = 
\begin{bmatrix}
R_{1c} & R_{2c} & R_{3c} 
\end{bmatrix}
\\
 
K=
\begin{pmatrix}
f&0&u_0\\
0&f&v_0\\
0&0&1
\end{pmatrix}
\\

\lambda v_i = K R e_i
\\

R_{ic} = \lambda K^{-1} v_i 
\\

ここで、Rは回転行列、vが消失点、eが標準基底、λが正規化係数、Kが内部カメラ行列となります(i=1,2,3)。 K のパラメータfは焦点距離、u0、v0は画像中心の座標です。

なお、3次元空間の1点Xは、並進成分をtとして以下の式で画像上の点xに射影されます。


x = K
[R\, t ]
X
\\

つまりRを推定すると、カメラの位置ではなく向きのみが得られるということですね。 前提がざっくりわかったところで論文を見ていきましょう。

Vanishing Point Estimation in Uncalibrated Images with Prior Gravity Direction

こちらの論文はgithubにて実装が公開されています。

https://github.com/cvg/VP-Estimation-with-Prior-Gravity

処理自体は大きく2つの箇所に分かれており、

  1. ライン推定(pylsdかDeepLSD)
  2. ソルバーによる消失点計算

この論文では、(2)の処理を行う際に画像のマンハッタンワールド仮説と重力方向の向きを考慮することで、推定精度を向上させています。

マンハッタンワールド仮説とは、人工物の多くは直交座標系に平行に作られているという仮説です。 確かに街中のビルや屋内の家具は直角が多いですよね。

この仮説を採用することで、ワールド座標を求める際に2本の軸さえあれば外積を用いて残りの1軸を計算することができます。

ソルバーによる消失点の計算

この論文では検出されたラインから消失点を得るソルバーを2つ提案しています。

上記の図の右2つがこの論文で提案されたソルバーの概念図です。

青い点線が重力方向です。 重力方向は加速度センサーなどで外部から与えられることも考慮されていますが、実装のサンプルでは垂直方向を重力方向としたコードになっていました。画像しかデータが無い場合は正立画像を使ってねということですね。

論文では最終的に、既存手法を含めたすべてのソルバーを組み合わせて推定精度を向上させていました。

結果

では、実際に論文のコードを動かしてみます。

こちらが線分検出の結果、

こちらが消失点推定の結果です。

緑のラインを伸ばしてみると交差した点が消失点に対応していることがわかりますね。

それではこのデータから回転行列Rを計算し、Blenderにデータを取り込んでみます。

カメラの向きを設定してから、適当な立方体を置いてみると…

なかなか良い精度で画像上に物体を配置することができました!

手動でfSpyにて設定したカメラ角度と比べても、2°程度の違いに収まっていました。

おわりに

今回は行っていませんが、初期値やソルバーの設定等でもう少し精度を上げられるかもしれません。 また、本論文と同じ作者からDeepLSDという線分検出の技法が提案されているのでこちらも気になりますね。 3Dや画像処理に関連する技術は今後も定期的に追っていこうと思います。

参考