Multi-View Environment (MVE)
MVE bietet eine vollständige Pipeline zur Photogrammetrie. Diese umfasst Structure-from-Motion, Multi-View Stereo und Surface Reconstruction. Die Pipeline besteht aus einzelnen Bibliotheken, welche in C++ geschrieben sind. Der Quelltext ist plattformunabhängig und läuft unter Linux, MacOS als auch Windows.
MVE wurde an der Technischen Universität Darmstadt durch die Forschungsgruppe ”Graphics, Capture and Massively Parallel Computing” entwickelt. Leiter der Forschungsgruppe ist Prof. Dr.-Ing. Michael Goesele. Zusätzlich haben an diesem Projekt Simon Fuhrmann, Fabian Langguth, Nils Moehrle und Michael Waechter mit gearbeitet. (Projekt Werbseite MVE)
Ein großer Vorteil für das Projekt ”Digital Humanities im Museum 4.0” war die Nutzbarkeit von MVE in der Kommandozeile. Dadurch konnte ein Skript erstellt werden, welches die Einzelschritte der Rekonstruktion automatisch durchführt.
Es werden folgende Programme von uns benutzt: - makescene - sfmrecon - dmrecon - scene2pset - fssrecon - meshclean
makescene
This utility creates MVE scene by importing from an external SfM software. With the "images-only" option, all images in the input directory are imported without camera information. If "append-images" is specified, images are added to an existing scene. The input images get converted into a MVE dataset.
Tips & Notes:
- Funktion von -o ist noch nicht klar. Was ist mit "originalen" Bildern gemeint? Aktuell scheint der Schalter nicht zu funktionieren. diff -bur mit_i/ mit_io/ zeigt, dass die Dateien in beiden Ordnern gleich ist.
- "Yes, --max-pixels is what you want for sfmrecon (or, makescene if you prefer that). Scale your images down to 1MP or even less to get results quicker. As a general suggestion, I would import high-res images with makescene, unless you want to safe space, and use --max-pixels for sfmrecon only."(https://github.com/simonfuhrmann/mve/issues/416)
Befehl | Beschreibung | Beispiel | Tags |
---|---|---|---|
-o, --original | Import original images | makescene -o <input_dir> | ??? |
-b, --bundle-id=ARG | Bundle ID (Photosynther and Bundler only [0] | makescene -b <input_dir> | Unwichtig |
-k, --keep-invalid | Keeps images with invalid cameras | makescene -k <input_dir> | experimental |
-i, --images-only | Imports images from <input_dir> only | makescene -i <input_dir> | wichtig |
-a, --append-images | Appends images to an existing scene | makescene -a new/images/here | unwichtig |
-m, --max-pixels=ARG | Limit image size by iterative half-sizing | makescene --max-pixels=60000 0 |
sfmrecon
Reconstruction of camera parameters for MVE scenes using Structure from Motion. Note: The prebundle and the log file are relative to the scene directory. The EXIF information of the images are saved into the specific meta.ini file after sfmrecon (https://github.com/simonfuhrmann/mve/issues/394).
Tips & Notes:
- Funktion von -o auch hier nicht bekannt
- Falls kein oder ein scheinbar ungeeginetes Initial-Paar für das Feature Matching gefunden wird, hilft es oftmals, ein besseres mit dem Schalter --initial-pair=X,Y anzugeben. X und Y stehen hierbei für die ID der Views.
- --cascade-hashing "should speed things up" (https://github.com/simonfuhrmann/mve/issues/416)
Befehl | Beschreibung | Beispiel | Tags |
---|---|---|---|
-o, --original=ARG | Original image embedding [original] | sfmrecon -o | ??? |
-e, --exif=ARG | EXIF data embedding [exif] | sfmrecon -e | ??? |
-m, --max-pixels=ARG | Limit image size by iterative half-sizing | sfmrecon --max-pixels=80000 0 | |
-u, --undistorted=ARG | Undistorted image embedding [undistored] | sfmrecon --undistorted=undi storted | |
--prebundle=ARG | Load/store pre-bundle file [prebundle.sfm] | sfmrecon --prebundle=prebun dle.sfm | |
--survey=ARG | Load survey from file [] | sfmrecon --survey=survey.tx t | |
--log-file=ARG | Log some timings to file [] | sfmrecon --log-file=log.txt | log |
--no-prediction | Disable matchability prediction | sfmrecon --no-prediction | experimental |
--normalize | Normalize scene after reconstruction | sfmrecon --normalize | |
--skip-sfm | Compute prebundle, skip SfM reconstruction | sfmrecon --skip-sfm --prebundle=prebun dle.sfm | experimental |
--always-full-ba | Run full bundle adjustment after every view | sfmrecon --always-full-ba | wichtig |
--video-matching=A RG | For frames extracted from a video: Match frame only to ARG previous frames [0] | sfmrecon -video-matching=5 | experimental |
--fixed-intrinsics | Do not optimize camera intrinsics | sfmrecon --fixed-intrinsics | wichtig |
--intrinsics-from- views | Use intrinsics from MVE views [use EXIF] | sfmrecon --intrinsics-from- views | wichtig |
--track-error-thre s=ARG | Error threshold for new tracks [0.01] | sfmrecon --track-error-thre s=0.025 | wichtig |
--track-thres-fact or=ARG | Error threshold factor for tracks [10] | sfmrecon --track-thres-fact or=13 | wichtig |
--use-2cam-tracks | Triangulate tracks from only two cameras | sfmrecon --use-2cam-tracks | experimental |
--initial-pair=ARG | Manually specify initial pair IDs [-1,-1] | sfmrecon --initial-pair=3,5 | wichtig |
--cascade-hashing | Use cascade hashing for matching [false] | sfmrecon --cascade-hasing | experimental |
--verbose-ba | Print detailed BA information [false] | sfmrecon --verbose-ba | log |
dmrecon
Generates the depthmaps for the input images
Tips & Notes:
- Keine Tips oder Notes bis jetzt
Befehl | Beschreibung | Beispiel | Tags |
---|---|---|---|
-n, --neighbors=ARG | Amount of neighbor views (global view selection) | dmrecon --neighbors=5 | |
-m, --master-view=ARG | Reconstructs given master view ID only | dmrecon --master-view=18 | |
-l, --list-view=ARG | Reconstructs given view IDs (given as string "0-10") | dmrecon --list-view="3-15" | experimental |
-s, --scale=ARG | Reconstruction on given scale [0] | dmrecon --scale=3 | wichtig |
--max-pixels=ARG | Limit master image size [1500000] | dmrecon --max-pixels=200000 | |
-f, --filter-width=ARG | Patch size for NCC based comparison [5] | dmrecon --filter-width=7 | |
--nocolorscale | Turn off color scale | dmrecon --nocolorscale | |
-i, --image=ARG | Specify source image embedding [undistorted] | dmrecon --image=undistorte d | |
--local-neighbors= ARG | Amount of neighbors for local view selection [4] | dmrecon --local-neighbors= 6 | |
--keep-dz | Store dz map into view | dmrecon --keep-dz | |
--keep-conf | Store confidence map into view | dmrecon --keep-conf | |
-p, --writeply | Use this option to write the ply file | dmrecon -p | |
--plydest=ARG | Path suffix appended to scene dir to write ply files | dmrecon --plydest=/output/ | |
--bounding-box=ARG | Six comma seperated values used as AABB [disabled] | dmrecon --bounding-box=??? | |
--progress=ARG | Progress output style: 'silent', 'simple' or 'fancy' | dmrecon --progress=fancy | log |
--force | Reconstruct and overwrite existing depthmaps | dmrecon --force |
scene2pset
Generates a pointset form the scene by projection reconstructed depth values in the world coordinate system
Tips & Notes:
- Keine Tips oder Notes bis jetzt
Befehl | Beschreibung | Beispiel | Tags |
---|---|---|---|
-d, --depthmap=ARG | Name of depth map to use [depth-L0] | scene2pset --depthmap=depth-L 1 | |
-i, --image=ARG | Name of color image to use [undistorted] | scene2pset --image=picture.jp g | |
-n, --with-normals | Write points with normals (PLY only) | scene2pset --with-normals | |
-s, --with-scale | Write points with scale values (PLY only) | scene2pset --with-scale | |
-c, --with-conf | Write points with confidence (PLY only) | scene2pset -c | |
-m, --mask=ARG | Name of mask/silhouette image to clip 3D points [] | scene2pset --mask=mask.png | |
-v, --views=ARG | View IDs to use for reconstruction [all] | scene2pset --views="3-10" | |
-b, --bounding-box=ARG | Six comma seperated values used as AABB | scene2pset --bounding-box=??? | |
-f, --min-fraction=ARG | Minimum fraction of valid depth values [0.0] | scene2pset --min-fraction=0.2 | |
-p, --poisson-normals | Scale normals according to confidence | scene2pset -p | |
-S, --scale-factor=ARG | Factor for computing scale values [2.5] | scene2pset --scale-factor=6.5 | |
-C, --correspondence | Output correspondences (in absence of -m and -b only) | scene2pset --correspondence | |
-F, --fssr=ARG | FSSR output, sets -nsc and -di with scale ARG | scene2pset --fssr=??? |
fssrecon
Samples the implicit function defined by the input samples and produces a surface mesh. The input samples must have normals and the "values" PLY attribute (the scale of the samples). Both confidence values and vertex colors are optional. The final surface should be cleaned (sliver triangles, isolated components, low-confidence vertices) afterwards.
Tips & Notes:
- (Zum Thema schnellere Ergebnisse vs. Qualität): "I wouldn't try tuning any parameters with fssrecon (especially not --refine-octree or --scale-factor, these are development features" (https://github.om/simonfuhrmann/mve/issues/416)
Befehl | Beschreibung | Beispiel | Tags |
---|---|---|---|
-s --scale-factor=ARG | Multiply sample scale with factor [1.0] | fssrecon --scale-factor=2.5 | experimental |
-r, --refine-octree=AR G | Refines octree with N levels [0] | fssrecon --refine-octree=1 | |
--min-scale=ARG | Minimum scale, smaller samples are clamped | fssrecon --min-scale=2 | |
--max-scale=ARG | Maximum scale, larger samples are ignored | fssrecon --max-scale=3 | |
--interpolation=AR G | Interpolation: linear, scaling, lsderiv, [cubic] | fssrecon --interpolation=sc aling |
meshclean
This application cleans degenerated faces resulting from MC-like algorithms. Vertices below a confidence threshold and vertices in small isolated components are deleted as well.
Tips & Notes:
- Höherer --threshold-Wert scheint das Modell besser aufzuräumen. "threshold=5.0" bringt (beim Smidt-Bildersatz) gute Ergebnisse.
- Beim Threshold sollte bedacht werden, dass dabei auch nützliche Flächen teilweise gelöscht werden könnten.
- Je höher --percentile gesetzt ist, desto mehr Flächen werden behalten. Alle Flächen mit einer höheren Wahrscheinlichkeit bleiben.
- Ein kleinerer "--component-size"-Wert als der Standard 1000 lässt mehr einzelne Teile erscheinen (die weniger Vertices als ARG haben. Außerdem scheint es bei bereits gut ausgewählten --threshold und --percentile Werten nicht mehr viel zu bewirken, da das meiste bereits entfernt worden ist.
Befehl | Beschreibung | Beispiel | Tags |
---|---|---|---|
-t, --threshold=ARG | Threshold on the geometry confidence [1.0] | meshclean --threshold=1.25 | wichtig |
-p, --percentile=ARG | Use the nth percentile (0-100) as confidence threshold [disabled] | meshclean --percentile=75 | wichtig |
-c, --component-size=ARG | Minimum number of vertices per component [1000] | meshclean --componen-size=1500 | wichtig |
-n, --no-clean | Prevents cleanup of degenerated faces | meshclean --no-clean | unwichtig |
--delete-scale | Delete scale attribute from mesh | meshclean --delete-scale | unwichtig |
--delete-conf | Delete confidence attribute from mesh | meshclean --delete-conf | unwichtig |
--delete-color | Delete color attribute from mesh | meshclean --delete-color | unwichtig |