From a203653b989212879cf9c7ce24a32355caef8a2d Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Fri, 15 Feb 2019 12:15:01 -0500 Subject: [PATCH] Fixed DEMs orthophoto misalignment bug --- modules/odm_georef/src/Georef.cpp | 14 ++++---------- scripts/odm_georeferencing.py | 8 ++++++-- scripts/odm_orthophoto.py | 3 ++- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/modules/odm_georef/src/Georef.cpp b/modules/odm_georef/src/Georef.cpp index 27ebc91a..8e0ddbea 100644 --- a/modules/odm_georef/src/Georef.cpp +++ b/modules/odm_georef/src/Georef.cpp @@ -1330,8 +1330,8 @@ void Georef::performFinalTransform(Mat4 &transMat, pcl::TextureMesh &mesh, pcl:: double transX = static_cast(transMat.r1c4_); double transY = static_cast(transMat.r2c4_); - transform(0, 3) = static_cast(0.0f); - transform(1, 3) = static_cast(0.0f); + transform(0, 3) = transX; + transform(1, 3) = transY; transform(2, 3) = static_cast(transMat.r3c4_); transform(3, 3) = static_cast(transMat.r4c4_); @@ -1367,20 +1367,14 @@ void Georef::performFinalTransform(Mat4 &transMat, pcl::TextureMesh &mesh, pcl:: log_ << "Successfully saved model.\n"; } - transform(0, 3) = transX; - transform(1, 3) = transY; - // GCPs and EXIF modes includes a translation // but not UTM offsets. We want our point cloud // and odm_georeferencing_model_geo.txt file // to include the UTM offset. // OpenSfM already has UTM offsets if (addUTM){ - georefSystem_.eastingOffset_ += transX; - georefSystem_.northingOffset_ += transY; - - transform(0, 3) = georefSystem_.eastingOffset_; - transform(1, 3) = georefSystem_.northingOffset_; + transform(0, 3) = georefSystem_.eastingOffset_ + transX; + transform(1, 3) = georefSystem_.northingOffset_ + transY; } printFinalTransform(transform); diff --git a/scripts/odm_georeferencing.py b/scripts/odm_georeferencing.py index ed60c416..e36d0c40 100644 --- a/scripts/odm_georeferencing.py +++ b/scripts/odm_georeferencing.py @@ -60,11 +60,15 @@ class ODMGeoreferencingCell(ecto.Cell): runs = [] if not args.use_3dmesh: - runs += [{ + # Make sure 2.5D mesh is georeferenced before the 3D mesh + # Because it will be used to calculate a transform + # for the point cloud. If we use the 3D model transform, + # DEMs and orthophoto might not align! + runs.insert(0, { 'georeferencing_dir': tree.odm_25dgeoreferencing, 'texturing_dir': tree.odm_25dtexturing, 'model': os.path.join(tree.odm_25dtexturing, tree.odm_textured_model_obj) - }] + }) for r in runs: odm_georeferencing_model_obj_geo = os.path.join(r['texturing_dir'], tree.odm_georeferencing_model_obj_geo) diff --git a/scripts/odm_orthophoto.py b/scripts/odm_orthophoto.py index 2b4b76e1..564dbd64 100644 --- a/scripts/odm_orthophoto.py +++ b/scripts/odm_orthophoto.py @@ -69,7 +69,8 @@ class ODMOrthoPhotoCell(ecto.Cell): # TODO: we should move this to a more central # location (perhaps during the dataset initialization) if georef and not georef.utm_east_offset: - odm_georeferencing_model_txt_geo_file = os.path.join(tree.odm_georeferencing, tree.odm_georeferencing_model_txt_geo) + georeferencing_dir = tree.odm_georeferencing if args.use_3dmesh and not args.skip_3dmodel else tree.odm_25dgeoreferencing + odm_georeferencing_model_txt_geo_file = os.path.join(georeferencing_dir, tree.odm_georeferencing_model_txt_geo) if io.file_exists(odm_georeferencing_model_txt_geo_file): georef.extract_offsets(odm_georeferencing_model_txt_geo_file)