MicMacクイックリファレンス

アイキャッチ, MicMac-qr MicMac

巨大なMicMacコマンド群から初心者が写真測量する上で必要なものだけを取り出しました。出典は主にMicMac toolsのサイトですが、参考文献にあげた他のドキュメントや実際に動かして検証した結果も参考に、最後まで解析を実行できるコマンド例までまとめています。使用しなかった部分は大胆に削除してありますので、必要に応じて原文にあたってください。

MicMacはフリーでオープンソースの写真測量スイートです。

必須コマンド群

以下の順番に処理を進めることで写真測量を行います。バッチファイルを作成すれば最後まで自動的に処理を行うことができます。

  • mm3d:起点となるユニバーサルコマンド
  • Tapioca:対応点を探索する。
  • Tapas:カメラパラメータを決定する。
  • AperiCloud:疎な点群を生成する。
  • GCPBascule:GCPでジオリファレンスする(3D表示したいだけなら不要)
  • Malt:深度マップや個々の画像のオルソを生成する。
  • Tawny:Maltで生成した個々の画像のオルソをマージして1つの画像にする。
  • Nuage2Ply:深度マップをポイントクラウド化。

その他のコマンド

多数のGCPが準備できるなら使用した方が良いコマンド。SKラボは動作検証していない。リンクはすべて原文。

  • Campari:GCPでカメラパラメータを補正する(精度高いGCPが多くある場合)
  • GCPCtrl:検証点による精度確認
  • SaisieAppuisInit:GCP作成ツール(Linux上でGUI版あり)
  • SaisieAppuisPredic:GCP作成ツール(Linux上でGUI版あり)

コマンドパイプライン例

作業フォルダに処理対象JPGファイルが収められている状態で、以下のコマンドをrun.batファイルに記入し、CMD.EXEで作業フォルダに入り、runとタイプすることで処理がスタートする。

なお、よい結果を得るためにはよい画像を準備することが大切である。よい画像とは、同じカメラ・レンズで撮影され、被写体ブレ、カメラブレ、ピンボケがなく、十分な諧調を持ち、露出が揃っており、被写体に高低差があり、画像同士の重複率が80%以上あり、画像の向きが揃っているものである。

GCPを使ってジオリファレンスし、オルソ、DEMを生成する場合

画像の他、GCPonGround.xml、GCPonImages.xmlをあらかじめ作成しておく。素人・個人が信頼できる多数の標定点を準備することは難しいので、GCPは最低限の3点+アルファとし、敢えてCampariによるカメラパラメータ補正は行わず、ジオリファレンスのみ行う。

mm3d Tapioca MulScale ".*.JPG" 300 2000
mm3d Tapas RadialBasic ".*.JPG"
mm3d AperiCloud ".*.JPG" RadialBasic
mm3d GCPBascule ".*.JPG" RadialBasic Ground GCPonGround.xml GCPonImages.xml
mm3d Malt Ortho ".*.JPG" Ground EZA=1
mm3d Tawny Ortho-MEC-Malt
mm3d Nuage2Ply MEC-Malt/NuageImProf_STD-MALT_Etape_8.xml Attr=Ortho-MEC-Malt/Orthophotomosaic.tif

出力:

  • 疎な点群(3D):作業フォルダ内のAperiCloud_RadialBasic.ply
  • 密な点群(3D):MEC-Maltフォルダ内のNuageImProf_STD_MALT_Etape_8.ply
  • オルソ画像:Ortho-MEC-Maltフォルダ内のOrthophotomosaic.tif(.tfwあり)
  • DEM:MEC-Maltフォルダ内のZ_Num8_DeZoom2_STD-MALT.tif (.tfwあり)

ジオリファレンスしないで密な点群を作成する場合

密な点群だけを作成し、それに対するジオリファレンスは別の方法で行った上でGIS上でDEMを作成することを想定。密な点群上で小さな標定点を探すことは難しい。別途測量された大きく明確な目標物がある場合に適用可能。UAV撮影ではなく手持ち撮影などでカメラが大きく斜め方向を向いているときはローカル座標が地表面と平行とは限らないので、Nuage2Plyによるオルソ画像の作成は意味がない場合がある。

