-
-
Sofa is 13 cm too wide for my door, but its 204 cm flat-pack box gets in on its side with under 2 cm to spare.
-
Scan-coach agent reads OpenCV's evidence, finds 1 m of wall I missed, and says exactly where to stand to rescan.
-
My real bedroom + hallway from iPhone LiDAR, measured by OpenCV 5 on AWS. Every wall shows its uncertainty.
-
5 OpenCV 5.0.0 bugs found and worked around, each reproduced by a test.
-
Who benefits: retailers, removalists, and customers avoiding $100–200 restocking fees.
-
The measured digital twin in 3D. Orbit it, or walk through it on your phone.
-
Door fit checks 6 orientations plus tilt: "13 cm too wide even upright. Carry the boxes in."
-
iPhone LiDAR → OpenCV 5 on AWS Graviton → advisory agent → fit, route and build-order checks.
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
- Scan a room with an iPhone's LiDAR (2 minutes, a free scanner app, 2 million points) and upload it.
- 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
- 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.
- 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) andOdometryfor RGB-DPCACompute2andRodriguesfor gravity- room segmentation with
watershed,distanceTransform,connectedComponentsWithStatsandfindContours - walls via MSAC and
fitLine(DIST_HUBER) - doors and windows from per-wall occupancy images, using morphology and components
minAreaRectfor furniture; an optional ArUco andsolvePnPscale 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:
- Dense
VolumeType_TSDFmoves surfaces: a plane at 2.00 m reconstructs at 2.29 m. Switched to HashTSDF. HashTSDF.raycastis offset by half a voxel. Odometry drifted 0.40 m over 200 frames, and 4.5 cm after correcting the offset.fetchPointsNormalsreturns the whole truncation band, 7 layers instead of 1. Fixed by extracting the surface through raycasting.SACSegmentationis not wrapped in Python. I wrote my own MSAC on the same plane model.OdometrySettingsneeds 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
- agentic-ai
- amazon-ec2
- amazon-web-services
- anthropic-api
- aws-graviton
- caddy
- claude
- computer-vision
- digital-twin
- fastapi
- ios
- javascript
- lidar
- numpy
- opencv
- opencv-5
- point-cloud
- python
- three.js
- tsdf
- uvicorn
- web-workers
Log in or sign up for Devpost to join the conversation.