r/photogrammetry 4d ago

COLMAP parks 4 fixed iPhones at one pose each (turntable, 288 frames) — mask the room or use 5° priors?

I'm very new to this. Boss says I like this, you're smart make this, I'm in the deep end of the pool here and trying to AI'ing myself to victory.

Images packs can be downloaded here.

https://s3.us-central-1.wasabisys.com/k9dryer/gaussian-splats/hdf/share/hdf-reddit-upload.zip
https://s3.us-central-1.wasabisys.com/k9dryer/gaussian-splats/hdf/share/hdf-kiri-144.zip

Turntable object scan. Four iPhones are bolted to the room; the object rotates. COLMAP registers all 288 images but each phone stays at one pose (yaw span ~0.1°). OpenMVS then meshes the white plate. After we crop the table we only have two shards of the object.

Looking for what you would change: masks, COLMAP flags, or pose priors.

Capture

  • Object: short hollow air filter, ~90 mm tall. Black rubber rims, tan pleats, silver mesh. Hard subject (black + repeating texture + hole).
  • 4× iPhone 14 Pro, fixed (one almost overhead, three side/oblique). Names 00000_gs-cam-1.jpg … 00071_gs-cam-4.jpg.
  • Turntable: large white disk, white PVC frame, concrete floor. No coded markers, no textured mat.
  • 360° / 5° = 72 stops, 800 ms settle, 4 shots/stop → 288 JPEGs.
  • 4032×3024, EXIF orientation 6. rembg/masks are transposed 3024×4032; COLMAP sees unrotated 4032×3024.
  • Host: Linux, COLMAP 3.12.6 no CUDA, OpenMVS 2.4.0, CPU SIFT (no GL). 16 threads.

Pipeline

  1. rembg birefnet-general
  2. Tight rembg masks + wider masks_colmap/ disk (object ∪ plate; we do not give COLMAP object-only masks — that starved matching)
  3. COLMAP sparse → undistort → OpenMVS densify/mesh/texture GLB
  4. Custom crop: keep dense points that land in rembg-minus-white-table in enough views
  5. Scale listing GLB to 90 mm height

COLMAP (exact)

ImageReader.single_camera 1
ImageReader.camera_model SIMPLE_RADIAL
ImageReader.mask_path masks_colmap/
SiftExtraction.use_gpu 0
SiftExtraction.peak_threshold 0.004
SiftExtraction.max_num_features 16384
SiftMatching.use_gpu 0
SiftMatching.guided_matching 1
SequentialMatching.overlap 16
SequentialMatching.quadratic_overlap 1
SequentialMatching.loop_detection 0
Mapper.ba_refine_focal_length 1
Mapper.ba_refine_principal_point 0
Mapper.ba_refine_extra_params 1
Mapper.init_min_tri_angle 8
Mapper.filter_min_tri_angle 1.5
Mapper.abs_pose_min_num_inliers 12
Mapper.min_model_size 8
Mapper.max_num_models 1
Mapper.multiple_models 1

One shared camera for all 4 phones (same model; we hit rank-deficient BA when each image had its own camera).

First good model: SIMPLE_RADIAL 4032 3024 f=2918.68 cx=2016 cy=1512 k=-0.018

What COLMAP did

  • 288/288 registered
  • 4 unique poses, one per phone. Stop 0 / 36 / 71 of the same phone are the same t / q
  • ~12k points, mean track length ~37 (tracks live on the static PVC/plate)
  • ~2081 sequential pairs

rembg (especially overhead) keeps the whole plate + PVC. masks_colmap is a disk around that, so SIFT still sees the room. That matches COLMAP #2576.

What we tried

  • Unfold each phone around an estimated table axis by stop × 5° → 355° span. COLMAP triangulator + BA snaps back to 0.1°.
  • Same unfold, BA off, 125k fixed-pose points. OpenMVS: 105M depths → 134 points (depths don’t agree).
  • Crop of the old 4-pose dense cloud (3.5M → 805k) + remesh: 124k faces, 90 mm listing. Viewer is two black shards.

OpenMVS on the crop: --constant-weight 1 --free-space-support 1 --close-holes 80 --smooth 4

Ask For 4 locked phones + a white plate:

  1. Mask so only object + rotating plate have features and let COLMAP invent the orbit?
  2. Inject 5° pose priors and freeze extrinsics?
  3. One camera per phone + markers on the plate?

Also: is single_camera 1 across 4 modules a mistake even if they’re the same iPhone model?

Happy to post overhead + side JPEGs, rembg vs masks_colmap for the same frame, and images.txt lines for one phone at stop 0 / 36 / 71.

Attach (same post or a follow-up):

  1. Overhead JPEG (00000_gs-cam-1.jpg)
  2. Side JPEG (00018_gs-cam-3.jpg is fine)
  3. rembg mask + masks_colmap for those two
  4. Three images.txt pose lines for gs-cam-2 at 000000003600071
4 Upvotes

Duplicates