3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

instantNeRFで遊ぶAdvent Calendar 2022

Day 13

COLMAP images.txt

Last updated at Posted at 2022-12-12

「instantNeRFで遊ぶ Advent Calendar 2022」の13日目です。

今日は「RealityCaptureのregistrationデータを流用する検討」の課題1として、colmap2nerf.pyに入力されるCOLMAPのimages.txtについて調べました。

業務外の個人的な検討活動です。
間違っていても責任はとれません。
間違えていたらできましたらご指摘ください

images.txt

各画像のカメラパラメータと特徴点が1行ごとに書かれています。
13-1.png

公式ページが教えているカメラパラメータにテストデータを入れながら確認していきます。

座標

OpenCVと同じのようです。

投影/カメラ中心の座標は、-R^t * Tで与えられ、ここでR^tは四元数から構成される3x3回転行列の逆行列/転置、Tは並進ベクトルである。画像のローカルカメラ座標系は、画像から見て、X軸が右、Y軸が下、Z軸が前を指すように定義される。
(DeepLで翻訳しました https://www.deepl.com/translator)

こちらがimages.txtのカメラ座標に[0,0,0]、向きに[1.0,0,0]を入力したときのCOLMAPの画面です。
image.png

並進

images.txtのTx, Ty, Tzへ[0,0,0], [-1,0,0], [0,-1,0], [0,0,-1]を入れてCOLMAPへ取り込んだ時の画面はこのようになりました。ただし、QW, QX, QY, QZは[1, 0, 0, 0]としました。
import modelでモデルデータのテキストファイル3点セットが入ったフォルダを指定しました。
13-2.png

カメラ中心の座標は-R^t * Tとあるので、カメラの中心座標は[0,0,0], [1,0,0], [0,1,0], [0,0,1]になっています。

表で検算した結果
13-6.png

回転

images.txtのQW, QX, QY, QZにオイラー角X, Y, Zが[10deg, 0deg, 0deg], [10deg, 30deg, 0deg], [10deg, 30deg, 50deg]の回転の角度をいれてCOLMAPへ取り込んだ時の画面はこのようになりました。
それぞれ回転後の座標軸に対して右ねじの方向に回転していましたので、内因性のオイラー角、右手系になっているようです。

テストしたimges.txt
13-3a.png

COLMAPの画面
13-3b.png

段階ごとに分解した図
図中の数字はカメラが回転した角度です。右ねじの逆方向に回転したのでマイナスをつけています。
13-3.png
13-4.png
13-5.png

ここでそれぞれのオイラー角はscipy.spatial.transformのRotationで求めました。

$python
>>> from scipy.spatial.transform import Rotation as R
>>> rot1=R.from_euler("ZYX", [0, 0, 10], degrees=True)
>>> print(rot1.as_quat()[3], rot1.as_quat()[0], rot1.as_quat()[1], rot1.as_quat()[2])
0.9961946980917455 0.08715574274765817 0.0 0.0
>>> rot2=R.from_euler("ZYX", [0, 30, 10], degrees=True)
>>> print(rot2.as_quat()[3], rot2.as_quat()[0], rot2.as_quat()[1], rot2.as_quat()[2])
0.9622501868990583 0.08418598282936919 0.25783416049629954 -0.022557566113149834
>>> rot3=R.from_euler("ZYX", [50, 30, 10], degrees=True)
>>> print(rot3.as_quat()[3], rot3.as_quat()[0], rot3.as_quat()[1], rot3.as_quat()[2])
0.8816280768439285 -0.03266701292872763 0.26925564114813405 0.3862204035220014

並進と回転

colmapはまず平行移動してから回転するようです。
(DeepLで翻訳しました https://www.deepl.com/translator)

images.txtからカメラの向きと位置を出す計算について、具体的な計算がこちらに紹介されていました。

カメラ位置と向きの値をimages.txtの形式に変換

RealityCaptureからexportしたカメラの位置や向きの値をimages.txtに書き込むことが目的でした。
documentationにある式を変換しました。
image.png

テストデータとして、位置[0.1, 0, 0]、向きがオイラー角 [10, 20, 30]degのカメラのimages.txtの内容を計算しました。
13-11.png
COLMAPの画面でもX軸上にカメラが配置されました。
13-12.png

まとめ

  • COLMAPの座標系はOpenCVと同じ
  • カメラの座標と向きはimages.txtの内容そのものではなく変換する必要がある
    • カメラの向きはクォータニオンを変換した回転行列Rの転置 R^t
    • カメラの位置はimages.txtにある位置ベクトルTに対して-R^t T

参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?