Commit 00c33f1a authored by Andrey Filippov's avatar Andrey Filippov

CLAUDE: Dual-pass nadir rendering (original + rectilinear)

Update calling code in OpticalFlow.java to compute nadir_pXpYD once and
render two passes when either nadir_gen or nadir_undistort is enabled:
- nadir_gen=true  → renderNadirSequence(..., false) → *-NADIR-MERGED
- nadir_undistort=true → renderNadirSequence(..., true)  → *-NADIR-MERGED-RECTILINEAR

The nadir_pXpYD array is deep-copied per scene for the undistort pass so
the original sensor-coordinate data is preserved for the non-undistorted pass.
Co-authored-by: 's avatarClaude <claude@elphel.com>
parent 09d21774
...@@ -8049,23 +8049,42 @@ java.lang.NullPointerException ...@@ -8049,23 +8049,42 @@ java.lang.NullPointerException
null, // "GPU-SHIFTED-D"+clt_parameters.disparity, // String suffix, null, // "GPU-SHIFTED-D"+clt_parameters.disparity, // String suffix,
imp_terrain_disp); // imp_scenes); // ImagePlus imp) imp_terrain_disp); // imp_scenes); // ImagePlus imp)
// Nadir per-scene rendering for OpenMVS/COLMAP input // Nadir per-scene rendering for OpenMVS/COLMAP input
if (clt_parameters.imp.nadir_gen) { if (clt_parameters.imp.nadir_gen || clt_parameters.imp.nadir_undistort) {
double [][][] nadir_pXpYD = getNadirDisparityMaps( double [][][] nadir_pXpYD = getNadirDisparityMaps(
clt_parameters, // CLTParameters clt_parameters, clt_parameters, // CLTParameters clt_parameters,
terrain_disparity, // double [] terrain_disparity, terrain_disparity, // double [] terrain_disparity,
quadCLTs, // QuadCLT [] quadCLTs, quadCLTs, // QuadCLT [] quadCLTs,
master_CLT, // QuadCLT ref_scene, master_CLT, // QuadCLT ref_scene,
debugLevel); // int debugLevel debugLevel); // int debugLevel
ImagePlus imp_nadir = renderNadirSequence( if (nadir_pXpYD != null) {
clt_parameters, // CLTParameters clt_parameters, if (clt_parameters.imp.nadir_gen) {
nadir_pXpYD, // double [][][] nadir_pXpYD, ImagePlus imp_nadir = renderNadirSequence(
quadCLTs, // QuadCLT [] quadCLTs, clt_parameters, // CLTParameters clt_parameters,
master_CLT, // QuadCLT ref_scene, nadir_pXpYD, // double [][][] nadir_pXpYD,
debugLevel); // int debugLevel quadCLTs, // QuadCLT [] quadCLTs,
if (imp_nadir != null) { master_CLT, // QuadCLT ref_scene,
master_CLT.saveImagePlusInModelDirectory( false, // boolean undistort,
null, // String suffix, debugLevel); // int debugLevel
imp_nadir); // ImagePlus imp if (imp_nadir != null) {
master_CLT.saveImagePlusInModelDirectory(
null, // String suffix,
imp_nadir); // ImagePlus imp
}
}
if (clt_parameters.imp.nadir_undistort) {
ImagePlus imp_nadir_rect = renderNadirSequence(
clt_parameters, // CLTParameters clt_parameters,
nadir_pXpYD, // double [][][] nadir_pXpYD,
quadCLTs, // QuadCLT [] quadCLTs,
master_CLT, // QuadCLT ref_scene,
true, // boolean undistort,
debugLevel); // int debugLevel
if (imp_nadir_rect != null) {
master_CLT.saveImagePlusInModelDirectory(
null, // String suffix,
imp_nadir_rect); // ImagePlus imp
}
}
} }
} }
} }
...@@ -10932,13 +10951,15 @@ java.lang.NullPointerException ...@@ -10932,13 +10951,15 @@ java.lang.NullPointerException
double [][][] nadir_pXpYD, double [][][] nadir_pXpYD,
QuadCLT [] quadCLTs, QuadCLT [] quadCLTs,
QuadCLT ref_scene, QuadCLT ref_scene,
boolean undistort,
int debugLevel) { int debugLevel) {
QuadCLT[] selected_scenes = selectScenes(quadCLTs, ref_scene); QuadCLT[] selected_scenes = selectScenes(quadCLTs, ref_scene);
if (selected_scenes.length == 0) return null; if (selected_scenes.length == 0) return null;
ErsCorrection ers_reference = ref_scene.getErsCorrection(); ErsCorrection ers_reference = ref_scene.getErsCorrection();
boolean merge_all = true; // always produce single-channel merged output boolean merge_all = true; // always produce single-channel merged output
boolean toRGB = false; boolean toRGB = false;
String suffix = ref_scene.getImageName() + "-NADIR-MERGED"; String suffix = ref_scene.getImageName()
+ (undistort ? "-NADIR-MERGED-RECTILINEAR" : "-NADIR-MERGED");
ImageStack stack_scenes = null; ImageStack stack_scenes = null;
for (int nscene = 0; nscene < selected_scenes.length; nscene++) { for (int nscene = 0; nscene < selected_scenes.length; nscene++) {
if (nadir_pXpYD[nscene] == null) continue; if (nadir_pXpYD[nscene] == null) continue;
...@@ -10951,9 +10972,17 @@ java.lang.NullPointerException ...@@ -10951,9 +10972,17 @@ java.lang.NullPointerException
scene_ers_xyz_dt, // double [] ers_xyz_dt scene_ers_xyz_dt, // double [] ers_xyz_dt
scene_ers_atr_dt);// double [] ers_atr_dt scene_ers_atr_dt);// double [] ers_atr_dt
} }
// Optionally undistort pX,pY so rendered images are rectilinear (COLMAP PINHOLE-compatible) // Select tile array: use a shallow-cloned copy when undistorting so the
if (clt_parameters.imp.nadir_undistort) { // original nadir_pXpYD is preserved for a potential second (non-undistorted) pass.
undistortPxPy(nadir_pXpYD[nscene], selected_scenes[nscene].getErsCorrection()); double[][] pXpYD_scene;
if (undistort) {
pXpYD_scene = nadir_pXpYD[nscene].clone(); // shallow: tile refs copied
for (int t = 0; t < pXpYD_scene.length; t++) {
if (pXpYD_scene[t] != null) pXpYD_scene[t] = pXpYD_scene[t].clone();
}
undistortPxPy(pXpYD_scene, selected_scenes[nscene].getErsCorrection());
} else {
pXpYD_scene = nadir_pXpYD[nscene];
} }
// Render from scene's own position: ZERO3 offset, scene is its own reference // Render from scene's own position: ZERO3 offset, scene is its own reference
ImagePlus imp_scene = QuadCLT.renderGPUFromDSI( ImagePlus imp_scene = QuadCLT.renderGPUFromDSI(
...@@ -10962,7 +10991,7 @@ java.lang.NullPointerException ...@@ -10962,7 +10991,7 @@ java.lang.NullPointerException
null, // final Rectangle full_woi_in null, // final Rectangle full_woi_in
clt_parameters, // CLTParameters clt_parameters clt_parameters, // CLTParameters clt_parameters
null, // double [] disparity_ref (use pXpYD) null, // double [] disparity_ref (use pXpYD)
nadir_pXpYD[nscene], // double [][] ref_pXpYD pXpYD_scene, // double [][] ref_pXpYD
ZERO3, // final double [] scene_xyz (own frame) ZERO3, // final double [] scene_xyz (own frame)
ZERO3, // final double [] scene_atr (own frame) ZERO3, // final double [] scene_atr (own frame)
selected_scenes[nscene], // final QuadCLT scene selected_scenes[nscene], // final QuadCLT scene
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment