不動産の内装の写真測量 in GTA SA (2) カメラキャリブレーション | 山口大学 空中測量(UAV写真測量)研究室の技術ノート

山口大学 空中測量(UAV写真測量)研究室の技術ノート

UAV写真測量, ドローン測量, フォトグラメトリ, SfMなどと呼ばれる技術の情報を掲載します。
1. 効率化・高精度化に関する研究速報・マニュアル
2. SfM/MVSソフトAgisoft Metashapeの使い方
などなど。

※「ブログトップ」の注意・免責事項からご覧ください。

【このテーマの記事は、日々の興味本位のお試しを記録するものです。おふさげも入っています。】

 

<ターゲットの設置と撮影>
ホテルThe Clown's Pocketの内装の写真測量は、現実の物件よりも条件が厳しそうなので、せめて内部パラメータの適切な初期値を与えるため、簡単なカメラキャリブレーションをしておくことにした。

 

日本ではチェスボード模様の平面を色々な向きから撮ってキャリブレーションを行うことが多いようだが、San Andreas州にはチェスボードが見当たらない。そこで、より古典的なアプローチとして、3次元座標が既知の多数の点を写した1枚の写真を使ってカメラパラメータを求めることにした。

 

まず、San Andreas州の自由な開発環境を利用して、Garver Bridge下の広場で、同型の薄い円形ターゲットを17個、向きを鉛直に揃えて3次元的に配置し、ほぼ正面から写真を1枚撮った。円形ターゲットは浮いているが、私が与えた3次元座標を保持し、風雨や銃砲弾などではびくともしない。

 

 

17個にとどめた理由は、同じ形なのであまり多くなると紛らわしいことと、仮想現実のカメラだからきっと内部パラメータは少ない(わざわざ主点のずれやスキュー、複雑な歪みを持たせる動機はないだろう)と考えたためだ。

 

 

<ターゲットの画素座標の読み取り>

次に、画像処理ソフトImageJを用いて、各ターゲットの中心を目視判読し、その画素座標(画像の左端から数えた画素数uと、上端から数えた画素数v;単位はpix)をテキストファイルにエクスポートした。

 

 

実際には、別の目的もあって、各点の画素座標を7人で読み取った。そこで、各点のu, vについて、7人が読み取った値の中央値を採用した。下表に参考までに、17のターゲットに与えた世界座標と、7人が読み取った画素座標の集計結果を示す。水色の部分が、カメラパラメータの推定に使ったデータになる。

 

表. 各ターゲットに与えた世界座標と、7人が読み取った画素座標の統計量

 

 

<カメラパラメータの推定1:ピンホールカメラモデルのキャリブレーション>

キャリブレーションの計算の1段階目は、

D.P. Robertson and R. Cipolla., Structure from Motion, In Varga, M., editors, Practical Image Processing and Computer Vision, John Wiley, 2009.

の13章に記載の、ピンホールカメラ(歪みのないカメラ)を仮定した方法である。ここでは詳しく述べないが、和歌山大学の呉先生のスライドでは日本語で説明されている。

 

写真の撮影は、世界座標系(3次元;例えばm単位)から画素座標系(2次元;pix単位)への投影であるが、歪みのないピンホールカメラモデルではこの投影は線形であり、3行4列の透視投影行列P ("projection matrix")で表せる。6点以上のターゲットがあれば、投影誤差(世界座標をPで投影して得た画素座標と読み取った画素座標の距離)の、全ターゲットに関するRMSの最小化により、Pが推定できる。そこから、行列の分解を使って、カメラの内部パラメータを格納した行列Kと、外部パラメータに対応する行列R(世界座標系→カメラ座標系への回転行列), ベクトル T(カメラ座標系での世界座標系の原点の座標)が取り出せるというわけだ。

 

ここまでを自作のRスクリプトで実行したところ、下記の結果を得た。

 

 

まず着目すべきは、投影誤差のRMSが0.16画素と、非常に小さいことだ。これはu, v成分を合成した誤差であることを考えると、上表に示した読み取りの標準誤差とあまり変わらないレベルだ(標準誤差を参照するなら中央値ではなく平均値を使え、と自分でも思ったがもう遅い)。以上から、厳密ではないが

GTA SAのカメラは、ピンホールカメラである

と判断される。いくらSan Andreas州広しと言えども、これを確認した人間は少ないだろう。

 

