- 09 Jun, 2026 6 commits
-
-
Andrey Filippov authored
Replace fixed ±1 pixel/velocity loops and indx_center_3d3/indx_margins_3d3 with configurable vel_suppr_rad loops and indx_center_vsupp/indx_margins_vsupp. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
-
Andrey Filippov authored
Suppress a point only when both conditions hold simultaneously: thresh = Math.max(athresh, M * rthresh) (M - val) >= thresh → zero the point athresh enforces a minimum absolute gap; M*rthresh enforces a minimum relative gap. Math.max means BOTH must be satisfied (either alone is insufficient). Replaces the previous M>=athresh && val<rthresh*M logic. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
CuasRTUtils: new filterConv5dROI(data, roi, athresh, rthresh) For each (pixel, velocity) point, finds max M over the ±1 neighbourhood in both pixel space (3×3) and velocity space (3×3 in vx/vy). Zeroes the point if M >= athresh AND val < rthresh*M (sidelobe suppression). Passes through unchanged when M < athresh (weak-signal linear regime). Uses indx_center_3d3 / indx_margins_3d3 for bit-reversed multithreaded pixel iteration; returns a new filtered array. CuasDetectRT: apply filterConv5dROI() to dpixels_5d_roi_pyramid[level][n5d] after convolve3d(), controlled by curt_vel_thresh_en / curt_vel_athresh / curt_vel_rthresh, at level-0 and all pyramid levels. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
-
Andrey Filippov authored
CuasRTUtils: new showConvKernel5dHyperRect(data, roi, scene_titles, title) - ImageJ hyperstack [num_vout][num_scenes][roi_w*sub_dim × roi_h*sub_dim] - Bottom slider (T): 121 velocities labelled "+vy:+vx" - Second slider (Z): scenes - Sub-pixels spatially embedded (no NaN separator grid) CuasDetectRT: add HYPER-RECT save immediately after each RECT save block (level-0 and pyramid loop), suffix "-HYPER-RECT" / "-LEV{n}-HYPER-RECT" Co-authored-by:Claude <claude@elphel.com>
-
- 07 Jun, 2026 5 commits
-
-
Andrey Filippov authored
- CuasRTUtils: add convolve3d(data, Rectangle roi, result_in) that allocates only [roi.width*roi.height][nsub][nvel] instead of full [width*height][nsub][nvel], skips non-ROI pixels in center/margin loops, uses roi-relative indexing. Also fix showConvKernel5d(data, roi, ...) pixel_idx to use ROI-relative (py_roi*roi.width+px_roi) instead of full-image indexing. - CuasDetectRT: add dpixels_5d_roi_pyramid alongside dpixels_5d_pyramid. Level-0 and pyramid loop 5D blocks now call convolve3d(window, null) only when curt_save_c5full, and convolve3d(window, curt_save_select, null) only when curt_save_c5rect. RECT save blocks now read from dpixels_5d_roi_pyramid. Eliminates the OutOfMemoryError when curt_save_c5full=false. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
New CuasRTUtils.showConvKernel5d(data, roi, titles, title): renders the vout_dim×vout_dim velocity map for each ROI pixel as a tiled flat image, with a 1-px NaN separator grid between pixel blocks (visible in ImageJ). Sub-pixels (pixel_decimate>1) tile within each block. CuasDetectRT: add curt_save_c5rect save calls at level-0 and each pyramid level (title suffix "-RECT", "-LEVn-RECT"). curt_save_c5full path unchanged. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
-
Andrey Filippov authored
Add convolve3d() (kernel5d) at level-0 before the temporal pyramid loop and at each pyramid level nlev+1 inside the loop, mirroring the existing 3D3 coarse-velocity pattern. Output saved as CONV5D hyperstack when debugLevel > -4. Add getNumHist() getter to CuasRTUtils. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
distributing for the power of coarse velocities
-
- 05 Jun, 2026 1 commit
-
-
Andrey Filippov authored
-
- 03 Jun, 2026 1 commit
-
-
Andrey Filippov authored
-
- 31 May, 2026 1 commit
-
-
Andrey Filippov authored
-
- 30 May, 2026 2 commits
-
-
Andrey Filippov authored
getInterseqScale() was calling getCorrIncExact() which returns 0.5*corr_offset for half_step mode instead of the actual integer keyframe step getCorrInc() (= corr_offset/2 with integer division). For odd corr_offset (e.g. 5) with half_step=true these differ: getCorrIncExact()=2.5 vs getCorrInc()=2. This caused getHalfBeforeAfterPixXY() to compute: after - before = RSLT_VX * 0.5 (wrong; observed by user) instead of: after - before = RSLT_VX * corr_inc/corr_offset = RSLT_VX * 0.4 (correct) recalcOmegas() uses the same interseq_scale in the inverse direction, so it also reconstructed RSLT_VX/VY incorrectly from neighbouring keyframe positions. Fix: use getCorrInc() (integer) in getInterseqScale() so that BX/AX positions correspond to actual raw-frame midpoints and the velocity round-trip is exact. Also adds an unambiguous convention comment near RSLT_VX/RSLT_VY in CuasMotionLMA.java documenting all required scale conversions. The omega calculation (getFrameVelocityScale * ifov * fps_raw) is independent of corr_inc and was already correct. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
coordinates relation
-
- 27 May, 2026 6 commits
-
-
Andrey Filippov authored
- parse_images_txt: store full R_cw (world→camera rotation) per frame - new compute_orientation_data(): per-frame COLMAP and ERS orientation in Sim(3)-aligned GPS frame; delta-rotation angle (convention-independent); cumulative rotation integrated from frame 0 - new print_orientation_report(): per-frame RMSE + cumulative totals - ers_to_R(): guessed convention Rz(az)*Rx(tilt)*Ry(roll) — to be verified - CSV: adds colmap_yaw/pitch/roll, delta_colmap/ers/diff, cum_colmap/ers/diff Key finding for water-tower straight-flight (378 frames): COLMAP cumulative rotation = 120.81° (photogrammetric noise ~0.25°/frame) ERS cumulative rotation = 14.10° (physically correct: 1.9° heading + vibration) → COLMAP orientation is dominated by pose-estimation noise for pure-nadir SfM → orientation comparison meaningful only for LARGE angular changes (turning sequences) → position comparison (Sim(3) RMSE) remains the primary validation metric Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
Compares COLMAP camera centers (images.txt) with three imagej-elphel position columns (ERS x/y/z, IMS imsX/Y/Z, PIMU pimuX-C/Y-C/Z-C) using 7-DOF Sim(3) alignment (Umeyama 1991). Reports scale, rotation (Euler angles), per-frame residuals in both COLMAP units and physical meters, and saves a CSV. Key results for water-tower scene (1763233718_057205, rect/PINHOLE, 378 frames): Scale ~0.054 (1 COLMAP unit ≈ 18.5 m; flight spans 225 m → 12.2 COLMAP units) ERS RMSE=8.3 m, max=19.6 m at trajectory endpoints Worst frames are at both ends of the 378-frame sequence — consistent with the SfM nadir doming artifact (camera orientations rotate outward from center) Two near-zero crossings at frames ~74 and ~296 confirm dome vs straight-line fit Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
Generates a multi-slice float32 TIFF (NaN-padded, ImageJ-compatible): Slice 1: tile-processor disparity D scattered to nadir image pixels (from *-NADIR-DISPARITY-MAPS.tiff, averaged across all scenes) Slice 2: COLMAP sparse Z_cam projected to the same nadir pixel grid (optional --dense PLY for OpenMVS dense cloud) Slice 3: spatial superposition (tile-proc priority; COLMAP where missing; average at overlapping pixels) Slice 4: tile-processor scene-count per pixel (--counts flag) Uses the COLMAP reference-image pose (auto-detected as centroid of camera centres, or specified via --ref-image) to project 3D points. Handles OPENCV lens distortion model (--no-distortion to skip). Intended for evaluating depth-fusion approaches (tile processor + SIFT): python3 scripts/fopen_nadir_compare.py \ --disp <ts>-NADIR-DISPARITY-MAPS.tiff \ --colmap sparse/0_txt/ [--dense scene_dense.ply] \ --out nadir_compare.tif --counts Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
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:Claude <claude@elphel.com>
-
Andrey Filippov authored
Add nadir_undistort (boolean, default true) to IntersceneMatchParameters at all 6 required locations (field, dialog, read, save, load, clone). When enabled, renderNadirSequence() undistorts the pX,pY coordinates of each scene's nadir disparity map before calling renderGPUFromDSI(), so the rendered NADIR-MERGED TIFF images are rectilinear (pinhole projection) rather than retaining the sensor's native radial distortion. Analysis of the Boson 640 calibration (lwir16-06-72-00.calib-tiff) showed: - True distortion polynomial terms: < 1 px magnitude across the full image - The dominant issue was d = K0 = 1.00997 (a ~1% focal-length constant offset) which, when modeled as PINHOLE with the nominal focal length, curves the ground plane into the 'Little Prince planet' sphere effect seen in Blender - With nadir_undistort=true, COLMAP can use a pure PINHOLE model with the correct effective focal length (f * d = 1121.8 px instead of 1110.8 px) The undistortPxPy() helper mirrors getWorldCoordinates() in GeometryCorrection: rD_mm = ||(pX-cx, pY-cy)|| * pixelSize_mm factor = getRByRDist(rD_mm / distortionRadius) pX_rect = (pX - cx) * factor + cx Co-authored-by:Claude <claude@elphel.com>
-
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:Claude <claude@elphel.com>
-
- 26 May, 2026 7 commits
-
-
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:Claude <claude@elphel.com>
-
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:Claude <claude@elphel.com>
-
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:Claude <claude@elphel.com>
-
Andrey Filippov authored
-
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:Claude <claude@elphel.com>
-
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:Claude <claude@elphel.com>
-
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:Claude <claude@elphel.com>
-
- 25 May, 2026 4 commits
-
-
Andrey Filippov authored
-
Andrey Filippov authored
-
Andrey Filippov authored
Replaces hardcoded `boolean reuse_non_centered = true` with a config parameter. Adds a companion `cuas_reuse_centered` parameter: when true, attempts to load ROUND_TWO_GOOD before starting computation and returns early if found, bypassing both phases. Both default to true — missing files behave as if set to false. Wired into dialog, properties (.corr-xml), and copy() in IntersceneMatchParameters. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
-
- 24 May, 2026 3 commits
-
-
Andrey Filippov authored
-
Andrey Filippov authored
Spawns attic/elphel-agent-tools/bin/cpu_profile_hold.py on startup, which calls power-profiles-daemon HoldProfile('balanced') via DBus. Released automatically via SIGTERM on JVM shutdown. Design: KDE AC default is power-saver; this hold raises the profile to balanced (hardware-driven boost under load) while ImageJ is running, then releases it so the machine drops back to power-saver on exit. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
-
- 23 May, 2026 1 commit
-
-
Andrey Filippov authored
-
- 21 May, 2026 2 commits
-
-
Andrey Filippov authored
Pure-Java prototype CuasRTDetector + RtParams parameters class + CuasRTLib JNA stub (activate when JNA added to pom.xml). No dependencies added; build is clean. See design discussion in attic/imagej-elphel-internal/handoffs/2026-05-21_RealTimeDesign.md. Co-authored-by:Claude <claude@elphel.com>
-
Andrey Filippov authored
-
- 19 May, 2026 1 commit
-
-
Andrey Filippov authored
-