Saltar a contenido

Calibración de 4 puntos (homografía manual)

Procedimiento mínimo para alinear cámara↔proyector sobre una superficie plana: capturar 4 correspondencias entre puntos proyectados conocidos y su posición vista por la cámara, y calcular una homografía con cv2.findHomography. Es el método que usa el holomat y el camino más rápido a una mesa SAR funcional (Fase 2 del roadmap mvp manualidades).

Contexto

Resuelve, para el caso plano, la calibracion camara proyector sin el aparato completo de gray code. Documenta paso a paso lo que el código real del Holomat hace, para que sea reproducible.

Contenido

Idea

Una homografía 3×3 basta para mapear dos planos. Si la superficie de trabajo es plana, 4 correspondencias (mínimo) entre el plano del proyector y el plano de la cámara definen el mapeo completo.

Procedimiento (estilo Holomat)

  1. Proyectar 4 target points en coordenadas de proyector conocidas, p.ej. cerca de las esquinas del área útil. La pantalla del Holomat es 1920×1200.
  2. Capturar la posición vista por la cámara de cada punto. El Holomat lo hace con el dedo: el usuario apoya el índice sobre cada punto proyectado y se registra el landmark 8 de mediapipe en píxeles de cámara, confirmando con Enter. (Alternativa más precisa: detectar automáticamente un marcador/cruz proyectado en la imagen de la cámara, sin dedo.)
  3. Calcular la homografía:
    M, _ = cv2.findHomography(calibration_points_np, target_points_np)
    np.save('M.npy', M)
    
    donde calibration_points_np son las posiciones en cámara y target_points_np las de proyector.
  4. Usar en runtime: transformar cualquier punto de cámara a coordenadas de proyector:
    M = np.load('M.npy')
    pt_proj = cv2.perspectiveTransform(np.array([[ [cx, cy] ]], dtype=np.float32), M)[0][0]
    

Qué da y qué NO da

  • Da: dibujar en el proyector sobre un punto que la cámara ve (UI, resaltar un objeto, líneas ancladas a la mesa).
  • NO da por sí sola: medición en mm reales. La homografía cámara→proyector no conoce la escala física. Para medir hace falta además fijar escala con referencia A4 o ArUco, y conviene quitar la distorsión del lente antes.
  • Precisión: limitada por la repetibilidad de la captura (con el dedo + MediaPipe hay ruido de varios px). Usar marcadores proyectados detectados automáticamente, o más de 4 puntos (findHomography con RANSAC), mejora el ajuste.

Mejoras recomendadas sobre el método Holomat

  • Capturar >4 puntos (grilla 3×3) y dejar que findHomography use RANSAC → menos sensible a un click malo.
  • Undistort la imagen de cámara primero (calibracion intrinseca camara) para que la homografía no tenga que absorber la distorsión del lente.
  • Detección automática del punto proyectado (centroide de un blob brillante) en vez del dedo → repetibilidad sub-pixel.

Relaciones

Citas / evidencia

  • M, _ = cv2.findHomography(calibration_points_np, target_points_np)hand_calibartion.py, holomat
  • transformed_coords = cv2.perspectiveTransform(np.array([landmark_coords]), self.M)[0]camera_manager.py, holomat

Abierto / gaps

  • Medir la precisión de la homografía con captura por dedo vs. detección automática de marcador proyectado.