投影誤差が小さいことの視覚的理解のため、下図に、画素座標の読み取り値(赤)と投影値(青)のプロットを示す。両者はよく重なっており、赤い点がほとんど見えない。

 

 

次に、内部パラメータ行列Kから内部パラメータを読み取る。PhotoScanのFrame cameraモデルの表記に合わせると、、Kの成分は内部パラメータを用いて次のように表せる。

f  + B1       B2         cx

       0          f          cy

       0          0           1

 

これを上のRによる計算結果と対照すると、

x (u)方向の主点のオフセット: cx = 0.44274 [pix]

y (v)方向の主点のオフセット: cy = 0.32990 [pix]

スキュー: B2 = - 0.35596

画面距離: f = 974.50

画素のxy方向の大きさの違いを表す係数 B1 = -60.521

となる。

 

主点のオフセットとスキューは小さく、開発者がこれらをわざわざ導入する動機が想像しにくいことも考慮すると、実際は0であると考えられる。

 

一方、B1は無視できない大きさである。

B1が負であるということは、イメージセンサ上の画素の一辺の長さが 横>縦 だということだ。そのため、同じ距離に対応する画素数は 横<縦 となる。このようなカメラで撮った画像をディスプレイで表示すると、すべての地物が現実よりも縦長に写るはずだ。

 

 

画像を良く見てみると、確かにそんな気がする。ターゲットは円形で鉛直に置いてあり、中央(17番)のターゲットは正面方向から少し見上げて撮っているのだから、B1が0なら縦長に写ることはないはずだ。しかし、実際に画像上で中央のターゲットのサイズを測ってみると、縦67画素、横63画素で、6%ほど縦長になっていた。この6%という数字は、推定したB1から予測される値(-B1 / (f + B1))と整合している。

 

おそらく、私の解像度の設定が適切でないため、カメラにも影響が出てしまったのだろう。

 

 

<カメラパラメータの推定2:歪みパラメータを含む?カメラモデルのキャリブレーション>

キャリブレーションの計算の2段階目は、1段階目で得られたピンホールカメラの内部パラメータを初期値として、歪みパラメータを含むFrame cameraモデルのキャリブレーションを行うこと、のはずだった。

 

しかし今回は、1段階目のピンホールカメラモデル自体が読み取りデータに十分によくあてはまり、さらに主点のオフセットとスキューはゼロでよいと判断された。そこで2段階目として、自作のRスクリプトにより、これらをゼロに固定した上で、残った内部パラメータであるfとB1だけを最適化した。ここでの最適化も、投影誤差のRMSの最小化である。

 

結果は次の通りとなった。

画面距離: f = 974.63

画素のxy方向の大きさの違いを表す係数 B1 = -60.527

投影誤差のRMS: 0.19 [pix]

 

いくつかの内部パラメータを除外したので、投影誤差(カメラモデルのあてはめの残差に当たる)は増えて当前だが、それでも十分に小さい。そこで、次ページ以降の内装の写真測量では、内部パラメータとしてfとB1のみを考慮し、初期値にこれらの値を用いることとする。

ちなみに35 mm判換算の焦点距離に直すと、x方向に関して約26 mmだ。そこそこ広角と言えよう。

 

いくらSan Andreas州広しと言えども、ゴジラや巨人や聖闘士が闊歩し、車が空を飛びまわる自由な世界であっても、真面目にカメラキャリブレーションをしたのは私が初めてかもしれない!(実際、"GTA SA" & "intrinsic parameter"などで検索しても、何も見つからない)。

 

なお、現実世界のカメラキャリブレーションにおける、カメラモデルや考慮する内部パラメータの選択は、この記事のケースのように感覚的に判断するべきではないだろう。同種のカメラに関する既存の情報を参考にするか、バンドル調整でセルフキャリブレーションを行う場合と同様に統計学的な方法で行うことが望ましいと考えられる。

 

統計学的な方法には例えば、検証専用のターゲットを用いる、交差検証をする、などが考えられる。AIC(赤池情報量基準)を単純に用いた方法も提案されているが、例えば半径方向歪みについて、低次の項が高次の項と同じペナルティを受けるというのは、感覚的にまずい気がする。AICなどを使う場合、誤差項に関する仮定をしっかり吟味する必要があるだろう。