mm3d Tapioca MulScale ".*.JPG" 300 2000
mm3d Tapas RadialBasic ".*.JPG"
mm3d AperiCloud ".*.JPG" RadialBasic
mm3d Malt Ortho ".*.JPG" RadialBasic
mm3d Tawny Ortho-MEC-Malt
mm3d Nuage2Ply MEC-Malt/NuageImProf_STD-MALT_Etape_8.xml Attr=Ortho-MEC-Malt/Orthophotomosaic.tif

出力:

  • 疎な点群(3D):作業フォルダ内のAperiCloud_RadialBasic.ply
  • 密な点群(3D):MEC-Maltフォルダ内のNuageImProf_STD_MALT_Etape_8.ply
  • オルソ画像:Ortho-MEC-Maltフォルダ内のOrthophotomosaic.tif(.tfwはあるが無意味)

参考文献

詳細な説明(英語+仏語)https://github.com/micmacIGN/Documentation/blob/master/DocMicMac.pdf
全体像の説明(英語)
https://opengeospatialdata.springeropen.com/track/pdf/10.1186/s40965-017-0027-2.pdf
Wiki(英語+仏語)
https://micmac.ensg.eu/index.php/Accueil

コマンドリファレンス

mm3d:すべてのコマンドの起点

ほとんどの解析コマンドはユニバーサルコマンドmm3dの引数として起動する。原文へ

Syntax

mm3d コマンド 必須引数1 必須引数2 ... 任意引数1 任意引数2 ...

コマンドはTapioca, Tapas, Maltなどの個々の解析コマンド。単にmm3dとタイプすると、使用可能なコマンドリストが表示される。各コマンドのHelpは mm3d Command -help

必須引数は決まった順番で与えなければならない。任意引数は 引数名=値 の形式で与える。

ログファイル

mm3d-LogFile.txt が作業フォルダに生成されており、コマンドとそのプロセスID、開始時間、終了時間が記録されている。

Tapioca:対応点の検出

MicMacにおけるSfMの第一ステップ。原文へ

Syntax

mm3d Tapioca モード 画像ファイル 必須引数1 必須引数2 ... 任意引数1 ...

モード

  • MulScale:まず低解像度で全画像の対応点を求め、一定数以上の対応点を持つ画像ペアは高解像度で求める。必須引数1: 低解像度画像の横ピクセル数。必須引数2:高解像度画像の横ピクセル数。-1でオリジナル解像度。
    有効任意引数(ExpTxt, ByP, PostFix, NbMinPt, DLR, Pat2, Detect, Match, NoMax, NoMin, NoUnknown)
  • All:全ての画像に対して指定の解像度で対応点を求める。必須引数1: 縮小画像の横ピクセル。-1でオリジナル解像度
    有効任意引数(ExpTxt, ByP, PostFix, Pat2, Detect, Match, NoMax, NoMin, NoUnknown)
  • Line:画像の連番で前後指定数の画像について対応点を求める。必須引数1: 縮小画像の横ピクセル。-1でオリジナル解像度
    有効任意引数(ExpTxt, Jump, ByP, PostFix, Circ, ForceAdSupResol, Detect, Match, NoMax, NoMin, NoUnknown)
  • File:対応点を求める画像の組みをxmlファイルで指定する。必須引数1: 縮小画像の横ピクセル。-1でオリジナル解像度
    有効任意引数(ExpTxt, PostFix, ByP, Detect, Match, NoMax, NoMin, NoUnknown)

任意引数

  • ExpTxt:INT :: {テキストフォーマットで出力。規定値はfalse}
  • ByP:INT :: {プロセス数}
  • PostFix:string :: {フォルダにpostfixを加える}
  • NbMinPt:INT :: {最小ポイント数}
  • DLR:INT :: {低解像度で実行}
  • Pat2:string :: {第二パターン}
  • Detect:string :: {keypointsを検出するための実行ファイル}
  • Match:string
  • MaxPoint:INT :: {グラフを作成するための1画像あたりポイント数。規定値200}
  • MinScale:REAL :: {設定されるとより小さいスケールのポイントは無視}
  • MaxScale:REAL :: {設定されるとより大きいスケールのポイントは無視}
  • NbRequired:INT :: {2つの画像間につながりがあると判定する対応数。既定値1}
  • NoMax:bool :: {Sift検出器でMaxを抑制}
  • NoMin:bool :: {Sift検出器でMinを抑制}
  • NoUnknown:bool :: {}
  • Out:string :: {出力XMLファイル名}
  • PrintGraph:bool :: {標準出力に結果グラフを出力}

