diff --git a/.gitignore b/.gitignore index 956fc78503..8a96a071b5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ _build venv venv_prod .vscode +.venv +.venv_prod # Base ignores: # ============= diff --git a/.tx/config b/.tx/config index 39b30a3819..135a77aa8d 100644 --- a/.tx/config +++ b/.tx/config @@ -1,604 +1,803 @@ [main] host = https://www.transifex.com -[opendronemap_docs.arguments] -file_filter = source/locale//LC_MESSAGES/arguments.po -source_file = source/locale/pot/arguments.pot -source_lang = en -type = PO - -[opendronemap_docs.contributing] -file_filter = source/locale//LC_MESSAGES/contributing.po -source_file = source/locale/pot/contributing.pot -source_lang = en -type = PO - -[opendronemap_docs.faq] -file_filter = source/locale//LC_MESSAGES/faq.po -source_file = source/locale/pot/faq.pot -source_lang = en -type = PO - -[opendronemap_docs.flying] -file_filter = source/locale//LC_MESSAGES/flying.po -source_file = source/locale/pot/flying.pot -source_lang = en -type = PO - -[opendronemap_docs.gcp] -file_filter = source/locale//LC_MESSAGES/gcp.po -source_file = source/locale/pot/gcp.pot -source_lang = en -type = PO - -[opendronemap_docs.geo] -file_filter = source/locale//LC_MESSAGES/geo.po -source_file = source/locale/pot/geo.pot -source_lang = en -type = PO - -[opendronemap_docs.index] -file_filter = source/locale//LC_MESSAGES/index.po -source_file = source/locale/pot/index.pot -source_lang = en -type = PO - -[opendronemap_docs.installation] -file_filter = source/locale//LC_MESSAGES/installation.po -source_file = source/locale/pot/installation.pot -source_lang = en -type = PO - -[opendronemap_docs.large] -file_filter = source/locale//LC_MESSAGES/large.po -source_file = source/locale/pot/large.pot -source_lang = en -type = PO - -[opendronemap_docs.map-accuracy] -file_filter = source/locale//LC_MESSAGES/map-accuracy.po -source_file = source/locale/pot/map-accuracy.pot -source_lang = en -type = PO - -[opendronemap_docs.masks] -file_filter = source/locale//LC_MESSAGES/masks.po -source_file = source/locale/pot/masks.pot -source_lang = en -type = PO - -[opendronemap_docs.multispectral] -file_filter = source/locale//LC_MESSAGES/multispectral.po -source_file = source/locale/pot/multispectral.pot -source_lang = en -type = PO - -[opendronemap_docs.outputs] -file_filter = source/locale//LC_MESSAGES/outputs.po -source_file = source/locale/pot/outputs.pot -source_lang = en -type = PO - -[opendronemap_docs.requesting-features] -file_filter = source/locale//LC_MESSAGES/requesting-features.po -source_file = source/locale/pot/requesting-features.pot -source_lang = en -type = PO - -[opendronemap_docs.resources] -file_filter = source/locale//LC_MESSAGES/resources.po -source_file = source/locale/pot/resources.pot -source_lang = en -type = PO - -[opendronemap_docs.tutorials] -file_filter = source/locale//LC_MESSAGES/tutorials.po -source_file = source/locale/pot/tutorials.pot -source_lang = en -type = PO - - - -[opendronemap_docs.arguments_auto-boundary] -file_filter = source/locale//LC_MESSAGES/arguments/auto-boundary.po -source_file = source/locale/pot/arguments/auto-boundary.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_boundary] -file_filter = source/locale//LC_MESSAGES/arguments/boundary.po -source_file = source/locale/pot/arguments/boundary.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_build-overviews] -file_filter = source/locale//LC_MESSAGES/arguments/build-overviews.po -source_file = source/locale/pot/arguments/build-overviews.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_camera-lens] -file_filter = source/locale//LC_MESSAGES/arguments/camera-lens.po -source_file = source/locale/pot/arguments/camera-lens.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_cameras] -file_filter = source/locale//LC_MESSAGES/arguments/cameras.po -source_file = source/locale/pot/arguments/cameras.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_cog] -file_filter = source/locale//LC_MESSAGES/arguments/cog.po -source_file = source/locale/pot/arguments/cog.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_copy-to] -file_filter = source/locale//LC_MESSAGES/arguments/copy-to.po -source_file = source/locale/pot/arguments/copy-to.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_crop] -file_filter = source/locale//LC_MESSAGES/arguments/crop.po -source_file = source/locale/pot/arguments/crop.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_debug] -file_filter = source/locale//LC_MESSAGES/arguments/debug.po -source_file = source/locale/pot/arguments/debug.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_dem-decimation] -file_filter = source/locale//LC_MESSAGES/arguments/dem-decimation.po -source_file = source/locale/pot/arguments/dem-decimation.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_dem-euclidean-map] -file_filter = source/locale//LC_MESSAGES/arguments/dem-euclidean-map.po -source_file = source/locale/pot/arguments/dem-euclidean-map.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_dem-gapfill-steps] -file_filter = source/locale//LC_MESSAGES/arguments/dem-gapfill-steps.po -source_file = source/locale/pot/arguments/dem-gapfill-steps.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_dem-resolution] -file_filter = source/locale//LC_MESSAGES/arguments/dem-resolution.po -source_file = source/locale/pot/arguments/dem-resolution.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_depthmap-resolution] -file_filter = source/locale//LC_MESSAGES/arguments/depthmap-resolution.po -source_file = source/locale/pot/arguments/depthmap-resolution.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_dsm] -file_filter = source/locale//LC_MESSAGES/arguments/dsm.po -source_file = source/locale/pot/arguments/dsm.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_dtm] -file_filter = source/locale//LC_MESSAGES/arguments/dtm.po -source_file = source/locale/pot/arguments/dtm.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_end-with] -file_filter = source/locale//LC_MESSAGES/arguments/end-with.po -source_file = source/locale/pot/arguments/end-with.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_fast-orthophoto] -file_filter = source/locale//LC_MESSAGES/arguments/fast-orthophoto.po -source_file = source/locale/pot/arguments/fast-orthophoto.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_feature-quality] -file_filter = source/locale//LC_MESSAGES/arguments/feature-quality.po -source_file = source/locale/pot/arguments/feature-quality.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_feature-type] -file_filter = source/locale//LC_MESSAGES/arguments/feature-type.po -source_file = source/locale/pot/arguments/feature-type.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_force-gps] -file_filter = source/locale//LC_MESSAGES/arguments/force-gps.po -source_file = source/locale/pot/arguments/force-gps.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_gcp] -file_filter = source/locale//LC_MESSAGES/arguments/gcp.po -source_file = source/locale/pot/arguments/gcp.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_geo] -file_filter = source/locale//LC_MESSAGES/arguments/geo.po -source_file = source/locale/pot/arguments/geo.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_gps-accuracy] -file_filter = source/locale//LC_MESSAGES/arguments/gps-accuracy.po -source_file = source/locale/pot/arguments/gps-accuracy.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_help] -file_filter = source/locale//LC_MESSAGES/arguments/help.po -source_file = source/locale/pot/arguments/help.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_ignore-gsd] -file_filter = source/locale//LC_MESSAGES/arguments/ignore-gsd.po -source_file = source/locale/pot/arguments/ignore-gsd.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_matcher-distance] -file_filter = source/locale//LC_MESSAGES/arguments/matcher-distance.po -source_file = source/locale/pot/arguments/matcher-distance.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_matcher-neighbors] -file_filter = source/locale//LC_MESSAGES/arguments/matcher-neighbors.po -source_file = source/locale/pot/arguments/matcher-neighbors.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_matcher-type] -file_filter = source/locale//LC_MESSAGES/arguments/matcher-type.po -source_file = source/locale/pot/arguments/matcher-type.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_max-concurrency] -file_filter = source/locale//LC_MESSAGES/arguments/max-concurrency.po -source_file = source/locale/pot/arguments/max-concurrency.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_merge] -file_filter = source/locale//LC_MESSAGES/arguments/merge.po -source_file = source/locale/pot/arguments/merge.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_mesh-octree-depth] -file_filter = source/locale//LC_MESSAGES/arguments/mesh-octree-depth.po -source_file = source/locale/pot/arguments/mesh-octree-depth.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_mesh-size] -file_filter = source/locale//LC_MESSAGES/arguments/mesh-size.po -source_file = source/locale/pot/arguments/mesh-size.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_min-num-features] -file_filter = source/locale//LC_MESSAGES/arguments/min-num-features.po -source_file = source/locale/pot/arguments/min-num-features.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_name] -file_filter = source/locale//LC_MESSAGES/arguments/name.po -source_file = source/locale/pot/arguments/name.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_optimize-disk-space] -file_filter = source/locale//LC_MESSAGES/arguments/optimize-disk-space.po -source_file = source/locale/pot/arguments/optimize-disk-space.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_orthophoto-compression] -file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-compression.po -source_file = source/locale/pot/arguments/orthophoto-compression.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_orthophoto-cutline] -file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-cutline.po -source_file = source/locale/pot/arguments/orthophoto-cutline.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_orthophoto-kmz] -file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-kmz.po -source_file = source/locale/pot/arguments/orthophoto-kmz.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_orthophoto-no-tiled] -file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-no-tiled.po -source_file = source/locale/pot/arguments/orthophoto-no-tiled.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_orthophoto-png] -file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-png.po -source_file = source/locale/pot/arguments/orthophoto-png.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_orthophoto-resolution] -file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-resolution.po -source_file = source/locale/pot/arguments/orthophoto-resolution.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-classify] -file_filter = source/locale//LC_MESSAGES/arguments/pc-classify.po -source_file = source/locale/pot/arguments/pc-classify.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-csv] -file_filter = source/locale//LC_MESSAGES/arguments/pc-csv.po -source_file = source/locale/pot/arguments/pc-csv.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-ept] -file_filter = source/locale//LC_MESSAGES/arguments/pc-ept.po -source_file = source/locale/pot/arguments/pc-ept.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-filter] -file_filter = source/locale//LC_MESSAGES/arguments/pc-filter.po -source_file = source/locale/pot/arguments/pc-filter.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-geometric] -file_filter = source/locale//LC_MESSAGES/arguments/pc-geometric.po -source_file = source/locale/pot/arguments/pc-geometric.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-las] -file_filter = source/locale//LC_MESSAGES/arguments/pc-las.po -source_file = source/locale/pot/arguments/pc-las.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-quality] -file_filter = source/locale//LC_MESSAGES/arguments/pc-quality.po -source_file = source/locale/pot/arguments/pc-quality.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-rectify] -file_filter = source/locale//LC_MESSAGES/arguments/pc-rectify.po -source_file = source/locale/pot/arguments/pc-rectify.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-sample] -file_filter = source/locale//LC_MESSAGES/arguments/pc-sample.po -source_file = source/locale/pot/arguments/pc-sample.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_pc-tile] -file_filter = source/locale//LC_MESSAGES/arguments/pc-tile.po -source_file = source/locale/pot/arguments/pc-tile.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_primary-band] -file_filter = source/locale//LC_MESSAGES/arguments/primary-band.po -source_file = source/locale/pot/arguments/primary-band.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_project-path] -file_filter = source/locale//LC_MESSAGES/arguments/project-path.po -source_file = source/locale/pot/arguments/project-path.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_radiometric-calibration] -file_filter = source/locale//LC_MESSAGES/arguments/radiometric-calibration.po -source_file = source/locale/pot/arguments/radiometric-calibration.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_rerun-all] -file_filter = source/locale//LC_MESSAGES/arguments/rerun-all.po -source_file = source/locale/pot/arguments/rerun-all.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_rerun-from] -file_filter = source/locale//LC_MESSAGES/arguments/rerun-from.po -source_file = source/locale/pot/arguments/rerun-from.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_rerun] -file_filter = source/locale//LC_MESSAGES/arguments/rerun.po -source_file = source/locale/pot/arguments/rerun.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_resize-to] -file_filter = source/locale//LC_MESSAGES/arguments/resize-to.po -source_file = source/locale/pot/arguments/resize-to.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_skip-3dmodel] -file_filter = source/locale//LC_MESSAGES/arguments/skip-3dmodel.po -source_file = source/locale/pot/arguments/skip-3dmodel.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_skip-band-alignment] -file_filter = source/locale//LC_MESSAGES/arguments/skip-band-alignment.po -source_file = source/locale/pot/arguments/skip-band-alignment.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_skip-report] -file_filter = source/locale//LC_MESSAGES/arguments/skip-report.po -source_file = source/locale/pot/arguments/skip-report.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_sm-cluster] -file_filter = source/locale//LC_MESSAGES/arguments/sm-cluster.po -source_file = source/locale/pot/arguments/sm-cluster.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_smrf-scalar] -file_filter = source/locale//LC_MESSAGES/arguments/smrf-scalar.po -source_file = source/locale/pot/arguments/smrf-scalar.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_smrf-slope] -file_filter = source/locale//LC_MESSAGES/arguments/smrf-slope.po -source_file = source/locale/pot/arguments/smrf-slope.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_smrf-threshold] -file_filter = source/locale//LC_MESSAGES/arguments/smrf-threshold.po -source_file = source/locale/pot/arguments/smrf-threshold.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_smrf-window] -file_filter = source/locale//LC_MESSAGES/arguments/smrf-window.po -source_file = source/locale/pot/arguments/smrf-window.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_split-image-groups] -file_filter = source/locale//LC_MESSAGES/arguments/split-image-groups.po -source_file = source/locale/pot/arguments/split-image-groups.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_split-overlap] -file_filter = source/locale//LC_MESSAGES/arguments/split-overlap.po -source_file = source/locale/pot/arguments/split-overlap.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_split] -file_filter = source/locale//LC_MESSAGES/arguments/split.po -source_file = source/locale/pot/arguments/split.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_texturing-data-term] -file_filter = source/locale//LC_MESSAGES/arguments/texturing-data-term.po -source_file = source/locale/pot/arguments/texturing-data-term.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_texturing-keep-unseen-faces] -file_filter = source/locale//LC_MESSAGES/arguments/texturing-keep-unseen-faces.po -source_file = source/locale/pot/arguments/texturing-keep-unseen-faces.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_texturing-outlier-removal-type] -file_filter = source/locale//LC_MESSAGES/arguments/texturing-outlier-removal-type.po -source_file = source/locale/pot/arguments/texturing-outlier-removal-type.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_texturing-skip-global-seam-leveling] -file_filter = source/locale//LC_MESSAGES/arguments/texturing-skip-global-seam-leveling.po -source_file = source/locale/pot/arguments/texturing-skip-global-seam-leveling.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_texturing-skip-local-seam-leveling] -file_filter = source/locale//LC_MESSAGES/arguments/texturing-skip-local-seam-leveling.po -source_file = source/locale/pot/arguments/texturing-skip-local-seam-leveling.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_texturing-tone-mapping] -file_filter = source/locale//LC_MESSAGES/arguments/texturing-tone-mapping.po -source_file = source/locale/pot/arguments/texturing-tone-mapping.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_tiles] -file_filter = source/locale//LC_MESSAGES/arguments/tiles.po -source_file = source/locale/pot/arguments/tiles.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_time] -file_filter = source/locale//LC_MESSAGES/arguments/time.po -source_file = source/locale/pot/arguments/time.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_use-3dmesh] -file_filter = source/locale//LC_MESSAGES/arguments/use-3dmesh.po -source_file = source/locale/pot/arguments/use-3dmesh.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_use-exif] -file_filter = source/locale//LC_MESSAGES/arguments/use-exif.po -source_file = source/locale/pot/arguments/use-exif.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_use-fixed-camera-params] -file_filter = source/locale//LC_MESSAGES/arguments/use-fixed-camera-params.po -source_file = source/locale/pot/arguments/use-fixed-camera-params.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_use-hybrid-bundle-adjustment] -file_filter = source/locale//LC_MESSAGES/arguments/use-hybrid-bundle-adjustment.po -source_file = source/locale/pot/arguments/use-hybrid-bundle-adjustment.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_verbose] -file_filter = source/locale//LC_MESSAGES/arguments/verbose.po -source_file = source/locale/pot/arguments/verbose.pot -source_lang = en -type = PO - -[opendronemap_docs.arguments_version] -file_filter = source/locale//LC_MESSAGES/arguments/version.po -source_file = source/locale/pot/arguments/version.pot -source_lang = en -type = PO +[o:americanredcross:p:opendronemap_docs:r:arguments] +file_filter = source/locale//LC_MESSAGES/arguments.po +source_file = source/locale/pot/arguments.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_auto-boundary] +file_filter = source/locale//LC_MESSAGES/arguments/auto-boundary.po +source_file = source/locale/pot/arguments/auto-boundary.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_boundary] +file_filter = source/locale//LC_MESSAGES/arguments/boundary.po +source_file = source/locale/pot/arguments/boundary.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_build-overviews] +file_filter = source/locale//LC_MESSAGES/arguments/build-overviews.po +source_file = source/locale/pot/arguments/build-overviews.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_camera-lens] +file_filter = source/locale//LC_MESSAGES/arguments/camera-lens.po +source_file = source/locale/pot/arguments/camera-lens.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_cameras] +file_filter = source/locale//LC_MESSAGES/arguments/cameras.po +source_file = source/locale/pot/arguments/cameras.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_cog] +file_filter = source/locale//LC_MESSAGES/arguments/cog.po +source_file = source/locale/pot/arguments/cog.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_copy-to] +file_filter = source/locale//LC_MESSAGES/arguments/copy-to.po +source_file = source/locale/pot/arguments/copy-to.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_crop] +file_filter = source/locale//LC_MESSAGES/arguments/crop.po +source_file = source/locale/pot/arguments/crop.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_debug] +file_filter = source/locale//LC_MESSAGES/arguments/debug.po +source_file = source/locale/pot/arguments/debug.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_dem-decimation] +file_filter = source/locale//LC_MESSAGES/arguments/dem-decimation.po +source_file = source/locale/pot/arguments/dem-decimation.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_dem-euclidean-map] +file_filter = source/locale//LC_MESSAGES/arguments/dem-euclidean-map.po +source_file = source/locale/pot/arguments/dem-euclidean-map.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_dem-gapfill-steps] +file_filter = source/locale//LC_MESSAGES/arguments/dem-gapfill-steps.po +source_file = source/locale/pot/arguments/dem-gapfill-steps.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_dem-resolution] +file_filter = source/locale//LC_MESSAGES/arguments/dem-resolution.po +source_file = source/locale/pot/arguments/dem-resolution.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_depthmap-resolution] +file_filter = source/locale//LC_MESSAGES/arguments/depthmap-resolution.po +source_file = source/locale/pot/arguments/depthmap-resolution.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_dsm] +file_filter = source/locale//LC_MESSAGES/arguments/dsm.po +source_file = source/locale/pot/arguments/dsm.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_dtm] +file_filter = source/locale//LC_MESSAGES/arguments/dtm.po +source_file = source/locale/pot/arguments/dtm.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_end-with] +file_filter = source/locale//LC_MESSAGES/arguments/end-with.po +source_file = source/locale/pot/arguments/end-with.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_fast-orthophoto] +file_filter = source/locale//LC_MESSAGES/arguments/fast-orthophoto.po +source_file = source/locale/pot/arguments/fast-orthophoto.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_feature-quality] +file_filter = source/locale//LC_MESSAGES/arguments/feature-quality.po +source_file = source/locale/pot/arguments/feature-quality.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_feature-type] +file_filter = source/locale//LC_MESSAGES/arguments/feature-type.po +source_file = source/locale/pot/arguments/feature-type.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_force-gps] +file_filter = source/locale//LC_MESSAGES/arguments/force-gps.po +source_file = source/locale/pot/arguments/force-gps.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_gcp] +file_filter = source/locale//LC_MESSAGES/arguments/gcp.po +source_file = source/locale/pot/arguments/gcp.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_geo] +file_filter = source/locale//LC_MESSAGES/arguments/geo.po +source_file = source/locale/pot/arguments/geo.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_gps-accuracy] +file_filter = source/locale//LC_MESSAGES/arguments/gps-accuracy.po +source_file = source/locale/pot/arguments/gps-accuracy.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_help] +file_filter = source/locale//LC_MESSAGES/arguments/help.po +source_file = source/locale/pot/arguments/help.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_ignore-gsd] +file_filter = source/locale//LC_MESSAGES/arguments/ignore-gsd.po +source_file = source/locale/pot/arguments/ignore-gsd.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_matcher-distance] +file_filter = source/locale//LC_MESSAGES/arguments/matcher-distance.po +source_file = source/locale/pot/arguments/matcher-distance.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_matcher-neighbors] +file_filter = source/locale//LC_MESSAGES/arguments/matcher-neighbors.po +source_file = source/locale/pot/arguments/matcher-neighbors.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_matcher-type] +file_filter = source/locale//LC_MESSAGES/arguments/matcher-type.po +source_file = source/locale/pot/arguments/matcher-type.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_max-concurrency] +file_filter = source/locale//LC_MESSAGES/arguments/max-concurrency.po +source_file = source/locale/pot/arguments/max-concurrency.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_merge] +file_filter = source/locale//LC_MESSAGES/arguments/merge.po +source_file = source/locale/pot/arguments/merge.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_mesh-octree-depth] +file_filter = source/locale//LC_MESSAGES/arguments/mesh-octree-depth.po +source_file = source/locale/pot/arguments/mesh-octree-depth.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_mesh-size] +file_filter = source/locale//LC_MESSAGES/arguments/mesh-size.po +source_file = source/locale/pot/arguments/mesh-size.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_min-num-features] +file_filter = source/locale//LC_MESSAGES/arguments/min-num-features.po +source_file = source/locale/pot/arguments/min-num-features.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_name] +file_filter = source/locale//LC_MESSAGES/arguments/name.po +source_file = source/locale/pot/arguments/name.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_optimize-disk-space] +file_filter = source/locale//LC_MESSAGES/arguments/optimize-disk-space.po +source_file = source/locale/pot/arguments/optimize-disk-space.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_orthophoto-compression] +file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-compression.po +source_file = source/locale/pot/arguments/orthophoto-compression.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_orthophoto-cutline] +file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-cutline.po +source_file = source/locale/pot/arguments/orthophoto-cutline.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_orthophoto-kmz] +file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-kmz.po +source_file = source/locale/pot/arguments/orthophoto-kmz.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_orthophoto-no-tiled] +file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-no-tiled.po +source_file = source/locale/pot/arguments/orthophoto-no-tiled.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_orthophoto-png] +file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-png.po +source_file = source/locale/pot/arguments/orthophoto-png.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_orthophoto-resolution] +file_filter = source/locale//LC_MESSAGES/arguments/orthophoto-resolution.po +source_file = source/locale/pot/arguments/orthophoto-resolution.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-classify] +file_filter = source/locale//LC_MESSAGES/arguments/pc-classify.po +source_file = source/locale/pot/arguments/pc-classify.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-csv] +file_filter = source/locale//LC_MESSAGES/arguments/pc-csv.po +source_file = source/locale/pot/arguments/pc-csv.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-ept] +file_filter = source/locale//LC_MESSAGES/arguments/pc-ept.po +source_file = source/locale/pot/arguments/pc-ept.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-filter] +file_filter = source/locale//LC_MESSAGES/arguments/pc-filter.po +source_file = source/locale/pot/arguments/pc-filter.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-geometric] +file_filter = source/locale//LC_MESSAGES/arguments/pc-geometric.po +source_file = source/locale/pot/arguments/pc-geometric.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-las] +file_filter = source/locale//LC_MESSAGES/arguments/pc-las.po +source_file = source/locale/pot/arguments/pc-las.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-quality] +file_filter = source/locale//LC_MESSAGES/arguments/pc-quality.po +source_file = source/locale/pot/arguments/pc-quality.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-rectify] +file_filter = source/locale//LC_MESSAGES/arguments/pc-rectify.po +source_file = source/locale/pot/arguments/pc-rectify.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-sample] +file_filter = source/locale//LC_MESSAGES/arguments/pc-sample.po +source_file = source/locale/pot/arguments/pc-sample.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_pc-tile] +file_filter = source/locale//LC_MESSAGES/arguments/pc-tile.po +source_file = source/locale/pot/arguments/pc-tile.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_primary-band] +file_filter = source/locale//LC_MESSAGES/arguments/primary-band.po +source_file = source/locale/pot/arguments/primary-band.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_project-path] +file_filter = source/locale//LC_MESSAGES/arguments/project-path.po +source_file = source/locale/pot/arguments/project-path.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_radiometric-calibration] +file_filter = source/locale//LC_MESSAGES/arguments/radiometric-calibration.po +source_file = source/locale/pot/arguments/radiometric-calibration.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_rerun] +file_filter = source/locale//LC_MESSAGES/arguments/rerun.po +source_file = source/locale/pot/arguments/rerun.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_rerun-all] +file_filter = source/locale//LC_MESSAGES/arguments/rerun-all.po +source_file = source/locale/pot/arguments/rerun-all.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_rerun-from] +file_filter = source/locale//LC_MESSAGES/arguments/rerun-from.po +source_file = source/locale/pot/arguments/rerun-from.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_resize-to] +file_filter = source/locale//LC_MESSAGES/arguments/resize-to.po +source_file = source/locale/pot/arguments/resize-to.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_skip-3dmodel] +file_filter = source/locale//LC_MESSAGES/arguments/skip-3dmodel.po +source_file = source/locale/pot/arguments/skip-3dmodel.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_skip-band-alignment] +file_filter = source/locale//LC_MESSAGES/arguments/skip-band-alignment.po +source_file = source/locale/pot/arguments/skip-band-alignment.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_skip-report] +file_filter = source/locale//LC_MESSAGES/arguments/skip-report.po +source_file = source/locale/pot/arguments/skip-report.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_sm-cluster] +file_filter = source/locale//LC_MESSAGES/arguments/sm-cluster.po +source_file = source/locale/pot/arguments/sm-cluster.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_smrf-scalar] +file_filter = source/locale//LC_MESSAGES/arguments/smrf-scalar.po +source_file = source/locale/pot/arguments/smrf-scalar.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_smrf-slope] +file_filter = source/locale//LC_MESSAGES/arguments/smrf-slope.po +source_file = source/locale/pot/arguments/smrf-slope.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_smrf-threshold] +file_filter = source/locale//LC_MESSAGES/arguments/smrf-threshold.po +source_file = source/locale/pot/arguments/smrf-threshold.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_smrf-window] +file_filter = source/locale//LC_MESSAGES/arguments/smrf-window.po +source_file = source/locale/pot/arguments/smrf-window.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_split] +file_filter = source/locale//LC_MESSAGES/arguments/split.po +source_file = source/locale/pot/arguments/split.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_split-image-groups] +file_filter = source/locale//LC_MESSAGES/arguments/split-image-groups.po +source_file = source/locale/pot/arguments/split-image-groups.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_split-overlap] +file_filter = source/locale//LC_MESSAGES/arguments/split-overlap.po +source_file = source/locale/pot/arguments/split-overlap.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_texturing-data-term] +file_filter = source/locale//LC_MESSAGES/arguments/texturing-data-term.po +source_file = source/locale/pot/arguments/texturing-data-term.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_texturing-keep-unseen-faces] +file_filter = source/locale//LC_MESSAGES/arguments/texturing-keep-unseen-faces.po +source_file = source/locale/pot/arguments/texturing-keep-unseen-faces.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_texturing-outlier-removal-type] +file_filter = source/locale//LC_MESSAGES/arguments/texturing-outlier-removal-type.po +source_file = source/locale/pot/arguments/texturing-outlier-removal-type.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_texturing-skip-global-seam-leveling] +file_filter = source/locale//LC_MESSAGES/arguments/texturing-skip-global-seam-leveling.po +source_file = source/locale/pot/arguments/texturing-skip-global-seam-leveling.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_texturing-skip-local-seam-leveling] +file_filter = source/locale//LC_MESSAGES/arguments/texturing-skip-local-seam-leveling.po +source_file = source/locale/pot/arguments/texturing-skip-local-seam-leveling.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_texturing-tone-mapping] +file_filter = source/locale//LC_MESSAGES/arguments/texturing-tone-mapping.po +source_file = source/locale/pot/arguments/texturing-tone-mapping.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_tiles] +file_filter = source/locale//LC_MESSAGES/arguments/tiles.po +source_file = source/locale/pot/arguments/tiles.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_time] +file_filter = source/locale//LC_MESSAGES/arguments/time.po +source_file = source/locale/pot/arguments/time.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_use-3dmesh] +file_filter = source/locale//LC_MESSAGES/arguments/use-3dmesh.po +source_file = source/locale/pot/arguments/use-3dmesh.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_use-exif] +file_filter = source/locale//LC_MESSAGES/arguments/use-exif.po +source_file = source/locale/pot/arguments/use-exif.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_use-fixed-camera-params] +file_filter = source/locale//LC_MESSAGES/arguments/use-fixed-camera-params.po +source_file = source/locale/pot/arguments/use-fixed-camera-params.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_use-hybrid-bundle-adjustment] +file_filter = source/locale//LC_MESSAGES/arguments/use-hybrid-bundle-adjustment.po +source_file = source/locale/pot/arguments/use-hybrid-bundle-adjustment.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_verbose] +file_filter = source/locale//LC_MESSAGES/arguments/verbose.po +source_file = source/locale/pot/arguments/verbose.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:arguments_version] +file_filter = source/locale//LC_MESSAGES/arguments/version.po +source_file = source/locale/pot/arguments/version.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:contributing] +file_filter = source/locale//LC_MESSAGES/contributing.po +source_file = source/locale/pot/contributing.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:faq] +file_filter = source/locale//LC_MESSAGES/faq.po +source_file = source/locale/pot/faq.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:flying] +file_filter = source/locale//LC_MESSAGES/flying.po +source_file = source/locale/pot/flying.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:gcp] +file_filter = source/locale//LC_MESSAGES/gcp.po +source_file = source/locale/pot/gcp.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:geo] +file_filter = source/locale//LC_MESSAGES/geo.po +source_file = source/locale/pot/geo.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:index] +file_filter = source/locale//LC_MESSAGES/index.po +source_file = source/locale/pot/index.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:installation] +file_filter = source/locale//LC_MESSAGES/installation.po +source_file = source/locale/pot/installation.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:large] +file_filter = source/locale//LC_MESSAGES/large.po +source_file = source/locale/pot/large.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:map-accuracy] +file_filter = source/locale//LC_MESSAGES/map-accuracy.po +source_file = source/locale/pot/map-accuracy.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:masks] +file_filter = source/locale//LC_MESSAGES/masks.po +source_file = source/locale/pot/masks.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:multispectral] +file_filter = source/locale//LC_MESSAGES/multispectral.po +source_file = source/locale/pot/multispectral.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:outputs] +file_filter = source/locale//LC_MESSAGES/outputs.po +source_file = source/locale/pot/outputs.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:requesting-features] +file_filter = source/locale//LC_MESSAGES/requesting-features.po +source_file = source/locale/pot/requesting-features.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:resources] +file_filter = source/locale//LC_MESSAGES/resources.po +source_file = source/locale/pot/resources.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + +[o:americanredcross:p:opendronemap_docs:r:tutorials] +file_filter = source/locale//LC_MESSAGES/tutorials.po +source_file = source/locale/pot/tutorials.pot +source_lang = en +type = PO +replace_edited_strings = false +keep_translations = false + diff --git a/README.md b/README.md index 112952e8df..7b68e5c813 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # OpenDroneMap Docs -Contribute to [OpenDroneMap](https://docs.opendronemap.org)'s documentation! Anyone is welcome to share their knowledge and improve our documentation. šŸŽ‰ And it's pretty simple too! +Contribute to [OpenDroneMap](https://docs.opendronemap.org)'s documentation!!! Anyone is welcome to share their knowledge and improve our documentation. šŸŽ‰ And it's pretty simple too! # "But I don't know if I can contribute" @@ -10,7 +10,7 @@ Tips, tricks, hacks, datasets, lessons learned, best practices, every bit helps. # How To Make Your First Contribution -If you don't have a GitHub account, [register](https://github.com/join?source=header-home) first. It's free and GitHub is awesome. +If you don't have a GitHub account, [register](https://github.com/join?source=header-home) first. It's free and GitHub is awesome !!! Once you have an account there are two ways to contribute. One is quick for small changes, the second takes a bit longer to setup but makes writing long parts of documentation much quicker. @@ -18,7 +18,7 @@ Once you have an account there are two ways to contribute. One is quick for smal Browse to https://github.com/OpenDroneMap/docs/tree/publish/source. Each row in the table corresponds to a page in the documentation. Tap on the file name, in the second (2nd) column from left. Press the "Edit" icon. -![image](https://user-images.githubusercontent.com/1951843/54656313-78e26500-4a9b-11e9-9d7f-412bf7c36a2b.png) +![image](https://user-images.githubusercontent.com/1951843/54656313-78e26500-4a9b-11e9-9d7f-412bf7c36a2b.webp) Make your changes, then scroll down and tap the "Propose Changes" button. @@ -38,9 +38,10 @@ You may want to read the English Style Guide for github https://github.com/raywe Press the "Fork" button at the top of this page. -![image](https://user-images.githubusercontent.com/1951843/54656025-77fd0380-4a9a-11e9-82f6-35278ed9ccfc.png) +![image](https://user-images.githubusercontent.com/1951843/54656025-77fd0380-4a9a-11e9-82f6-35278ed9ccfc.webp) ## Step 2. Install Git and Python 3 +As there is an issue with python3.13 [(https://github.com/ethereum/s……olidity/issues/15811) with ](https://github.com/ethereum/solidity/issues/15811) python3.12 at most should be used. ### Linux: @@ -87,23 +88,23 @@ From the same Terminal (or command prompt) run the following: ``` cd docs/ -pip install virtualenv -virtualenv -p python3 venv +python3 -m venv .venv +source .venv/bin/activate # Linux/Mac -source venv/bin/activate +source .venv/bin/activate # Windows -venv\scripts\activate +.venv\scripts\activate pip install -r requirements.txt ``` -After running `source venv/bin/activate` there should be some indication that the Python virtual environment is active (see the `(venv)` that appears at the start of terminal prompt in the screengrab below). **Note:** The next time you can `cd` into the docs folder and just run `source venv/bin/activate`. There should be no need to rerun the `pip install` and `virtualenv` commands. +After running `source .venv/bin/activate` there should be some indication that the Python virtual environment is active (see the `(.venv)` that appears at the start of terminal prompt in the screengrab below). **Note:** The next time you can `cd` into the docs folder and just run `source .venv/bin/activate`. There should be no need to rerun the `pip install` and `python3 -m venv .venv` commands. Note: If you've installed `sphinx` on your system, you may run into issues with commands using that version instead of the version inside your virtualenv. -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/terminal_venv.png) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/terminal_venv.webp) Then if there are no errors, run: @@ -170,9 +171,9 @@ An *italic section of text* may also have a single asterisk on either side. Italic text needs to have a space before, then a backtick or grave accent (\`) that touches the first character of the italic text, then the italic text, then a backtick or grave accent (\`) that touches the last character of the italic text, then a space. The backticks may also be asterisks. -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_italic_transifex.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_italic_en.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_italic_sw.png) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_italic_transifex.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_italic_en.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_italic_sw.webp) ### Bold @@ -183,9 +184,9 @@ A **bold section of text** will have double asterisks on either side. Bold text needs to have a space before, then a double asterisk (`**`) that touches the first character of the bold text, then the bold text, then a double asterisk (`**`) that touches the last character of the bold text, then a space. -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_bold_transifex.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_bold_en.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_bold_sw.png) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_bold_transifex.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_bold_en.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_bold_sw.webp) ### Link @@ -194,9 +195,9 @@ Check out the `ODM documentation `_! ``` Links need to have a space before, then a backtick or grave accent (\`), then the text that will become the link on the page (in the above example: "ODM documentation"), then a space, then a less than symbol (`<`), then the complete URL, then a greater than symbol and underscore (`>_`). -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_link_transifex.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_link_en.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_link_sw.png) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_link_transifex.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_link_en.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_link_sw.webp) ### Code @@ -204,13 +205,13 @@ Code snippets need to have a space before, then a double backtick or grave accen **NOTE:** Code snippets may be referring to specific software commands and so often should NOT be translated. -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code_transifex.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code_en.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code_sw.png) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code_transifex.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code_en.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code_sw.webp) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code2_transifex.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code2_en.png) -![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code2_es.png) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code2_transifex.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code2_en.webp) +![](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_code2_es.webp) ## Managing the translation process @@ -247,7 +248,7 @@ You can also run the build for just one specific language, for example: sphinx-build -b dirhtml -D language='sw' source "_build/html/sw/" ``` -![build errors logged to the terminal](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/sphinx-build_errors_in_terminal.png) +![build errors logged to the terminal](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/sphinx-build_errors_in_terminal.webp) You should see output in your console such as: @@ -260,7 +261,7 @@ Look at the source file and line that is mentioned. In this case the file is `so Go to Transifex, go to the resource, and go to the string. The warning/error message should help you understand what went wrong. In this case the link syntax wasn't matched correctly. Fix and save the translation. -![Transifex screen grab](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_err_transifex.png) +![Transifex screen grab](https://raw.githubusercontent.com/OpenDroneMap/docs/publish/source/readme-img/reST_syntax_err_transifex.webp) Pull the language down (for example, `tx pull -l sw`) and then try the build again. diff --git a/requirements.txt b/requirements.txt index a5264d1194..ec45ba82ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ sphinx==5.3.0 sphinx-autobuild==2021.3.14 sphinx-intl==2.0.1 sphinx-rtd-theme==1.1.1 -transifex-client==0.14.4 +transifex-client==0.12.5 +sphinxcontrib-mermaid==0.9.2 diff --git a/requirements_prod.txt b/requirements_prod.txt index 2c469b7d6c..393e3fec24 100644 --- a/requirements_prod.txt +++ b/requirements_prod.txt @@ -1,5 +1,6 @@ setuptools -sphinx==5.3.0 -sphinx-intl==2.0.1 -sphinx-rtd-theme==1.1.1 +sphinx==7.4.7 +sphinx-intl +sphinx-rtd-theme +sphinxcontrib-mermaid wheel diff --git a/source/arguments.rst b/source/arguments.rst index d6a4fd755e..e463144751 100644 --- a/source/arguments.rst +++ b/source/arguments.rst @@ -29,7 +29,7 @@ Options and Flags :ref:`build-overviews` Build orthophoto overviews for faster display in programs such as QGIS. Default: ``False`` -:ref:`camera-lens` auto | perspective | brown | fisheye | spherical | equirectangular | dual +:ref:`camera-lens` auto | perspective | brown | fisheye | fisheye_opencv | spherical | equirectangular | dual Set a camera projection type. Manually setting a value can help improve geometric undistortion. By default the application tries to determine a lens type from the images metadata. . Default: ``auto`` :ref:`cameras` @@ -54,7 +54,7 @@ Options and Flags Number of steps used to fill areas with gaps. Set to 0 to disable gap filling. Starting with a radius equal to the output resolution, N different DEMs are generated with progressively bigger radius using the inverse distance weighted (IDW) algorithm and merged together. Remaining gaps are then merged using nearest neighbor interpolation. Default: ``3`` :ref:`dem-resolution` - DSM/DTM resolution in cm / pixel. Note that this value is capped to 2x the ground sampling distance (GSD) estimate. To remove the cap, check --ignore-gsd also. Default: ``5`` + DSM/DTM resolution in cm / pixel. Note that this value is capped by a ground sampling distance (GSD) estimate. Default: ``5`` :ref:`dsm` Use this tag to build a DSM (Digital Surface Model, ground + objects) using a progressive morphological filter. Check the --dem\* parameters for finer tuning. Default: ``False`` @@ -71,8 +71,8 @@ Options and Flags :ref:`feature-quality` ultra | high | medium | low | lowest Set feature extraction quality. Higher quality generates better features, but requires more memory and takes longer. . Default: ``high`` -:ref:`feature-type` akaze | hahog | orb | sift - Choose the algorithm for extracting keypoints and computing descriptors. . Default: ``sift`` +:ref:`feature-type` akaze | dspsift | hahog | orb | sift + Choose the algorithm for extracting keypoints and computing descriptors. . Default: ``dspsift`` :ref:`force-gps` Use images' GPS exif data for reconstruction, even if there are GCPs present.This flag is useful if you have high precision GPS measurements. If there are no GCPs, this flag does nothing. Default: ``False`` @@ -81,23 +81,29 @@ Options and Flags Path to the file containing the ground control points used for georeferencing. The file needs to use the following format: EPSG: or <+proj definition>geo_x geo_y geo_z im_x im_y image_name [gcp_name] [extra1] [extra2]Default: ``None`` :ref:`geo` - Path to the image geolocation file containing the camera center coordinates used for georeferencing. If you dont have values for omega/phi/kappa you can set them to 0. The file needs to use the following format: EPSG: or <+proj definition>image_name geo_x geo_y geo_z [omega (degrees)] [phi (degrees)] [kappa (degrees)] [horz accuracy (meters)] [vert accuracy (meters)]Default: ``None`` + Path to the image geolocation file containing the camera center coordinates used for georeferencing. If you don't have values for yaw/pitch/roll you can set them to 0. The file needs to use the following format: EPSG: or <+proj definition>image_name geo_x geo_y geo_z [yaw (degrees)] [pitch (degrees)] [roll (degrees)] [horz accuracy (meters)] [vert accuracy (meters)]Default: ``None`` :ref:`gltf` Generate single file Binary glTF (GLB) textured models. Default: ``False`` :ref:`gps-accuracy` - Set a value in meters for the GPS Dilution of Precision (DOP) information for all images. If your images are tagged with high precision GPS information (RTK), this value will be automatically set accordingly. You can use this option to manually set it in case the reconstruction fails. Lowering this option can sometimes help control bowling-effects over large areas. Default: ``10`` + Set a value in meters for the GPS Dilution of Precision (DOP) information for all images. If your images are tagged with high precision GPS information (RTK), this value will be automatically set accordingly. You can use this option to manually set it in case the reconstruction fails. Lowering this option can sometimes help control bowling-effects over large areas. Default: ``3`` + +:ref:`gps-z-offset` + Set a GPS offset in meters for the vertical axis (Z) by adding it to the altitude value of the GPS EXIF data. This does not change the value of any GCPs. This can be useful for example when adjusting from ellipsoidal to orthometric height. Default: ``0`` :ref:`help` show this help message and exit :ref:`ignore-gsd` - Ignore Ground Sampling Distance (GSD). GSD caps the maximum resolution of image outputs and resizes images when necessary, resulting in faster processing and lower memory usage. Since GSD is an estimate, sometimes ignoring it can result in slightly better image output quality. Default: ``False`` + Ignore Ground Sampling Distance (GSD).A memory and processor hungry change relative to the default behavior if set to true. Ordinarily, GSD estimates are used to cap the maximum resolution of image outputs and resizes images when necessary, resulting in faster processing and lower memory usage. Since GSD is an estimate, sometimes ignoring it can result in slightly better image output quality. Never set --ignore-gsd to true unless you are positive you need it, and even then: do not use it. Default: ``False`` :ref:`matcher-neighbors` Perform image matching with the nearest images based on GPS exif data. Set to 0 to match by triangulation. Default: ``0`` +:ref:`matcher-order` + Perform image matching with the nearest N images based on image filename order. Can speed up processing of sequential images, such as those extracted from video. It is applied only on non-georeferenced datasets. Set to 0 to disable. Default: ``0`` + :ref:`matcher-type` bow | bruteforce | flann Matcher algorithm, Fast Library for Approximate Nearest Neighbors or Bag of Words. FLANN is slower, but more stable. BOW is faster, but can sometimes miss valid matches. BRUTEFORCE is very slow but robust.. Default: ``flann`` @@ -141,10 +147,10 @@ Options and Flags Set this parameter if you want to generate a PNG rendering of the orthophoto. Default: ``False`` :ref:`orthophoto-resolution` 0.0> - Orthophoto resolution in cm / pixel. Note that this value is capped by a ground sampling distance (GSD) estimate. To remove the cap, check --ignore-gsd also. Default: ``5`` + Orthophoto resolution in cm / pixel. Note that this value is capped by a ground sampling distance (GSD) estimate.Default: ``5`` :ref:`pc-classify` - Classify the point cloud outputs using a Simple Morphological Filter. You can control the behavior of this option by tweaking the --dem-\* parameters. Default: ``False`` + Classify the point cloud outputs. You can control the behavior of this option by tweaking the --dem-\* parameters. Default: ``False`` :ref:`pc-copc` Save the georeferenced point cloud in Cloud Optimized Point Cloud (COPC) format. Default: ``False`` @@ -156,7 +162,7 @@ Options and Flags Export the georeferenced point cloud in Entwine Point Tile (EPT) format. Default: ``False`` :ref:`pc-filter` - Filters the point cloud by removing points that deviate more than N standard deviations from the local mean. Set to 0 to disable filtering. Default: ``2.5`` + Filters the point cloud by removing points that deviate more than N standard deviations from the local mean. Set to 0 to disable filtering. Default: ``5`` :ref:`pc-las` Export the georeferenced point cloud in LAS format. Default: ``False`` @@ -173,9 +179,6 @@ Options and Flags :ref:`pc-skip-geometric` Geometric estimates improve the accuracy of the point cloud by computing geometrically consistent depthmaps but may not be usable in larger datasets. This flag disables geometric estimates. Default: ``False`` -:ref:`pc-tile` - Reduce the memory usage needed for depthmap fusion by splitting large scenes into tiles. Turn this on if your machine doesn't have much RAM and/or you've set --pc-quality to high or ultra. Experimental. Default: ``False`` - :ref:`primary-band` When processing multispectral datasets, you can specify the name of the primary band that will be used for reconstruction. It's recommended to choose a band which has sharp details and is in focus. Default: ``auto`` @@ -203,6 +206,9 @@ Options and Flags :ref:`sfm-algorithm` incremental | triangulation | planar Choose the structure from motion algorithm. For aerial datasets, if camera GPS positions and angles are available, triangulation can generate better results. For planar scenes captured at fixed altitude with nadir-only images, planar can be much faster. . Default: ``incremental`` +:ref:`sfm-no-partial` + Do not attempt to merge partial reconstructions. This can happen when images do not have sufficient overlap or are isolated. Default: ``False`` + :ref:`skip-3dmodel` Skip generation of a full 3D model. This can save time if you only need 2D results such as orthophotos and DEMs. Default: ``False`` @@ -243,7 +249,7 @@ Options and Flags Path to the image groups file that controls how images should be split into groups. The file needs to use the following format: image_name group_nameDefault: ``None`` :ref:`split-overlap` - Radius of the overlap between submodels. After grouping images into clusters, images that are closer than this radius to a cluster are added to the cluster. This is done to ensure that neighboring submodels overlap. Default: ``150`` + Radius of the overlap between submodels in meters. After grouping images into clusters, images that are closer than this radius to a cluster are added to the cluster. This is done to ensure that neighboring submodels overlap. All imagesneed GPS information. Default: ``150`` :ref:`texturing-keep-unseen-faces` Keep faces in the mesh that are not seen in any camera. Default: ``False`` @@ -254,9 +260,6 @@ Options and Flags :ref:`texturing-skip-global-seam-leveling` Skip normalization of colors across all images. Useful when processing radiometric data. Default: ``False`` -:ref:`texturing-skip-local-seam-leveling` - Skip the blending of colors near seams. Default: ``False`` - :ref:`tiles` Generate static tiles for orthophotos and DEMs that are suitable for viewers like Leaflet or OpenLayers. Default: ``False`` diff --git a/source/arguments/align.rst b/source/arguments/align.rst index 19960aafa0..e037bfba1a 100644 --- a/source/arguments/align.rst +++ b/source/arguments/align.rst @@ -13,6 +13,13 @@ align Path to a GeoTIFF DEM or a LAS/LAZ point cloud that the reconstruction outputs should be automatically aligned to. Experimental. Default: ``None`` +See `Multi-temporal datasets for further usage information. <../../map-accuracy/#improving-relative-accuracy>`_ + +.. figure:: ../images/align_pc.webp + :alt: Animated gif comparing two separately processed, but aligned digital surface models. + :align: center + +Animated gif comparing two separately processed, but aligned digital surface models. `Learn to edit `_ and help improve `this page `_! diff --git a/source/arguments/auto-boundary.rst b/source/arguments/auto-boundary.rst index 7c28558446..dd40c9516a 100644 --- a/source/arguments/auto-boundary.rst +++ b/source/arguments/auto-boundary.rst @@ -57,14 +57,14 @@ Example Images True: ``--auto-boundary`` ^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140864618-2a0c95f2-669e-45dc-b5c5-df82a555e4e5.png +.. figure:: https://user-images.githubusercontent.com/19295950/140864618-2a0c95f2-669e-45dc-b5c5-df82a555e4e5.webp :alt: WebODM displaying the reconstruction extent of a terrestrial orbit survey of a Northern Catalpa tree. The WebODM 3D View shows the full extent of the reconstruction, bounded by the ``--auto-boundary`` option. False: ``null`` ^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140864753-db3695c5-3ba2-48fb-a644-3e591913de72.png +.. figure:: https://user-images.githubusercontent.com/19295950/140864753-db3695c5-3ba2-48fb-a644-3e591913de72.webp :alt: WebODM displaying the reconstruction extent of a terrestrial orbit survey of a Northern Catalpa tree. The WebODM 3D View shows the full extent of the recosntruction. Compared to the ``--auto-boundary`` reconstruction above, one can see that the full reconstruction area is much larger (and therefore more visually sparse). diff --git a/source/arguments/boundary.rst b/source/arguments/boundary.rst index cfc512145b..9b6fa6b2ba 100644 --- a/source/arguments/boundary.rst +++ b/source/arguments/boundary.rst @@ -62,28 +62,28 @@ GeoJSON.io New GeoJSON """""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102197-b44fea3b-01df-4f2f-9cde-f1c94ba2e8d3.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102197-b44fea3b-01df-4f2f-9cde-f1c94ba2e8d3.webp :alt: GeoJSON.io interface with empty GeoJSON map and text. After opening the above link to GeoJSON.io, one should pan and zoom the map preview to find their area of interest. Creating A Polygon """"""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102194-7992ddf8-81ce-4ee9-bb81-b5d93cb05e25.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102194-7992ddf8-81ce-4ee9-bb81-b5d93cb05e25.webp :alt: Choosing the "Draw Polygon" menu option in the Map View. Selecting the "Draw Polygon" menu option will allow you to place vertices for your polygon by left-clicking on the map. Placing Vertices """"""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102186-38a4107f-4c93-46f9-b423-3ce40fddff4b.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102186-38a4107f-4c93-46f9-b423-3ce40fddff4b.webp :alt: Placing vertices in the Map View to create the boundary GeoJSON. Choose the appropriate locations of the boundary of your polygon by left-clicking on the map to place a vertex. You can place as many vertices as you require. Completing A Polygon """"""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102193-4e619f4e-e95d-4c3d-8f89-29a38015bce0.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102193-4e619f4e-e95d-4c3d-8f89-29a38015bce0.webp :alt: Completed polygon in the Map View and GeoJSON text view. To close the polygon, you left-click on your first vertex. You will be able to close your polygon once you have placed at least three vertices on the map. @@ -91,7 +91,7 @@ Completing A Polygon Saving A Polygon """"""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102199-a5d37bbf-d057-46d8-8baf-91817c7e2f30.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102199-a5d37bbf-d057-46d8-8baf-91817c7e2f30.webp :alt: Saving the polygon using the Save menu and choosing GeoJSON. Select "Save" and then "GeoJSON" to save the completed GeoJSON boundary to disk. Your browser will prompt or otherwise alert you that the file is ready to download. Alternatively, you can copy and paste the text-only representation of the GeoJSON boundary from the right panel with the "JSON" header. @@ -138,21 +138,21 @@ Saving A Polygon Downloading A Polygon """""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145103954-17ba7c31-fda6-4883-b7a6-3f0bacc266dd.png +.. figure:: https://user-images.githubusercontent.com/19295950/145103954-17ba7c31-fda6-4883-b7a6-3f0bacc266dd.webp :alt: Browser Download/Save file prompt for the generated GeoJSON file. Once the GeoJSON file has been chosen for saving, the browser will prompt you to save it to disk. Choose an appropriate location where you can access it at a later time to load into WebODM. Setting Boundary [GeoJSON] In Task Options """"""""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102200-02bd1c97-e0e8-4932-a77d-91562823b46e.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102200-02bd1c97-e0e8-4932-a77d-91562823b46e.webp :alt: Task Options preview showing Boundary field and "Load" icon. When you are editing the Task Options for your Task, you can choose to load the Boundary [GeoJSON] created above by clicking the "Load" icon. Alternatively, you can paste the textual representation of the boundary into the Boundary [GeoJSON] text box. Boundary [GeoJSON] Loaded In Task Options """""""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102196-8f87e4ac-197f-4ce0-ac6f-082772921ea0.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102196-8f87e4ac-197f-4ce0-ac6f-082772921ea0.webp :alt: Task Options preview showing loaded Boundary with GeoJSON text. Once the Boundary [GeoJSON] has been loaded from disk or pasted from the system clipboard, you can confirm its presence by seeing the text in the text box. You can now save the Task Options to enable the Boundary [GeoJSON] for the processing Task. @@ -164,28 +164,28 @@ QGIS Creating A New Temporary Scratch Layer """"""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109912-9176cd94-1140-43ac-a371-96de2b874ec3.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109912-9176cd94-1140-43ac-a371-96de2b874ec3.webp :alt: Choosing the "Create A Temporary Scratch Layer" tool to make an empty layer to create our Boundary [GeoJSON] within. You will first need a layer to create your Boundary [GeoJSON] within, so creating a New Temporary Scratch layer is a way to do this without needing to setup a file on disk first. New Temporary Scratch Layer Geometry Type """""""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109915-ddbfed43-da5e-466b-a4b6-d6ff3b96a555.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109915-ddbfed43-da5e-466b-a4b6-d6ff3b96a555.webp :alt: Setting "Polygon" as the Geometry Type for the Temporary Scratch Layer. There are numerous choices of geometry types that can be represented by a given layer. OpenDroneMap is designed to work with Single Polygon, so you will choose Polygon from the Geometry Type menu. New Temporary Scratch Layer Settings """"""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109917-58b6c147-bdae-45be-839d-5d56b1a22fe8.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109917-58b6c147-bdae-45be-839d-5d56b1a22fe8.webp :alt: Leaving the remaining settings in their Default state. Similar to Geometry Types, there are a large number of settings and options you can adjust for a Temporary Scratch Layer. You should leave these at their pictured defaults for usage with OpenDroneMap. Adding an Orthophoto Background """""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109918-df591ce8-3df4-485d-a775-81813b7e61ef.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109918-df591ce8-3df4-485d-a775-81813b7e61ef.webp :alt: Browsing to a generated Orthophoto from WebODM that covers the Area Of Interest (AOI). If you have run the task already without a Boundary [GeoJSON], you can load the generated Orthophoto from OpenDroneMap into QGIS to use as your basemap for creating your Boundary [GeoJSON]. This should ensure that your boundary polygon exactly matches the data in your Task, as different basemaps can have errors of 1-10m or more. @@ -193,35 +193,35 @@ Adding an Orthophoto Background Adding A Polyon Feature """""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109907-b61afb3c-fdd2-4eef-872a-91f2ea97d887.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109907-b61afb3c-fdd2-4eef-872a-91f2ea97d887.webp :alt: Selecting the "Add A Polygon Feature" tool to begin creating a boundary polygon. After selecting the "Add A Polygon Feature" tool, you can begin placing vertices on the map to create your boundary. To finish your polygon, you will right-click on the canvas. Similar to GeoJSON.io, a finished polygon will have a darker outline and a darker fill to indicate that it is "solid". Toggle Editing Off """"""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109924-42480f63-2cfa-427c-8414-f45d39f796f7.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109924-42480f63-2cfa-427c-8414-f45d39f796f7.webp :alt: Clicking the "Toggle Editing" tool will prompt you to save your changes to the Temporary Scratch Layer. Once you are finished with your boundary polygon, you can click the "Toggle Editing" tool to accept your changes and write them out to the Temporary Scratch Layer and make the layer valid for saving/exporting to disk. Save Changes To Temporary Scratch Layer """""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109921-73ab273a-7180-40ea-ba3d-75ecb65c97f5.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109921-73ab273a-7180-40ea-ba3d-75ecb65c97f5.webp :alt: QGIS Dialog asking you to Save your changes to the Temporary Scratch Layer. Clicking Save on this dialog will write the changes to the Temporary Scratch Layer and enable export/save functionality. Export Temporary Scratch Layer Features """""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109911-45d7dae3-49ce-40fb-8df0-85a164763810.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109911-45d7dae3-49ce-40fb-8df0-85a164763810.webp :alt: A right-click on the Temporary Scratch Layer in the Layers panel will expose the Export menu item, with the Save Features As sub-menu item. Right-click on the Temporary Scratch Layer in the Layers panel to bring up the Export menu and the Save Features As sub-menu item, selecting Save Features As. This will prompt you to choose the export format, location and file name, and settings for your layer. Save Vector Layer As """"""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109923-b55dfc1a-5c31-4382-8b1f-3bc6322b0f33.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109923-b55dfc1a-5c31-4382-8b1f-3bc6322b0f33.webp :alt: The "Save Vector Layer As" dialog showing Format as GeoJSON, an example of a valid File Name and path, CRS of EPSG:4326 and other default options. This dialog will require you to choose GeoJSON as the format, a valid filename and path for the GeoJSON to be written out to disk with, and a valid CRS. The safest CRS choice with GeoJSON is EPSG:4326, so choose that if it is not chosen by default. All other options should be left as default and do not apply for OpenDroneMap usage. @@ -231,35 +231,35 @@ Example Images True: ``--boundary [GeoJSON]`` - Point Cloud ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140858936-10fda65f-c278-46ae-95bd-7af8f8369554.png +.. figure:: https://user-images.githubusercontent.com/19295950/140858936-10fda65f-c278-46ae-95bd-7af8f8369554.webp :alt: WebODM displaying the "clipped" reconstruction of the Brighton Beach dataset Point Cloud. The WebODM 3D View shows the modified extent of the reconstruction Point Cloud, bounded by the GeoJSON proivded to the ``--boundary`` option. True: ``--boundary [GeoJSON]`` - Orthophoto ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140859033-c6cab4f0-74b3-4266-b5ec-4a90da931340.png +.. figure:: https://user-images.githubusercontent.com/19295950/140859033-c6cab4f0-74b3-4266-b5ec-4a90da931340.webp :alt: WebODM displaying the "clipped" reconstruction of the Brighton Beach dataset Orthophoto. The WebODM 3D View shows the modified extent of the reconstruction Orthophoto, bounded by the GeoJSON proivded to the ``--boundary`` option. True: ``--boundary [GeoJSON]`` - Digital Elevation Model ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140859073-28db5174-9a40-42d8-86d6-f345d9dad5a8.png +.. figure:: https://user-images.githubusercontent.com/19295950/140859073-28db5174-9a40-42d8-86d6-f345d9dad5a8.webp :alt: WebODM displaying the "clipped" reconstruction of the Brighton Beach dataset Digital Elevation Model. The WebODM 3D View shows the modified extent of the reconstruction Digital Elevation Model, bounded by the GeoJSON proivded to the ``--boundary`` option. True: ``--boundary [GeoJSON]`` - 3D Model/Textured Mesh ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140859125-4854e651-9eff-430d-956c-16f4d9a52dfd.png +.. figure:: https://user-images.githubusercontent.com/19295950/140859125-4854e651-9eff-430d-956c-16f4d9a52dfd.webp :alt: WebODM displaying the "clipped" reconstruction of the Brighton Beach dataset 3D Model/Textured Mesh. The WebODM 3D View shows the modified extent of the reconstruction 3D Model/Textured Mesh, bounded by the GeoJSON proivded to the ``--boundary`` option. False: ``null`` ^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140858712-9bfd8c56-a52a-480e-b68d-d5a97bc516fd.png +.. figure:: https://user-images.githubusercontent.com/19295950/140858712-9bfd8c56-a52a-480e-b68d-d5a97bc516fd.webp :alt: WebODM displaying the full reconstruction of the Brighton Beach dataset Point Cloud. The WebODM 3D View shows the full extent of the recosntruction. Compared to the ``--boundary`` reconstruction above, one can see that the full reconstruction area is much larger and includes many features outside of the Area Of Interest used to generate the GeoJSON. diff --git a/source/arguments/build-overviews.rst b/source/arguments/build-overviews.rst index da541a0274..1ec80e65f9 100644 --- a/source/arguments/build-overviews.rst +++ b/source/arguments/build-overviews.rst @@ -60,14 +60,14 @@ Example Images True: ``--build-overviews`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127073339-6b2a0a4f-6ede-4dc1-8da4-5bc9646de304.png +.. figure:: https://user-images.githubusercontent.com/19295950/127073339-6b2a0a4f-6ede-4dc1-8da4-5bc9646de304.webp :alt: QGIS displaying the generated Overviews The Layer Properties panel demonstrates that this OpenDroneMap-generated GeoTIFF has internal Overviews. False: ``null`` ^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127074349-a3f84c4c-d05c-4bf1-bd7c-790781ad0fe3.png +.. figure:: https://user-images.githubusercontent.com/19295950/127074349-a3f84c4c-d05c-4bf1-bd7c-790781ad0fe3.webp :alt: QGIS displaying the file is lacking Overviews The Layer Properties panel demonstrates that this OpenDroneMap-generated GeoTIFF lacks internal Overviews. diff --git a/source/arguments/camera-lens.rst b/source/arguments/camera-lens.rst index e44a10e815..fbde7c27fd 100644 --- a/source/arguments/camera-lens.rst +++ b/source/arguments/camera-lens.rst @@ -8,7 +8,7 @@ camera-lens ``````````` -**Options:** *auto | perspective | brown | fisheye | spherical | equirectangular | dual* +**Options:** *auto | perspective | brown | fisheye | fisheye_opencv | spherical | equirectangular | dual* Set a camera projection type. Manually setting a value can help improve geometric undistortion. By default the application tries to determine a lens type from the images metadata. . Default: ``auto`` @@ -56,21 +56,21 @@ The following examples are all data taken with a standard Rectilinear Lens. Manu ``auto`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127077336-ae79a958-a953-4376-86fd-430d0e5457f2.png +.. figure:: https://user-images.githubusercontent.com/19295950/127077336-ae79a958-a953-4376-86fd-430d0e5457f2.webp :alt: Rectilinear data rendered by ``auto`` Camera Lens Model This Point Cloud shows a proper reconstruction via the ``auto`` (``brown``) Camera Lens Model, which is appropriate for this sensor. ``brown`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127077753-580a174e-7572-4315-8801-224ce097d9fc.png +.. figure:: https://user-images.githubusercontent.com/19295950/127077753-580a174e-7572-4315-8801-224ce097d9fc.webp :alt: Rectilinear data rendered by ``brown`` Camera Lens Model As in the prior example, this Point Cloud is reconstructed via the ``brown`` Camera Lens Model. ``fisheye`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127077826-53d459fe-5e4e-4b10-8e70-fbddf775c4f7.png +.. figure:: https://user-images.githubusercontent.com/19295950/127077826-53d459fe-5e4e-4b10-8e70-fbddf775c4f7.webp :alt: Rectilinear data rendered by ``fisheye`` Camera Lens Model In this Point Cloud reconstruction, severe bowling and other artifacts have been introduced via the use of the wrong Camera Lens Model. @@ -78,7 +78,7 @@ The following examples are all data taken with a standard Rectilinear Lens. Manu ``perspective`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127077485-699f9e61-72a6-45f2-990f-f5748b6ee99f.png +.. figure:: https://user-images.githubusercontent.com/19295950/127077485-699f9e61-72a6-45f2-990f-f5748b6ee99f.webp :alt: Rectilinear data rendered by ``perspective`` Camera Lens Model This Point Cloud rendered well, very similar to the ``auto`` and ``brown`` examples. One may see artifacts in the ``perspective`` Camera Lens Model in very large collections, or over very flat/homogenus terrain (agricultural fields). In such cases, forcing ``brown`` may help. @@ -86,7 +86,7 @@ The following examples are all data taken with a standard Rectilinear Lens. Manu ``spherical`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127078960-27e35cbb-a378-4d0d-92e2-42dbfd1edd7c.png +.. figure:: https://user-images.githubusercontent.com/19295950/127078960-27e35cbb-a378-4d0d-92e2-42dbfd1edd7c.webp :alt: Rectilinear data rendered by ``spherical`` Camera Lens Model This Point Cloud failed to reconstruct properly due to the manual selection of the ``fisheye`` Camera Lens Model. Similar failures to reconstruct can often indicate the wrong manual selection, or in edge cases, wrong ``auto`` selection of the Camera Lens Model, and you are advised to try another Model that is more appropriate. diff --git a/source/arguments/cog.rst b/source/arguments/cog.rst index d353d5287d..3f4f1467ef 100644 --- a/source/arguments/cog.rst +++ b/source/arguments/cog.rst @@ -55,34 +55,34 @@ Example Images True: ``--cog`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127079824-c85fa5a9-842a-4f28-a380-b6404aac7ef2.png +.. figure:: https://user-images.githubusercontent.com/19295950/127079824-c85fa5a9-842a-4f28-a380-b6404aac7ef2.webp :alt: GDAL Info showing LAYOUT=COG The Raster Information tool in QGIS can print information from gdalinfo which can be used to confirm the conformance of a GeoTIFF to the COG spec. -.. figure:: https://user-images.githubusercontent.com/19295950/138731905-d10483bd-b91b-4f63-bfb4-89c0f50bf74b.png +.. figure:: https://user-images.githubusercontent.com/19295950/138731905-d10483bd-b91b-4f63-bfb4-89c0f50bf74b.webp :alt: QGIS Layer Properties showing Internal Overviews The Layer Properties panel can show that there are in fact internal overviews. Keep in mind that not every GeoTIFF has internal overviews, but every COG must. -.. figure:: https://user-images.githubusercontent.com/19295950/138733095-fb5f07ef-fbb0-48f4-8401-25cbf5294b9d.png +.. figure:: https://user-images.githubusercontent.com/19295950/138733095-fb5f07ef-fbb0-48f4-8401-25cbf5294b9d.webp :alt: QGIS Layer Properties showing an on-disk file size of 8.78 MB Note that the on-disk file size is 8.78 MB for the COG due to the presence of internal overviews when compared to the 6.30 MB of the non-COG GeoTIFF below. False: ``null`` ^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127080115-7e09ba30-140f-402d-b00a-8bb0c7bc72ff.png +.. figure:: https://user-images.githubusercontent.com/19295950/127080115-7e09ba30-140f-402d-b00a-8bb0c7bc72ff.webp :alt: GDAL Info not showing LAYOUT=COG The Raster Information tool in QGIS does not show LAYOUT=COG, which indicates that this GeoTIFF does not meet the COG spec. -.. figure:: https://user-images.githubusercontent.com/19295950/138732051-d227c98d-10a5-46de-ac99-8c5ffb0a12b2.png +.. figure:: https://user-images.githubusercontent.com/19295950/138732051-d227c98d-10a5-46de-ac99-8c5ffb0a12b2.webp :alt: QGIS Layer Properties not showing Internal Overviews The Layer Properties panel shows that the GeoTIFF lacks all levels of Internal Pyramids. -.. figure:: https://user-images.githubusercontent.com/19295950/138733132-a9c4f8b4-673a-426b-a665-bde5e89e4de3.png +.. figure:: https://user-images.githubusercontent.com/19295950/138733132-a9c4f8b4-673a-426b-a665-bde5e89e4de3.webp :alt: QGIS Layer Properties showing an on-disk file size of 6.30 MB Note that the on-disk file size is 6.30 MB for the COG due to the lack of internal overviews when compared to the 8.78 MB of the COG GeoTIFF above. diff --git a/source/arguments/dem-resolution.rst b/source/arguments/dem-resolution.rst index 1449fb80dd..e923c2bb82 100644 --- a/source/arguments/dem-resolution.rst +++ b/source/arguments/dem-resolution.rst @@ -10,7 +10,7 @@ dem-resolution **Options:** ** -DSM/DTM resolution in cm / pixel. Note that this value is capped to 2x the ground sampling distance (GSD) estimate. To remove the cap, check --ignore-gsd also. Default: ``5`` +DSM/DTM resolution in cm / pixel. Note that this value is capped by a ground sampling distance (GSD) estimate. Default: ``5`` diff --git a/source/arguments/feature-type.rst b/source/arguments/feature-type.rst index 43aaab1749..8dab97c426 100644 --- a/source/arguments/feature-type.rst +++ b/source/arguments/feature-type.rst @@ -8,9 +8,9 @@ feature-type ```````````` -**Options:** *akaze | hahog | orb | sift* +**Options:** *akaze | dspsift | hahog | orb | sift* -Choose the algorithm for extracting keypoints and computing descriptors. . Default: ``sift`` +Choose the algorithm for extracting keypoints and computing descriptors. . Default: ``dspsift`` diff --git a/source/arguments/geo.rst b/source/arguments/geo.rst index 00c7fe3cff..871fc6a6f1 100644 --- a/source/arguments/geo.rst +++ b/source/arguments/geo.rst @@ -10,7 +10,7 @@ geo **Options:** ** -Path to the image geolocation file containing the camera center coordinates used for georeferencing. If you dont have values for omega/phi/kappa you can set them to 0. The file needs to use the following format: EPSG: or <+proj definition>image_name geo_x geo_y geo_z [omega (degrees)] [phi (degrees)] [kappa (degrees)] [horz accuracy (meters)] [vert accuracy (meters)]Default: ``None`` +Path to the image geolocation file containing the camera center coordinates used for georeferencing. If you don't have values for yaw/pitch/roll you can set them to 0. The file needs to use the following format: EPSG: or <+proj definition>image_name geo_x geo_y geo_z [yaw (degrees)] [pitch (degrees)] [roll (degrees)] [horz accuracy (meters)] [vert accuracy (meters)]Default: ``None`` diff --git a/source/arguments/gps-accuracy.rst b/source/arguments/gps-accuracy.rst index 484445f046..8ebbc7ece1 100644 --- a/source/arguments/gps-accuracy.rst +++ b/source/arguments/gps-accuracy.rst @@ -10,7 +10,7 @@ gps-accuracy **Options:** ** -Set a value in meters for the GPS Dilution of Precision (DOP) information for all images. If your images are tagged with high precision GPS information (RTK), this value will be automatically set accordingly. You can use this option to manually set it in case the reconstruction fails. Lowering this option can sometimes help control bowling-effects over large areas. Default: ``10`` +Set a value in meters for the GPS Dilution of Precision (DOP) information for all images. If your images are tagged with high precision GPS information (RTK), this value will be automatically set accordingly. You can use this option to manually set it in case the reconstruction fails. Lowering this option can sometimes help control bowling-effects over large areas. Default: ``3`` diff --git a/source/arguments/gps-z-offset.rst b/source/arguments/gps-z-offset.rst new file mode 100644 index 0000000000..6b9873429e --- /dev/null +++ b/source/arguments/gps-z-offset.rst @@ -0,0 +1,18 @@ +.. + AUTO-GENERATED by extract_odm_strings.py! DO NOT EDIT! + If you want to add more details to a command, edit a + .rst file in arguments_edit/.rst + +.. _gps-z-offset: + +gps-z-offset +```````````` + +**Options:** ** + +Set a GPS offset in meters for the vertical axis (Z) by adding it to the altitude value of the GPS EXIF data. This does not change the value of any GCPs. This can be useful for example when adjusting from ellipsoidal to orthometric height. Default: ``0`` + + + + +`Learn to edit `_ and help improve `this page `_! diff --git a/source/arguments/ignore-gsd.rst b/source/arguments/ignore-gsd.rst index c67fb1a9e0..fa7f1cc24d 100644 --- a/source/arguments/ignore-gsd.rst +++ b/source/arguments/ignore-gsd.rst @@ -10,7 +10,7 @@ ignore-gsd -Ignore Ground Sampling Distance (GSD). GSD caps the maximum resolution of image outputs and resizes images when necessary, resulting in faster processing and lower memory usage. Since GSD is an estimate, sometimes ignoring it can result in slightly better image output quality. Default: ``False`` +Ignore Ground Sampling Distance (GSD).A memory and processor hungry change relative to the default behavior if set to true. Ordinarily, GSD estimates are used to cap the maximum resolution of image outputs and resizes images when necessary, resulting in faster processing and lower memory usage. Since GSD is an estimate, sometimes ignoring it can result in slightly better image output quality. Never set --ignore-gsd to true unless you are positive you need it, and even then: do not use it. Default: ``False`` diff --git a/source/arguments/matcher-order.rst b/source/arguments/matcher-order.rst new file mode 100644 index 0000000000..f3005ec0eb --- /dev/null +++ b/source/arguments/matcher-order.rst @@ -0,0 +1,18 @@ +.. + AUTO-GENERATED by extract_odm_strings.py! DO NOT EDIT! + If you want to add more details to a command, edit a + .rst file in arguments_edit/.rst + +.. _matcher-order: + +matcher-order +````````````` + +**Options:** ** + +Perform image matching with the nearest N images based on image filename order. Can speed up processing of sequential images, such as those extracted from video. It is applied only on non-georeferenced datasets. Set to 0 to disable. Default: ``0`` + + + + +`Learn to edit `_ and help improve `this page `_! diff --git a/source/arguments/orthophoto-resolution.rst b/source/arguments/orthophoto-resolution.rst index 3494a02f94..d2988d91f4 100644 --- a/source/arguments/orthophoto-resolution.rst +++ b/source/arguments/orthophoto-resolution.rst @@ -10,7 +10,7 @@ orthophoto-resolution **Options:** * 0.0>* -Orthophoto resolution in cm / pixel. Note that this value is capped by a ground sampling distance (GSD) estimate. To remove the cap, check --ignore-gsd also. Default: ``5`` +Orthophoto resolution in cm / pixel. Note that this value is capped by a ground sampling distance (GSD) estimate.Default: ``5`` diff --git a/source/arguments/pc-classify.rst b/source/arguments/pc-classify.rst index d6d6588f7a..ca28ef2b86 100644 --- a/source/arguments/pc-classify.rst +++ b/source/arguments/pc-classify.rst @@ -10,7 +10,7 @@ pc-classify -Classify the point cloud outputs using a Simple Morphological Filter. You can control the behavior of this option by tweaking the --dem-\* parameters. Default: ``False`` +Classify the point cloud outputs. You can control the behavior of this option by tweaking the --dem-\* parameters. Default: ``False`` diff --git a/source/arguments/pc-filter.rst b/source/arguments/pc-filter.rst index 1164cc0b1a..db6e9f5777 100644 --- a/source/arguments/pc-filter.rst +++ b/source/arguments/pc-filter.rst @@ -10,7 +10,7 @@ pc-filter **Options:** ** -Filters the point cloud by removing points that deviate more than N standard deviations from the local mean. Set to 0 to disable filtering. Default: ``2.5`` +Filters the point cloud by removing points that deviate more than N standard deviations from the local mean. Set to 0 to disable filtering. Default: ``5`` diff --git a/source/arguments/sfm-no-partial.rst b/source/arguments/sfm-no-partial.rst new file mode 100644 index 0000000000..47e3f2b6ed --- /dev/null +++ b/source/arguments/sfm-no-partial.rst @@ -0,0 +1,18 @@ +.. + AUTO-GENERATED by extract_odm_strings.py! DO NOT EDIT! + If you want to add more details to a command, edit a + .rst file in arguments_edit/.rst + +.. _sfm-no-partial: + +sfm-no-partial +`````````````` + + + +Do not attempt to merge partial reconstructions. This can happen when images do not have sufficient overlap or are isolated. Default: ``False`` + + + + +`Learn to edit `_ and help improve `this page `_! diff --git a/source/arguments/split-overlap.rst b/source/arguments/split-overlap.rst index ff4caf9128..65961dfa3f 100644 --- a/source/arguments/split-overlap.rst +++ b/source/arguments/split-overlap.rst @@ -10,7 +10,7 @@ split-overlap **Options:** ** -Radius of the overlap between submodels. After grouping images into clusters, images that are closer than this radius to a cluster are added to the cluster. This is done to ensure that neighboring submodels overlap. Default: ``150`` +Radius of the overlap between submodels in meters. After grouping images into clusters, images that are closer than this radius to a cluster are added to the cluster. This is done to ensure that neighboring submodels overlap. All imagesneed GPS information. Default: ``150`` diff --git a/source/arguments_edit/align.rst b/source/arguments_edit/align.rst index 8b13789179..fa6301dae5 100644 --- a/source/arguments_edit/align.rst +++ b/source/arguments_edit/align.rst @@ -1 +1,8 @@ +See `Multi-temporal datasets for further usage information. <../../map-accuracy/#improving-relative-accuracy>`_ + +.. figure:: ../images/align_pc.webp + :alt: Animated gif comparing two separately processed, but aligned digital surface models. + :align: center + +Animated gif comparing two separately processed, but aligned digital surface models. diff --git a/source/arguments_edit/auto-boundary.rst b/source/arguments_edit/auto-boundary.rst index 3e3a8b3f82..f993fb807e 100644 --- a/source/arguments_edit/auto-boundary.rst +++ b/source/arguments_edit/auto-boundary.rst @@ -43,14 +43,14 @@ Example Images True: ``--auto-boundary`` ^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140864618-2a0c95f2-669e-45dc-b5c5-df82a555e4e5.png +.. figure:: https://user-images.githubusercontent.com/19295950/140864618-2a0c95f2-669e-45dc-b5c5-df82a555e4e5.webp :alt: WebODM displaying the reconstruction extent of a terrestrial orbit survey of a Northern Catalpa tree. The WebODM 3D View shows the full extent of the reconstruction, bounded by the ``--auto-boundary`` option. False: ``null`` ^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140864753-db3695c5-3ba2-48fb-a644-3e591913de72.png +.. figure:: https://user-images.githubusercontent.com/19295950/140864753-db3695c5-3ba2-48fb-a644-3e591913de72.webp :alt: WebODM displaying the reconstruction extent of a terrestrial orbit survey of a Northern Catalpa tree. The WebODM 3D View shows the full extent of the recosntruction. Compared to the ``--auto-boundary`` reconstruction above, one can see that the full reconstruction area is much larger (and therefore more visually sparse). diff --git a/source/arguments_edit/boundary.rst b/source/arguments_edit/boundary.rst index 61780b007d..83de1f9558 100644 --- a/source/arguments_edit/boundary.rst +++ b/source/arguments_edit/boundary.rst @@ -48,28 +48,28 @@ GeoJSON.io New GeoJSON """""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102197-b44fea3b-01df-4f2f-9cde-f1c94ba2e8d3.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102197-b44fea3b-01df-4f2f-9cde-f1c94ba2e8d3.webp :alt: GeoJSON.io interface with empty GeoJSON map and text. After opening the above link to GeoJSON.io, one should pan and zoom the map preview to find their area of interest. Creating A Polygon """"""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102194-7992ddf8-81ce-4ee9-bb81-b5d93cb05e25.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102194-7992ddf8-81ce-4ee9-bb81-b5d93cb05e25.webp :alt: Choosing the "Draw Polygon" menu option in the Map View. Selecting the "Draw Polygon" menu option will allow you to place vertices for your polygon by left-clicking on the map. Placing Vertices """"""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102186-38a4107f-4c93-46f9-b423-3ce40fddff4b.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102186-38a4107f-4c93-46f9-b423-3ce40fddff4b.webp :alt: Placing vertices in the Map View to create the boundary GeoJSON. Choose the appropriate locations of the boundary of your polygon by left-clicking on the map to place a vertex. You can place as many vertices as you require. Completing A Polygon """"""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102193-4e619f4e-e95d-4c3d-8f89-29a38015bce0.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102193-4e619f4e-e95d-4c3d-8f89-29a38015bce0.webp :alt: Completed polygon in the Map View and GeoJSON text view. To close the polygon, you left-click on your first vertex. You will be able to close your polygon once you have placed at least three vertices on the map. @@ -77,7 +77,7 @@ Completing A Polygon Saving A Polygon """"""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102199-a5d37bbf-d057-46d8-8baf-91817c7e2f30.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102199-a5d37bbf-d057-46d8-8baf-91817c7e2f30.webp :alt: Saving the polygon using the Save menu and choosing GeoJSON. Select "Save" and then "GeoJSON" to save the completed GeoJSON boundary to disk. Your browser will prompt or otherwise alert you that the file is ready to download. Alternatively, you can copy and paste the text-only representation of the GeoJSON boundary from the right panel with the "JSON" header. @@ -124,21 +124,21 @@ Saving A Polygon Downloading A Polygon """""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145103954-17ba7c31-fda6-4883-b7a6-3f0bacc266dd.png +.. figure:: https://user-images.githubusercontent.com/19295950/145103954-17ba7c31-fda6-4883-b7a6-3f0bacc266dd.webp :alt: Browser Download/Save file prompt for the generated GeoJSON file. Once the GeoJSON file has been chosen for saving, the browser will prompt you to save it to disk. Choose an appropriate location where you can access it at a later time to load into WebODM. Setting Boundary [GeoJSON] In Task Options """"""""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102200-02bd1c97-e0e8-4932-a77d-91562823b46e.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102200-02bd1c97-e0e8-4932-a77d-91562823b46e.webp :alt: Task Options preview showing Boundary field and "Load" icon. When you are editing the Task Options for your Task, you can choose to load the Boundary [GeoJSON] created above by clicking the "Load" icon. Alternatively, you can paste the textual representation of the boundary into the Boundary [GeoJSON] text box. Boundary [GeoJSON] Loaded In Task Options """""""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145102196-8f87e4ac-197f-4ce0-ac6f-082772921ea0.png +.. figure:: https://user-images.githubusercontent.com/19295950/145102196-8f87e4ac-197f-4ce0-ac6f-082772921ea0.webp :alt: Task Options preview showing loaded Boundary with GeoJSON text. Once the Boundary [GeoJSON] has been loaded from disk or pasted from the system clipboard, you can confirm its presence by seeing the text in the text box. You can now save the Task Options to enable the Boundary [GeoJSON] for the processing Task. @@ -150,28 +150,28 @@ QGIS Creating A New Temporary Scratch Layer """"""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109912-9176cd94-1140-43ac-a371-96de2b874ec3.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109912-9176cd94-1140-43ac-a371-96de2b874ec3.webp :alt: Choosing the "Create A Temporary Scratch Layer" tool to make an empty layer to create our Boundary [GeoJSON] within. You will first need a layer to create your Boundary [GeoJSON] within, so creating a New Temporary Scratch layer is a way to do this without needing to setup a file on disk first. New Temporary Scratch Layer Geometry Type """""""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109915-ddbfed43-da5e-466b-a4b6-d6ff3b96a555.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109915-ddbfed43-da5e-466b-a4b6-d6ff3b96a555.webp :alt: Setting "Polygon" as the Geometry Type for the Temporary Scratch Layer. There are numerous choices of geometry types that can be represented by a given layer. OpenDroneMap is designed to work with Single Polygon, so you will choose Polygon from the Geometry Type menu. New Temporary Scratch Layer Settings """"""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109917-58b6c147-bdae-45be-839d-5d56b1a22fe8.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109917-58b6c147-bdae-45be-839d-5d56b1a22fe8.webp :alt: Leaving the remaining settings in their Default state. Similar to Geometry Types, there are a large number of settings and options you can adjust for a Temporary Scratch Layer. You should leave these at their pictured defaults for usage with OpenDroneMap. Adding an Orthophoto Background """""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109918-df591ce8-3df4-485d-a775-81813b7e61ef.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109918-df591ce8-3df4-485d-a775-81813b7e61ef.webp :alt: Browsing to a generated Orthophoto from WebODM that covers the Area Of Interest (AOI). If you have run the task already without a Boundary [GeoJSON], you can load the generated Orthophoto from OpenDroneMap into QGIS to use as your basemap for creating your Boundary [GeoJSON]. This should ensure that your boundary polygon exactly matches the data in your Task, as different basemaps can have errors of 1-10m or more. @@ -179,35 +179,35 @@ Adding an Orthophoto Background Adding A Polyon Feature """""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109907-b61afb3c-fdd2-4eef-872a-91f2ea97d887.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109907-b61afb3c-fdd2-4eef-872a-91f2ea97d887.webp :alt: Selecting the "Add A Polygon Feature" tool to begin creating a boundary polygon. After selecting the "Add A Polygon Feature" tool, you can begin placing vertices on the map to create your boundary. To finish your polygon, you will right-click on the canvas. Similar to GeoJSON.io, a finished polygon will have a darker outline and a darker fill to indicate that it is "solid". Toggle Editing Off """"""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109924-42480f63-2cfa-427c-8414-f45d39f796f7.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109924-42480f63-2cfa-427c-8414-f45d39f796f7.webp :alt: Clicking the "Toggle Editing" tool will prompt you to save your changes to the Temporary Scratch Layer. Once you are finished with your boundary polygon, you can click the "Toggle Editing" tool to accept your changes and write them out to the Temporary Scratch Layer and make the layer valid for saving/exporting to disk. Save Changes To Temporary Scratch Layer """""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109921-73ab273a-7180-40ea-ba3d-75ecb65c97f5.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109921-73ab273a-7180-40ea-ba3d-75ecb65c97f5.webp :alt: QGIS Dialog asking you to Save your changes to the Temporary Scratch Layer. Clicking Save on this dialog will write the changes to the Temporary Scratch Layer and enable export/save functionality. Export Temporary Scratch Layer Features """""""""""""""""""""""""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109911-45d7dae3-49ce-40fb-8df0-85a164763810.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109911-45d7dae3-49ce-40fb-8df0-85a164763810.webp :alt: A right-click on the Temporary Scratch Layer in the Layers panel will expose the Export menu item, with the Save Features As sub-menu item. Right-click on the Temporary Scratch Layer in the Layers panel to bring up the Export menu and the Save Features As sub-menu item, selecting Save Features As. This will prompt you to choose the export format, location and file name, and settings for your layer. Save Vector Layer As """"""""""""""""""""" -.. figure:: https://user-images.githubusercontent.com/19295950/145109923-b55dfc1a-5c31-4382-8b1f-3bc6322b0f33.png +.. figure:: https://user-images.githubusercontent.com/19295950/145109923-b55dfc1a-5c31-4382-8b1f-3bc6322b0f33.webp :alt: The "Save Vector Layer As" dialog showing Format as GeoJSON, an example of a valid File Name and path, CRS of EPSG:4326 and other default options. This dialog will require you to choose GeoJSON as the format, a valid filename and path for the GeoJSON to be written out to disk with, and a valid CRS. The safest CRS choice with GeoJSON is EPSG:4326, so choose that if it is not chosen by default. All other options should be left as default and do not apply for OpenDroneMap usage. @@ -217,35 +217,35 @@ Example Images True: ``--boundary [GeoJSON]`` - Point Cloud ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140858936-10fda65f-c278-46ae-95bd-7af8f8369554.png +.. figure:: https://user-images.githubusercontent.com/19295950/140858936-10fda65f-c278-46ae-95bd-7af8f8369554.webp :alt: WebODM displaying the "clipped" reconstruction of the Brighton Beach dataset Point Cloud. The WebODM 3D View shows the modified extent of the reconstruction Point Cloud, bounded by the GeoJSON proivded to the ``--boundary`` option. True: ``--boundary [GeoJSON]`` - Orthophoto ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140859033-c6cab4f0-74b3-4266-b5ec-4a90da931340.png +.. figure:: https://user-images.githubusercontent.com/19295950/140859033-c6cab4f0-74b3-4266-b5ec-4a90da931340.webp :alt: WebODM displaying the "clipped" reconstruction of the Brighton Beach dataset Orthophoto. The WebODM 3D View shows the modified extent of the reconstruction Orthophoto, bounded by the GeoJSON proivded to the ``--boundary`` option. True: ``--boundary [GeoJSON]`` - Digital Elevation Model ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140859073-28db5174-9a40-42d8-86d6-f345d9dad5a8.png +.. figure:: https://user-images.githubusercontent.com/19295950/140859073-28db5174-9a40-42d8-86d6-f345d9dad5a8.webp :alt: WebODM displaying the "clipped" reconstruction of the Brighton Beach dataset Digital Elevation Model. The WebODM 3D View shows the modified extent of the reconstruction Digital Elevation Model, bounded by the GeoJSON proivded to the ``--boundary`` option. True: ``--boundary [GeoJSON]`` - 3D Model/Textured Mesh ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140859125-4854e651-9eff-430d-956c-16f4d9a52dfd.png +.. figure:: https://user-images.githubusercontent.com/19295950/140859125-4854e651-9eff-430d-956c-16f4d9a52dfd.webp :alt: WebODM displaying the "clipped" reconstruction of the Brighton Beach dataset 3D Model/Textured Mesh. The WebODM 3D View shows the modified extent of the reconstruction 3D Model/Textured Mesh, bounded by the GeoJSON proivded to the ``--boundary`` option. False: ``null`` ^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/140858712-9bfd8c56-a52a-480e-b68d-d5a97bc516fd.png +.. figure:: https://user-images.githubusercontent.com/19295950/140858712-9bfd8c56-a52a-480e-b68d-d5a97bc516fd.webp :alt: WebODM displaying the full reconstruction of the Brighton Beach dataset Point Cloud. The WebODM 3D View shows the full extent of the recosntruction. Compared to the ``--boundary`` reconstruction above, one can see that the full reconstruction area is much larger and includes many features outside of the Area Of Interest used to generate the GeoJSON. diff --git a/source/arguments_edit/build-overviews.rst b/source/arguments_edit/build-overviews.rst index faa8606987..b03689018f 100644 --- a/source/arguments_edit/build-overviews.rst +++ b/source/arguments_edit/build-overviews.rst @@ -46,14 +46,14 @@ Example Images True: ``--build-overviews`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127073339-6b2a0a4f-6ede-4dc1-8da4-5bc9646de304.png +.. figure:: https://user-images.githubusercontent.com/19295950/127073339-6b2a0a4f-6ede-4dc1-8da4-5bc9646de304.webp :alt: QGIS displaying the generated Overviews The Layer Properties panel demonstrates that this OpenDroneMap-generated GeoTIFF has internal Overviews. False: ``null`` ^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127074349-a3f84c4c-d05c-4bf1-bd7c-790781ad0fe3.png +.. figure:: https://user-images.githubusercontent.com/19295950/127074349-a3f84c4c-d05c-4bf1-bd7c-790781ad0fe3.webp :alt: QGIS displaying the file is lacking Overviews The Layer Properties panel demonstrates that this OpenDroneMap-generated GeoTIFF lacks internal Overviews. diff --git a/source/arguments_edit/camera-lens.rst b/source/arguments_edit/camera-lens.rst index 44ec823ec9..7d31921778 100644 --- a/source/arguments_edit/camera-lens.rst +++ b/source/arguments_edit/camera-lens.rst @@ -42,21 +42,21 @@ The following examples are all data taken with a standard Rectilinear Lens. Manu ``auto`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127077336-ae79a958-a953-4376-86fd-430d0e5457f2.png +.. figure:: https://user-images.githubusercontent.com/19295950/127077336-ae79a958-a953-4376-86fd-430d0e5457f2.webp :alt: Rectilinear data rendered by ``auto`` Camera Lens Model This Point Cloud shows a proper reconstruction via the ``auto`` (``brown``) Camera Lens Model, which is appropriate for this sensor. ``brown`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127077753-580a174e-7572-4315-8801-224ce097d9fc.png +.. figure:: https://user-images.githubusercontent.com/19295950/127077753-580a174e-7572-4315-8801-224ce097d9fc.webp :alt: Rectilinear data rendered by ``brown`` Camera Lens Model As in the prior example, this Point Cloud is reconstructed via the ``brown`` Camera Lens Model. ``fisheye`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127077826-53d459fe-5e4e-4b10-8e70-fbddf775c4f7.png +.. figure:: https://user-images.githubusercontent.com/19295950/127077826-53d459fe-5e4e-4b10-8e70-fbddf775c4f7.webp :alt: Rectilinear data rendered by ``fisheye`` Camera Lens Model In this Point Cloud reconstruction, severe bowling and other artifacts have been introduced via the use of the wrong Camera Lens Model. @@ -64,7 +64,7 @@ The following examples are all data taken with a standard Rectilinear Lens. Manu ``perspective`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127077485-699f9e61-72a6-45f2-990f-f5748b6ee99f.png +.. figure:: https://user-images.githubusercontent.com/19295950/127077485-699f9e61-72a6-45f2-990f-f5748b6ee99f.webp :alt: Rectilinear data rendered by ``perspective`` Camera Lens Model This Point Cloud rendered well, very similar to the ``auto`` and ``brown`` examples. One may see artifacts in the ``perspective`` Camera Lens Model in very large collections, or over very flat/homogenus terrain (agricultural fields). In such cases, forcing ``brown`` may help. @@ -72,7 +72,7 @@ The following examples are all data taken with a standard Rectilinear Lens. Manu ``spherical`` : Rectilinear Data ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127078960-27e35cbb-a378-4d0d-92e2-42dbfd1edd7c.png +.. figure:: https://user-images.githubusercontent.com/19295950/127078960-27e35cbb-a378-4d0d-92e2-42dbfd1edd7c.webp :alt: Rectilinear data rendered by ``spherical`` Camera Lens Model This Point Cloud failed to reconstruct properly due to the manual selection of the ``fisheye`` Camera Lens Model. Similar failures to reconstruct can often indicate the wrong manual selection, or in edge cases, wrong ``auto`` selection of the Camera Lens Model, and you are advised to try another Model that is more appropriate. diff --git a/source/arguments_edit/cog.rst b/source/arguments_edit/cog.rst index 312207950a..1648442b05 100644 --- a/source/arguments_edit/cog.rst +++ b/source/arguments_edit/cog.rst @@ -41,34 +41,34 @@ Example Images True: ``--cog`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127079824-c85fa5a9-842a-4f28-a380-b6404aac7ef2.png +.. figure:: https://user-images.githubusercontent.com/19295950/127079824-c85fa5a9-842a-4f28-a380-b6404aac7ef2.webp :alt: GDAL Info showing LAYOUT=COG The Raster Information tool in QGIS can print information from gdalinfo which can be used to confirm the conformance of a GeoTIFF to the COG spec. -.. figure:: https://user-images.githubusercontent.com/19295950/138731905-d10483bd-b91b-4f63-bfb4-89c0f50bf74b.png +.. figure:: https://user-images.githubusercontent.com/19295950/138731905-d10483bd-b91b-4f63-bfb4-89c0f50bf74b.webp :alt: QGIS Layer Properties showing Internal Overviews The Layer Properties panel can show that there are in fact internal overviews. Keep in mind that not every GeoTIFF has internal overviews, but every COG must. -.. figure:: https://user-images.githubusercontent.com/19295950/138733095-fb5f07ef-fbb0-48f4-8401-25cbf5294b9d.png +.. figure:: https://user-images.githubusercontent.com/19295950/138733095-fb5f07ef-fbb0-48f4-8401-25cbf5294b9d.webp :alt: QGIS Layer Properties showing an on-disk file size of 8.78 MB Note that the on-disk file size is 8.78 MB for the COG due to the presence of internal overviews when compared to the 6.30 MB of the non-COG GeoTIFF below. False: ``null`` ^^^^^^^^^^^^^^^ -.. figure:: https://user-images.githubusercontent.com/19295950/127080115-7e09ba30-140f-402d-b00a-8bb0c7bc72ff.png +.. figure:: https://user-images.githubusercontent.com/19295950/127080115-7e09ba30-140f-402d-b00a-8bb0c7bc72ff.webp :alt: GDAL Info not showing LAYOUT=COG The Raster Information tool in QGIS does not show LAYOUT=COG, which indicates that this GeoTIFF does not meet the COG spec. -.. figure:: https://user-images.githubusercontent.com/19295950/138732051-d227c98d-10a5-46de-ac99-8c5ffb0a12b2.png +.. figure:: https://user-images.githubusercontent.com/19295950/138732051-d227c98d-10a5-46de-ac99-8c5ffb0a12b2.webp :alt: QGIS Layer Properties not showing Internal Overviews The Layer Properties panel shows that the GeoTIFF lacks all levels of Internal Pyramids. -.. figure:: https://user-images.githubusercontent.com/19295950/138733132-a9c4f8b4-673a-426b-a665-bde5e89e4de3.png +.. figure:: https://user-images.githubusercontent.com/19295950/138733132-a9c4f8b4-673a-426b-a665-bde5e89e4de3.webp :alt: QGIS Layer Properties showing an on-disk file size of 6.30 MB Note that the on-disk file size is 6.30 MB for the COG due to the lack of internal overviews when compared to the 8.78 MB of the COG GeoTIFF above. diff --git a/source/arguments_edit/gps-z-offset.rst b/source/arguments_edit/gps-z-offset.rst new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/source/arguments_edit/gps-z-offset.rst @@ -0,0 +1 @@ + diff --git a/source/arguments_edit/matcher-order.rst b/source/arguments_edit/matcher-order.rst new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/source/arguments_edit/matcher-order.rst @@ -0,0 +1 @@ + diff --git a/source/arguments_edit/sfm-no-partial.rst b/source/arguments_edit/sfm-no-partial.rst new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/source/arguments_edit/sfm-no-partial.rst @@ -0,0 +1 @@ + diff --git a/source/conf.py b/source/conf.py index 108a3f1ba2..38ae4f22f1 100644 --- a/source/conf.py +++ b/source/conf.py @@ -33,8 +33,15 @@ extensions = [ 'sphinx.ext.todo', 'sphinx_rtd_theme', - 'sphinx.ext.githubpages' + 'sphinx.ext.githubpages', + 'sphinxcontrib.mermaid' + ] + +# mermaid version +mermaid_version = "10.9.1" + + #For internationalization: locale_dirs = ['locale/'] gettext_compact = False diff --git a/source/contributing.rst b/source/contributing.rst index 9a4b7eec17..68a9385b29 100644 --- a/source/contributing.rst +++ b/source/contributing.rst @@ -1,4 +1,47 @@ -.. contributing +####################################### +How to Contribute and Request Features +####################################### + +How To Request Features +======================= + +All software needs user feedback and feature requests, to grow and maintain +alignment with the needs of its users. + +OpenDroneMap is FOSS software. Free and open source (FOSS) projects are interesting +from the inside and outside: from the outside, successful ones feel like they should be able +to do anything, and it's hard to know what a reasonable request is. From the inside of a +project, they can feel very resource constrained: largely by time, money, and opportunity +overload. + +**Demanding that a feature be implemented is probably not going to convince the development team to do so**. Imagine +if somebody knocked on your door and asked you to "stop reading this page right now and come to my house to cook me dinner!". Your first response might very reasonably be "who on earth is this person and why should I spend my time and energy fulfilling his agenda instead of my own?". + +**Suggesting** that a feature be implemented is a more effective (and cordial) way to ask for new features, especially if you're prepared to offer some of your own resources (time, funds or both) to help get the feature implemented. Explaining why +*your* suggestion can benefit others can also help. If the feature benefits you exclusively, it might be harder to convince others to do the work for you. + +A feature request can be submitted as issues on the applicable Github repository (e.g., +`WebODM `_ or `ODM `_ +or similar) or more simply as a discussion topic on `the community forum `_. +Try to start by searching these sources to see if someone else has already brought it up. Sometimes a feature is already in +the works, or has at least been discussed. + +To request the addition of support for new drone cameras: please share a set of test images on the `datasets channel on the forum `_. Without test images there's not much the developers can do. + +And importantly, the trick is to listen: if someone within the project says: "This is a big lift, +we need MONEY or TIME or SOMEONE TO HELP CODE IT" (or possibly a combination of the three) +then there are two answers that work really well in response: + + *Ok. I didn't know it was a big feature request! I hope someone comes along with the necessary resources. As a community member, I would be happy to be an early user and tester!* + +or + + *Let's figure out if we can put together the resources to get this done! Here's what I can contribute toward it: €¦$...* + +We are glad you are excited to see new features added to the project. Some new features need support, +and some are easier to implement. We'll do our best to help you understand where your request falls, and +we appreciate any support you can provide. + How To Contribute ================= diff --git a/source/faq.rst b/source/faq.rst index d48693eb27..f05ae58436 100644 --- a/source/faq.rst +++ b/source/faq.rst @@ -1,46 +1,41 @@ -########################## +################################################### +Frequently Asked Questions and Additional Resources +################################################### + +************************** Frequently Asked Questions -########################## +************************** -*************** Data Processing -*************** +--------------- -Can I process two or more orthophoto GeoTIFFs to stitch them together? ----------------------------------------------------------------------- +**Can I process two or more orthophoto GeoTIFFs to stitch them together?** No. ODM is a photogrammetric pipeline and orthophotos do not have the necessary camera information since the images have already been orthorectified. You can use another program such as `Hugin `_ to do that. -The software is not using all of my CPU cores / memory / GPU all of the times. Is it normal? --------------------------------------------------------------------------------------------- +**The software is not using all of my CPU cores / memory / GPU all of the times. Is it normal?** Yes. The software tries to use all available resources, when possible, but not always. It's normal to see 10-15% CPU utilization at several moments during processing and 0% GPU utilization for lots of times. -If I use the native version of the software, how can I allocate more resources for processing? ----------------------------------------------------------------------------------------------- +**If I use the native version of the software, how can I allocate more resources for processing?** No need; the native (non-docker) version of the software already uses all available resources. -********* Licensing -********* +--------- -I want to build a commercial application that includes ODM. Do I need a commercial license? -------------------------------------------------------------------------------------------- +**I want to build a commercial application that includes ODM. Do I need a commercial license?** ODM is free and open source software, released under the `AGPLv3 `_. You are free to build and sell applications with it, just make sure to comply with the requirements of the license, in particular the disclose source requirement. -Are there other licensing options aside from the AGPLv3? --------------------------------------------------------- +**Are there other licensing options aside from the AGPLv3?** Nope, sorry! -************* Memory issues -************* +------------- -Your computer is running out of memory, what can you do? --------------------------------------------------------- +**Your computer is running out of memory, what can you do?** 1. First you can buy more RAM, this is the ultimate and final solution. 2. Alternatively you can resize the images when uploading and/or tweak your quality settings. @@ -55,6 +50,29 @@ Your computer is running out of memory, what can you do? - In Linux you can add a swap file or a partition dedicated to swap. For more information, please consult your search engine of choice as there are a lot of different distributions and methods to add swap. +********************* +Additional References +********************* + +For Users +--------- + +The following resources are a good place to start: + +* `README page for ODM `_ +* `README page for WebODM `_ +* `README page for NodeODM `_ +* `Ground Control Points Format Specification `_ +* `OpenDroneMap: The Missing Guide `_ + +For Developers +-------------- + +In addition to user resources, we recommend to also read the following: +* WebODM documentation: https://docs.webodm.org +* NodeODM API specification: https://github.com/OpenDroneMap/NodeODM/blob/master/docs/index.adoc +* Overview of the ODM pipeline: http://community.opendronemap.org/t/where-can-i-find-background-information-on-the-concepts-of-odm/665/2 +* We keep a `section in our forum dedicated to research papers `_. This is a valuable place where to read more about state of the art research related to structure from motion, multi-view stereo, meshing, texturing, etc. which can be used to improve the software. `Learn to edit `_ and help improve `this page `_! diff --git a/source/flowchart.rst b/source/flowchart.rst new file mode 100644 index 0000000000..34d13c5c46 --- /dev/null +++ b/source/flowchart.rst @@ -0,0 +1,268 @@ +.. Flowchart with options + +Flowchart with options +======================= + +.. mermaid:: + :zoom: + + flowchart TB + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Subgraph Stages + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + subgraph Dataset-stage["`**Dataset-stage**`"] + bg-removal:::options + camera-lens:::options + cameras:::options + gcp:::options + geo:::options + gps-accuracy:::options + primary-band:::options + sky-removal:::options + use-exif:::options + video-limit:::options + video-resolution:::options + end + bg-removal ~~~ camera-lens ~~~ cameras ~~~ gcp ~~~ geo + gps-accuracy ~~~ primary-band ~~~ sky-removal ~~~ use-exif ~~~ video-limit + + click bg-removal "../arguments/bg-removal/" + click camera-lens "../arguments/camera-lens/" + click cameras "../arguments/cameras/" + click gcp "../arguments/gcp/" + click geo "../arguments/geo/" + click gps-accuracy "../arguments/gps-accuracy/" + click primary-band "../arguments/primary-band/" + click sky-removal "../arguments/sky-removal/" + click use-exif "../arguments/use-exif/" + click video-limit "../arguments/video-limit/" + click video-resolution "../arguments/video-resolution/" + + + subgraph Split["`**Split**`"] + direction TB + sm-cluster:::options + sm-no-align:::options + split:::options + split-image-groups:::options + split-overlap:::options + end + click sm-cluster "../arguments/sm-cluster/" + click sm-no-align "../arguments/sm-no-align/" + click split "../arguments/split/" + click split-image-groups "../arguments/split-image-groups/" + click split-overlap "../arguments/split-overlap/" + + Spliting["`**Spliting**`"] + + subgraph OpenSFM["`**OpenSFM**`"] + feature-quality:::options + feature-type:::options + force-gps:::options + ignore-gsd:::options + matcher-neighbors:::options + matcher-order:::options + matcher-type:::options + min-num-features:::options + pc-quality:::options + radiometric-calibration:::options + rolling-shutter:::options + rolling-shutter-readout:::options + sfm-algorithm:::options + sfm-no-partial:::options + skip-band-alignment:::options + use-fixed-camera-params:::options + use-hybrid-bundle-adjustment:::options + end + feature-quality ~~~ feature-type ~~~ force-gps ~~~ ignore-gsd ~~~ matcher-neighbors + matcher-order ~~~ matcher-type ~~~ min-num-features ~~~ pc-quality ~~~ radiometric-calibration + rolling-shutter ~~~ rolling-shutter-readout ~~~ sfm-algorithm ~~~ sfm-no-partial ~~~ skip-band-alignment + use-fixed-camera-params ~~~ use-hybrid-bundle-adjustment + + click feature-quality "../arguments/feature-quality/" + click feature-type "../arguments/feature-type/" + click force-gps "../arguments/force-gps/" + click ignore-gsd "../arguments/ignore-gsd/" + click matcher-neighbors "../arguments/matcher-neighbors/" + click matcher-order "../arguments/matcher-order/" + click matcher-type "../arguments/matcher-type/" + click min-num-features "../arguments/min-num-features/" + click pc-quality "../arguments/pc-quality/" + click radiometric-calibration "../arguments/radiometric-calibration/" + click rolling-shutter "../arguments/rolling-shutter/" + click rolling-shutter-readout "../arguments/rolling-shutter-readout/" + click sfm-algorithm "../arguments/sfm-algorithm/" + click sfm-no-partial "../arguments/sfm-no-partial/" + click skip-band-alignment "../arguments/skip-band-alignment/" + click use-fixed-camera-params "../arguments/use-fixed-camera-params/" + click use-hybrid-bundle-adjustment "../arguments/use-hybrid-bundle-adjustment/" + + + subgraph Openmvs["`**Openmvs**`"] + pc-filter:::options + pc-skip-geometric:::options + end + pc-filter ~~~ pc-skip-geometric + + click pc-filter "../arguments/pc-filter/" + click pc-skip-geometric "../arguments/pc-skip-geometric/" + + subgraph Odm-filterpoints["`**Odm-filterpoints**`"] + auto-boundary:::options + auto-boundary-distance:::options + boundary:::options + fast-orthophoto:::options + pc-sample:::options + end + auto-boundary ~~~ auto-boundary-distance ~~~ boundary ~~~ fast-orthophoto ~~~ pc-sample + + click auto-boundary "../arguments/auto-boundary/" + click auto-boundary-distance "../arguments/auto-boundary-distance/" + click boundary "../arguments/boundary/" + click fast-orthophoto "../arguments/fast-orthophoto/" + click pc-sample "../arguments/pc-sample/" + + subgraph Odm-meshing["`**Odm-meshing**`"] + mesh-octree-depth:::options + mesh-size:::options + skip-3dmodel:::options + end + mesh-octree-depth ~~~ mesh-size ~~~ skip-3dmodel + + click mesh-octree-depth "../arguments/mesh-octree-depth/" + click mesh-size "../arguments/mesh-size/" + click skip-3dmodel "../arguments/skip-3dmodel/" + + subgraph Mvs-texturing["`**Mvs-texturing**`"] + gltf:::options + texturing-keep-unseen-faces:::options + texturing-single-material:::options + texturing-skip-global-seam-leveling:::options + use-3dmesh:::options + end + gltf ~~~ texturing-keep-unseen-faces ~~~ texturing-single-material ~~~ texturing-skip-global-seam-leveling ~~~ use-3dmesh + + click gltf "../arguments/gltf/" + click texturing-keep-unseen-faces "../arguments/texturing-keep-unseen-faces/" + click texturing-single-material "../arguments/texturing-single-material/" + click texturing-skip-global-seam-leveling "../arguments/texturing-skip-global-seam-leveling/" + click use-3dmesh "../arguments/use-3dmesh/" + + subgraph Odm-georeferencing["`**Odm-georeferencing**`"] + align:::options + crop:::options + pc-classify:::options + pc-copc:::options + pc-csv:::options + pc-ept:::options + pc-las:::options + pc-rectify:::options + end + align ~~~ crop ~~~ pc-classify ~~~ pc-copc ~~~ pc-csv + pc-ept ~~~ pc-las ~~~ pc-rectify + + click align "../arguments/align/" + click crop "../arguments/crop/" + click pc-classify "../arguments/pc-classify/" + click pc-copc "../arguments/pc-copc/" + click pc-csv "../arguments/pc-csv/" + click pc-ept "../arguments/pc-ept/" + click pc-las "../arguments/pc-las/" + click pc-rectify "../arguments/pc-rectify/" + + subgraph Odm-dem["`**Odm-dem**`"] + cog:::options + dem-decimation:::options + dem-euclidean-map:::options + dem-gapfill-steps:::options + dem-resolution:::options + dsm:::options + dtm:::options + smrf-scalar:::options + smrf-slope:::options + smrf-threshold:::options + smrf-window:::options + tiles:::options + end + cog ~~~ dem-decimation ~~~ dem-euclidean-map ~~~ dem-gapfill-steps ~~~ dem-resolution + dsm ~~~ dtm ~~~ smrf-scalar ~~~ smrf-slope ~~~ smrf-threshold ~~~ smrf-window + + click cog "../arguments/cog/" + click dem-decimation "../arguments/dem-decimation/" + click dem-euclidean-map "../arguments/dem-euclidean-map/" + click dem-gapfill-steps "../arguments/dem-gapfill-steps/" + click dem-resolution "../arguments/dem-resolution/" + click dsm "../arguments/dsm/" + click dtm "../arguments/dtm/" + click smrf-scalar "../arguments/smrf-scalar/" + click smrf-slope "../arguments/smrf-slope/" + click smrf-threshold "../arguments/smrf-threshold/" + click smrf-window "../arguments/smrf-window/" + + subgraph Odm-orthophoto["`**Odm-orthophoto**`"] + build-overviews:::options + orthophoto-compression:::options + orthophoto-cutline:::options + orthophoto-kmz:::options + orthophoto-no-tiled:::options + orthophoto-png:::options + orthophoto-resolution:::options + skip-orthophoto:::options + end + build-overviews ~~~ orthophoto-compression ~~~ orthophoto-cutline ~~~ orthophoto-kmz + orthophoto-no-tiled ~~~ orthophoto-png ~~~ orthophoto-resolution ~~~ skip-orthophoto + + click build-overviews "../arguments/build-overviews/" + click orthophoto-compression "../arguments/orthophoto-compression/" + click orthophoto-cutline "../arguments/orthophoto-cutline/" + click orthophoto-kmz "../arguments/orthophoto-kmz/" + click orthophoto-no-tiled "../arguments/orthophoto-no-tiled/" + click orthophoto-png "../arguments/orthophoto-png/" + click orthophoto-resolution "../arguments/orthophoto-resolution/" + click skip-orthophoto "../arguments/skip-orthophoto/" + + subgraph Odm-report["`**Odm-report**`"] + skip-report:::options + end + + click skip-report "../arguments/skip-report/" + + subgraph Odm-postprocess["`**Odm-postprocess**`"] + 3d-tiles:::options + copy-to:::options + end + 3d-tiles ~~~ copy-to + + click 3d-tiles "../arguments/3d-tiles/" + click copy-to "../arguments/copy-to/" + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Links + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + images{"Images"} ==> Dataset-stage ==> Split == No ==> OpenSFM ==> Openmvs + Openmvs ==> Odm-filterpoints ==> Odm-meshing ==> Mvs-texturing ==> Odm-georeferencing + Odm-georeferencing ==> Odm-dem ==> Odm-orthophoto ==> Odm-report ==> Odm-postprocess + + %% Split yes + %%Split == Yes ==> Spliting == Merge ==> OpenSFM-detect-features + Split == Yes ==> Spliting ==> OpenSFM + + %% Styles + + %% Style for options + classDef options fill:#ffffde,stroke-width:4px,stroke-dasharray:5,stroke:#f66 + + %% Style for stages + classDef stages fill:#3699db,rx:10,ry:10,rx:10,ry:10,stroke:#333,stroke-width:2px,font-size:15pt; + class Dataset-stage,Split,OpenSFM,Openmvs,Odm-filterpoints stages + class Odm-meshing,Mvs-texturing,Odm-georeferencing,Odm-dem stages + class Odm-orthophoto,Odm-report,Odm-postprocess,Spliting stages + + classDef imagesstyle fill:#64ff0c,rx:10,ry:10,stroke:#333,stroke-width:2px; + class images imagesstyle diff --git a/source/flying.rst b/source/flying.rst index 483d2860a0..e71c39ce19 100644 --- a/source/flying.rst +++ b/source/flying.rst @@ -1,6 +1,30 @@ Flying Tips =========== +Data collection effort, full 3D +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For best in class results with full 3D reconstruction, we recommend the following: + +* 60% overlap nadir flight +* 70-80% overlap 45-degree gimbal angle cross-grid + +The 45-degree cross-grid flight provides the basis for a fully tied together model, while the nadir flights provide the necessary texture for orthophoto texturing. The lower overlap meets the minimum requirement for orthophoto products as facilitated by feature matching from the much higher overlap cross-grid. + +Data collection effort, 2D and 2.5D products +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For best in class results 2D and 2.5D products, we recommend the following: + +* 70-80% overlap slightly off-nadir (5-10 degree off nadir) + +For more complex buildings and vegetation, aim for closer to 80-83% overlap. If buildings, vegetation, and terrain changes are not complex, it's quite feasible to use closer to 70% overlap. + +(credit: derived from ongoing conversations with Ivan Gayton, Humanitarian OpenStreetMap Team) + +Other resources on flying +^^^^^^^^^^^^^^^^^^^^^^^^^ + The `Humanitarian OpenStreetMap team `_ has guidelines on `flying for UAV mapping `_: - `Choosing the right UAV `_ @@ -15,5 +39,4 @@ See also DroneDeploy's guide on `Making Successful Maps `_. - `Learn to edit `_ and help improve `this page `_! diff --git a/source/gcp.rst b/source/gcp.rst deleted file mode 100644 index 0a30610d7d..0000000000 --- a/source/gcp.rst +++ /dev/null @@ -1,111 +0,0 @@ -##################### -Ground Control Points -##################### - -Ground control points are useful for correcting distortions in the data and referencing the data to know coordinate systems. - -A Ground Control Point (GCP) is a position measurement made on the ground, typically using a high precision GPS. (Toffanin 2019) - -Ground control points can be set existing structures like pavement corners, lines on a parking lot or contrasting color floor tiles, otherwise can be set using targets placed on the ground. - -Targets can be purchased or build with an ample variety of materials ranging from bucket lids to floor tiles. - -************************************* -Recommended practices for GCP setting -************************************* - -Keep ground control points visible for all camera locations. Consider the expected ground sampling distance, illumination, vegetation, buildings and all the existing obstacles. - -Procure an evenly horizontal distribution of the GCPs within the project, covering high and low elevations. A minimum of 5 GCP works for most of the jobs, and for larger projects 8 – 10 are sufficient. Locate some points near the corners and others in the center, considering that GCP spacing should be larger than the image footprint so that you can’t see more than one GCP in a single image. - -In order to ensure each GCP are found in at least 5 images, separate the points 10 to 30 meters from the perimeter of the project. This distance is dependent of the overlapping, so increasing overlapping should reduce the required distance from the perimeter. - -*************** -GCP file format -*************** - -The format of the GCP file is simple. - - * The first line should contain the name of the projection used for the geo coordinates. This can be specified either as a PROJ string (e.g. ``+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs``), EPSG code (e.g. ``EPSG:4326``) or as a ``WGS84 UTM [N|S]`` value (eg. ``WGS84 UTM 16N``) - * Subsequent lines are the X, Y & Z coordinates, your associated pixels, the image filename and optional extra fields, separated by tabs or spaces: - * Elevation values can be set to "NaN" to indicate no value - * The 7th column (optional) typically contains the label of the GCP. - -GCP file format:: - - - geo_x geo_y geo_z im_x im_y image_name [gcp_name] [extra1] [extra2] - ... - -Example:: - - +proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs - 544256.7 5320919.9 5 3044 2622 IMG_0525.jpg - 544157.7 5320899.2 5 4193 1552 IMG_0585.jpg - 544033.4 5320876.0 5 1606 2763 IMG_0690.jpg - -If you supply a GCP file called ``gcp_list.txt`` then ODM will automatically detect it. If it has another name you can specify using ``--gcp ``. If you have a gcp file and want to do georeferencing with exif instead, then you can specify ``--use-exif``. If you have high precision GPS measurements in your images (RTK) and want to use that information along with a gcp file, you can specify ``--force-gps``. - -`This post has some information about placing Ground Control Targets before a flight `_, but if you already have images, you can find your own points in the images post facto. It's important that you find high-contrast objects that are found in **at least** 3 photos, and that you find a minimum of 5 objects. - -Sharp corners are good picks for GCPs. You should also place/find the GCPs evenly around your survey area. - -The ``gcp_list.txt`` file must be created in the base of your project folder. - -For good results your file should have a minimum of 15 lines after the header (5 points with 3 images to each point). - -*************** -User Interfaces -*************** - -You can use one of two user interfaces for creating GCP files: - - * `POSM GCPi `_ - * `GCP Editor Pro `_ - ---------- -POSM GCPi ---------- - -The POSM GCPi is loaded by default on WebODM. An example is available at `the WebODM Demo `_. To use this with known ground control XYZ values, one would do the following: - -Create a GCP list that only includes gcp name (this is the label that will be seen in the GCP interface), x, y, and z, with a header with a proj4 string of your GCPs (make sure they are in a planar coordinate system, such as UTM. It should look something like this: - -:: - - +proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs - gcp01 529356.250827686 9251137.5643209 8.465 - gcp02 530203.125367657 9250140.80991621 15.781 - gcp03 530292.136003818 9250745.02372435 11.977 - gcp04 530203.125367657 9250140.80991621 15.781 - gcp05 530292.136003818 9250745.02372435 11.977 - -Then one can load this GCP list into the interface, load the images, and place each of the GCPs in the image. - --------------- -GCP Editor Pro --------------- - -This app needs to be installed separately or can be loaded as a WebODM plugin from `https://github.com/uav4geo/GCPEditorPro `_ - -Create a CSV file that includes the gcp name, northing, easting and elevation. - -:: - - GCP Label,Northing,Easting,Elevation - gcp01,529356.250827686,9251137.5643209,8.465 - gcp02,530203.125367657,9250140.80991621,15.781 - ... - -Then import the CSV from the main screen and type ``+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs`` in the ``EPSG/PROJ`` box. - -The following screen will display a map from where to select the GCPs to tag and import the respective images. - -********** -References -********** - -Toffanin, Piero. `Open Drone Map: The Missing Guide. `_ MasseranoLabs LLC, 2019. - - -`Learn to edit `_ and help improve `this page `_! diff --git a/source/geo.rst b/source/geo.rst deleted file mode 100644 index a3d148626b..0000000000 --- a/source/geo.rst +++ /dev/null @@ -1,35 +0,0 @@ -####################### -Image Geolocation Files -####################### - -By default ODM will use the GPS information embedded in the images, if it is available. Sometimes images do not contain GPS information, or a user wishes to override the information with more accurate data (such as RTK). - -Starting from ODM ``2.0`` people can supply an image geolocation file (geo) for this purpose. - -The format of the image geolocation file is simple. - - * The first line should contain the name of the projection used for the geo coordinates. This can be specified either as a PROJ string (e.g. ``+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs``), EPSG code (e.g. ``EPSG:4326``) or as a ``WGS84 UTM [N|S]`` value (eg. ``WGS84 UTM 16N``) - * Subsequent lines are the image filename, X, Y & Z (optional) coordinates, the camera angles (optional, currently used only for radiometric calibration) and the horizontal/vertical accuracy (optional): - * Camera angles can be set to ``0`` if they are not available. - * The 10th column (optional) can contain extra fields, such as a label. - -File format:: - - - image_name geo_x geo_y [geo_z] [omega (degrees)] [phi (degrees)] [kappa (degrees)] [horz accuracy (meters)] [vert accuracy (meters)] [extras...] - ... - -Example:: - - EPSG:4326 - DJI_0028.JPG -91.9942096111111 46.84252125 198.609 - DJI_0032.JPG -91.9938293055556 46.8424584444444 198.609 - - - -If you supply a file called ``geo.txt`` then ODM will automatically detect it. If it has another name you can specify using ``--geo ``. - -The ``geo.txt`` file must be created in the base of your project folder. - - -`Learn to edit `_ and help improve `this page `_! diff --git a/source/images/Background_animation.gif b/source/images/Background_animation.gif deleted file mode 100644 index 37dea2a923..0000000000 Binary files a/source/images/Background_animation.gif and /dev/null differ diff --git a/source/images/Background_animation.webp b/source/images/Background_animation.webp new file mode 100644 index 0000000000..5565b203c4 Binary files /dev/null and b/source/images/Background_animation.webp differ diff --git a/source/images/ClusterODMLogo.png b/source/images/ClusterODMLogo.png deleted file mode 100644 index 42f114348b..0000000000 Binary files a/source/images/ClusterODMLogo.png and /dev/null differ diff --git a/source/images/ClusterODMLogo.webp b/source/images/ClusterODMLogo.webp new file mode 100644 index 0000000000..b91a0894de Binary files /dev/null and b/source/images/ClusterODMLogo.webp differ diff --git a/source/images/EDL_animation.gif b/source/images/EDL_animation.gif deleted file mode 100644 index 6228f57669..0000000000 Binary files a/source/images/EDL_animation.gif and /dev/null differ diff --git a/source/images/EDL_animation.webp b/source/images/EDL_animation.webp new file mode 100644 index 0000000000..7758d41234 Binary files /dev/null and b/source/images/EDL_animation.webp differ diff --git a/source/images/FOV_animation.gif b/source/images/FOV_animation.gif deleted file mode 100644 index 73ad0a592e..0000000000 Binary files a/source/images/FOV_animation.gif and /dev/null differ diff --git a/source/images/FOV_animation.webp b/source/images/FOV_animation.webp new file mode 100644 index 0000000000..eb92c361f7 Binary files /dev/null and b/source/images/FOV_animation.webp differ diff --git a/source/images/NodeODMLogo.png b/source/images/NodeODMLogo.png deleted file mode 100644 index 6f5e02cc9e..0000000000 Binary files a/source/images/NodeODMLogo.png and /dev/null differ diff --git a/source/images/NodeODMLogo.webp b/source/images/NodeODMLogo.webp new file mode 100644 index 0000000000..a72d9b8c61 Binary files /dev/null and b/source/images/NodeODMLogo.webp differ diff --git a/source/images/PyODMLogo.png b/source/images/PyODMLogo.png deleted file mode 100644 index dd8cd11e65..0000000000 Binary files a/source/images/PyODMLogo.png and /dev/null differ diff --git a/source/images/PyODMLogo.webp b/source/images/PyODMLogo.webp new file mode 100644 index 0000000000..ac49f5469f Binary files /dev/null and b/source/images/PyODMLogo.webp differ diff --git a/source/images/UR_3D.gif b/source/images/UR_3D.gif deleted file mode 100644 index a0096d5f8e..0000000000 Binary files a/source/images/UR_3D.gif and /dev/null differ diff --git a/source/images/UR_3D.webp b/source/images/UR_3D.webp new file mode 100644 index 0000000000..1138bbd864 Binary files /dev/null and b/source/images/UR_3D.webp differ diff --git a/source/images/abs_accuracy.png b/source/images/abs_accuracy.png deleted file mode 100644 index 3f80851639..0000000000 Binary files a/source/images/abs_accuracy.png and /dev/null differ diff --git a/source/images/abs_accuracy.webp b/source/images/abs_accuracy.webp new file mode 100644 index 0000000000..8c807cb361 Binary files /dev/null and b/source/images/abs_accuracy.webp differ diff --git a/source/images/align_pc.webp b/source/images/align_pc.webp new file mode 100644 index 0000000000..062971f8c9 Binary files /dev/null and b/source/images/align_pc.webp differ diff --git a/source/images/bioskeys.png b/source/images/bioskeys.png deleted file mode 100644 index b48bf835ee..0000000000 Binary files a/source/images/bioskeys.png and /dev/null differ diff --git a/source/images/bioskeys.webp b/source/images/bioskeys.webp new file mode 100644 index 0000000000..162d06149a Binary files /dev/null and b/source/images/bioskeys.webp differ diff --git a/source/images/camera_animation.gif b/source/images/camera_animation.gif deleted file mode 100644 index 576a867987..0000000000 Binary files a/source/images/camera_animation.gif and /dev/null differ diff --git a/source/images/camera_animation.webp b/source/images/camera_animation.webp new file mode 100644 index 0000000000..2732f59e83 Binary files /dev/null and b/source/images/camera_animation.webp differ diff --git a/source/images/cameras.png b/source/images/cameras.png deleted file mode 100644 index 7900d059e4..0000000000 Binary files a/source/images/cameras.png and /dev/null differ diff --git a/source/images/cameras.webp b/source/images/cameras.webp new file mode 100644 index 0000000000..c83d459a29 Binary files /dev/null and b/source/images/cameras.webp differ diff --git a/source/images/clipping.png b/source/images/clipping.png deleted file mode 100644 index 35339a0cc0..0000000000 Binary files a/source/images/clipping.png and /dev/null differ diff --git a/source/images/clipping.webp b/source/images/clipping.webp new file mode 100644 index 0000000000..818775df04 Binary files /dev/null and b/source/images/clipping.webp differ diff --git a/source/images/clipping_animation.gif b/source/images/clipping_animation.gif deleted file mode 100644 index 32fbae40d9..0000000000 Binary files a/source/images/clipping_animation.gif and /dev/null differ diff --git a/source/images/clipping_animation.webp b/source/images/clipping_animation.webp new file mode 100644 index 0000000000..af857d351a Binary files /dev/null and b/source/images/clipping_animation.webp differ diff --git a/source/images/clusterodm-admin-interface.webp b/source/images/clusterodm-admin-interface.webp new file mode 100644 index 0000000000..5e287738c0 Binary files /dev/null and b/source/images/clusterodm-admin-interface.webp differ diff --git a/source/images/clusterodm-user-interface.webp b/source/images/clusterodm-user-interface.webp new file mode 100644 index 0000000000..82639ecf50 Binary files /dev/null and b/source/images/clusterodm-user-interface.webp differ diff --git a/source/images/clusterodm.png b/source/images/clusterodm.png deleted file mode 100644 index d53fa14454..0000000000 Binary files a/source/images/clusterodm.png and /dev/null differ diff --git a/source/images/clusterodm.webp b/source/images/clusterodm.webp new file mode 100644 index 0000000000..d6078d779d Binary files /dev/null and b/source/images/clusterodm.webp differ diff --git a/source/images/congratulations.png b/source/images/congratulations.png deleted file mode 100644 index 41895acc08..0000000000 Binary files a/source/images/congratulations.png and /dev/null differ diff --git a/source/images/congratulations.webp b/source/images/congratulations.webp new file mode 100644 index 0000000000..8c0445e06d Binary files /dev/null and b/source/images/congratulations.webp differ diff --git a/source/images/cool.png b/source/images/cool.png deleted file mode 100644 index 93d02e67fc..0000000000 Binary files a/source/images/cool.png and /dev/null differ diff --git a/source/images/cool.webp b/source/images/cool.webp new file mode 100644 index 0000000000..863ae7c12f Binary files /dev/null and b/source/images/cool.webp differ diff --git a/source/images/digitalsurfacemodel.png b/source/images/digitalsurfacemodel.png deleted file mode 100644 index 918d42547a..0000000000 Binary files a/source/images/digitalsurfacemodel.png and /dev/null differ diff --git a/source/images/digitalsurfacemodel.webp b/source/images/digitalsurfacemodel.webp new file mode 100644 index 0000000000..5519e5b1d2 Binary files /dev/null and b/source/images/digitalsurfacemodel.webp differ diff --git a/source/images/dockeradvanced.png b/source/images/dockeradvanced.png deleted file mode 100644 index 6b229a2fef..0000000000 Binary files a/source/images/dockeradvanced.png and /dev/null differ diff --git a/source/images/dockeradvanced.webp b/source/images/dockeradvanced.webp new file mode 100644 index 0000000000..a36a7244df Binary files /dev/null and b/source/images/dockeradvanced.webp differ diff --git a/source/images/dockericon.png b/source/images/dockericon.png deleted file mode 100644 index b3d3ad4eeb..0000000000 Binary files a/source/images/dockericon.png and /dev/null differ diff --git a/source/images/dockericon.webp b/source/images/dockericon.webp new file mode 100644 index 0000000000..6d128e32c5 Binary files /dev/null and b/source/images/dockericon.webp differ diff --git a/source/images/dockersettings.png b/source/images/dockersettings.png deleted file mode 100644 index f851ac4296..0000000000 Binary files a/source/images/dockersettings.png and /dev/null differ diff --git a/source/images/dockersettings.webp b/source/images/dockersettings.webp new file mode 100644 index 0000000000..7da94b81a9 Binary files /dev/null and b/source/images/dockersettings.webp differ diff --git a/source/images/flightplanning.gif b/source/images/flightplanning.gif deleted file mode 100644 index 9784014b3c..0000000000 Binary files a/source/images/flightplanning.gif and /dev/null differ diff --git a/source/images/flightplanning.webp b/source/images/flightplanning.webp new file mode 100644 index 0000000000..54a4b79528 Binary files /dev/null and b/source/images/flightplanning.webp differ diff --git a/source/images/forward_facing.png b/source/images/forward_facing.png deleted file mode 100644 index ef95ff0438..0000000000 Binary files a/source/images/forward_facing.png and /dev/null differ diff --git a/source/images/forward_facing.webp b/source/images/forward_facing.webp new file mode 100644 index 0000000000..4969345dbd Binary files /dev/null and b/source/images/forward_facing.webp differ diff --git a/source/images/gitgui.png b/source/images/gitgui.png deleted file mode 100644 index 8817829a74..0000000000 Binary files a/source/images/gitgui.png and /dev/null differ diff --git a/source/images/gitgui.webp b/source/images/gitgui.webp new file mode 100644 index 0000000000..9601139931 Binary files /dev/null and b/source/images/gitgui.webp differ diff --git a/source/images/gitguisuccess.png b/source/images/gitguisuccess.png deleted file mode 100644 index a6ee982a2f..0000000000 Binary files a/source/images/gitguisuccess.png and /dev/null differ diff --git a/source/images/gitguisuccess.webp b/source/images/gitguisuccess.webp new file mode 100644 index 0000000000..83b0241a9b Binary files /dev/null and b/source/images/gitguisuccess.webp differ diff --git a/source/images/height_animation.gif b/source/images/height_animation.gif deleted file mode 100644 index 0b27e30779..0000000000 Binary files a/source/images/height_animation.gif and /dev/null differ diff --git a/source/images/height_animation.webp b/source/images/height_animation.webp new file mode 100644 index 0000000000..37e6cdfb55 Binary files /dev/null and b/source/images/height_animation.webp differ diff --git a/source/images/height_profile.png b/source/images/height_profile.png deleted file mode 100644 index 4f1755e7cf..0000000000 Binary files a/source/images/height_profile.png and /dev/null differ diff --git a/source/images/height_profile.webp b/source/images/height_profile.webp new file mode 100644 index 0000000000..ef37dfa044 Binary files /dev/null and b/source/images/height_profile.webp differ diff --git a/source/images/installpython3.png b/source/images/installpython3.png deleted file mode 100644 index c3c734dbce..0000000000 Binary files a/source/images/installpython3.png and /dev/null differ diff --git a/source/images/installpython3.webp b/source/images/installpython3.webp new file mode 100644 index 0000000000..d936792c69 Binary files /dev/null and b/source/images/installpython3.webp differ diff --git a/source/images/lawnmower_pattern.png b/source/images/lawnmower_pattern.png deleted file mode 100644 index 9909f442ca..0000000000 Binary files a/source/images/lawnmower_pattern.png and /dev/null differ diff --git a/source/images/lawnmower_pattern.webp b/source/images/lawnmower_pattern.webp new file mode 100644 index 0000000000..233de8f2dd Binary files /dev/null and b/source/images/lawnmower_pattern.webp differ diff --git a/source/images/macwhale.png b/source/images/macwhale.png deleted file mode 100644 index ffdcf61579..0000000000 Binary files a/source/images/macwhale.png and /dev/null differ diff --git a/source/images/macwhale.webp b/source/images/macwhale.webp new file mode 100644 index 0000000000..66bfc01fdc Binary files /dev/null and b/source/images/macwhale.webp differ diff --git a/source/images/measurement.png b/source/images/measurement.png deleted file mode 100644 index a5cca41726..0000000000 Binary files a/source/images/measurement.png and /dev/null differ diff --git a/source/images/measurement.webp b/source/images/measurement.webp new file mode 100644 index 0000000000..90dd8aba1f Binary files /dev/null and b/source/images/measurement.webp differ diff --git a/source/images/measurement1.png b/source/images/measurement1.png deleted file mode 100644 index 057675e049..0000000000 Binary files a/source/images/measurement1.png and /dev/null differ diff --git a/source/images/measurement1.webp b/source/images/measurement1.webp new file mode 100644 index 0000000000..83efe135fa Binary files /dev/null and b/source/images/measurement1.webp differ diff --git a/source/images/measurement2.png b/source/images/measurement2.png deleted file mode 100644 index 51741b2da0..0000000000 Binary files a/source/images/measurement2.png and /dev/null differ diff --git a/source/images/measurement2.webp b/source/images/measurement2.webp new file mode 100644 index 0000000000..53ae4c5043 Binary files /dev/null and b/source/images/measurement2.webp differ diff --git a/source/images/measurement3.png b/source/images/measurement3.png deleted file mode 100644 index 64605ab64c..0000000000 Binary files a/source/images/measurement3.png and /dev/null differ diff --git a/source/images/measurement3.webp b/source/images/measurement3.webp new file mode 100644 index 0000000000..21a4bb1caf Binary files /dev/null and b/source/images/measurement3.webp differ diff --git a/source/images/measurement4.png b/source/images/measurement4.png deleted file mode 100644 index 7dbc49d571..0000000000 Binary files a/source/images/measurement4.png and /dev/null differ diff --git a/source/images/measurement4.webp b/source/images/measurement4.webp new file mode 100644 index 0000000000..638c8d0160 Binary files /dev/null and b/source/images/measurement4.webp differ diff --git a/source/images/measurement7.png b/source/images/measurement7.png deleted file mode 100644 index b0ee39f1e8..0000000000 Binary files a/source/images/measurement7.png and /dev/null differ diff --git a/source/images/measurement7.webp b/source/images/measurement7.webp new file mode 100644 index 0000000000..bd61ae1208 Binary files /dev/null and b/source/images/measurement7.webp differ diff --git a/source/images/msimbasi_bowling.png b/source/images/msimbasi_bowling.png deleted file mode 100644 index 123caed8f6..0000000000 Binary files a/source/images/msimbasi_bowling.png and /dev/null differ diff --git a/source/images/msimbasi_bowling.webp b/source/images/msimbasi_bowling.webp new file mode 100644 index 0000000000..f00bdeb68c Binary files /dev/null and b/source/images/msimbasi_bowling.webp differ diff --git a/source/images/navigation.png b/source/images/navigation.png deleted file mode 100644 index 855e2cd55c..0000000000 Binary files a/source/images/navigation.png and /dev/null differ diff --git a/source/images/navigation.webp b/source/images/navigation.webp new file mode 100644 index 0000000000..135770b93d Binary files /dev/null and b/source/images/navigation.webp differ diff --git a/source/images/nerd.png b/source/images/nerd.png deleted file mode 100644 index 0188adc99c..0000000000 Binary files a/source/images/nerd.png and /dev/null differ diff --git a/source/images/nerd.webp b/source/images/nerd.webp new file mode 100644 index 0000000000..8e3d6d188b Binary files /dev/null and b/source/images/nerd.webp differ diff --git a/source/images/orthophoto.png b/source/images/orthophoto.png deleted file mode 100644 index 28e019c374..0000000000 Binary files a/source/images/orthophoto.png and /dev/null differ diff --git a/source/images/orthophoto.webp b/source/images/orthophoto.webp new file mode 100644 index 0000000000..79f8f636c9 Binary files /dev/null and b/source/images/orthophoto.webp differ diff --git a/source/images/pencil.png b/source/images/pencil.png deleted file mode 100644 index fd2f65e394..0000000000 Binary files a/source/images/pencil.png and /dev/null differ diff --git a/source/images/pencil.webp b/source/images/pencil.webp new file mode 100644 index 0000000000..6f8b33cd87 Binary files /dev/null and b/source/images/pencil.webp differ diff --git a/source/images/pointcloud.png b/source/images/pointcloud.png deleted file mode 100644 index 4552a28cca..0000000000 Binary files a/source/images/pointcloud.png and /dev/null differ diff --git a/source/images/pointcloud.webp b/source/images/pointcloud.webp new file mode 100644 index 0000000000..4a6e039ff4 Binary files /dev/null and b/source/images/pointcloud.webp differ diff --git a/source/images/pointcloud_elevation.png b/source/images/pointcloud_elevation.png deleted file mode 100644 index 7de37f7fd4..0000000000 Binary files a/source/images/pointcloud_elevation.png and /dev/null differ diff --git a/source/images/pointcloud_elevation.webp b/source/images/pointcloud_elevation.webp new file mode 100644 index 0000000000..afee88f0db Binary files /dev/null and b/source/images/pointcloud_elevation.webp differ diff --git a/source/images/pointcloudmoar.png b/source/images/pointcloudmoar.png deleted file mode 100644 index 6a11ff68cc..0000000000 Binary files a/source/images/pointcloudmoar.png and /dev/null differ diff --git a/source/images/pointcloudmoar.webp b/source/images/pointcloudmoar.webp new file mode 100644 index 0000000000..a0e7fd0d07 Binary files /dev/null and b/source/images/pointcloudmoar.webp differ diff --git a/source/images/rel_accuracy.png b/source/images/rel_accuracy.png deleted file mode 100644 index a32ead1c2c..0000000000 Binary files a/source/images/rel_accuracy.png and /dev/null differ diff --git a/source/images/rel_accuracy.webp b/source/images/rel_accuracy.webp new file mode 100644 index 0000000000..5b84cd428e Binary files /dev/null and b/source/images/rel_accuracy.webp differ diff --git a/source/images/robot.png b/source/images/robot.png deleted file mode 100644 index f32c7c337e..0000000000 Binary files a/source/images/robot.png and /dev/null differ diff --git a/source/images/robot.webp b/source/images/robot.webp new file mode 100644 index 0000000000..2cf3a53c2c Binary files /dev/null and b/source/images/robot.webp differ diff --git a/source/images/rotation.gif b/source/images/rotation.gif deleted file mode 100644 index 6b21592336..0000000000 Binary files a/source/images/rotation.gif and /dev/null differ diff --git a/source/images/rotation.webp b/source/images/rotation.webp new file mode 100644 index 0000000000..560c7d980d Binary files /dev/null and b/source/images/rotation.webp differ diff --git a/source/images/seedling.png b/source/images/seedling.png deleted file mode 100644 index b5e4fe3ef5..0000000000 Binary files a/source/images/seedling.png and /dev/null differ diff --git a/source/images/seedling.webp b/source/images/seedling.webp new file mode 100644 index 0000000000..d17792584f Binary files /dev/null and b/source/images/seedling.webp differ diff --git a/source/images/smrf.png b/source/images/smrf.png deleted file mode 100644 index 12bb3a064d..0000000000 Binary files a/source/images/smrf.png and /dev/null differ diff --git a/source/images/smrf.webp b/source/images/smrf.webp new file mode 100644 index 0000000000..39c90df450 Binary files /dev/null and b/source/images/smrf.webp differ diff --git a/source/images/stockpile.png b/source/images/stockpile.png deleted file mode 100644 index 55b31adf2c..0000000000 Binary files a/source/images/stockpile.png and /dev/null differ diff --git a/source/images/stockpile.webp b/source/images/stockpile.webp new file mode 100644 index 0000000000..29deab82ca Binary files /dev/null and b/source/images/stockpile.webp differ diff --git a/source/images/texturedmesh.png b/source/images/texturedmesh.png deleted file mode 100644 index 58be0a2322..0000000000 Binary files a/source/images/texturedmesh.png and /dev/null differ diff --git a/source/images/texturedmesh.webp b/source/images/texturedmesh.webp new file mode 100644 index 0000000000..2ab1a90ec6 Binary files /dev/null and b/source/images/texturedmesh.webp differ diff --git a/source/images/texturedmodel.png b/source/images/texturedmodel.png deleted file mode 100644 index 00dd78bfa7..0000000000 Binary files a/source/images/texturedmodel.png and /dev/null differ diff --git a/source/images/texturedmodel.webp b/source/images/texturedmodel.webp new file mode 100644 index 0000000000..e58278fbde Binary files /dev/null and b/source/images/texturedmodel.webp differ diff --git a/source/images/thermal.webp b/source/images/thermal.webp new file mode 100644 index 0000000000..1682d646f6 Binary files /dev/null and b/source/images/thermal.webp differ diff --git a/source/images/timeSIFTexampleSoilExcavation.webp b/source/images/timeSIFTexampleSoilExcavation.webp new file mode 100644 index 0000000000..050990ed33 Binary files /dev/null and b/source/images/timeSIFTexampleSoilExcavation.webp differ diff --git a/source/images/vimdiff_ceres_change.webp b/source/images/vimdiff_ceres_change.webp new file mode 100644 index 0000000000..09060c1f14 Binary files /dev/null and b/source/images/vimdiff_ceres_change.webp differ diff --git a/source/images/virtualboxsettings.png b/source/images/virtualboxsettings.png deleted file mode 100644 index eaa5e95b91..0000000000 Binary files a/source/images/virtualboxsettings.png and /dev/null differ diff --git a/source/images/virtualboxsettings.webp b/source/images/virtualboxsettings.webp new file mode 100644 index 0000000000..3fd90a0d1e Binary files /dev/null and b/source/images/virtualboxsettings.webp differ diff --git a/source/images/virtualizationcheck.png b/source/images/virtualizationcheck.png deleted file mode 100644 index 42f8fcc227..0000000000 Binary files a/source/images/virtualizationcheck.png and /dev/null differ diff --git a/source/images/virtualizationcheck.webp b/source/images/virtualizationcheck.webp new file mode 100644 index 0000000000..b3dbba1e8f Binary files /dev/null and b/source/images/virtualizationcheck.webp differ diff --git a/source/images/webodmdashboard.png b/source/images/webodmdashboard.png deleted file mode 100644 index 985a8d754f..0000000000 Binary files a/source/images/webodmdashboard.png and /dev/null differ diff --git a/source/images/webodmdashboard.webp b/source/images/webodmdashboard.webp new file mode 100644 index 0000000000..494ae5aca4 Binary files /dev/null and b/source/images/webodmdashboard.webp differ diff --git a/source/images/webodmsuccess.png b/source/images/webodmsuccess.png deleted file mode 100644 index 10d503ef66..0000000000 Binary files a/source/images/webodmsuccess.png and /dev/null differ diff --git a/source/images/webodmsuccess.webp b/source/images/webodmsuccess.webp new file mode 100644 index 0000000000..92dd299f75 Binary files /dev/null and b/source/images/webodmsuccess.webp differ diff --git a/source/index.rst b/source/index.rst index 2ba322296d..d2976edcc9 100644 --- a/source/index.rst +++ b/source/index.rst @@ -1,6 +1,6 @@ .. raw:: html - + .. figure:: https://www.opendronemap.org/wp-content/uploads/2018/07/odm-logo.svg :alt: OpenDroneMap Logo @@ -30,7 +30,7 @@ The documentation is available in several languages. Some translations are incom | | -.. figure:: images/seedling.png +.. figure:: images/seedling.webp :alt: image of seedling :align: right :height: 70 @@ -41,7 +41,7 @@ The documentation is available in several languages. Some translations are incom installation -.. figure:: images/pencil.png +.. figure:: images/pencil.webp :alt: image of pencil :align: right :height: 60 @@ -50,15 +50,11 @@ The documentation is available in several languages. Some translations are incom .. toctree:: tutorials arguments + flowchart outputs - gcp map-accuracy - geo - masks + multispectral large - resources flying - multispectral - requesting-features contributing faq diff --git a/source/installation.rst b/source/installation.rst index aa5b9da775..d1b6f0a3b3 100644 --- a/source/installation.rst +++ b/source/installation.rst @@ -8,7 +8,7 @@ This section is excerpted and modified with permission from `OpenDroneMap: The M Quickstart ---------- -Installers for OpenDroneMap are available for purchase from UAV4Geo, and are the easiest way to get started and come with support. +Installers for OpenDroneMap are available for purchase, and are the easiest way to get started and come with support. https://opendronemap.org/webodm/download/#installer @@ -30,7 +30,7 @@ No more than 100-200 images can be processed with the above specifications (the * 100 GB of disk space * 16 GB RAM -The above will allow for a few hundred images to be processed without too many issues. A CPU with more cores will allow for faster processing, while a graphics card (GPU) currently has no impact on performance. For processing more images, add more disk space and RAM linearly to the number of images you need to process. +The above will allow the processing of a few hundred images with minimal issues. A CPU with more cores will allow for faster processing, while a graphics card (GPU) currently has no impact on performance. For processing more images, add more disk space and RAM linearly to the number of images you need to process. .. csv-table:: Minimum RAM needed for N images :header: "Number of images", "RAM or RAM + Swap" @@ -62,7 +62,7 @@ Step 1. Check Virtualization Support Docker requires a feature from your CPU called virtualization, which allows it to run virtual machines (VMs). Make sure you have it enabled! Sometimes this is disabled. To check, on Windows 8 or higher you can open the **Task Manager** (press CTRL+SHIFT+ESC) and switch to the **Performance** tab. -.. figure:: images/virtualizationcheck.png +.. figure:: images/virtualizationcheck.webp :alt: Image of checking virtualization in Windows 8 or higher :align: center @@ -73,7 +73,7 @@ www.microsoft.com/en-us/download/details.aspx?id=592>`_ instead. If virtualization is disabled, you’ll need to enable it. The procedure unfortunately is a bit different for each computer model, so the best way to do this is to look up on a search engine ā€œhow to enable vtx for ā€. Often times it’s a matter of restarting the computer, immediately pressing F2 or F12 during startup, navigating the boot menu and changing the settings to enable virtualization (often called ā€œVT-Xā€). -.. figure:: images/bioskeys.png +.. figure:: images/bioskeys.webp :alt: Table of different bios keys :align: center @@ -89,7 +89,7 @@ First, you’ll need to install: For Python 3, make sure you check **Add Python 3.x to PATH** during the installation. -.. figure:: images/installpython3.png +.. figure:: images/installpython3.webp :alt: Screenshot of Python3 installation process :align: center @@ -101,7 +101,7 @@ Then, only if you are on Windows 10 Home, Windows 8 (any version) or Windows 7 ( If you are on Windows 10 Professional or a newer version, you should install instead: -* Docker for Windows: https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe +* Docker for Windows:https://docs.docker.com/desktop/install/windows-install/ Please do **NOT** install both docker programs. They are different and will create a mess if they are both installed. @@ -119,7 +119,7 @@ If you installed Docker Toolbox (see below if you installed Docker for Windows i 3. Right click the **default** VM and press **Settings...** 4. Move the **Base Memory** slider from the **System** panel and allocate 60-70% of all available memory, optionally adding 50% of the available processors from the **Processor** tab also -.. figure:: images/virtualboxsettings.png +.. figure:: images/virtualboxsettings.webp :alt: Screenshot of VirtualBox Settings :align: center @@ -134,13 +134,13 @@ If you installed Docker for Windows instead: 3. From the panel, click **Advanced** and use the sliders to allocate 60-70% of available memory and use half of all available CPUs. 4. Press **Apply**. -.. figure:: images/dockericon.png +.. figure:: images/dockericon.webp :alt: Screenshot of Docker Icon :align: center *Step 1 Docker icon* -.. figure:: images/dockersettings.png +.. figure:: images/dockersettings.webp :alt: Screenshot of Docker Settings :align: center @@ -156,7 +156,7 @@ Open the **Git Gui** program that comes installed with Git. From there: * In **Target Directory** click browse and navigate to a folder of your choosing (create one if necessary) * Press **Clone** -.. figure:: images/gitgui.png +.. figure:: images/gitgui.webp :alt: Screenshot of Git Gui :align: center @@ -164,7 +164,7 @@ Open the **Git Gui** program that comes installed with Git. From there: If the download succeeded, you should now see this window: -.. figure:: images/gitguisuccess.png +.. figure:: images/gitguisuccess.webp :alt: Screenshot of Git Gui after successful download :align: center @@ -183,7 +183,7 @@ From Git Gui, go to the **Repository** menu, then click **Git Bash**. From the c Several components will download to your machine at this point, including WebODM, NodeODM and ODM. After the download you should be greeted by the following screen: -.. figure:: images/webodmsuccess.png +.. figure:: images/webodmsuccess.webp :alt: Screenshot of after successfully downloading WebODM :align: center @@ -238,7 +238,7 @@ There are only two programs to install: After installing docker you should find an icon that looks like a whale in the task bar. -.. figure:: images/macwhale.png +.. figure:: images/macwhale.webp :alt: Screenshot of Docker whale :align: center @@ -280,7 +280,7 @@ Docker on macOS works by running a VM in the background (think of it as a ā€œcom 3. Adjust the CPUs slider to use half of all available CPUs and the memory to use 60-70% of all available memory 4. Press **Apply & Restart** -.. figure:: images/dockeradvanced.png +.. figure:: images/dockeradvanced.webp :alt: Screenshot of Docker advanced settings :align: center @@ -362,33 +362,21 @@ Commands to type: Step 2. Check Additional Requirements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -In addition to the three programs above, the dockercompose script is also needed. Sometimes it’s already installed with docker, but sometimes it isn’t. To verify if it’s installed try to type: +In addition to the three programs above, the docker compose script is also needed. Sometimes it’s already installed with docker, but sometimes it isn’t. To verify if it’s installed try to type: .. code:: bash - $ docker-compose --version + $ docker compose --version You should see somethings similar to the following: .. code:: bash - docker-compose version 1.22.0, build f46880f + docker compose version 24.0.5, build ced0996600 -If instead you get something similar to the following: -.. code:: bash - - docker-compose: command not found - -you can install it by using pip: - -.. code:: bash - - $ sudo pip install docker-compose - - -Step 3. Download and Launch WebODM -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Step 3a. Download and Launch WebODM with webodm.sh call of docker compose +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From a terminal type: @@ -400,6 +388,140 @@ From a terminal type: Then open a web browser to http://localhost:8000. +Step 3b. Alternatively, start via docker compose without webodm.sh +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +copy the following 3 files into a newly created folder: + +The ``config-default.json``: + +.. code:: json + + { + "instance": "node-OpenDroneMap", + "odm_path": "/code", + + "logger": { + "level": "info", + "maxFileSize": 104857600, + "maxFiles": 10, + "logDirectory": "" + }, + + "port": "auto", + "deamon": false, + "parallelQueueProcessing": 8, + "cleanupTasksAfter": 2880, + "test": false, + "testSkipOrthophotos": false, + "testSkipDems": false, + "token": "", + "authorizedIps": [], + "maxImages": "" + } + +The ``init.sql``: + +.. code:: sql + + CREATE EXTENSION postgis_raster; + SET postgis.gdal_enabled_drivers = 'ENABLE_ALL'; + +And finally the ``compose.yml``: + +.. code:: yml + + services: + webodm-node-odm-1: + image: opendronemap/nodeodm:gpu + container_name: webodm-node-odm-1 + ports: + - "3000:3000" + volumes: + - ./config-default.json:/var/www/config-default.json + privileged: true + restart: unless-stopped + deploy: + resources: + reservations: + devices: + - driver: nvidia + capabilities: [gpu] + + webapp-odm: + image: opendronemap/webodm_webapp + container_name: webapp + entrypoint: /bin/bash -c "service cron start && chmod +x /webodm/*.sh && /bin/bash -c \"/webodm/wait-for-it.sh -t 0 redis-odm:6379 -- /webodm/start.sh\" && python manage.py migrate" + restart: always + volumes: + - ./data/webodm:/webodm/app/media:z + ports: + - "8000:8000" + depends_on: + - db-odm + - redis-odm + - webodm-node-odm-1 + environment: + - WO_BROKER=redis://redis-odm + - WO_DEFAULT_NODES=1 + - WO_HOST=localhost + - WO_PORT=8000 + - WO_MEDIA_DIR=appmedia + - WO_DB_DIR=dbdata + - WO_SSL=NO + - WO_SSL_INSECURE_PORT_REDIRECT=80 + - WO_DATABASE_HOST=db-odm + - WO_DATABASE_NAME=webodm_dev + - WO_DATABASE_USER=postgres + - WO_DATABASE_PASSWORD=postgres + + redis-odm: + image: redis:alpine + container_name: redis-odm + restart: always + + db-odm: + image: postgis/postgis:17-3.5-alpine + container_name: db-odm + restart: always + volumes: + - ./data/odm-db:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + - POSTGRES_DB=webodm_dev + healthcheck: + test: [ "CMD", "pg_isready", "-q", "-d", "webodm_dev", "-U", "postgres"] + timeout: 45s + interval: 20s + retries: 5 + + worker: + image: opendronemap/webodm_webapp + container_name: worker + entrypoint: /bin/bash -c "/webodm/wait-for-it.sh -t 0 redis-odm:6379 -- /webodm/wait-for-it.sh -t 0 webapp-odm:8000 -- /webodm/worker.sh start" + restart: always + volumes: + - ./data/webodm:/webodm/app/media:z + depends_on: + - redis-odm + - db-odm + environment: + - WO_BROKER=redis://redis-odm + - WO_DATABASE_HOST=db-odm + - WO_DATABASE_NAME=webodm_dev + - WO_DATABASE_USER=postgres + - WO_DATABASE_PASSWORD=postgres + +Finally, start the stack using ``docker compose up -d``. +You can now access WebODM at http://localhost:8000 and the nodeODM at http://localhost:3000. + +To view logs of the services use ``docker compose logs`` + +To shut down the services run ``docker compose down``. + + Basic Commands and Troubleshooting ---------------------------------- @@ -445,9 +567,10 @@ Other useful commands are listed below: Hello, WebODM! -------------- -After running ./webodm.sh start and opening WebODM in the browser, you will be greeted with a welcome message and will be asked to create the first user. Take some time to familiarize yourself with the web interface and explore its various menus. +After starting the containers using 3a. or 3b. you can open WebODM in the browser. +This will greet you with a welcome message and will ask to create the first user. Take some time to familiarize yourself with the web interface and explore its various menus. -.. figure:: images/webodmdashboard.png +.. figure:: images/webodmdashboard.webp :alt: Screenshot of WebODM Dashboard :align: center @@ -457,7 +580,7 @@ Notice that under the **Processing Nodes** menu there’s a "node-odm-1" node al If you’ve made it this far, congratulations! Now it’s time to start processing some data. -.. figure:: images/congratulations.png +.. figure:: images/congratulations.webp :alt: Image of celebratory dance :align: center diff --git a/source/large.rst b/source/large.rst index b168b9c81d..68ae553b29 100644 --- a/source/large.rst +++ b/source/large.rst @@ -1,7 +1,7 @@ .. large -Splitting Large Datasets -======================== +Large Datasets +============== Starting with ODM version ``0.6.0`` you can split up very large datasets into manageable chunks (called submodels), running the pipeline on each chunk, and then producing merged DEMs, orthophotos and point clouds. The process is referred to as "split-merge". @@ -9,17 +9,6 @@ Why might you use the split-merge pipeline? If you have a very large number of i Split-merge works in WebODM out of the box as long as the processing nodes support split-merge, by enabling the ``--split`` option when creating a new task. -Calibrate images ----------------- - -Image calibration is recommended (but not required) for large datasets because error propagation due to image distortion could cause a bowl effect on the models. Calibration instructions can be found at `Calibrate Images `_. - -.. figure:: images/msimbasi_bowling.png - :alt: image of lens distortion effect on bowling of data - :align: center - -Bowling effect on point cloud over 13,000+ image dataset collected by World Bank Tanzania over the flood prone Msimbasi Basin, Dar es Salaam, Tanzania. - Local Split-Merge ----------------- @@ -47,12 +36,12 @@ Distributed Split-Merge ODM can also automatically distribute the processing of each submodel to multiple machines via `NodeODM `_ nodes, orchestrated via `ClusterODM `_. -.. figure:: images/clusterodm.png +.. figure:: images/clusterodm.webp :alt: image of lens distortion effect on bowling of data :align: center Getting Started with Distributed Split-Merge -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The first step is start ClusterODM @@ -193,6 +182,33 @@ The 3D textured meshes are currently not being merged as part of the workflow (o GCPs are fully supported, however, there needs to be at least 3 GCP points on each submodel for the georeferencing to take place. If a submodel has fewer than 3 GCPs, a combination of the remaining GCPs + EXIF data will be used instead (which is going to be less accurate). We recommend using the ``image_groups.txt`` file to accurately control the submodel split when using GCPs. +Estimating data collection effort +--------------------------------- + +Larger datasets can be collected with specialized fix wing UAVs, vertical takeoff and landing (VTOL) UAVs, and collected quite efficiently under certain conditions. In many instances, however, we are constrained to doing data collection efforts with commodity quadcopters. In these cases, a common question is the data collection time under ideal conditions with commodity equipment. + +Data collection effort, full 3D +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For best in class results with full 3D reconstruction and 5cm resolution, it is feasible to collect 1-2km\ :sup:`2` per person, per day. This requires the following set of flights: + +* 60% overlap nadir flight +* 70-80% overlap 45-degree gimbal angle cross-grid + +The 45-degree cross-grid flight provides the basis for a fully tied together model, while the nadir flights provide the necessary texture for orthophoto texturing. The lower overlap meets the minimum requirement for orthophoto products as facilitated by by feature matching from the much higher overlap cross-grid. + +Data collection effort, 2D and 2.5D products +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For best in class results 2D and 2.5D products and 5cm resolution, it is feasible to collect 2-4km\ :sup:`2` per person, per day. This requires the following set of flights: + +* 70-80% overlap slightly off-nadir (5-10 degree off nadir) + +For more complex buildings and vegetation, aim for closer to 80% overlap. If buildings, vegetation, and terrain changes are not complex, it's quite feasible to use closer to 70% overlap. + +(credit: derived from ongoing conversations with Ivan Gayton, Humanitarian OpenStreetMap Team) + + Acknowledgments --------------- Huge props to Pau and the folks at Mapillary for their amazing contributions to OpenDroneMap through their OpenSfM code, which is a key component of the split-merge pipeline. We look forward to further pushing the limits of OpenDroneMap and seeing how big a dataset we can process. diff --git a/source/map-accuracy.rst b/source/map-accuracy.rst index 8a6cfc87f7..cd0e52aeef 100644 --- a/source/map-accuracy.rst +++ b/source/map-accuracy.rst @@ -1,6 +1,10 @@ -############ +######################## +High Precision Workflows +######################## + +************ Map accuracy -############ +************ Accuracy can be defined as the degree or closeness to which the information on a map matches the values in the real world. Therefore, when we refer to accuracy, we are talking about quality of data and about number of errors contained in a certain dataset (Pascual 2011). @@ -11,7 +15,7 @@ Local or relative accuracy can be defined as the degree to which de distances be Relative accuracy is independent of the location of the map in the world, so a map can have a high relative accuracy (in size and shape) but its position in the world can be shifted (Figure 1). -.. figure:: images/rel_accuracy.png +.. figure:: images/rel_accuracy.webp :alt: Model showing high relative accuracy :align: center @@ -23,7 +27,7 @@ Relative accuracy is independent of the location of the map in the world, so a m Absolute accuracy is the accuracy of the reconstruction in relation to its true position on the planet (Pix4D 2019). Figure 2 shows a relative and absolute accurate model, as the points are correctly placed according to its real world position. -.. figure:: images/abs_accuracy.png +.. figure:: images/abs_accuracy.webp :alt: Model showing high absolute accuracy :align: center @@ -34,9 +38,9 @@ Absolute accuracy is the accuracy of the reconstruction in relation to its true Each project has specific accuracy needs to be met. For instance assessing the progress in a construction site or measuring an area affected by a fire does not require the use of GCP, since absolute accuracy will not impact the decision making process. In the other hand, there are tasks on which accuracy is critical, for example project compliance evaluations and land title surveying, which require a higher relative and absolute accuracy. -************** +-------------- What to expect -************** +-------------- In general terms, one can expect the relative accuracy to be in the order of 1 to 3 times the average GSD for the dataset. And as for the absolute accuracy, one must consider that it is dependent of the GPS unit mounted in the UAV but the horizontal accuracy of a standard GPS is usually in the range of 2 to 6 meters and the vertical accuracy between 3 to 4 times the horizontal accuracy. @@ -66,10 +70,9 @@ The higher the flight altitude, the larger the image footprint and GSD. The resu Flight speed have special effect in cameras equipped with rolling shutter, while those equipped with global or mechanical shutter tends to reduce this effect. UAV equipped with RTK positioning systems are also affected with the speed, but with hover at each photo taken, you can get very good accuracy. If instead you are moving during each photo take, the accuracy is going to be limited by two factors: the speed at which you are moving multiplied by the 1 second increments of RTK (Mather 2020). - -********** +---------- References -********** +---------- Barry, P., & Coakley, R. Ā«Accuracy of UAV photogrammetry compared with Network RTK GPS.Ā» Baseline Surveys. 2013. http://uav.ie/PDF/Accuracy_UAV_compare_RTK_GPS.pdf (accessed 10 13, 2020). @@ -83,5 +86,291 @@ Pascual, Manuel S. GIS Lounge: GIS Data: A Look at Accuracy, Precision, and Type Pix4D. Ā«What is accuracy in an aerial mapping project?Ā» Pix4D. 25 de 05 de 2019. https://www.pix4d.com/blog/accuracy-aerial-mapping (accessed 10 13, 2020). +********************* +Ground Control Points +********************* + +-------- +Overview +-------- + +Ground control points are useful for correcting distortions in the data and referencing the data to know coordinate systems. + +A Ground Control Point (GCP) is a position measurement made on the ground, typically using a high precision GPS. (Toffanin 2019) + +Ground control points can be set existing structures like pavement corners, lines on a parking lot or contrasting color floor tiles, otherwise can be set using targets placed on the ground. + +Targets can be purchased or build with an ample variety of materials ranging from bucket lids to floor tiles. + + +Recommended practices for GCP setting +------------------------------------- + +Keep ground control points visible for all camera locations. Consider the expected ground sampling distance, illumination, vegetation, buildings and all the existing obstacles. + +Procure an evenly horizontal distribution of the GCPs within the project, covering high and low elevations. A minimum of 5 GCP works for most of the jobs, and for larger projects 8 Ć¢ā‚¬ā€œ 10 are sufficient. Locate some points near the corners and others in the center, considering that GCP spacing should be larger than the image footprint so that you can’t see more than one GCP in a single image. + +In order to ensure each GCP are found in at least 5 images, separate the points 10 to 30 meters from the perimeter of the project. This distance is dependent of the overlapping, so increasing overlapping should reduce the required distance from the perimeter. + +GCP file format +--------------- + +The format of the GCP file is simple. + + * The first line should contain the name of the projection used for the geo coordinates. This can be specified either as a PROJ string (e.g. ``+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs``), EPSG code (e.g. ``EPSG:4326``) or as a ``WGS84 UTM [N|S]`` value (eg. ``WGS84 UTM 16N``) + * Subsequent lines are the X, Y & Z coordinates, your associated pixels, the image filename and optional extra fields, separated by tabs or spaces: + * Avoid setting elevation values to "NaN" to indicate no value. This can cause processing failures. Instead use 0.0 + * Similarly decreasing the no. of digits after the decimal place for `geo_x` and `geo_y` can also reduce processing failures. + * The 7th column (optional) typically contains the label of the GCP. + +GCP file format:: + + + geo_x geo_y geo_z im_x im_y image_name [gcp_name] [extra1] [extra2] + ... + +Example:: + + +proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs + 544256.7 5320919.9 5 3044 2622 IMG_0525.jpg + 544157.7 5320899.2 5 4193 1552 IMG_0585.jpg + 544033.4 5320876.0 5 1606 2763 IMG_0690.jpg + +If you supply a GCP file called ``gcp_list.txt`` then ODM will automatically detect it. If it has another name you can specify using ``--gcp ``. If you have a gcp file and want to do georeferencing with exif instead, then you can specify ``--use-exif``. If you have high precision GPS measurements in your images (RTK) and want to use that information along with a gcp file, you can specify ``--force-gps``. + +`This post has some information about placing Ground Control Targets before a flight `_, but if you already have images, you can find your own points in the images post facto. It's important that you find high-contrast objects that are found in **at least** 3 photos, and that you find a minimum of 5 objects. + +Sharp corners are good picks for GCPs. You should also place/find the GCPs evenly around your survey area. + +The ``gcp_list.txt`` file must be created in the base of your project folder. + +For good results your file should have a minimum of 15 lines after the header (5 points with 3 images to each point). + +--------------- +User Interfaces +--------------- + +You can use one of two user interfaces for creating GCP files: + + * `POSM GCPi `_ + * `GCP Editor Pro `_ + +POSM GCPi +--------- + +The POSM GCPi is loaded by default on WebODM. An example is available at `the WebODM Demo `_. To use this with known ground control XYZ values, one would do the following: + +Create a GCP list that only includes gcp name (this is the label that will be seen in the GCP interface), x, y, and z, with a header with a proj4 string of your GCPs (make sure they are in a planar coordinate system, such as UTM. It should look something like this: + +:: + + +proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs + gcp01 529356.250827686 9251137.5643209 8.465 + gcp02 530203.125367657 9250140.80991621 15.781 + gcp03 530292.136003818 9250745.02372435 11.977 + gcp04 530203.125367657 9250140.80991621 15.781 + gcp05 530292.136003818 9250745.02372435 11.977 + +Then one can load this GCP list into the interface, load the images, and place each of the GCPs in the image. + +GCP Editor Pro +-------------- + +This app needs to be installed separately or can be loaded as a WebODM plugin from `https://github.com/uav4geo/GCPEditorPro `_ + +Create a CSV file that includes the gcp name, northing, easting and elevation. + +:: + + GCP Label,Northing,Easting,Elevation + gcp01,529356.250827686,9251137.5643209,8.465 + gcp02,530203.125367657,9250140.80991621,15.781 + ... + +Then import the CSV from the main screen and type ``+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs`` in the ``EPSG/PROJ`` box. + +The following screen will display a map from where to select the GCPs to tag and import the respective images. + +---------- +References +---------- + +Toffanin, Piero. `Open Drone Map: The Missing Guide. `_ MasseranoLabs LLC, 2019. + +*********************** +Image Geolocation Files +*********************** + +By default ODM will use the GPS information embedded in the images, if it is available. Sometimes images do not contain GPS information, or a user wishes to override the information with more accurate data (such as RTK). + +Starting from ODM ``2.0`` people can supply an image geolocation file (geo) for this purpose. + +The format of the image geolocation file is simple. + + * The first line should contain the name of the projection used for the geo coordinates. This can be specified either as a PROJ string (e.g. ``+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs``), EPSG code (e.g. ``EPSG:4326``) or as a ``WGS84 UTM [N|S]`` value (eg. ``WGS84 UTM 16N``) + * Subsequent lines are the image filename, X, Y & Z (optional) coordinates, the camera angles (optional, currently used only for radiometric calibration) and the horizontal/vertical accuracy (optional): + * Camera angles can be set to ``0`` if they are not available. + * The 10th column (optional) can contain extra fields, such as a label. + +File format:: + + + image_name geo_x geo_y [geo_z] [yaw (degrees)] [pitch (degrees)] [roll (degrees)] [horz accuracy (meters)] [vert accuracy (meters)] [extras...] + ... + +Example:: + + EPSG:4326 + DJI_0028.JPG -91.9942096111111 46.84252125 198.609 + DJI_0032.JPG -91.9938293055556 46.8424584444444 198.609 + + + +If you supply a file called ``geo.txt`` then ODM will automatically detect it. If it has another name you can specify using ``--geo ``. + +The ``geo.txt`` file must be created in the base of your project folder or when using WebODM, uploaded with the raw jpg or tif input files. + +**************************** +Improving relative accuracy +**************************** + +Georeferencing by default is done using GPS (GNSS) or GCPs (if provided). + +Starting from ODM ``3.0.2`` people can supply a reference alignment file to georeference the program outputs. The reconstruction will be initially performed using GPS/GCPs and will subsequently be aligned to the reference model via a linear scaling/rotation/shift operation. + +If you supply a file called ``align.laz``, ``align.las`` or ``align.tif`` (single band GeoTIFF DEM) then ODM will automatically detect it and attempt to align outputs to this reference model. If it has another name you can specify using ``--align ``. + +The alignment file must be created in the base of your project folder. The base folder is usually where you have stored your images. If you are using WebODM or NodeODM, then upload the align file with your images. If resizing your images in WebODM, use an ``align.laz`` or ``align.las`` file instead of a tif. + +----------------------- +Multi-temporal Datasets +----------------------- + +When previously mapped sites need revisited, OpenDroneMap can align multiple versions of a dataset through time by using a prior point cloud or digital elevation model. As the prior point cloud `seems to provide better results `_, that is the approach we will review here. + +**Workflow for multi-temporal datasets:** + +#. Process your original data. This step doesn't require a ground control point file, but use one if absolute accuracy is a project requirement +#. Download the Point Cloud from your first processed dataset as an LAZ file type (default). Rename the point cloud to align.laz +#. Include that LAZ file with each of your subsequent processing. If you are using command line ODM, include it in the images directory. If uploading, simply upload with your raw images for processing +#. Check your log. It should include a line near the top that indicates it has set align to a path value, something like this:: + + [INFO] Initializing ODM 3.5.3 - Tue Oct 15 05:01:43 2024 + [INFO] ============== + [INFO] 3d_tiles: False + [INFO] align: /var/www/data/bc14fa2c-ba5c-4b85-99b0-0b7ff715b210/gcp/align.laz + [INFO] auto_boundary: True + +**Output example for aligned datasets:** + +.. figure:: images/align_pc.webp + :alt: Animated gif comparing two separately processed, but aligned digital surface models. + :align: center + +Animated gif comparing two separately processed, but aligned digital surface models. + +Plugin Time-SIFT +---------------- + +The script at contrib/time-sift in the ODM repository does Time-SIFT processing with ODM. Time-SIFT is a method for multi-temporal analysis without the need to co-registrate the data. + + D. Feurer, F. Vinatier, Joining multi-epoch archival aerial images in + a single SfM block allows 3-D change detection with almost + exclusively image information, ISPRS Journal of Photogrammetry and + Remote Sensing, Volume 146, 2018, Pages 495-506, ISSN 0924-2716, doi: + 10.1016/j.isprsjprs.2018.10.016 + (https://doi.org/10.1016/j.isprsjprs.2018.10.016) + +Requirements +============ + +- ODM ! :-) +- subprocess +- json +- os +- shutil +- pathlib +- sys +- argparse +- textwrap + +Usage +===== + +Provided example +================ + +Download or clone `this repo `__ +to get example data. + +Then execute + +:: + + python Timesift_odm.py datasets --end-with odm_filterpoints + +It should make the Time-SIFT processing on the downloaded example data, stopping after the filtered dense clouds step. + +In the destination dir, you should obtain new directories, ``0_before`` and ``1_after`` at the same level as the ``time-sift-block`` directory. These new directories contain all the results natively co-registered. + +You can then use `CloudCompare `__ to compute distance between the ``datasets/0_before/odm_filterpoints/point_cloud.ply`` and the ``datasets/1_after/odm_filterpoints point_cloud.ply`` and obtain this image showing the difference between the two 3D surfaces. Here, two soil samples were excavated as can be seen on the image below. + +.. figure:: images/timeSIFTexampleSoilExcavation.webp + :alt: Distance between two point clouds showing soil surface before and after soil excavation (soil sampling for bulk density measurement). + :align: center + + +Your own data +~~~~~~~~~~~~~ + +In your dataset directory (usually ``datasets``, but you can have chosen another name) you have to prepare a Time-SIFT project directory (default name : ``time-sift-block``, *can be tuned via a parameter*) that contains : \* ``images/`` : a subdirectory with all images of all epochs. This directory name is fixed as it is the one expected by ODM \* +``images_epochs.txt`` : a file that has the same format as the file used for the split and merge ODM function. This file name *can be tuned via a parameter*. + +The ``images_epochs.txt`` file has two columns, the first column contains image names and the second contains the epoch name as follows + +:: + + DSC_0368.JPG 0_before + DSC_0369.JPG 0_before + DSC_0370.JPG 0_before + DSC_0389.JPG 1_after + DSC_0390.JPG 1_after + DSC_0391.JPG 1_after + +Your directory, before running the script, should look like this : + +:: + + $PWD/datasets/ + └── time-sift-block/ + ā”œā”€ā”€ images/ + └── images_epochs.txt + +At the end of the script you obtain a directory by epoch (at the same level as the Time-SIFT project directory). Each directory is processed with images of each epoch and all results are natively co-registered due to the initial sfm step done with all images. + +:: + + $PWD/datasets/ + ā”œā”€ā”€ 0_before/ + ā”œā”€ā”€ 1_after/ + └── time-sift-block/ + +.. |image1| image:: https://forge.inrae.fr/Denis.Feurer/timesift-odm-data-example/-/raw/main/Example.webp?ref_type=heads + + +----------------------- +Aligning Large Datasets +----------------------- + +When attempting to process very large datasets it may very well be the case that one needs to devide a large set of images into smaller more manageable chunks for ease of processing.This process however, may introduce some uncertainty with respect to the alignment of all the processed outputs.To make sure that all point clouds and terrain/suface models are seamlessly alighn in preparation for merging we follow the simple techniques outlined below. + +**Workflow for aligning large datasets:** + +#.Split the full compliment of images into manageable chunks. E.g. If you have flown and collected a total of 1000 images but you know your processor cannot handle all these images at once, you may want to devide these images into four sets of submodels with 250 images each. +#.Process the first dataset with theDigital Surface Model (DSM) option enabled. +#.Download the DSM from first dataseta in its raw-tiff format and rename it to 'align.tif' +#.Load the second dataset together with the align.tif +#.Process the second dataset (including the align.tif file) +#.Repeat until all submodels have been processed. `Learn to edit `_ and help improve `this page `_! diff --git a/source/masks.rst b/source/masks.rst deleted file mode 100644 index 8eed0a510e..0000000000 --- a/source/masks.rst +++ /dev/null @@ -1,29 +0,0 @@ -################# -Using Image Masks -################# - -Starting from ODM ``2.0`` people can supply image masks to inform the software to skip reconstruction over certain areas. This is useful for cases where the sky was accidentally included in the input photos from oblique shots, or simply to limit the reconstruction of a single subject. - -To add a mask, simply create a new black and white image of the same dimension as the target image you want to mask (you can use a program such as GIMP to do this). Color in black the areas to exclude from the reconstruction. - -.. figure:: https://user-images.githubusercontent.com/1951843/93247037-ade87a00-f75b-11ea-8b42-25bc1d89279d.png - :alt: Target image - :align: center - -.. figure:: https://user-images.githubusercontent.com/1951843/93247007-a2954e80-f75b-11ea-87b3-4f04bd1737b9.png - :alt: Image mask - :align: center - - -.. figure:: https://user-images.githubusercontent.com/1951843/93246970-8f827e80-f75b-11ea-8179-5a8fdd9f5193.png - :alt: 3D result (building is masked) - :align: center - -Name your file: - -``_mask.JPG`` - -For example, ``DJI_0018.JPG`` can have a mask by creating a ``DJI_0018_mask.JPG`` file and include that in the list of images. You can use ``.JPG``, ``.PNG``, ``.BMP`` and ``.TIF`` formats for image masks. - - -`Learn to edit `_ and help improve `this page `_! diff --git a/source/multispectral.rst b/source/multispectral.rst index 69a85a1538..ccddcff932 100644 --- a/source/multispectral.rst +++ b/source/multispectral.rst @@ -1,32 +1,41 @@ +######################### +Multispectral and Thermal +######################### + Multispectral Support ===================== Since version 0.9.9 ODM has basic support for radiometric normalization, which is able to generate reflectance orthophotos from multispectral cameras. Multispectral cameras capture multiple shots of the scene using different band sensors. -Hardware --------- + +Supported Sensors +----------------- While we aim to support as many cameras as possible, multispectral support has been developed using the following cameras, so they will work better: - * `MicaSense RedEdge-MX and Altum `_ - * `Sentera 6X `_ - * `DJI Phantom 4 Multispectral `_ + * `MicaSense RedEdge-MX and Altum `_ + * `Sentera 6X `_ (as of ODM version 1.0.1) + * `DJI Phantom 4 Multispectral `_ (as of ODM version 2.8.8) + * `DJI Mavic 3 Multispectral `_ (as of ODM version 3.5.3) Other cameras might also work. You can help us expand this list by `sharing datasets `_ captured with other cameras. -Usage ------ +Creating Orthophotos from Multispectral Data +------------------------------------------- -Process all the images from all bands at once (do not separate the bands into multiple folders) and pass the `--radiometric-calibration` parameter to enable radiometric normalization. If the images are part of a multi-camera setup, the resulting orthophoto will have N bands, one for each camera (+ alpha). +For supported sensors listed above (and likley other sensors), users can process multipsectral data in the same manner as visible light images. Images from all sensor bands should be processed at once (do not separate the bands into multiple folders). Users have the option to pass the ``--radiometric-calibration`` parameter with options ``camera`` or ``camera+sun`` to enable radiometric normalization. If the images are part of a multi-camera setup, the resulting orthophoto will have N bands, one for each camera (+ alpha). +NDVI and other vegetation indices can be calculated from these stitched orthophotos using software such as `qGIS `_ `Learn to edit `_ and help improve `this page `_! +Workflows for Non-supported Sensors +----------------------------------- + +**Sentera AGX710:** -Sentera AGX710 --------------- -While this sensor is not officially supported by ODM, the following workflow gives some good results. +While the Sentera AGX710 is not officially supported by ODM, the following workflow gives some good results. * all JPGs from the NDRE directory should be renamed with the exact following pattern 0000X_NIR.jpg. No extra '_' should be present in the file names ie 10_51_14_IMG_00008.jpg => 00008_NIR.jpg * all JPGs from the nRGB directory should be renamed with the exact following pattern 0000X_RGB.jpg. No extra '_' should be present in the file names ie 10_51_14_IMG_00023.jpg => 00023_RGB.jpg @@ -48,3 +57,32 @@ While this sensor is not officially supported by ODM, the following workflow giv python3 contrib/ndvi/rename_sentera_agx710_multispectral_tif.py output_dir/odm_orthophoto.tif * output_dir/odm_orthophoto.tif could be open with `QGIS `_ with correct band names + +Thermal Support +=============== + +ODM has support for radiometric calibration of thermal data, which is able to generate temperature orthophotos from long-wave infrared (LWIR) cameras. LWIR images can be processed alone or as part of a multispectral dataset. + +.. figure:: images/thermal.webp + :alt: Screen shot of thermal imagery as displayed in WebODM + :align: center + +Hardware +-------- + +While we aim to support as many cameras as possible, thermal support has been developed using the following cameras, so they will work better: + + * `MicaSense Altum `_ + * `DJI Zenmuse XT `_ + * `DJI Zenmuse H20 Series `_ + +Other cameras might also work. You can help us expand this list by `sharing datasets `_ captured with other cameras. + +Usage +----- + +Process the images using the `--radiometric-calibration camera` parameter to enable radiometric calibration. + + +`Learn to edit `_ and help improve `this page `_! + diff --git a/source/outputs.rst b/source/outputs.rst index 02fc1629b8..1b24af1374 100644 --- a/source/outputs.rst +++ b/source/outputs.rst @@ -8,7 +8,7 @@ Point Cloud ``odm_georeferencing/odm_georeferenced_model.ply/laz/csv`` -- The georeferenced point cloud in different file formats -.. figure:: images/pointcloud.png +.. figure:: images/pointcloud.webp :alt: image of OpenDroneMap derived point cloud :align: center @@ -21,9 +21,9 @@ Point Cloud ``odm_texturing/odm_textured_model.obj`` -- The textured surface mesh ``odm_texturing/odm_textured_model_geo.obj`` -- The georeferenced and textured surface mesh -You can access the point cloud and textured meshes using MeshLab. Open MeshLab, and choose File:Import Mesh and choose your textured mesh from a location similar to the following: ``odm_texturing\odm_textured_model.obj`` +You can access the point cloud and textured meshes using MeshLab. Open MeshLab, and choose ``File:Import Mesh`` and choose your textured mesh from a location similar to the following: ``odm_texturing\odm_textured_model.obj`` -.. figure:: images/UR_3D.gif +.. figure:: images/UR_3D.webp :alt: image of OpenDroneMap derived textured mesh :align: center @@ -36,7 +36,7 @@ Orthophoto ``odm_orthophoto/odm_orthphoto.original.tif`` -- The orthophoto in its original un-cropped state. -.. figure:: images/orthophoto.png +.. figure:: images/orthophoto.webp :alt: image of OpenDroneMap orthophoto :align: center @@ -45,19 +45,24 @@ Orthophoto DTM/DSM ^^^^^^^ -DTM/DSM will only be created if the ``--dtm`` or ``--dsm`` options are used. See `tutorial on elevation models `_ for more options in creating. +DTM/DSM will only be created if the ``--dtm`` or ``--dsm`` options are used. See `tutorial on elevation models <../tutorials/#creating-digital-elevation-models>`_ for more options in creating. Data will be stored in: * ``odm_dem/dtm.tif`` * ``odm_dem/dsm.tif`` -.. figure:: images/digitalsurfacemodel.png +.. figure:: images/digitalsurfacemodel.webp :alt: image of OpenDroneMap derived digital surface model :align: center *Digital surface model over State University Zanzibar, courtesy of* `Khadija Abdullah Ali `_ +Logs +^^^^ +Logs are output to stdout. On Linux `ANSI escape color code `_ (eg ^[[39m) is used and could be disabled by setting no_ansiesc environment variable to any value like ``env no_ansiesc=1`` + + List of all outputs ^^^^^^^^^^^^^^^^^^^ @@ -97,13 +102,13 @@ List of all outputs │ ā”œā”€ā”€ odm_georeferencing_log.txt # Georeferencing log │ └── odm_georeferencing_utm_log.txt # Log for the extract_utm portion ā”œā”€ā”€ odm_orthophoto/ - │ ā”œā”€ā”€ odm_orthophoto.png # Orthophoto image (no coordinates) + │ ā”œā”€ā”€ odm_orthophoto.webp # Orthophoto image (no coordinates) │ ā”œā”€ā”€ odm_orthophoto.tif # Orthophoto GeoTiff │ ā”œā”€ā”€ odm_orthophoto_log.txt # Log file │ └── gdal_translate_log.txt # Log for georeferencing the png file └── odm_dem/ ā”œā”€ā”€ dsm.tif # Digital Surface Model Geotiff - the tops of everything - └── dtm.tif # Digital Terrain Model Geotoff - the ground. + └── dtm.tif # Digital Terrain Model Geotiff - the ground. diff --git a/source/readme-img/reST_syntax_bold_en.png b/source/readme-img/reST_syntax_bold_en.png deleted file mode 100644 index 7a918b7499..0000000000 Binary files a/source/readme-img/reST_syntax_bold_en.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_bold_en.webp b/source/readme-img/reST_syntax_bold_en.webp new file mode 100644 index 0000000000..477b9e5cbd Binary files /dev/null and b/source/readme-img/reST_syntax_bold_en.webp differ diff --git a/source/readme-img/reST_syntax_bold_sw.png b/source/readme-img/reST_syntax_bold_sw.png deleted file mode 100644 index 3ee4ada014..0000000000 Binary files a/source/readme-img/reST_syntax_bold_sw.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_bold_sw.webp b/source/readme-img/reST_syntax_bold_sw.webp new file mode 100644 index 0000000000..1ea6c8d2b3 Binary files /dev/null and b/source/readme-img/reST_syntax_bold_sw.webp differ diff --git a/source/readme-img/reST_syntax_bold_transifex.png b/source/readme-img/reST_syntax_bold_transifex.png deleted file mode 100644 index 6e2ed2ab4a..0000000000 Binary files a/source/readme-img/reST_syntax_bold_transifex.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_bold_transifex.webp b/source/readme-img/reST_syntax_bold_transifex.webp new file mode 100644 index 0000000000..ab486dfa26 Binary files /dev/null and b/source/readme-img/reST_syntax_bold_transifex.webp differ diff --git a/source/readme-img/reST_syntax_code2_en.png b/source/readme-img/reST_syntax_code2_en.png deleted file mode 100644 index 01a9cc9475..0000000000 Binary files a/source/readme-img/reST_syntax_code2_en.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_code2_en.webp b/source/readme-img/reST_syntax_code2_en.webp new file mode 100644 index 0000000000..252caa0fd1 Binary files /dev/null and b/source/readme-img/reST_syntax_code2_en.webp differ diff --git a/source/readme-img/reST_syntax_code2_es.png b/source/readme-img/reST_syntax_code2_es.png deleted file mode 100644 index c691ad21de..0000000000 Binary files a/source/readme-img/reST_syntax_code2_es.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_code2_es.webp b/source/readme-img/reST_syntax_code2_es.webp new file mode 100644 index 0000000000..267b6cbea7 Binary files /dev/null and b/source/readme-img/reST_syntax_code2_es.webp differ diff --git a/source/readme-img/reST_syntax_code2_transifex.png b/source/readme-img/reST_syntax_code2_transifex.png deleted file mode 100644 index 19d3c025c6..0000000000 Binary files a/source/readme-img/reST_syntax_code2_transifex.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_code2_transifex.webp b/source/readme-img/reST_syntax_code2_transifex.webp new file mode 100644 index 0000000000..2a9201ab44 Binary files /dev/null and b/source/readme-img/reST_syntax_code2_transifex.webp differ diff --git a/source/readme-img/reST_syntax_code_en.png b/source/readme-img/reST_syntax_code_en.png deleted file mode 100644 index f61557d47f..0000000000 Binary files a/source/readme-img/reST_syntax_code_en.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_code_en.webp b/source/readme-img/reST_syntax_code_en.webp new file mode 100644 index 0000000000..f645920013 Binary files /dev/null and b/source/readme-img/reST_syntax_code_en.webp differ diff --git a/source/readme-img/reST_syntax_code_sw.png b/source/readme-img/reST_syntax_code_sw.png deleted file mode 100644 index be2f990e34..0000000000 Binary files a/source/readme-img/reST_syntax_code_sw.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_code_sw.webp b/source/readme-img/reST_syntax_code_sw.webp new file mode 100644 index 0000000000..7e561e1b86 Binary files /dev/null and b/source/readme-img/reST_syntax_code_sw.webp differ diff --git a/source/readme-img/reST_syntax_code_transifex.png b/source/readme-img/reST_syntax_code_transifex.png deleted file mode 100644 index 86ce68795c..0000000000 Binary files a/source/readme-img/reST_syntax_code_transifex.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_code_transifex.webp b/source/readme-img/reST_syntax_code_transifex.webp new file mode 100644 index 0000000000..6db18d75ba Binary files /dev/null and b/source/readme-img/reST_syntax_code_transifex.webp differ diff --git a/source/readme-img/reST_syntax_err_transifex.png b/source/readme-img/reST_syntax_err_transifex.png deleted file mode 100644 index a98b937af2..0000000000 Binary files a/source/readme-img/reST_syntax_err_transifex.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_err_transifex.webp b/source/readme-img/reST_syntax_err_transifex.webp new file mode 100644 index 0000000000..17bcd7d208 Binary files /dev/null and b/source/readme-img/reST_syntax_err_transifex.webp differ diff --git a/source/readme-img/reST_syntax_italic_en.png b/source/readme-img/reST_syntax_italic_en.png deleted file mode 100644 index 1744b51ae0..0000000000 Binary files a/source/readme-img/reST_syntax_italic_en.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_italic_en.webp b/source/readme-img/reST_syntax_italic_en.webp new file mode 100644 index 0000000000..e725bcc009 Binary files /dev/null and b/source/readme-img/reST_syntax_italic_en.webp differ diff --git a/source/readme-img/reST_syntax_italic_sw.png b/source/readme-img/reST_syntax_italic_sw.png deleted file mode 100644 index 12f97b2fab..0000000000 Binary files a/source/readme-img/reST_syntax_italic_sw.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_italic_sw.webp b/source/readme-img/reST_syntax_italic_sw.webp new file mode 100644 index 0000000000..2b46dac78a Binary files /dev/null and b/source/readme-img/reST_syntax_italic_sw.webp differ diff --git a/source/readme-img/reST_syntax_italic_transifex.png b/source/readme-img/reST_syntax_italic_transifex.png deleted file mode 100644 index 7c6f60be3c..0000000000 Binary files a/source/readme-img/reST_syntax_italic_transifex.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_italic_transifex.webp b/source/readme-img/reST_syntax_italic_transifex.webp new file mode 100644 index 0000000000..7e0d4ad109 Binary files /dev/null and b/source/readme-img/reST_syntax_italic_transifex.webp differ diff --git a/source/readme-img/reST_syntax_link_en.png b/source/readme-img/reST_syntax_link_en.png deleted file mode 100644 index d385aa3d30..0000000000 Binary files a/source/readme-img/reST_syntax_link_en.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_link_en.webp b/source/readme-img/reST_syntax_link_en.webp new file mode 100644 index 0000000000..b9d3e04f8d Binary files /dev/null and b/source/readme-img/reST_syntax_link_en.webp differ diff --git a/source/readme-img/reST_syntax_link_sw.png b/source/readme-img/reST_syntax_link_sw.png deleted file mode 100644 index 36078ccc4f..0000000000 Binary files a/source/readme-img/reST_syntax_link_sw.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_link_sw.webp b/source/readme-img/reST_syntax_link_sw.webp new file mode 100644 index 0000000000..28bebdc774 Binary files /dev/null and b/source/readme-img/reST_syntax_link_sw.webp differ diff --git a/source/readme-img/reST_syntax_link_transifex.png b/source/readme-img/reST_syntax_link_transifex.png deleted file mode 100644 index 96151271df..0000000000 Binary files a/source/readme-img/reST_syntax_link_transifex.png and /dev/null differ diff --git a/source/readme-img/reST_syntax_link_transifex.webp b/source/readme-img/reST_syntax_link_transifex.webp new file mode 100644 index 0000000000..dceb42d6d4 Binary files /dev/null and b/source/readme-img/reST_syntax_link_transifex.webp differ diff --git a/source/readme-img/sphinx-build_errors_in_terminal.png b/source/readme-img/sphinx-build_errors_in_terminal.png deleted file mode 100644 index ba647eaa89..0000000000 Binary files a/source/readme-img/sphinx-build_errors_in_terminal.png and /dev/null differ diff --git a/source/readme-img/sphinx-build_errors_in_terminal.webp b/source/readme-img/sphinx-build_errors_in_terminal.webp new file mode 100644 index 0000000000..c3d54b5f11 Binary files /dev/null and b/source/readme-img/sphinx-build_errors_in_terminal.webp differ diff --git a/source/readme-img/terminal_venv.png b/source/readme-img/terminal_venv.png deleted file mode 100644 index 983c19b075..0000000000 Binary files a/source/readme-img/terminal_venv.png and /dev/null differ diff --git a/source/readme-img/terminal_venv.webp b/source/readme-img/terminal_venv.webp new file mode 100644 index 0000000000..1299688e50 Binary files /dev/null and b/source/readme-img/terminal_venv.webp differ diff --git a/source/requesting-features.rst b/source/requesting-features.rst deleted file mode 100644 index 6acde16ee0..0000000000 --- a/source/requesting-features.rst +++ /dev/null @@ -1,42 +0,0 @@ -How To Request Features -======================= - -All software needs user feedback and feature requests, to grow and maintain -alignment with the needs of its users. - -OpenDroneMap is FOSS software. Free and open source (FOSS) projects are interesting -from the inside and outside: from the outside, successful ones feel like they should be able -to do anything, and it’s hard to know what a reasonable request is. From the inside of a -project, they can feel very resource constrained: largely by time, money, and opportunity -overload. - -**Demanding that a feature be implemented is probably not going to convince the development team to do so**. Imagine -if somebody knocked on your door and asked you to "stop reading this page right now and come to my house to cook me dinner!". Your first response might very reasonably be "who on earth is this person and why should I spend my time and energy fulfilling his agenda instead of my own?". - -**Suggesting** that a feature be implemented is a more effective (and cordial) way to ask for new features, especially if you're prepared to offer some of your own resources (time, funds or both) to help get the feature implemented. Explaining why -*your* suggestion can benefit others can also help. If the feature benefits you exclusively, it might be harder to convince others to do the work for you. - -A feature request can be submitted as issues on the applicable Github repository (e.g., -`WebODM `_ or `ODM `_ -or similar) or more simply as a discussion topic on `the community forum `_. -Try to start by searching these sources to see if someone else has already brought it up. Sometimes a feature is already in -the works, or has at least been discussed. - -To request the addition of support for new drone cameras: please share a set of test images on the `datasets channel on the forum `_. Without test images there's not much the developers can do. - -And importantly, the trick is to listen: if someone within the project says: "This is a big lift, -we need MONEY or TIME or SOMEONE TO HELP CODE IT" (or possibly a combination of the three) -then there are two answers that work really well in response: - - *Ok. I didn’t know it was a big feature request! I hope someone comes along with the necessary resources. As a community member, I would be happy to be an early user and tester!* - -or - - *Let’s figure out if we can put together the resources to get this done! Here’s what I can contribute toward it: …* - -We are glad you are excited to see new features added to the project. Some new features need support, -and some are easier to implement. We'll do our best to help you understand where your request falls, and -we appreciate any support you can provide. - - -`Learn to edit `_ and help improve `this page `_! \ No newline at end of file diff --git a/source/resources.rst b/source/resources.rst deleted file mode 100644 index 9fcb910ee0..0000000000 --- a/source/resources.rst +++ /dev/null @@ -1,26 +0,0 @@ -Additional References -===================== - -For Users --------------- - -The following resources are a good place to start: - -* `README page for ODM `_ -* `README page for WebODM `_ -* `README page for NodeODM `_ -* `Ground Control Points Format Specification `_ -* `OpenDroneMap: The Missing Guide `_ - -For Developers --------------- - -In addition to user resources, we recommend to also read the following: - -* WebODM documentation: https://docs.webodm.org -* NodeODM API specification: https://github.com/OpenDroneMap/NodeODM/blob/master/docs/index.adoc -* Overview of the ODM pipeline: http://community.opendronemap.org/t/where-can-i-find-background-information-on-the-concepts-of-odm/665/2 -* We keep a `section in our forum dedicated to research papers `_. This is a valuable place where to read more about state of the art research related to structure from motion, multi-view stereo, meshing, texturing, etc. which can be used to improve the software. - - -`Learn to edit `_ and help improve `this page `_! \ No newline at end of file diff --git a/source/tutorials.rst b/source/tutorials.rst index 0a4a6e96a2..f437a6f7e4 100644 --- a/source/tutorials.rst +++ b/source/tutorials.rst @@ -10,92 +10,316 @@ Below you will find instructions for some common use cases. Creating High Quality Orthophotos ********************************* -.. figure:: images/orthophoto.png +.. figure:: images/orthophoto.webp :alt: image of OpenDroneMap orthophoto :align: center Without any parameter tweaks, ODM chooses a good compromise between quality, speed and memory usage. If you want to get higher quality results, you need to tweak some parameters: * ``--orthophoto-resolution`` is the resolution of the orthophoto in cm/pixel. Decrease this value for a higher resolution result. - * ``--ignore-gsd`` is a flag that instructs ODM to skip certain memory and speed optimizations that directly affect the orthophoto. Using this flag will increase runtime and memory usage, but may produce sharper results. - * ``--texturing-nadir-weight`` should be increased to ``29-32`` in urban areas to reconstruct better edges of roofs. It should be decreased to ``0-6`` in grassy / flat areas. * ``--texturing-data-term`` should be set to `area` in forest areas. * ``--mesh-size`` should be increased to ``300000-600000`` and ``--mesh-octree-depth`` should be increased to ``10-11`` in urban areas to recreate better buildings / roofs. -********************** -Calibrating the Camera -********************** +********************************* +Creating Digital Elevation Models +********************************* -Camera calibration is a special challenge with commodity cameras. Temperature changes, vibrations, focus, and other factors can affect the derived parameters with substantial effects on resulting data. Automatic or self calibration is possible and desirable with drone flights, but depending on the flight pattern, automatic calibration may not remove all distortion from the resulting products. James and Robson (2014) in their paper `Mitigating systematic error in topographic models derived from UAV and ground‐based image networks `_ address how to minimize the distortion from self-calibration. +By default ODM does not create digital elevation models (DEMs). To create a digital terrain model, make sure to pass the ``--dtm`` flag. To create a digital surface model, be sure to pass the ``--dsm`` flag. + +.. figure:: images/digitalsurfacemodel.webp + :alt: image of OpenDroneMap derived digital surface model + :align: center + +For DTM generation, a Simple Morphological Filter (smrf) is used to classify points in ground vs. non-ground and only the ground points are used. The ``smrf`` filter can be controlled via several parameters: + + * ``--smrf-scalar`` scaling value. Increase this parameter for terrains with lots of height variation. + * ``--smrf-slope`` slope parameter, which is a measure of "slope tolerance". Increase this parameter for terrains with lots of height variation. Should be set to something higher than 0.1 and not higher than 1.2. + * ``--smrf-threshold`` elevation threshold. Set this parameter to the minimum height (in meters) that you expect non-ground objects to be. + * ``--smrf-window`` window radius parameter (in meters) that corresponds to the size of the largest feature (building, trees, etc.) to be removed. Should be set to a value higher than 10. + +Changing these options can affect the result of DTMs significantly. The best source to read to understand how the parameters affect the output is to read the original paper `An improved simple morphological filter for the terrain classification of airborne LIDAR data `_ (PDF freely available). + +Overall the ``--smrf-threshold`` option has the biggest impact on results. -.. figure:: images/msimbasi_bowling.png +SMRF is good at avoiding Type I errors (small number of ground points mistakenly classified as non-ground) but only "acceptable" at avoiding Type II errors (large number non-ground points mistakenly classified as ground). This needs to be taken in consideration when generating DTMs that are meant to be used visually, since objects mistaken for ground look like artifacts in the final DTM. + +.. figure:: images/smrf.webp :alt: image of lens distortion effect on bowling of data :align: center -*Bowling effect on point cloud over 13,000+ image dataset collected by World Bank Tanzania over the flood prone Msimbasi Basin, Dar es Salaam, Tanzania.* +Two other important parameters affect DEM generation: -To mitigate this effect, there are a few options but the simplest are as follows: fly two patterns separated by 20°, and rather than having a nadir (straight down pointing) camera, use one that tilts forward by 5°. + * ``--dem-resolution`` which sets the output resolution of the DEM raster (cm/pixel) + * ``--dem-gapfill-steps`` which determines the number of progressive DEM layers to use. For urban scenes increasing this value to `4-5` can help produce better interpolation results in the areas that are left empty by the SMRF filter. -.. figure:: images/flightplanning.gif - :alt: animation showing optimum - :align: center - :height: 480 - :width: 640 +Example of how to generate a DTM:: -As this approach to flying can be take longer than typical flights, a pilot or team can fly a small area using the above approach. OpenDroneMap will generate a calibration file called cameras.json that then can be imported to be used to calibrate another flight that is more efficiently flown. + docker run -ti --rm -v /my/project:/datasets/code --project-path /datasets --dtm --dem-resolution 2 --smrf-threshold 0.4 --smrf-window 24 -Alternatively, the following experimental method can be applied: fly with much lower overlap, but two *crossgrid* flights (sometimes called crosshatch) separated by 20° with a 5° forward facing camera. +*************************************** +Using Potree 3D viewer module on WebODM +*************************************** -* Crossgrid overlap percentages can be lower than parallel flights. To get good 3D results, you will require 68% overlap and sidelap for an equivalent 83% overlap and sidelap. -* To get good 2D and 2.5D (digital elevation model) results, you will require 42% overlap and sidelap for an equivalent 70% overlap and sidelap. +Cameras +======= +Activate this function to display camera positions. -.. figure:: images/rotation.gif - :alt: animation showing experimental optimum - :align: center +You can also click in the camera icon to display single images in a frame on the upper right corner. A click on the image frame toggles into full screen mode. -Vertically separated flight lines also improve accuracy, but less so than a camera that is forward facing by 5°. +Within the image frame there are links to download the image and the GeoJSON camera file. -.. figure:: images/forward_facing.png - :alt: figure showing effect of vertically separated flight lines and forward facing cameras on improving self calibration +.. figure:: images/cameras.webp + :alt: Camera locations :align: center -From James and Robson (2014), `CC BY 4.0 `_ +Textured model +============== -********************************* -Creating Digital Elevation Models -********************************* +Activate this function to show load the textured model. Depending on the file size and connection speed, it may take several seconds to load. -By default ODM does not create DEMs. To create a digital terrain model, make sure to pass the ``--dtm`` flag. To create a digital surface model, be sure to pass the ``--dsm`` flag. +.. figure:: images/texturedmodel.webp + :alt: Textured model + :align: center -.. figure:: images/digitalsurfacemodel.png - :alt: image of OpenDroneMap derived digital surface model +Appearance +========== + + + +Point budget +------------ +For both appearance and performance purposes, the point budget on the scene can be managed. Some old and less capable machines would benefit from a 500,000 point budget while most mid-range specs machine are capable of handling 1 to 2 million point budget. + +A 5 to 7 million point budget produces a smooth point cloud 3d model, but may result in a high resource demanding process. + +Default point budget value is set to 1,000,000. + +Field of view +------------- + +In order to control model elements to be included within the scene the field of view can be adjusted. Default value is set to 60 degrees. + +.. figure:: images/FOV_animation.webp + :alt: Field of view adjustment :align: center -For DTM generation, a Simple Morphological Filter (smrf) is used to classify points in ground vs. non-ground and only the ground points are used. The ``smrf`` filter can be controlled via several parameters: - * ``--smrf-scalar`` scaling value. Increase this parameter for terrains with lots of height variation. - * ``--smrf-slope`` slope parameter, which is a measure of "slope tolerance". Increase this parameter for terrains with lots of height variation. Should be set to something higher than 0.1 and not higher than 1.2. - * ``--smrf-threshold`` elevation threshold. Set this parameter to the minimum height (in meters) that you expect non-ground objects to be. - * ``--smrf-window`` window radius parameter (in meters) that corresponds to the size of the largest feature (building, trees, etc.) to be removed. Should be set to a value higher than 10. +Eye Dome-lighting +----------------- -Changing these options can affect the result of DTMs significantly. The best source to read to understand how the parameters affect the output is to read the original paper `An improved simple morphological filter for the terrain classification of airborne LIDAR data `_ (PDF freely available). +The Potree Point Cloud 3d viewer module can implement eye dome-lighting, a lighting model that accentuates the shapes of objects. -Overall the ``--smrf-threshold`` option has the biggest impact on results. +Eye Dome-lighting group objects, shade their outlines and enhances depth perception in scientific visualization images. It is useful for recognition and measurement of structures within a model. It can be modified by adjusting Radius, Strength and Opacity. -SMRF is good at avoiding Type I errors (small number of ground points mistakenly classified as non-ground) but only "acceptable" at avoiding Type II errors (large number non-ground points mistakenly classified as ground). This needs to be taken in consideration when generating DTMs that are meant to be used visually, since objects mistaken for ground look like artifacts in the final DTM. +By default, Eye Dome-Lighting is enabled on Potree 3D viewer, but it can be disabled by clicking on the enable option. + +.. figure:: images/EDL_animation.webp + :alt: Eye dome lighting adjustment + :align: center + + +Background +---------- + +Potree 3D viewer background can be modified. Available options are **Skybox** / **Gradient** / **Black** / **White** / **None** + +.. figure:: images/Background_animation.webp + :alt: Background selection + :align: center + +Other +----- + +**Splat Quality** = Splat quality can be adjusted to standard or high quality, to improve the appearance of the model. + +**Min node size** = Min node size option will impact the point density of the nodes represented. + +**Box** = Display the boxes of the nodes. + +**Lock view** = Lock the point cloud view, preventing to load or unload points to the model. + +Tools +===== + +Measurement +----------- + +Potree 3D viewer module provides several tools for measurement. This tool set consist of 12 elements. +It also has controls for showing or hiding the resulting measurement labels. + +Measurements are performed by left clicking on the desired points and for some tools right clicking is needed in order to terminate the process. + +.. figure:: images/measurement.webp + :alt: Tools - Measurement tools + :align: center + +**Angle** + +This tool measures the tridimensional angle formed by the lines connecting 3 points. +To start a measurement, click on the angle icon, then left click on 3 point and the process will be automatically ended. +Further information can also be obtained from selecting this element under the scene section. + +**Point** + +This tool highlights a selected point and display its XYZ coordinate. +To start a measurement, click on the point icon, then click on the desired point and the process will be automatically ended. +Further information can also be obtained from selecting this element under the scene section. + +**Distance** + +This tool measures the tridimensional distance of the lines connecting a series of points. +To start a measurement, click on the distance icon and start clicking on the desired points (two or more). Right click to finish measurement. +Further information such as Total length can also be obtained from selecting this element under the scene section. + +**Height** + +This tool measures the height or vertical distance between two points. +To start a measurement, click on the height icon and then click on the desired two points. The process will be automatically ended. +Further information can also be obtained from selecting this element under the scene section. + +.. figure:: images/height_animation.webp + :alt: Height measurement + :align: center + +**Circle** + +This tool measures the radius of a circle formed by three points. +To start a measurement, click on the circle icon and then click on the desired two points. The process will be automatically ended. +Further information such as Circumference can also be obtained from selecting this element under the scene section. + +**Azimuth** + +This tool measures the azimuthal angle of a line. This line is formed by two points selected by the user, the angle is measured in degrees, clockwise from 0 to 360 and starting from the geographical north. +To start a measurement, click on the azimuth icon and then click on the desired two points. The process will be automatically ended. +Further information can also be obtained from selecting this element under the scene section. + +**Area** + +This tool measures the horizontal area formed by a polygon. +To start a measurement, click on the area icon and start clicking on the points forming the desired polygon (three or more). Right click to finish measurement. +Further information can also be obtained from selecting this element under the scene section. + +**Volume (cube)** + +This tool measures the volume formed by a cube. +To start a measurement, click on the volume (cube) icon and click on the model to place the cube. It is possible relocate, redimension and rotate the cube using the displayed handlers. Right click to finish measurement. +Further information can also be obtained from selecting this element under the scene section. + +**Volume (sphere)** + +This tool measures the volume formed by a sphere. +To start a measurement, click on the volume (sphere) icon and click on the model to place the sphere. It is possible relocate, redimension and rotate the sphere using the displayed handlers. Right click to finish measurement. +Further information can also be obtained from selecting this element under the scene section. + +**Height profile** + +This tool creates a height profile formed by a line on the model. +To start a measurement, click on the Height profile icon and then form a line on the model by clicking on the desired points (two or more). Right click to finish measurement. +Further information and options, such as "Show 2d Profile", can also been obtained from selecting this element under the scene section. + +.. figure:: images/height_profile.webp + :alt: Height profile + :align: center + +**Annotation** + +This tool creates an annotation label on a highlighted point on the model. +To start a measurement, click on the annotation icon and then click on the desired point. The process will be automatically ended. +To edit the annotation, select this element under the scene section, then edit Title and Description. + +**Remove measurements** + +This tool removes all measurements on the model. +To remove all measurement, click on the "Remove measurements" icon. + + +Clipping +--------- + + +.. figure:: images/clipping.webp + :alt: Tools - Clipping tools + :align: center + +Point cloud can be clipped by selecting an area. Clipping options include **None** / **Highlight** / **Inside** / **Outside** + +To clip a point cloud, click on the volume clip icon, place the cube on the model and relocate, redimension and rotate to contain the desired area. +Highlight is set by default as the clipping method. If display only the points contained within the cube click on "Inside", otherwise click on "Outside". + +To remove the clipping volume or polygons click on the "Remove all measurements" icon. + +.. figure:: images/clipping_animation.webp + :alt: Tools - Clipping + :align: center + +Navigation +----------- + +.. figure:: images/navigation.webp + :alt: Tools - Navigation controls + :align: center + +Potree 3D viewer have 4 Navigation controls which define its behavior. + +**Earth Control** + +Earth control navigated as anchored to the ground. Mouse left button moves the model horizontally, mouse wheel controls zoom and right button orbits the model. + +**Fly control** + +Fly control moves the camera as in birds eye using the keyboard. Keys "W" and "S" moves forward and backwards, respectively and in the direction of the camera, while "A" and "D" moves left and right respectively. Also, the "R" and "F" keys moves the camera up and down. The mouse left button changes the direction of the camera, mouse wheel controls zoom, and right button moves the camera in the XYZ axis. + +The speed for these movements can be controlled using the sliding control. + +**Helicopter control** + +Helicopter control moves the camera as in an aircraft using the keyboard. Keys "W" and "S" moves forward and backwards, respectively restricted in a horizontal plane, while "A" and "D" moves left and right respectively. Also, the "R" and "F" keys moves the camera up and down. The mouse left button changes the direction of the camera, mouse wheel controls zoom, and right button moves the model in the XY axis. + +The speed for these movements can be controlled using the sliding control. + +**Orbit Control** + +Orbit Control is the default navigation behavior. The mouse left button orbits the model, the wheel controls zoom and the right button moves the model in the XYZ axis. + +**Full extent** + +Full extent button restores the model view. + +**Navigation cube** + +Navigation cube displays a wireframe cube containing the model. + +**Compass** + +Compass button displays a compass on the upper right corner. + +**Camera animation** + +The camera animation button creates a camera animation path. Position of the camera is defined by the points on the green line while the points in the blue line are the location towards the camera is intended to be facing. + +To create an animation, adjust the points for the camera locations and camera direction, then select the camera element under the Scene section to create more point, change animation speed or play the animation. + +.. figure:: images/camera_animation.webp + :alt: Tools - Navigation controls + :align: center + + +Scene +===== + +The Scene section displays a file tree containing all the scene elements. +Elements are arranged in six groups, which are **Point clouds** / **Measurements** / **Annotations** +/ **Other** / **Vector** / **Images** -.. figure:: images/smrf.png - :alt: image of lens distortion effect on bowling of data - :align: center +Each element under these groups can be selected to get further information or to control its properties. -Two other important parameters affect DEM generation: +For instance, point clouds properties can be modified to show elevation and also the color ramp cam be customized. - * ``--dem-resolution`` which sets the output resolution of the DEM raster (cm/pixel) - * ``--dem-gapfill-steps`` which determines the number of progressive DEM layers to use. For urban scenes increasing this value to `4-5` can help produce better interpolation results in the areas that are left empty by the SMRF filter. +.. figure:: images/pointcloud_elevation.webp + :alt: Tools - Navigation controls + :align: center -Example of how to generate a DTM:: - docker run -ti --rm -v /my/project:/datasets/code --project-path /datasets --dtm --dem-resolution 2 --smrf-threshold 0.4 --smrf-window 24 *************************** Measuring stockpile volume @@ -115,10 +339,10 @@ Most stockpile measurement jobs does not require a crosshatch pattern or angled In most of the cases a lawn mower flight pattern is capable of producing highly accurate stockpile models. -.. figure:: images/lawnmower_pattern.png +.. figure:: images/lawnmower_pattern.webp :alt: a simple lawnmower flight pattern can produce accurate results :align: center - + Recommended overlap would be between 75% and 80% with a sidelap in the order of 65% to 70%. It is also recommended to slightly increase overlap and sidelap as the flight height is increased. Flight height @@ -158,39 +382,39 @@ Measuring As almost 50% of the material will be found in the first 20% of the stockpile height, special care should be taken in adequately defining the base plane. -.. figure:: images/stockpile.png - :alt: almost 50% of the material will be found in the first 20% of the stockpile height +.. figure:: images/stockpile.webp + :alt: almost 50% of the material will be found in the first 20% of the stockpile height :align: center -In WebODM Dashboard, clic on "view map" to start a 2D view of your project. +In WebODM Dashboard, clic on "view map" to start a 2D view of your project. Once in the 2D map view, clic on the "Measure volume, area and length" button. -.. figure:: images/measurement1.png +.. figure:: images/measurement1.webp :alt: clic on the "Measure volume, area and length" button :align: center - + then clic on "Create a new measurement" -.. figure:: images/measurement2.png +.. figure:: images/measurement2.webp :alt: clic on "Create a new measurement" :align: center Start placing the points to define the stockpile base plane -.. figure:: images/measurement3.png +.. figure:: images/measurement3.webp :alt: Define the stockpile base plane :align: center - + Clic on "Finish measurement" to finish the process. -.. figure:: images/measurement4.png +.. figure:: images/measurement4.webp :alt: Clic on "Finish measurement" to finish the process :align: center - + Dialog box will show the message "Computing ..." for a few seconds, and after the computing is finished the volume measurement value will be displayed. -.. figure:: images/measurement7.png +.. figure:: images/measurement7.webp :alt: Clic on "Finish measurement" to finish the process :align: center @@ -296,68 +520,6 @@ Cleaning up after Docker Docker has a lamentable use of space and by default does not clean up excess data and machines when processes are complete. This can be advantageous if we need to access a process that has since terminated, but carries the burden of using increasing amounts of storage over time. Maciej Łebkowski has an `excellent overview of how to manage excess disk usage in docker `_. -***************** -Using Singularity -***************** - -'Singularity '_ is another container platform able to run Docker images. Singularity could be used from laptop to large HPC clusters, local university or company clusters, a single server, in the cloud... -A container is a single file without anything else to install - -Downloading image -================= -Singularity can use ODM Docker container after their download. It creates .sif images - -For latest ODM Docker image - -.. code:: bash - - > singularity pull --disable-cache docker://opendronemap/odm:latest - -For latest ODM GPU Docker image - -.. code:: bash - - > singularity pull --disable-cache docker://opendronemap/odm:gpu - -Using Singularity SIF image -=========================== - -As Singularity has a different way to map directories than Docker, a bash script file is a good solution to map ODM directories. -Here is a linux example for ODM :: - - images_dir=/path_to_image_dir/ - name=`basename $images_dir` - output_dir=/path_to_output_directories/$name - mkdir -p $output_dir - - singularity run - --bind $images_dir:/$output_dir/code/images,\ - --writable-tmpfs odm_latest.sif \ - --orthophoto-png --mesh-octree-depth 12 --ignore-gsd --dtm \ - --smrf-threshold 0.4 --smrf-window 24 --dsm --pc-csv --pc-las --orthophoto-kmz \ - --ignore-gsd --matcher-type flann --feature-quality ultra --max-concurrency 16 \ - --use-hybrid-bundle-adjustment --build-overviews --time --min-num-features 10000 \ - --project-path $output_dir - - -Here is a linux example for the ODM with GPU :: - - images_dir=/path_to_image_dir/ - name=`basename $images_dir` - output_dir=/path_to_output_directories/$name - mkdir -p $output_dir - - singularity run - --bind $images_dir:/$output_dir/code/images,\ - --writable-tmpfs odm_latest.sif \ - --orthophoto-png --mesh-octree-depth 12 --ignore-gsd --dtm \ - --smrf-threshold 0.4 --smrf-window 24 --dsm --pc-csv --pc-las --orthophoto-kmz \ - --ignore-gsd --matcher-type flann --feature-quality ultra --max-concurrency 16 \ - --use-hybrid-bundle-adjustment --build-overviews --time --min-num-features 10000 \ - --project-path $output_dir - - - ************************************* Using ODM from low-bandwidth location ************************************* @@ -416,7 +578,7 @@ Install address of your server). If you want to follow this example closely, *do* use the username ``odm``; then your install path will be ``/home/odm/ODM/`` and will match all of the examples in - this document. + this document. - Go ahead and execute ``sudo apt update`` and ``sudo apt upgrade`` to ensure your server isn’t dangerously without updates. Make sure to stay with Ubuntu 18.04. @@ -485,7 +647,7 @@ Prep data and project example, into the volume we attached to the cloud machine at ``/mnt/odmdata/``. - This will take some bandwidth. No way around the size of the - files.\ `1 <#footnote1>`__, \ `2 <#footnote2>`__\ + files.\ `1 <#footnote1>`__, \ `2 <#footnote2>`__\ Directory structure ^^^^^^^^^^^^^^^^^^^ @@ -559,7 +721,7 @@ Resize droplet, pull pin, run away :: - nohup python run.py myproject --split 1 --split-overlap 0 --ignore-gsd --depthmap-resolution 1000 --orthophoto-resolution 5 --dem-resolution 15 --pc-las --dsm + nohup python run.py myproject --split 1 --split-overlap 0 --depthmap-resolution 1000 --orthophoto-resolution 5 --dem-resolution 15 --pc-las --dsm - This points ODM at the folder (in this example) ``/mnt/odmdata/myproject/``. Provided the image_groups.txt and @@ -618,268 +780,325 @@ After it finishes (assuming you survive that long) tar -zcvf archivename /path/to/folder -*************************************** -Using Potree 3D viewer module on WebODM -*************************************** +******** +Advanced +******** -Cameras -======= -Activate this function to display camera positions. -You can also click in the camera icon to display single images in a frame on the upper right corner. A click on the image frame toggles into full screen mode. +Calibrating the Camera +====================== -Within the image frame there are links to download the image and the GeoJSON camera file. +Camera calibration is a special challenge with commodity cameras. Temperature changes, vibrations, focus, and other factors can affect the derived parameters with substantial effects on resulting data. Automatic or self calibration is possible and desirable with drone flights, but depending on the flight pattern, automatic calibration may not remove all distortion from the resulting products. James and Robson (2014) in their paper `Mitigating systematic error in topographic models derived from UAV and ground‐based image networks `_ address how to minimize the distortion from self-calibration. -.. figure:: images/cameras.png - :alt: Camera locations +.. figure:: images/msimbasi_bowling.webp + :alt: image of lens distortion effect on bowling of data :align: center -Textured model -============== +*Bowling effect on point cloud over 13,000+ image dataset collected by World Bank Tanzania over the flood prone Msimbasi Basin, Dar es Salaam, Tanzania.* -Activate this function to show load the textured model. Depending on the file size and connection speed, it may take several seconds to load. +To mitigate this effect, there are a few options but the simplest are as follows: fly two patterns separated by 20°, and rather than having a nadir (straight down pointing) camera, use one that tilts forward by 5°. -.. figure:: images/texturedmodel.png - :alt: Textured model +.. figure:: images/flightplanning.webp + :alt: animation showing optimum + :align: center + :height: 480 + :width: 640 + +As this approach takes longer than traditional imaging, pilots and teams may apply this technique to a smaller area and use the collected data to optimize future flights. OpenDroneMap can generate a calibration file called cameras.json from a small sample flight. The calibration file can be used for future flights, mitigating the bowling effect without sacrificing efficiency. + +Alternatively, the following experimental method can be applied: fly with much lower overlap, but two *crossgrid* flights (sometimes called crosshatch) separated by 20° with a 5° forward facing camera. + +* Crossgrid overlap percentages can be lower than parallel flights. To get good 3D results, you will require 68% overlap and sidelap for an equivalent 83% overlap and sidelap. +* To get good 2D and 2.5D (digital elevation model) results, you will require 42% overlap and sidelap for an equivalent 70% overlap and sidelap. + +.. figure:: images/rotation.webp + :alt: animation showing experimental optimum + :align: center + +Vertically separated flight lines also improve accuracy, but less so than a camera that is forward facing by 5°. + +.. figure:: images/forward_facing.webp + :alt: figure showing effect of vertically separated flight lines and forward facing cameras on improving self calibration :align: center -Appearance -========== +From James and Robson (2014), `CC BY 4.0 `_ +Using Image Masks +================= -Point budget ------------- -For both appearance and performance purposes, the point budget on the scene can be managed. Some old and less capable machines would benefit from a 500,000 point budget while most mid-range specs machine are capable of handling 1 to 2 million point budget. +Starting from ODM ``2.0`` people can supply image masks to inform the software to skip reconstruction over certain areas. This is useful for cases where the sky was accidentally included in the input photos from oblique shots, or simply to limit the reconstruction of a single subject. -A 5 to 7 million point budget produces a smooth point cloud 3d model, but may result in a high resource demanding process. +To add a mask, simply create a new black and white image of the same dimension as the target image you want to mask (you can use a program such as GIMP to do this). Color in black the areas to exclude from the reconstruction. -Default point budget value is set to 1,000,000. +.. figure:: https://user-images.githubusercontent.com/1951843/93247037-ade87a00-f75b-11ea-8b42-25bc1d89279d.webp + :alt: Target image + :align: center -Field of view -------------- +.. figure:: https://user-images.githubusercontent.com/1951843/93247007-a2954e80-f75b-11ea-87b3-4f04bd1737b9.webp + :alt: Image mask + :align: center -In order to control model elements to be included within the scene the field of view can be adjusted. Default value is set to 60 degrees. -.. figure:: images/FOV_animation.gif - :alt: Field of view adjustment +.. figure:: https://user-images.githubusercontent.com/1951843/93246970-8f827e80-f75b-11ea-8179-5a8fdd9f5193.webp + :alt: 3D result (building is masked) :align: center +Name your file: -Eye Dome-lighting ------------------ +``_mask.JPG`` -The Potree Point Cloud 3d viewer module can implement eye dome-lighting, a lighting model that accentuates the shapes of objects. +For example, ``DJI_0018.JPG`` can have a mask by creating a ``DJI_0018_mask.JPG`` file and include that in the list of images. You can use ``.JPG``, ``.PNG``, ``.BMP`` and ``.TIF`` formats for image masks. -Eye Dome-lighting group objects, shade their outlines and enhances depth perception in scientific visualization images. It is useful for recognition and measurement of structures within a model. It can be modified by adjusting Radius, Strength and Opacity. +Using Singularity +================= -By default, Eye Dome-Lighting is enabled on Potree 3D viewer, but it can be disabled by clicking on the enable option. +`Singularity `__ is another container platform able to run Docker images. +Singularity can be run both on local machins and in instances where the user does not have root access. +Instances where a user may not have root privlidges include HPC clusters and cloud cluster resources. +A container is a single file without anything else to install. -.. figure:: images/EDL_animation.gif - :alt: Eye dome lighting adjustment - :align: center +Build Singularity image from Docker image +----------------------------------------- +Singularity can use Docker image to build SIF image. -Background ----------- +For latest ODM Docker image (Recommended) : -Potree 3D viewer background can be modified. Available options are **Skybox** / **Gradient** / **Black** / **White** / **None** +.. code:: bash -.. figure:: images/Background_animation.gif - :alt: Background selection - :align: center + singularity build --disable-cache -f odm_latest.sif docker://opendronemap/odm:latest -Other ------ +For latest ODM GPU Docker image : -**Splat Quality** = Splat quality can be adjusted to standard or high quality, to improve the appearance of the model. +.. code:: bash + + singularity build --disable-cache -f odm_gpu.sif docker://opendronemap/odm:gpu -**Min node size** = Min node size option will impact the point density of the nodes represented. +Using Singularity SIF image +--------------------------- -**Box** = Display the boxes of the nodes. -**Lock view** = Lock the point cloud view, preventing to load or unload points to the model. +Once you have used one of the above commands to download and create the `odm_latest.sif` image, it can be ran using singularity. +Place your images in a directory named ā€œimagesā€ (for example /my/project/images) , then simply run : -Tools -===== +.. code:: bash -Measurement ------------ + singularity run --bind /my/project:/datasets/code odm_latest.sif --project-path /datasets -Potree 3D viewer module provides several tools for measurement. This tool set consist of 12 elements. -It also has controls for showing or hiding the resulting measurement labels. +Like with docker, additional `Options and Flags `_ can be added to the command : -Measurements are performed by left clicking on the desired points and for some tools right clicking is needed in order to terminate the process. +.. code:: bash -.. figure:: images/measurement.png - :alt: Tools - Measurement tools - :align: center + singularity run --bind /my/project:/datasets/code \ + --writable-tmpfs odm_latest.sif \ + --orthophoto-png --mesh-octree-depth 12 --dtm \ + --smrf-threshold 0.4 --smrf-window 24 --dsm --pc-csv --pc-las --orthophoto-kmz \ + --matcher-type flann --feature-quality ultra --max-concurrency 16 \ + --use-hybrid-bundle-adjustment --build-overviews --time --min-num-features 10000 \ + --project-path /datasets -**Angle** -This tool measures the tridimensional angle formed by the lines connecting 3 points. -To start a measurement, click on the angle icon, then left click on 3 point and the process will be automatically ended. -Further information can also be obtained from selecting this element under the scene section. +ClusterODM, NodeODM, SLURM, with Singularity on HPC +=================================================== -**Point** -This tool highlights a selected point and display its XYZ coordinate. -To start a measurement, click on the point icon, then click on the desired point and the process will be automatically ended. -Further information can also be obtained from selecting this element under the scene section. +You can write a SLURM script to schedule and set up available nodes with NodeODM for the ClusterODM to be wired to if you are on the HPC. Using SLURM will decrease the amount of time and processes needed to set up nodes for ClusterODM each time. This provides an easier way for user to use ODM on the HPC. -**Distance** +To setup HPC with SLURM, you must make sure SLURM is installed. -This tool measures the tridimensional distance of the lines connecting a series of points. -To start a measurement, click on the distance icon and start clicking on the desired points (two or more). Right click to finish measurement. -Further information such as Total length can also be obtained from selecting this element under the scene section. +SLURM script will be different from cluster to cluster, depending on which nodes in the cluster that you have. However, the main idea is we want to run NodeODM on each node once, and by default, each NodeODM will be running on port 3000. Apptainer will be taking available ports starting from port 3000, so if your node's port 3000 is open, by default NodeODM will be run on that node. After that, we want to run ClusterODM on the head node and connect the running NodeODMs to the ClusterODM. With that, we will have a functional ClusterODM running on HPC. -**Height** +Here is an example of SLURM script assigning nodes 48, 50, 51 to run NodeODM. You can freely change and use it depending on your system: -This tool measures the height or vertical distance between two points. -To start a measurement, click on the height icon and then click on the desired two points. The process will be automatically ended. -Further information can also be obtained from selecting this element under the scene section. +:: -.. figure:: images/height_animation.gif - :alt: Height measurement - :align: center + #!/usr/bin/bash + #source. bashrc + #SBATCH --partition=8core + #SBATCH --nodelist-node [48,50, 51] + #SBATCH --time 20:00:00 -**Circle** + cd SHOME + cd ODM/NodeODM/ -This tool measures the radius of a circle formed by three points. -To start a measurement, click on the circle icon and then click on the desired two points. The process will be automatically ended. -Further information such as Circumference can also be obtained from selecting this element under the scene section. + #Launch on Node 48 + srun --nodes-1 apptainer run --writable node/ & -**Azimuth** + #Launch on node 50 + srun --nodes-1 apptainer run --writable node/ & -This tool measures the azimuthal angle of a line. This line is formed by two points selected by the user, the angle is measured in degrees, clockwise from 0 to 360 and starting from the geographical north. -To start a measurement, click on the azimuth icon and then click on the desired two points. The process will be automatically ended. -Further information can also be obtained from selecting this element under the scene section. + #Launch on node 51 + srun --nodes=1 apptainer run --writable node/ & + wait -**Area** -This tool measures the horizontal area formed by a polygon. -To start a measurement, click on the area icon and start clicking on the points forming the desired polygon (three or more). Right click to finish measurement. -Further information can also be obtained from selecting this element under the scene section. +You can check for available nodes using sinfo: -**Volume (cube)** +:: -This tool measures the volume formed by a cube. -To start a measurement, click on the volume (cube) icon and click on the model to place the cube. It is possible relocate, redimension and rotate the cube using the displayed handlers. Right click to finish measurement. -Further information can also be obtained from selecting this element under the scene section. + sinfo -**Volume (sphere)** +Run the following command to schedule using the SLURM script: -This tool measures the volume formed by a sphere. -To start a measurement, click on the volume (sphere) icon and click on the model to place the sphere. It is possible relocate, redimension and rotate the sphere using the displayed handlers. Right click to finish measurement. -Further information can also be obtained from selecting this element under the scene section. +:: -**Height profile** + sbatch sample.slurm -This tool creates a height profile formed by a line on the model. -To start a measurement, click on the Height profile icon and then form a line on the model by clicking on the desired points (two or more). Right click to finish measurement. -Further information and options, such as "Show 2d Profile", can also been obtained from selecting this element under the scene section. -.. figure:: images/height_profile.png - :alt: Height profile - :align: center +You can also check for currently running jobs using squeue: -**Annotation** +:: -This tool creates an annotation label on a highlighted point on the model. -To start a measurement, click on the annotation icon and then click on the desired point. The process will be automatically ended. -To edit the annotation, select this element under the scene section, then edit Title and Description. + squeue -u $USER -**Remove measurements** -This tool removes all measurements on the model. -To remove all measurement, click on the "Remove measurements" icon. +Unfortunately, SLURM does not handle assigning jobs to the head node. Hence, if we want to run ClusterODM on the head node, we have to run it locally. After that, you can connect to the CLI and wire the NodeODMs to the ClusterODMs. Here is an example following the sample SLURM script: +:: -Clipping ---------- + telnet localhost 8080 + > NODE ADD node48 3000 + > NODE ADD node50 3000 + > NODE ADD node51 3000 + > NODE LIST -.. figure:: images/clipping.png - :alt: Tools - Clipping tools - :align: center +You should always check to make sure which ports are being used to run NodeODM if ClusterODM is not wired correctly. -Point cloud can be clipped by selecting an area. Clipping options include **None** / **Highlight** / **Inside** / **Outside** +It is also possible to pre-populate nodes using JSON. If starting ClusterODM from apptainer or docker, the relevant JSON is available at `docker/data/nodes.json`. Contents might look similar to the following: -To clip a point cloud, click on the volume clip icon, place the cube on the model and relocate, redimension and rotate to contain the desired area. -Highlight is set by default as the clipping method. If display only the points contained within the cube click on "Inside", otherwise click on "Outside". +:: -To remove the clipping volume or polygons click on the "Remove all measurements" icon. + [ + {"hostname":"node48","port":"3000","token":""}, + {"hostname":"node50","port":"3000","token":""}, + {"hostname":"node51","port":"3000","token":""} + ] -.. figure:: images/clipping_animation.gif - :alt: Tools - Clipping + +After finish hosting ClusterODM on the head node and finish wiring it to the NodeODM, you can try tunneling to see if ClusterODM works as expected. Open another shell window in your local machine and tunnel them to the HPC using the following command: + +:: + + ssh -L localhost:10000:localhost:10000 user@hostname + + +Replace user and hostname with your appropriate username and the hpc address. Basically, this command will tunnel the port of the hpc to your local port. After this, open a browser in your local machine and connect to `http://localhost:10000`. Port 10000 is where ClusterODM's administrative web interface is hosted at. This is what it looks like: + +.. figure:: https://user-images.githubusercontent.com/70782465/214938402-707bee90-ea17-4573-82f8-74096d9caf03.webp + :alt: Screenshot of ClusterODM's administrative web interface :align: center -Navigation ------------ -.. figure:: images/navigation.png - :alt: Tools - Navigation controls +Here you can check the NodeODMs status and even add or delete working nodes. + +After that, do tunneling for port 3000 of the HPC to your local machine: + +:: + +ssh -L localhost:3000:localhost:3000 user@hostname + +Port 3000 is ClusterODM's proxy. This is the place we assign tasks to ClusterODM. Once again, connect to `http://localhost:3000` with your browser after tunneling. Here, you can Assign Tasks and observe the tasks' processes. + +.. figure:: https://user-images.githubusercontent.com/70782465/214938234-113f99dc-f69e-4e78-a782-deaf94e986b0.webp + :alt: Screenshot of ClusterODM's jobs interface :align: center -Potree 3D viewer have 4 Navigation controls which define its behavior. +After adding images in this browser, you can press Start Task and see ClusterODM assigning tasks to the nodes you have wired to. Go for a walk and check the progress. -**Earth Control** +Development and testing of ODM +============================== -Earth control navigated as anchored to the ground. Mouse left button moves the model horizontally, mouse wheel controls zoom and right button orbits the model. +Development and testing of code changes can be difficult. The simplest way to do so is modify the code and rebuild docker images from source, much as documented in the `README for the ODM repository `_. -**Fly control** +However, having to do a full docker rebuild for each change is time consuming and wasteful. What might be better is to have a dedicated, long running node that allows us to test out changes in near real time. -Fly control moves the camera as in birds eye using the keyboard. Keys "W" and "S" moves forward and backwards, respectively and in the direction of the camera, while "A" and "D" moves left and right respectively. Also, the "R" and "F" keys moves the camera up and down. The mouse left button changes the direction of the camera, mouse wheel controls zoom, and right button moves the camera in the XYZ axis. +#. Fork and clone repository +#. Set up local NodeODM docker instance +#. Modify code +#. Connect to NodeODM instance +#. Install and use changes -The speed for these movements can be controlled using the sliding control. +Fork and clone repository +------------------------- -**Helicopter control** +First, let's fork the ODM repo, and checkout a new branch locally that will function as our development branch. -Helicopter control moves the camera as in an aircraft using the keyboard. Keys "W" and "S" moves forward and backwards, respectively restricted in a horizontal plane, while "A" and "D" moves left and right respectively. Also, the "R" and "F" keys moves the camera up and down. The mouse left button changes the direction of the camera, mouse wheel controls zoom, and right button moves the model in the XY axis. +:: -The speed for these movements can be controlled using the sliding control. + git checkout -b my_clever_new_change + # Switched to a new branch 'my_clever_new_change' -**Orbit Control** +Set up local NodeODM docker instance +------------------------------------ -Orbit Control is the default navigation behavior. The mouse left button orbits the model, the wheel controls zoom and the right button moves the model in the XYZ axis. +Next, we will set up a NodeODM instance with a locally mounted volume that points to our development branch of ODM -**Full extent** +:: -Full extent button restores the model view. + docker run -d --restart unless-stopped -p 3000:3000 -v /path/to/cloned/ODM/repository/data:/code opendronemap/nodeodm -**Navigation cube** +Modify code +----------- -Navigation cube displays a wireframe cube containing the model. +For our test today, we will attempt to upgrade Ceres Solver to version 2.2.0. Most external libraries like Ceres can be found in the Superbuild directory. In this case we edit SuperBuild/cmake/External-Ceres.cmake, and set it to use version 2.2.0 -**Compass** +.. figure:: images/vimdiff_ceres_change.webp -Compass button displays a compass on the upper right corner. +Now that we've made that small, but substantive change, we need to rebuild Ceres on the docker image for testing. -**Camera animation** -The camera animation button creates a camera animation path. Position of the camera is defined by the points on the green line while the points in the blue line are the location towards the camera is intended to be facing. +Connect to NodeODM instance +--------------------------- -To create an animation, adjust the points for the camera locations and camera direction, then select the camera element under the Scene section to create more point, change animation speed or play the animation. +Let us find out our container name, in case we forgot: -.. figure:: images/camera_animation.gif - :alt: Tools - Navigation controls - :align: center +:: + docker ps + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + c997a4c5611b opendronemap/nodeodm "/usr/bin/node /var/…" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp affectionate_yalow -Scene -===== +Now that we know the container name, we will connect to that instance using docker exec as follows: -The Scene section displays a file tree containing all the scene elements. -Elements are arranged in six groups, which are **Point clouds** / **Measurements** / **Annotations** -/ **Other** / **Vector** / **Images** +:: -Each element under these groups can be selected to get further information or to control its properties. + docker exec -it affectionate_yalow bash -For instance, point clouds properties can be modified to show elevation and also the color ramp cam be customized. +Install and use changes +----------------------- -.. figure:: images/pointcloud_elevation.png - :alt: Tools - Navigation controls - :align: center +Let us get the environment prepared for our testing: + +:: + + root@c997a4c5611b:/var/www# cd /code + ./configure.sh install + mkdir /code/SuperBuild/build + cd /code/SuperBuild/build + + +Next we can rebuild Ceres. + +:: + + cmake ../. + make -j$(nproc) ceres + ... + -- Up-to-date: /code/SuperBuild/install/include/ceres + -- Up-to-date: /code/SuperBuild/install/include/ceres/internal + -- Installing: /code/SuperBuild/install/include/ceres/internal/config.h + -- Installing: /code/SuperBuild/install/include/ceres/internal/export.h + -- Installing: /code/SuperBuild/install/include/ceres/internal/miniglog/glog/logging.h + -- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresTargets.cmake + -- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresTargets-release.cmake + -- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresConfig.cmake + -- Installing: /code/SuperBuild/install/lib/cmake/Ceres/CeresConfigVersion.cmake + [100%] Completed 'ceres' + [100%] Built target ceres + +Success! Now we can either run ODM directly inside this container, use the NodeODM interface to process data, or connect in with WebODM for additional testing. `Learn to edit `_ and help improve `this page `_!