The problem, and who pays for it

In a 2025 survey of 1,500 UK furniture buyers, 49% had ordered furniture that didn't fit through the door or couldn't get up the stairs (Fixtuur, 2025). Each failure means a return, a 10–20% restocking fee (so $100–200 on a $1,000 sofa), and a wasted delivery trip.

RoomTwin answers "will it fit?" before anyone buys or loads a truck: through the door, round the corner, in the right order.

  • Furniture retailers: a "fits your home?" check next to the Buy button, so fewer returns.
  • Removalists: know before the truck leaves what goes in boxed, what gets tilted, and the route.
  • Customers: no restocking fee and no sofa stuck in the hallway.

What it does

  1. Scan a room with an iPhone's LiDAR (2 minutes, a free scanner app, 2 million points) and upload it.
  2. An OpenCV 5 pipeline on AWS Graviton measures it in about 13 seconds:
    • finds gravity and splits rooms at the doorways
    • fits every wall, and finds doors and windows (including a closed, flush door) and existing furniture
    • attaches a 1-sigma uncertainty to every measurement
  3. A scan-coach agent inspects OpenCV's evidence: the summary, the per-wall occupancy images and the floor plan. It then accepts the scan, requests one specific physical rescan, or asks a question. It's advisory only: the person decides.
  4. The web app has plan, 3D and phone walk-through views.
    • Paste an IKEA link and it reads the real dimensions, including the flat-pack box sizes.
    • Door fit is checked over all 6 orientations plus tilting.
    • A route search (x, z, yaw) runs from the entry to the item's spot, and a build order that never blocks the next piece.

Real result in my home: the EKTORP sofa is 13 cm too wide for my bedroom door, even upright. But its 204 cm flat-pack box gets in, carried on its side, with under 2 cm to spare at the hallway wall.

How I built it

  • OpenCV 5 (opencv-python-headless 5.0.0.93):
    • loadPointCloud/loadMesh; Volume (HashTSDF) and Odometry for RGB-D
    • PCACompute2 and Rodrigues for gravity
    • room segmentation with watershed, distanceTransform, connectedComponentsWithStats and findContours
    • walls via MSAC and fitLine(DIST_HUBER)
    • doors and windows from per-wall occupancy images, using morphology and components
    • minAreaRect for furniture; an optional ArUco and solvePnP scale check
  • Agent: Claude with strict tool schemas. Three read-only perception tools and three actions; every step is logged to a trace.
  • AWS: EC2 Graviton (arm64), FastAPI and Caddy HTTPS, with a daily cap on model calls.
  • Web: three.js, with the logistics running in a Web Worker.

Challenges: OpenCV 5.0.0 fought back

I found and worked around 5 bugs and binding gaps, each reproduced by a test:

  1. Dense VolumeType_TSDF moves surfaces: a plane at 2.00 m reconstructs at 2.29 m. Switched to HashTSDF.
  2. HashTSDF.raycast is offset by half a voxel. Odometry drifted 0.40 m over 200 frames, and 4.5 cm after correcting the offset.
  3. fetchPointsNormals returns the whole truncation band, 7 layers instead of 1. Fixed by extracting the surface through raycasting.
  4. SACSegmentation is not wrapped in Python. I wrote my own MSAC on the same plane model.
  5. OdometrySettings needs float32, and the OpenCL TSDF crashed. Fixed with typed inputs and the CPU path.

Real scans also drift about 1° between rooms. I level each room separately.

Accuracy (honest)

  • Synthetic rooms: 48/48 sweep scans pass, worst wall error 0.62 cm.
  • Real bedroom, by tape measure:
    • Matches: 4.81 m wall → 4.809 m; 60 cm step → 60.3 cm; ceiling about 2.40 m → 2.399 m.
    • Misses: the door was 9 cm off (probably the tape caught the frame), and the window 7.6 cm off (it was measured on the blind). Both are documented in the report.

What I learned

  • OpenCV 5's 3D module is usable from Python today, but check it against ground truth: two of these bugs silently shift geometry.
  • An agent is most useful when its perception is someone else's measured output.

What's next

  • Retailer integration
  • Trying larger spaces, commerical spaces etc
  • A 3D route graphic interface to see the asthetics of the room and let users plan it out

Built With

Share this project:

Updates

Submission history