出力

Homolフォルダ(MulScaleモード時はHomol_SResフォルダ)内にPastis+画像ファイル名のフォルダが作成され、その中に、その画像との対応点を持つ画像ファイル名.datのバイナリファイルが保存される。

使用例1:Mulscale(多くの場合これが良い)

mm3d Tapioca MulScale ".*.jpg" 300 2000 NbMinPt=2

作業フォルダにある全jpgファイルに対し、最初は横300画素に縮小した画像を用いて全組み合わせで対応点を探し、対応点が2(デフォルト)以上見つかった画像についてのみ横2000画素に縮小した画像で再度対応点を探す。Allに比べてスピードアップにつながる。

横5000x縦2000ピクセルの画像使用時に2000を指定すれば、画像を0.4倍に縮小することになる。

使用例2:All (画像の数が少ない時)

mm3d Tapioca All ".*.jpg" -1 

作業フォルダ内の全jpgファイルに対し、オリジナル解像度で全画像ペアをマッチングしバイナリ出力。-1はオリジナル解像度。0.3から0.5倍になるような値を推奨。Allの時に使えるオプションはExpTxtとByPのみ。

使用例3:Line(画像が1列に並んでいる場合)

mm3d Tapioca Line ".*.JPG" 2000 3

作業フォルダ内の前jpgファイルに対し、対象画像の前後(連番で判断)±3枚の画像についてのみ対応点を検出する。処理は横2000画素に縮小した画像で行う。例えば街路に沿って建物の写真を順番に撮影した場合など、連番が離れた画像に対応点がないことが明白な場合に大幅なスピードアップになる。

Tapas:カメラパラメータとカメラ位置の推定

MicMacにおけるSfMの第二ステップ。原文へ

Syntax

mm3d Tapas キャリブレーションモード 画像ファイル

キャリブレーションモード

ModeCalib: RadialExtended(放射歪曲;10自由度), RadialBasic(放射歪曲;5自由度), Fraser(放射歪曲+偏心+アフィン変換;12自由度), FraserBasic(放射歪曲+偏心+アフィン変換;10自由度), FishEyeEqui(対角魚眼;14自由度), HemiEqui(半球魚眼;14自由度), AutoCal(別途求めたパラメータ使用し再探索), Figee(別途求めたパラメータ固定)

出力

Ori-OUTDIRフォルダ(オプション引数out=OUTDIRで指定。デフォルトはキャリブレーションモードで指定した名前)

注意

  • 解析には画像に記録された焦点距離などのExif情報を利用するので、Exifのない画像を使用する場合はドキュメントのCamera data base and exif handlingを読むべき。
  • 自由度の高いキャリブレーションを行うためには良質の画像ファイルまたは多くの標定点が必要。草木が風で揺れているとか、水面があるなど条件が悪い時はむしろ自由度が低い方が良い結果が得られる。まずはRadialBasicを試し、結果が良くないようならRadialExtendedかFraserBasicを試すことを薦める。
  • 良質の画像ファイルとは、カメラブレ、被写体ブレ、ピンボケがなく、十分なコントラストを持ち、撮影範囲に高低差があり、画像同士の重なりが80%以上あるもの。
  • 水面は屈折現象があるため、水深が深く川底がよく見えるような場合は特に悪影響がある。Tapasの段階では水面を塗りつぶした画像を使用するなどの工夫が必要な場合もある。

使用例1:通常の処理

mm3d Tapas RadialBasic ".*.JPG"

作業フォルダに置かれたすべてのJPG画像に対し、RadialBasicモデルのパラメータを求め、結果をOri-RadialBasicに入れる。

使用例2:画像が多い場合

mm3d Tapas RadialBasic "img((0[1-3])|(1[2-3])).JPG" Out=Calib
mm3d Tapas AutoCal ".*.JPG" InCal=Calib Out=Mur

データーが大規模な場合、まず少数の良い画像セットでパラメータを求め、そのパラメータを初期値にして全体を求めると良い場合がある。良い画像セットの条件は、「注意」とも重なるが、すべでの画像が同じ場所を含んでいる、高低差がある部分を含んでいる、同じ場所が画像内の大きく異なる場所に写っている、の3項をすべて満たしたもの。

