Triangulation

Multi-camera 3D reconstruction through refractive interface.

Refractive triangulation for 3D reconstruction.

aquacal.triangulation.triangulate.triangulate_point(calibration, observations)[source]

Triangulate a single 3D point from multi-camera observations.

Parameters:
Returns:

3D point in world coordinates, or None if triangulation fails. Failure occurs if: fewer than 2 observations, camera not in calibration, or refractive_back_project() fails for all cameras.

Return type:

ndarray[tuple[int, …], dtype[float64]] | None

Notes

  • Uses refractive_back_project() to get rays in water

  • Finds point minimizing sum of squared distances to all rays

aquacal.triangulation.triangulate.triangulate_rays(rays)[source]

Find 3D point minimizing sum of squared distances to all rays.

Uses closed-form linear least squares solution.

Parameters:

rays (list[tuple[ndarray[tuple[int, ...], dtype[float64]], ndarray[tuple[int, ...], dtype[float64]]]]) – List of (origin, direction) tuples. Directions must be unit vectors. Must have at least 2 rays.

Returns:

3D point that minimizes sum of squared distances to all rays.

Raises:

ValueError – If fewer than 2 rays provided or system is degenerate.

Return type:

ndarray[tuple[int, …], dtype[float64]]

aquacal.triangulation.triangulate.point_to_ray_distance(point, ray_origin, ray_direction)[source]

Compute perpendicular distance from point to ray.

Parameters:
Returns:

Perpendicular distance from point to ray (always non-negative).

Return type:

float