Module: Gsplat::Math::CameraDistortion

Defined in:
lib/gsplat/math/camera_distortion.rb

Overview

OpenCV pinhole distortion and equidistant fisheye projection.

Class Method Summary collapse

Class Method Details

.project_camera(means, intrinsics, camera_model, radial: nil, tangential: nil, thin_prism: nil) ⇒ Object

rubocop:disable Metrics/ParameterLists



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/gsplat/math/camera_distortion.rb', line 10

def project_camera(means, intrinsics, camera_model, radial: nil, tangential: nil, thin_prism: nil)
  # rubocop:enable Metrics/ParameterLists
  projected = means.class.zeros(means.shape[0], 2)
  jacobians = means.class.zeros(means.shape[0], 2, 3)
  means.shape[0].times do |index|
    point = means[index, true].to_a.map(&:to_f)
    projected[index, true] = project_point(
      point, intrinsics, camera_model, radial, tangential, thin_prism
    )
    jacobians[index, true, true] = numerical_jacobian(
      point, intrinsics, camera_model, radial, tangential, thin_prism, means.class
    )
  end
  [projected, jacobians]
end

.project_point(point, intrinsics, camera_model, radial, tangential, thin_prism) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/ParameterLists



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/gsplat/math/camera_distortion.rb', line 27

def project_point(point, intrinsics, camera_model, radial, tangential, thin_prism)
  # rubocop:enable Metrics/AbcSize, Metrics/ParameterLists
  x_coord = point[0] / point[2]
  y_coord = point[1] / point[2]
  normalized = if camera_model.to_s == "fisheye"
                 fisheye_normalized = fisheye(x_coord, y_coord, radial)
                 tangential_prism(
                   *fisheye_normalized, *fisheye_normalized, tangential, thin_prism
                 )
               else
                 pinhole_normalized = pinhole(x_coord, y_coord, radial)
                 tangential_prism(
                   *pinhole_normalized, x_coord, y_coord, tangential, thin_prism
                 )
               end
  [
    (intrinsics[0, 0].to_f * normalized[0]) +
      (intrinsics[0, 1].to_f * normalized[1]) + intrinsics[0, 2].to_f,
    (intrinsics[1, 0].to_f * normalized[0]) +
      (intrinsics[1, 1].to_f * normalized[1]) + intrinsics[1, 2].to_f
  ]
end