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
null, // "GPU-SHIFTED-D"+clt_parameters.disparity, // String suffix,
imp_terrain_disp); // imp_scenes); // ImagePlus imp)
// 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(
clt_parameters, // CLTParameters clt_parameters,
terrain_disparity, // double [] terrain_disparity,
quadCLTs, // QuadCLT [] quadCLTs,
master_CLT, // QuadCLT ref_scene,
debugLevel); // int debugLevel
ImagePlus imp_nadir = renderNadirSequence(
clt_parameters, // CLTParameters clt_parameters,
nadir_pXpYD, // double [][][] nadir_pXpYD,
quadCLTs, // QuadCLT [] quadCLTs,
master_CLT, // QuadCLT ref_scene,
debugLevel); // int debugLevel
if (imp_nadir != null) {
master_CLT.saveImagePlusInModelDirectory(
null, // String suffix,
imp_nadir); // ImagePlus imp
if (nadir_pXpYD != null) {
if (clt_parameters.imp.nadir_gen) {
ImagePlus imp_nadir = renderNadirSequence(
clt_parameters, // CLTParameters clt_parameters,
nadir_pXpYD, // double [][][] nadir_pXpYD,
quadCLTs, // QuadCLT [] quadCLTs,
master_CLT, // QuadCLT ref_scene,
false, // boolean undistort,
debugLevel); // int debugLevel
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
double [][][] nadir_pXpYD,
QuadCLT [] quadCLTs,
QuadCLT ref_scene,
boolean undistort,
int debugLevel) {
QuadCLT[] selected_scenes = selectScenes(quadCLTs, ref_scene);
if (selected_scenes.length == 0) return null;
ErsCorrection ers_reference = ref_scene.getErsCorrection();
boolean merge_all = true; // always produce single-channel merged output
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;
for (int nscene = 0; nscene < selected_scenes.length; nscene++) {
if (nadir_pXpYD[nscene] == null) continue;
......@@ -10951,9 +10972,17 @@ java.lang.NullPointerException
scene_ers_xyz_dt, // double [] ers_xyz_dt
scene_ers_atr_dt);// double [] ers_atr_dt
}
// Optionally undistort pX,pY so rendered images are rectilinear (COLMAP PINHOLE-compatible)
if (clt_parameters.imp.nadir_undistort) {
undistortPxPy(nadir_pXpYD[nscene], selected_scenes[nscene].getErsCorrection());
// Select tile array: use a shallow-cloned copy when undistorting so the
// original nadir_pXpYD is preserved for a potential second (non-undistorted) pass.
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
ImagePlus imp_scene = QuadCLT.renderGPUFromDSI(
......@@ -10962,7 +10991,7 @@ java.lang.NullPointerException
null, // final Rectangle full_woi_in
clt_parameters, // CLTParameters clt_parameters
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_atr (own frame)
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