2014年6月17日火曜日

VisualSfMの使い方 その4 -対応点リストの読み込み-

VisualSfMでは、三次元復元を行う際にSIFTを用いたマッチング結果を利用するようになっている。ただし、拡張現実感などで復元結果を利用したトラッキングを作ろうとした場合には、SIFTは計算コストが高くリアルタイムでのトラッキングには適さない(SIFT-GPUを使えば別ですが)。

また、VisualSfMで利用しているSIFTのプログラムとOpenCVに実装されているSIFTでは、得られる特徴点や特徴量が微妙に異なる。なので、どうせならOpenCVで抽出した点に対して復元処理を行いたい。

SIFT以外の特徴点検出手法の利用やOpenCVに実装されている手法の利用は、自分で各画像の特徴点情報ファイル(".sift"という拡張子のファイル)とマッチングリストを用意することで実現できる。方法については、VisualSfMのDocumentに書かれているが、各ファイルの準備方法について簡単に述べる。

・特徴点情報ファイル
VisualSfMでは、各画像から抽出された特徴点の情報は、一旦、"画像ファイル名.sift"というファイルに書き込まれる。このファイルを自分で用意することで、SIFT以外の特徴点検出結果を利用することが可能となる。

特徴点情報ファイルには、以下のフォーマットで特徴点情報が書き込まれている。
[Header][検出位置情報][特徴量][EOF]
なお、情報は全てバイナリファイルとして書き込まれる必要がある。

- ヘッダ情報
ヘッダ情報はint型の大きさ5の配列で以下の情報が書き込まれる。
  int[5] = {name, version, npoint, 5, 128};
  name = ('S'+ ('I'<<8)+('F'<<16)+('T'<<24));
  version = ('V'+('4'<<8)+('.'<<16)+('0'<<24)); (色情報を含めてある場合は ('V'+('5'<<8)+('.'<<16)+('0'<<24)))
  npoint = 検出された特徴点数

- 検出位置情報
検出された特徴点の位置・色・スケール・方向の情報をfloat型の大きさ5の配列として書き込んでいく。この時、色情報に関しては、unsigned char [4]の情報をfloatへキャストする必要がある。
最終的には、float[5] = {x, y, color, scale, orientation}を特徴点毎に順番に書き込んでいく。
scale、orientationについては、復元処理には利用されないので、これらの情報が得られない手法を用いる場合には"0"を入れておくなどしておけば良い。

- 特徴量
各特徴点に対する特徴量を書き込む。VisualSfMのマッチング関数を用いる場合には、特徴量は128次元のunsigned char型で、特徴ベクトルの大きさは512に正規化されている必要がある。
ただし、自分でマッチングリストを用意する場合には、特に気にする必要はない。

- EOF
EOFは以下の情報を書き込む。
  int eof_marker = (0xff+('E'<<8)+('O'<<16)+('F'<<24));

・マッチングリスト
特徴点の対応付けで紹介したプログラムを応用して、マッチングリストを作成することができる。
マッチングリストはテキストファイルで、マッチングを行った画像対ごとの情報を以下のように書き込んでいく。

  画像1のファイルパス 画像2のファイルパス 対応点数
  画像1の特徴点インデックス
  画像2の特徴点インデックス

以下は、VisualSfMのDocumentに載っている例で、この場合、画像888.jpgで検出されたインデックス19の特徴点と画像709.jpgで検出されたインデックス139の特徴点が対応付いているという意味になる。インデックスについては、特徴点情報ファイルと一致するようにしなければならない。また、インデックスは0から始まる。

888.jpg 709.jpg 24
19 18 24 3651 1511 2899 71 115 201 202 199 1639 2595 210 189 1355 268 241 137 728 1899 193 192 325
139 143 181 261 342 349 373 433 622 623 686 700 745 812 868 951 987 990 1001 1016 1021 1046 1047 1069


特徴点情報ファイル、マッチングリストが準備出来たら、VisualSfMで File -> Open + Multi Images で画像および特徴点情報の読み込みを行い。SfM -> Pairwise Matching -> Import Feature Matches でマッチングリストを読み込む。後は、SfM -> Reconstruct Sparse を実行すると復元が開始される。



0 件のコメント:

コメントを投稿