Apuntes para escanear un objeto con una cámara 360
Bitácora de investigación · Hyuga.ai · Artículo 3
En el segundo artículo corrimos el pipeline completo sobre espacios abiertos: split fisheye, rig de dos cámaras, COLMAP. Esta semana cambiamos el objetivo: escanear un objeto aislado. Escaneamos una PC vintage de los 90, monitor CRT y gabinete beige, puesta en el centro de la escena para reconstruirla con el mayor detalle posible. Después de varias corridas, lo que separó un splat limpio de uno con costuras fueron las poses de cámara.
El setup
Capturamos con una DJI Osmo 360, con un softbox sobre el objeto para suavizar las sombras del monitor y el gabinete. Grabamos en equirectangular con ISO y parámetros fijos. De ahí seguimos el pipeline de siempre: cortar el video en tramos iguales y quedarnos con el frame más nítido de cada tramo. Empezamos con 200 segmentos y llegamos a 500.
Entrenamos COLMAP con las dos cámaras del rig aunque la PC solo aparecía en la delantera (pano_camera0). La lente de atrás no ve el objeto, pero le da a COLMAP más entorno para ubicar cada pose. Brush entrena solo con la cámara delantera.
Usamos Brush porque corre en una máquina normal, sin hardware específico. Sirve Lichtfeld o cualquier otro entrenador; lo de este artículo no depende de eso.
La estabilización de la Osmo rompía los frames
En los primeros frames extraídos había una costura rara que no cerraba entre una imagen y la siguiente. Después de dar vueltas, el problema era la estabilización de la cámara.
Con la estabilización activada, la Osmo rota la imagen entre sus dos lentes físicas para compensar el movimiento. Un mismo lente físico deja de caer siempre en la misma imagen fisheye. Ese yaw y pitch que la cámara mete por su cuenta rompía los frames, que era justo lo que habíamos cuidado en la captura.
La desactivamos y cada lente físico quedó fijo a su cámara: uno a pano_camera0, el otro a pano_camera1. El costo fue que sin estabilización la cámara tampoco hace el flip vertical, así que ese flip lo hicimos nosotros en el preprocesamiento. Un paso más y los frames volvieron a cerrar.

Con la estabilización activada, un mismo lente físico deja de caer siempre en la misma imagen fisheye y la costura entre frames no cierra.
El error de las poses movió la aguja
Corrimos COLMAP varias veces cambiando resolución de matching, método de emparejamiento y cantidad de segmentos. Dos de esas corridas dejaron claro qué era lo que importaba.
| Secuencial (pc-2-2) | Exhaustive (pc-2-3) | |
|---|---|---|
| Vistas | 500 | 500 |
| Reproj pano0 (media) | 1.134 px | 1.096 px |
| Reproj pano0 (mediana) | 1.178 px | 1.102 px |
| Zona espiral (seg 29–47) | 1.288 px | 0.995 px |
No comparamos la cantidad de puntos 3D entre las dos corridas: se procesaron a distinta resolución de matching, así que el conteo de puntos no es equivalente. La métrica comparable es el error de reproyección.
La corrida de la derecha produjo el mejor splat, sin costuras ni ese paralaje donde el objeto parece moverse de forma incoherente entre vistas. El dato relevante está en la última fila. La zona espiral, la parte más difícil de la captura donde rodeábamos la PC, bajó de 1.288 a 0.995 px de error, un 29% menos. Era justo donde antes aparecían las costuras. Al bajar el error de las poses, las costuras desaparecieron.
Lo verificamos desde el otro lado. Densificamos una escena con RomaV2, que agrega una gran cantidad de puntos manteniendo las mismas poses. La mejora visual fue mínima. Las poses no cambiaron, así que el problema de fondo seguía presente, ahora tapado con más puntos.
Cuando el splat sale con costuras o paralaje incoherente, el instinto es sumar densidad. Para este objeto la densidad no era el problema. Lo que corregía el resultado era bajar el error de las poses de cámara.
Sequential o exhaustive
COLMAP puede emparejar imágenes en secuencia (cada foto con sus vecinas en el tiempo) o exhaustive (todas contra todas).
Las dos anduvieron. En algunos casos rindió mejor una, en otros la otra, según cómo estaba ordenada la captura y la cobertura. Lo que importó fue cuál dejaba el error de reproyección más bajo para el dataset. Para esta PC y esta captura, exhaustive ganó en la zona espiral que nos daba problemas. Lo tomamos como resultado de este dataset y no como regla.
Medí el error y elegí en base a eso.Máscaras aunque no haya gente
En los artículos anteriores las máscaras servían para sacar personas. Acá no había personas y las máscaras igual fueron una de las mejores decisiones.
La idea es entrenar el splat solo en el objeto e ignorar el fondo. Entrenamos un YOLO para segmentar la silueta de la PC en las 500 imágenes. Con 100 anotaciones a mano y un fine-tune de unos 6 minutos, el modelo recortaba el objeto en todas las vistas con buena precisión.
El impacto en el entrenamiento fue grande:
| Sin máscaras | Con máscaras | |
|---|---|---|
| PLY final | 379 MB (cortado) | 61 MB |
| Duración | ~9 h (sin terminar) | ~1h44m |
| RAM | swap extremo | controlada |
| HD 3840 | inviable | viable |
Sin máscaras, Brush intentaba reconstruir también el fondo entero, con archivos enormes y corridas que a veces ni terminaban. Con máscaras, el entrenamiento se concentró en la PC.
Acotando el trabajo al objeto pudimos entrenar en HD real (3840×3840). Sin máscaras el HD era inviable por RAM. Con máscaras entró cómodo y el detalle del objeto subió.Aunque la escena no tenga nada que ocultar, las máscaras le dicen al entrenador dónde poner el esfuerzo. Menos RAM, menos tiempo, más resolución donde importa.

Máscara de segmentación YOLO sobre la PC: el entrenador concentra el trabajo en el objeto e ignora el fondo.
El resultado
El mejor splat salió juntando todo esto: las poses con el error más bajo que conseguimos, imágenes en HD y máscaras para concentrar el trabajo en el objeto. La PC quedó nítida, sin costuras, con buen detalle en el CRT y el gabinete, y los splats enfocados en el objeto en vez de dispersos por el fondo.

Resultado final: poses de bajo error, entrenamiento en HD y máscaras de objeto.
Lo que sigue
Lo que nos llevamos:
- Cuando el splat tiene costuras o paralaje raro, mirá el error de las poses antes de sumar puntos.
- Sequential y exhaustive sirven las dos. Quedate con la que te deje el error más bajo.
- Si escaneás un objeto con una 360, desactivá la estabilización para que cada lente físico quede fijo a su cámara.
- Usá máscaras aunque no haya gente. Bajan RAM y tiempo, y te habilitan más resolución en el objeto.
Preguntas abiertas:
- ¿Hasta dónde se puede bajar el error de las poses antes de que deje de notarse en el splat?
- ¿Cuándo conviene densificar y cuándo es tapar un problema de poses?
- Entrenar todo en HD con exhaustive se nos murió por RAM. ¿Cómo se escala eso sin hardware dedicado?
Hyuga.ai — investigación en curso ¿Estás escaneando objetos o ambientes? Nos interesa comparar notas.