1行目で、img01.JPG, img02.JPG, img03.JPG, img12.JPG, img13.JPGを使ってRadialExtendedのパラメータを求め、Ori-Calibに保存。2行目でOri-Cailbから初期値をとり、画像全体でパラメータを求めてOri-Murに保存。(AutoCalなら改めてパラメータを求めなおすが、Figeeならパラメータは固定する。)

AperiCloud:疎な点群ポイントクラウド出力

疎な点群をファイル出力することは必須ではない。処理の良否の目視判断材料として出力。原文へ

Syntax

mm3d AperiCloud 画像ファイル 座標フォルダ 任意引数...

画像ファイル:Tapasで指定したものと同じ(一部のみの指定も可)
座標フォルダ:Tapasで指定した出力先
任意引数とそのデフォルト:ExpTxt=0(1でテキスト形式でタイポイントは赤)、Out=AperiCloud.ply(出力ファイル名)、Bin=1(0でplyファイルがテキスト形式)、RGB=1(0で白黒。時短に効く)

出力

作業フォルダにAperiCloud_座標フォルダ名.plyファイルを生成。

使用例

mm3d AperiCloud ".*.JPG" RadialBasic

Tapasの出力フォルダであるOri-RadialBasic内のデータを用いて疎な点群ファイルAperiCloud.plyを出力

GCPBascule:GCPによるジオリファレンス

Tapasの出力とGCPファイルを使ってジオリファレンスを行う。原文へ

Syntax

mm3d GCPBascule 画像ファイル 入力座標フォルダ 出力座標フォルダ GCPxml 画像計測xml 任意引数

必須引数

任意引数

きちんと制御するには理解が必要だと思うが、素人・個人が正確なGCPを多数用意するのは難しいのでここでは説明しない。原文を確認されたい。

使用例

GCPBascule ".*.JPG" RadialBasic Ground GCPonGround.xml GCPonImages.xml

画像ファイルは作業フォルダに直に置き、TapasでRadialBasicタイプのパラメータを求めたことを想定。GCPonGround.xml, GCPonImages.xmlはあらかじめ作成しておく。

Malt:深度マップの作成

MicMacにおけるMVSステップ。立体物3Dモデルではなく、平面を基準とした地形モデルに適する。原文へ

Syntax

mm3d Malt タイプ 画像ファイル 座標フォルダ 任意引数

座標フォルダ:Tapas(GCPなしの場合)あるいはGCPBascule(GCPありの場合)の出力フォルダ

タイプ

