From fd3508295fa79f0332dc0a91308eb3f7f6eb0a4a Mon Sep 17 00:00:00 2001 From: thadwald Date: Mon, 22 Dec 2025 17:06:00 -0600 Subject: [PATCH 1/2] fix(photo): handle special case for Mavic 3E backward-facing images --- opendm/photo.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/opendm/photo.py b/opendm/photo.py index eaa3433cb..564e07a27 100644 --- a/opendm/photo.py +++ b/opendm/photo.py @@ -471,6 +471,15 @@ def parse_exif_values(self, _path_file): # Roll: 0 (assuming gimbal) if self.has_ypr(): if self.camera_make.lower() in ['dji', 'hasselblad']: + + # Mavic 3E smart oblique backward-facing images need special treatment + # backward-facing images are identified with a 180ยบ roll + if abs(self.roll) > 90: + # Camera faces opposite direction + self.yaw = (self.yaw + 180) % 360 + # Pitch axis is inverted in flipped frame + self.pitch = -self.pitch + self.pitch = 90 + self.pitch if self.camera_make.lower() == 'sensefly': From d45619e2f26654cfaedfe744728aace596004bc4 Mon Sep 17 00:00:00 2001 From: thadwald Date: Mon, 22 Dec 2025 17:41:10 -0600 Subject: [PATCH 2/2] fix(osfm): add 'split_image_groups' to remove_always list in get_submodel_argv. fix copy-to copy_to typo --- opendm/osfm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendm/osfm.py b/opendm/osfm.py index 5db25706d..543cb2f45 100644 --- a/opendm/osfm.py +++ b/opendm/osfm.py @@ -657,7 +657,7 @@ def get_submodel_argv(args, submodels_path = None, submodel_name = None): reading the contents of --boundary """ assure_always = ['orthophoto_cutline', 'dem_euclidean_map', 'skip_3dmodel', 'skip_report'] - remove_always = ['split', 'split_overlap', 'rerun_from', 'rerun', 'gcp', 'end_with', 'sm_cluster', 'rerun_all', 'pc_csv', 'pc_las', 'pc_ept', 'tiles', 'copy-to', 'cog'] + remove_always = ['split', 'split_overlap', 'split_image_groups', 'rerun_from', 'rerun', 'gcp', 'end_with', 'sm_cluster', 'rerun_all', 'pc_csv', 'pc_las', 'pc_ept', 'tiles', 'copy_to', 'cog'] read_json_always = ['cameras', 'boundary'] argv = sys.argv