1. 27 May, 2026 1 commit
    • Andrey Filippov's avatar
      CLAUDE: Add nadir_um_en/sigma/weight parameters for SIFT-tuned UM on nadir renders · 11c8998d
      Andrey Filippov authored
      Add three dedicated unsharp-mask parameters to IntersceneMatchParameters:
        nadir_um_en     (boolean, default false) - enable UM on nadir images
        nadir_um_sigma  (double,  default 2.0)   - Gaussian sigma in pixels
        nadir_um_weight (double,  default 1.0)   - blend weight (1.0 = 100%)
      
      These are separate from the existing um_sigma/weight and terr_um_* / cuas_rng_um_*
      parameters so they can be independently tuned for SIFT feature extraction.
      LWIR nadir images with UM sigma=2 go from ~500 to ~5000 SIFT keypoints/frame.
      
      Updated all 6 required locations: field declarations, dialog, dialog-read,
      save, load, and clone.
      
      Applied the filter in renderNadirSequence() using the existing applyUM()
      helper, matching the renderSceneSequence() pattern.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      11c8998d
  2. 26 May, 2026 7 commits
    • Andrey Filippov's avatar
      CLAUDE: Add transposeJagged() utility to ShowDoubleFloatArrays; refactor getNadirDisparityMaps() · 2e1c69b0
      Andrey Filippov authored
      Add ShowDoubleFloatArrays.transposeJagged(double[][][], int n_comp, int n_inner)
      which converts the common [outer][inner][comp] layout (with null outer or inner
      entries) to [outer][comp][inner] substituting NaN for nulls.  This pattern
      appeared inline in getNadirDisparityMaps() and recurs in other tile-processing
      code.
      
      Refactor getNadirDisparityMaps() to replace the 12-line inline transpose loop
      with a single call to the new utility, keeping the same semantics.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      2e1c69b0
    • Andrey Filippov's avatar
      CLAUDE: Save NADIR-DISPARITY-MAPS hyperstack from getNadirDisparityMaps() · 72a8b1df
      Andrey Filippov authored
      After computing per-scene pXpYD arrays, saves a tile-resolution
      hyperstack <ts>-NADIR-DISPARITY-MAPS.tiff with:
        - frames = scenes (labelled by timestamp)
        - slices = pX, pY, D (3 channels)
        - NaN where scene has no pose or tile has no data
      
      Useful for verifying disparity transform coverage before feeding
      the rendered images into OpenMVS/COLMAP.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      72a8b1df
    • Andrey Filippov's avatar
      CLAUDE: Add getNadirDisparityMaps() and renderNadirSequence() for OpenMVS · f455f79f
      Andrey Filippov authored
      New methods in OpticalFlow.java:
      - getNadirDisparityMaps(): transforms SfM terrain disparity from the
        segment reference into each scene's own camera frame using
        Cuas.transformFromVirtual(). Returns double[][][nscene][ntiles][3].
      - renderNadirSequence(): renders each scene from its own position
        (scene_xyz/atr=ZERO3, ref_scene=scene itself) using per-scene
        pXpYD from getNadirDisparityMaps(). ERS rolling-shutter velocity
        corrections are still applied. Output: <ts>-NADIR-MERGED.tiff.
      
      Unlike renderSceneSequence() (TERRAIN-DISP), which warps all frames
      to the reference for zero ground parallax, renderNadirSequence() produces
      natural-parallax perspective images from each scene's own viewpoint —
      the correct input format for OpenMVS/COLMAP dense reconstruction.
      
      New parameter in IntersceneMatchParameters:
      - nadir_gen (boolean, default false): checkbox under 'Flat ground' tab,
        before fgnd_gen_optho. Enables nadir rendering in the existing
        TERRAIN-DISP pipeline block.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      f455f79f
    • Andrey Filippov's avatar
      several typos · 5477b6bc
      Andrey Filippov authored
      5477b6bc
    • Andrey Filippov's avatar
      CLAUDE: Update eclipse_project_setup/.project — add attic filter · 9812ffc0
      Andrey Filippov authored
      Adds filteredResources to the seed template:
      - regex filter for node_modules/.git/Java LS artifacts (existing on .137)
      - multiFilter to hide attic/ from Eclipse project explorer and build
      
      Copy this to .project on a new machine setup.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      9812ffc0
    • Andrey Filippov's avatar
      CLAUDE: Add lwir_map scripts (renamed from fopen_nc_summary/fopen_overlay) · f0e7dc49
      Andrey Filippov authored
      - scripts/lwir_map/lwir_scene_summary.py  (was fopen_nc_summary.py)
      - scripts/lwir_map/lwir_map_overlay.py    (was fopen_overlay.py)
      - scripts/lwir_map/README.md              (pipeline doc + known limitations)
      - Updated catalog.json and scripts/README.md with new names/paths
      
      Scripts read imagej-elphel linked LWIR output and generate per-scene
      TSV + GeoJSON/KML/SVG map overlays for satellite atlas navigation.
      Not FOPEN-specific; usable for any airplane/drone LWIR acquisition.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      f0e7dc49
    • Andrey Filippov's avatar
      CLAUDE: Add OpenMVS 3D reconstruction section to project-details.md · 1579c9b3
      Andrey Filippov authored
      Documents TERRAIN-DISP-MERGED TIFF format, INTERFRAME.corr-xml pose
      convention, Elphel→COLMAP coordinate conversion, disparity-to-depth
      formula, and the foliage CLI pipeline (no C++ library linking).
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      1579c9b3
  3. 25 May, 2026 4 commits
  4. 24 May, 2026 3 commits
  5. 23 May, 2026 1 commit
  6. 21 May, 2026 2 commits
  7. 19 May, 2026 1 commit
  8. 17 May, 2026 1 commit
  9. 14 May, 2026 3 commits
  10. 12 May, 2026 2 commits
  11. 11 May, 2026 1 commit
  12. 09 May, 2026 4 commits
  13. 08 May, 2026 3 commits
    • Andrey Filippov's avatar
      Claude: Demote INDX_VX/VY/STRENGTH/FRAC to method-local constants · 0868da8a
      Andrey Filippov authored
      These four constants described the layout of TDCorrTile.getMismatchVector()
      return values and had no business being class-level statics in CuasMotion.
      Moved to local scope in the two methods that use them: getTargetsFromCorr2d
      and refineMotionVectors.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      0868da8a
    • Andrey Filippov's avatar
      Claude: Remove dead code from cuas package + fix targetsAnalyzeMCP · 115acc78
      Andrey Filippov authored
      Dead method/constant removal (21 methods across 5 files):
      - CuasMotion: addMotionVectors, clearFailByStrongerNeighbor, cloneTargetsSequence,
        filterByHorizon, filterMotionScans, findMatchingTarget, getKeyFrameVelocityScale,
        getTargetImages, getTargetsFromHyperAugment_2025, getVectorFieldHyper, showPxPyDs,
        subtractTargetSequence, trimSuffix; constants INDX_SPEED, INDX_CONFIDENCE, VF_TOP_TITLES
      - CorrectionFPN: calculateFPN_old
      - CuasCenterLma: getAverageRoll
      - CuasMotionLMA: applyWindowToData, copyMotion, getRR0, getFullParametersVector
      - CuasTile: setParentIndex, getParentIndex (were already commented out)
      
      targetsAnalyzeMCP fixes:
      - Correct PAR constants (add PAR_PXYAR=-2, shift others)
      - params array now accepts strings ("pxy","pxyar","vpxy","upxy", or LMA_TITLES names)
        in addition to integer indices; default remains ["pxy"]
      - Add missing PAR_PXYAR case (px, py, a, rmse, r)
      - Add amplitude to PAR_PXY case
      - Default case uses LMA_TITLES[npar] key instead of String.valueOf(npar)
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      115acc78
    • Andrey Filippov's avatar
      debugging · 5defee61
      Andrey Filippov authored
      5defee61
  14. 07 May, 2026 7 commits
    • Andrey Filippov's avatar
      Claude: Add temporal LPF to shiftAndRenderAccumulate and refineMotionVectors inputs · aac34c6a
      Andrey Filippov authored
      - Extract precorr_ra, accum_ra, cuas_gaussian_ra in locateAndFreezeTargetsMulti
      - Compute fpixels_accum (LPF with cuas_accum_ra) for shiftAndRenderAccumulate in both loops
      - Compute fpixels_refine (LPF with cuas_precorr_ra) for refineMotionVectors
      - Both use Gaussian or running-average depending on cuas_gaussian_ra flag
      - When ra==1, LPF is a no-op (passes fpixels_tum through unchanged)
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      aac34c6a
    • Andrey Filippov's avatar
      Claude: Fix NPE in refineMotionVectors debug CORR2D visualization · 7f0ce136
      Andrey Filippov authored
      corr_partial_dbg() NPEs on null layers when sequences are skipped
      (has_centered=false or no valid frame pairs). Fill null slots with
      empty double[num_tiles][] before calling the visualizer.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      7f0ce136
    • Andrey Filippov's avatar
      Claude: FAIL_PENDING refactoring — migrate first loop from motion_sequence to target_sequence_multi · 1dfb402e
      Andrey Filippov authored
      - Add FAIL_PENDING=-1 sentinel constant to CuasMotionLMA
      - Add initFromMotionSequence(): clones motion entries into target_sequence_multi as sentinels
        (RSLT_FAIL=FAIL_PENDING, RSLT_CENTERED=CENTERED_NO, RSLT_QSCORE=initial RSLT_MSCORE)
      - Add syncMotionScoreToSentinels(): keeps sentinel QSCORE current after each getEffectiveStrengthMV
      - Decouple use_motion/select_new flags in filter5Targets from motion_sequence==null
      - Add motion==null paths in filter5Targets: prohibit setup and is-max ranking for FAIL_PENDING sentinels
      - Extend filter5Targets marking step to cover FAIL_PENDING sentinels (use_motion=true, motion==null)
      - Update extendMotionScan center-detection to accept FAIL_PENDING as valid center state
      - First loop in locateAndFreezeTargetsMulti: call initFromMotionSequence, syncMotionScoreToSentinels;
        pass null to filter5Targets; use applyFilter(target_sequence_multi); use getRemain(target_sequence_multi)
      - getRemain(target_sequence_multi): count FAIL_PENDING+CENTERED_NO in num_noncentered
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      1dfb402e
    • Andrey Filippov's avatar
      Claude: Fix filter5Targets select_new silently forced to false when motion_sequence=null · 70e96522
      Andrey Filippov authored
      Line 8734 was: select_new = (motion_sequence != null) ? select_new_in : false
      This caused pass 2 (filter5(null, tsm, false, true, ...)) to enter the
      !select_new path — finding best existing good tiles instead of untested
      non-centered tiles — so nothing was ever selected and the centered-mode
      loop was a no-op.
      
      Fix: decouple select_new from motion_sequence null-check; only use_motion
      is forced false when motion_sequence is null.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      70e96522
    • Andrey Filippov's avatar
      Tested code that Claude fixed, minor additional fix. Still not fully · c9316c55
      Andrey Filippov authored
      operational because of filter5Targets().
      c9316c55
    • Andrey Filippov's avatar
      Claude: Fix correlatePairs to use per-tile motion-tracking TpTask centers · 4b7711ef
      Andrey Filippov authored
      Add targets_mv / frame_center_mv / corr_offset_mv overloads to
      correlatePairs() and correlatePair().  When targets_mv is non-null,
      GpuQuad.setRectilinearMovingTasks() generates per-tile TpTask centers
      that follow the target at each frame (cx0 + vx*offset_scale), so the
      GPU correlates tiles centered on the moving object and the result is the
      residual velocity rather than the full VX displacement.
      
      Callers that don't need this pass through the old uniform-grid overload
      unchanged.  Also reverts the wrong "fixed-destination / shifted-read"
      masking edit from the previous session; the masking was already correct
      (mask tracks the target per frame) before that edit.
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      4b7711ef
    • Andrey Filippov's avatar
      Claude: refineMotionVectors() — improved debug images · a57f2dfc
      Andrey Filippov authored
      - Masked frames: replace single-frame display with full fmin..fmax stack
        (scene_titles used as slice labels; scroll to watch target stay in place)
      - Source frame display removed (not needed alongside masked stack)
      - Single-tile corr2d block removed; replaced by full CORR2D multi-slice image
        after the nseq loop — one slice per keyframe, same tiled layout as *CORR2D.tiff,
        slice-labeled from scene_titles, uses corr_border_contrast from CLTParameters
      Co-Authored-By: 's avatarClaude Sonnet 4.6 <noreply@anthropic.com>
      a57f2dfc