タイプ選択が必要なところがMaltが自動ツールになり切れていない部分であるとの記述あり(文献2

  • Ortho:デフォルトでオルソ画像生成。(比較的平坦性の高い対象向き文献2
  • UrbanMNE:都市部むき高解像度DEM生成。(HrOr=trueを設定しなければオルソはできない)
  • GeomImage:建物など3D性が高い対象向き?(文献2)(HrOr=trueを設定しなければオルソはできない)Master=オプションで種画像指定が必要

任意引数

マスク画像の使用など、特に水面が多い画像を処理する際に必要になる可能性のある引数や、出力の解像度や範囲を指定する引数が多くあるが、すべて省いた。必要な方は原文を参照されたい。

  • UseGpu:bool :: {CUDA使用, def=false 有効にするには自分でバイナリをビルドする必要}
  • DirMEC:string :: {結果を保存するサブフォルダ}
  • DirOF:string :: {オルソ出力フォルダ (規定は Ortho-${DirMEC}) }
  • Purge:bool :: {計算前に結果フォルダ内を消去}
  • ZoomF:INT :: {最終ズーム倍率 (規定はOrthoの時 2、UrbanMNEの時1)}
  • ZoomI:INT :: {初期ズーム倍率 (規定は画像の数に依存)}
  • HrOr:bool :: {高解像度オルソを計算} これを設定するとUrbanMNEやGeomImageでもオルソを出力
  • LrOr:bool :: {低解像度オルソを計算} これを設定してもUrbanMNEやGeomImageではオルソ×
  • DoOrtho:bool :: {HrOr=trueなどの設定なしにこれのみtrueにしてもオルソはできなかった}
  • ZMoy:REAL :: {Zの平均値}
  • EZA:bool :: {Zの絶対値をエクスポート。規定値はfalseで、ZMoyに対する相対値になる。DEMが欲しい時true または1。}

出力

Ortho, UrbanMNEでは「MEC-Malt」フォルダ、GeomIageでは「MM-Malt-Img-種画像名」フォルダ:Nuage2Plyで使用するNuageImProf_STD-MALT_Etape_8.xmlファイルを含む。Etapeは仏語で英語ではStage。ズームレベルを指すものと思われる。8が最大で、大きいほど点群密度が高い。TA_STD-MALT.tifファイルはライン間の重なり部分が着色されている。この範囲がオルソ画像になるようだ。

オルソ画像生成を指定した場合には「Ortho-MEC-Maltフォルダ」:各画像のオルソ

使用例1:Orthoで深度マップおよび個々の画像のオルソを生成

mm3d Malt Ortho ".*.JPG" RadialBasic

Tapasにより出力されたOri-RadialBasicに保存されている相対座標を使い、個々の画像ファイルに対するオルソ画像を作成しつつ深度マップを生成する。結果はMEC-MaltとOrtho-MEC-Maltに出力される。この処理の後、Tawnyを使えばオルソ画像を合成して一つにできる。

使用例2:Orthoで深度マップ、個々の画像のオルソ、およびDEMを生成

mm3d Malt Ortho ".*.JPG" Ground EZA=1

GCPBasculeにより出力されたOri-Groundに保存されている絶対座標を使い、個々の画像ファイルに対するオルソ画像を作成しつつ深度マップとDEMを生成する。結果はMEC-MaltとOrtho-MEC-Maltに出力される。DEMはMEC-Malt内のZ_Num8_DeZoom2_STD-MALT.tifで、GIS用ワールドファイル.twfも同時に生成される。解像度はオルソの1/2、32bit実数。(micmacに限ったことではないが、画像周辺部の標高は明らかに信用できないのでmicmacのマスク処理やGISのラスタクリップなどで除去する。)この処理の後、Tawnyを使えばオルソ画像を合成して一つにできる。

使用例3:UrbanMNEで深度マップ、個々の画像のオルソ、およびDEMを生成

mm3d Malt UrbanMNE ".*.JPG" Ground HrOr=true EZA=1

GCPを使用した場合のコマンド。この処理以降は使用例2と同じ。HrOr=trueを除くとオルソは生成されない。

使用例4:GeomImageで深度マップ、オルソ、およびDEMを生成

mm3d Malt GeomImage ".*.JPG" Ground Master="V032.JPG" HrOr=true EZA=1

Masterイメージは適宜変更する。GCPを使用した場合のコマンド。HrOr=trueを除くとオルソは生成されない。また、Maltの出力フォルダ名にMasterイメージ名が含まれ、MM-Malt-Img-V032のようになる。オルソフォルダ名は同じなのでTawnyは使用例2と同じで良いが、Nuage2Plyは以下のように変更する必要あり。

mm3d Nuage2Ply MM-Malt-Img-V032/NuageImProf_STD-MALT_Etape_8.xml Attr=Ortho-MEC-Malt/Orthophotomosaic.tif

Tawny:オルソ画像の作成

Maltで生成した個々の画像のオルソをマージして1つのオルソ画像にする。原文へ

Syntax

mm3d Towny 入力フォルダ 任意引数

入力フォルダはMaltから出力されたオルソ画像フォルダ(Ortho-MEC-Malt)

任意引数

多くの任意引数があるが当面使用しないと思われるため省いた。興味があれば原文を参照されたい。

使用例

mm3d Tawny Ortho-MEC-Malt

Ortho-MEC-MaltはMaltをOrthoタイプで実行した時に生成されるフォルダで、内部にOrt_画像ファイル名.tifという名前で各画像のオルソが納められている。このコマンドでそれらを結合し、Orthophotomosaic.tifという画像を作成する。なお、Maltで作成されるOrthoは対象領域の辺縁部はカットされているようだ。必要なサイズのオルソを作成するには十分広い範囲を撮影しておく必要がある。

Nuage2Ply:深度マップをポイントクラウド化

深度マップかDEMを読み込み、ply形式のポイントクラウドとして出力する。attrオプションでポイントに色をつけることができる。Malt Orthoで生成したDEMの場合、Tawnyで生成したオルソを使用できる。原文へ

Syntax

mm3d Nuage2Ply xmlファイル 任意引数

必須引数

xmlファイルはMaltによってMEC-Maltフォルダ内に作成されたNuageImProf_STD-MALT_Etape_([1-8]).xmlファイルのどれか。Etape_([1-8])はズームレベルを示しており、値が大きいほど高精細。

任意引数

マスクなどの引数は省いた。必要があれば原文を参照されたい。

  • Out:string :: {出力ファイル名 (default toto.xml => toto.ply)}
  • Attr:string :: {ポイントに着色するためのイメージファイル}
  • Comments:vector<std::string> :: {plyファイルに加えるコメント (Def=None)}
  • Bin:INT :: {出力をバイナリ型式にするかアスキー型式にするか (Def=1, バイナリ)}
  • DoPly:INT :: {Plyファイルを出力, def = true}
  • DoXYZ:INT :: {XYZをRGBとしたイメージを出力}
  • ExagZ:REAL :: {深度の誇張パラメータ, Def=1.0}
  • Mesh:bool :: {メッシュを出力 (Def=false)}
  • 64B:bool :: {64ビットのplyを出力, Def=false, meshlabやcloud compareでは扱えないので注意}
  • Offs:Pt3dr :: {32ビットでは大きな値が扱えないのでオフセットを使用。例: Offs=[300000,5000000,0]}
  • ForceRGB:bool :: {グレーイメージでもRGB形式にする (QTのバグのためDef=true)}

出力

MEC-Maltフォルダ内にNuageImProf_STD_MALT_Etape_([1-8]).plyファイルが出力される。

使用例

mm3d Nuage2Ply MEC-Malt/NuageImProf_STD-MALT_Etape_8.xml Attr=Ortho-MEC-Malt/Orthophotomosaic.tif

Tawnyで作成したオルソをAttrオプションで指定して、ズームレベル8のポイントクラウドに色をつける。結果は./MEC-Malt/NuageImProf_STD_MALT_Etape_8.plyファイル。

標定点(GCP)ファイルの準備

標定点(GCP)実座標と画像上の位置は別々のxmlファイルで与える。最小3点あれば可能。ツールとしては最低限メモ帳とペイントがあれば作成できる。

実座標xmlファイル (GCPonGround.xml)

実座標は緯度経度ではなく投影座標系で与えた方が良い。GISなどで正しい位置に合わせる必要がなければローカル座標も可。

<?xml version="1.0" ?>
<Global>
     <DicoAppuisFlottant>
          <OneAppuisDAF>
               <Pt>22345.332 103555.455 10.1</Pt> <!--- 投影座標 --->
               <NamePt>1</NamePt> <!-- 標定点1 -->
               <Incertitude>0.01 0.01 0.05</Incertitude> <!--- 想定誤差 --->
          </OneAppuisDAF>
               ....
          <OneAppuisDAF> </OneAppusDAF>を標定点の数だけ繰り返す
               ....
     </DicoAppuisFlottant>
</Global>

画像上の座標xmlファイル (GCPonImages.xml)

画面上の座標はWindowsのペイントで画像を開いたとき左下に表示されるカーソル座標と同じ。

<?xml version="1.0" ?>
<SetOfMesureAppuisFlottants>

     <MesureAppuiFlottant1Im>
          <NameIm>1.JPG</NameIm>   <!-- 画像ファイル名 -->
	    <OneMesureAF1I>
               <NamePt>1</NamePt>  <!-- 標定点1 -->
               <PtIm>341 89</PtIm> <!-- 画像の左上から測定した標定点のピクセル位置-->
            </OneMesureAF1I>
               ....
            <OneMesureAF1I>~</OneMesureAF1I>
            を1.JPGに含まれる標定点の数だけ繰り返す
               ....
     </MesureAppuiFlottant1Im>
          ....
     <MesureAppuiFlottant1Im>~ </MesureAppuiFlottant1Im>
     を標定点を含む画像分繰り返す。
    (当然物陰で見えない標定点もあるので抜けていても可)
          ....
</SetOfMesureAppuisFlottants>

コメント

タイトルとURLをコピーしました