39 using t::geometry::kernel::NDArrayIndexer;
40 using t::geometry::kernel::TransformIndexer;
49 return abs_r < delta ? r : delta *
Sign(r);
54 return abs_r < delta ? 0.5 * r * r : delta * abs_r - 0.5 * delta * delta;
60 const float depth_outlier_trunc,
67 float* source_v = source_vertex_indexer.
GetDataPtr<
float>(x, y);
68 if (
ISNAN(source_v[0])) {
73 float T_source_to_target_v[3], u, v;
75 &T_source_to_target_v[0], &T_source_to_target_v[1],
76 &T_source_to_target_v[2]);
77 ti.
Project(T_source_to_target_v[0], T_source_to_target_v[1],
78 T_source_to_target_v[2], &u, &v);
82 if (T_source_to_target_v[2] < 0 ||
87 int ui =
static_cast<int>(u);
88 int vi =
static_cast<int>(v);
89 float* target_v = target_vertex_indexer.
GetDataPtr<
float>(ui, vi);
90 float* target_n = target_normal_indexer.
GetDataPtr<
float>(ui, vi);
91 if (
ISNAN(target_v[0]) ||
ISNAN(target_n[0])) {
95 r = (T_source_to_target_v[0] - target_v[0]) * target_n[0] +
96 (T_source_to_target_v[1] - target_v[1]) * target_n[1] +
97 (T_source_to_target_v[2] - target_v[2]) * target_n[2];
98 if (abs(r) > depth_outlier_trunc) {
102 J_ij[0] = -T_source_to_target_v[2] * target_n[1] +
103 T_source_to_target_v[1] * target_n[2];
104 J_ij[1] = T_source_to_target_v[2] * target_n[0] -
105 T_source_to_target_v[0] * target_n[2];
106 J_ij[2] = -T_source_to_target_v[1] * target_n[0] +
107 T_source_to_target_v[0] * target_n[1];
108 J_ij[3] = target_n[0];
109 J_ij[4] = target_n[1];
110 J_ij[5] = target_n[2];
118 const float depth_outlier_trunc,
129 const float sobel_scale = 0.125;
131 float* source_v = source_vertex_indexer.
GetDataPtr<
float>(x, y);
132 if (
ISNAN(source_v[0])) {
137 float T_source_to_target_v[3], u_tf, v_tf;
139 &T_source_to_target_v[0], &T_source_to_target_v[1],
140 &T_source_to_target_v[2]);
141 ti.
Project(T_source_to_target_v[0], T_source_to_target_v[1],
142 T_source_to_target_v[2], &u_tf, &v_tf);
143 int u_t =
int(roundf(u_tf));
144 int v_t =
int(roundf(v_tf));
146 if (T_source_to_target_v[2] < 0 ||
154 float depth_t = *target_depth_indexer.
GetDataPtr<
float>(u_t, v_t);
155 float diff_D = depth_t - T_source_to_target_v[2];
156 if (
ISNAN(depth_t) || abs(diff_D) > depth_outlier_trunc) {
160 float diff_I = *target_intensity_indexer.
GetDataPtr<
float>(u_t, v_t) -
161 *source_intensity_indexer.
GetDataPtr<
float>(x, y);
162 float dIdx = sobel_scale *
163 (*target_intensity_dx_indexer.
GetDataPtr<
float>(u_t, v_t));
164 float dIdy = sobel_scale *
165 (*target_intensity_dy_indexer.
GetDataPtr<
float>(u_t, v_t));
167 float invz = 1 / T_source_to_target_v[2];
168 float c0 = dIdx * fx * invz;
169 float c1 = dIdy * fy * invz;
170 float c2 = -(c0 * T_source_to_target_v[0] + c1 * T_source_to_target_v[1]) *
173 J_I[0] = (-T_source_to_target_v[2] * c1 + T_source_to_target_v[1] * c2);
174 J_I[1] = (T_source_to_target_v[2] * c0 - T_source_to_target_v[0] * c2);
175 J_I[2] = (-T_source_to_target_v[1] * c0 + T_source_to_target_v[0] * c1);
187 const float depth_outlier_trunc,
204 const float sqrt_lambda_intensity = 0.707;
205 const float sqrt_lambda_depth = 0.707;
206 const float sobel_scale = 0.125;
208 float* source_v = source_vertex_indexer.
GetDataPtr<
float>(x, y);
209 if (
ISNAN(source_v[0])) {
214 float T_source_to_target_v[3], u_tf, v_tf;
216 &T_source_to_target_v[0], &T_source_to_target_v[1],
217 &T_source_to_target_v[2]);
218 ti.
Project(T_source_to_target_v[0], T_source_to_target_v[1],
219 T_source_to_target_v[2], &u_tf, &v_tf);
220 int u_t =
int(roundf(u_tf));
221 int v_t =
int(roundf(v_tf));
223 if (T_source_to_target_v[2] < 0 ||
231 float depth_t = *target_depth_indexer.
GetDataPtr<
float>(u_t, v_t);
232 float diff_D = depth_t - T_source_to_target_v[2];
233 if (
ISNAN(depth_t) || abs(diff_D) > depth_outlier_trunc) {
237 float dDdx = sobel_scale *
238 (*target_depth_dx_indexer.
GetDataPtr<
float>(u_t, v_t));
239 float dDdy = sobel_scale *
240 (*target_depth_dy_indexer.
GetDataPtr<
float>(u_t, v_t));
245 float diff_I = *target_intensity_indexer.
GetDataPtr<
float>(u_t, v_t) -
246 *source_intensity_indexer.
GetDataPtr<
float>(x, y);
247 float dIdx = sobel_scale *
248 (*target_intensity_dx_indexer.
GetDataPtr<
float>(u_t, v_t));
249 float dIdy = sobel_scale *
250 (*target_intensity_dy_indexer.
GetDataPtr<
float>(u_t, v_t));
252 float invz = 1 / T_source_to_target_v[2];
253 float c0 = dIdx * fx * invz;
254 float c1 = dIdy * fy * invz;
255 float c2 = -(c0 * T_source_to_target_v[0] + c1 * T_source_to_target_v[1]) *
257 float d0 = dDdx * fx * invz;
258 float d1 = dDdy * fy * invz;
259 float d2 = -(d0 * T_source_to_target_v[0] + d1 * T_source_to_target_v[1]) *
262 J_I[0] = sqrt_lambda_intensity *
263 (-T_source_to_target_v[2] * c1 + T_source_to_target_v[1] * c2);
264 J_I[1] = sqrt_lambda_intensity *
265 (T_source_to_target_v[2] * c0 - T_source_to_target_v[0] * c2);
266 J_I[2] = sqrt_lambda_intensity *
267 (-T_source_to_target_v[1] * c0 + T_source_to_target_v[0] * c1);
268 J_I[3] = sqrt_lambda_intensity * (c0);
269 J_I[4] = sqrt_lambda_intensity * (c1);
270 J_I[5] = sqrt_lambda_intensity * (c2);
271 r_I = sqrt_lambda_intensity * diff_I;
273 J_D[0] = sqrt_lambda_depth *
274 ((-T_source_to_target_v[2] * d1 + T_source_to_target_v[1] * d2) -
275 T_source_to_target_v[1]);
276 J_D[1] = sqrt_lambda_depth *
277 ((T_source_to_target_v[2] * d0 - T_source_to_target_v[0] * d2) +
278 T_source_to_target_v[0]);
279 J_D[2] = sqrt_lambda_depth *
280 ((-T_source_to_target_v[1] * d0 + T_source_to_target_v[0] * d1));
281 J_D[3] = sqrt_lambda_depth * (d0);
282 J_D[4] = sqrt_lambda_depth * (d1);
283 J_D[5] = sqrt_lambda_depth * (d2 - 1.0f);
285 r_D = sqrt_lambda_depth * diff_D;
Definition: GeometryIndexer.h:168
#define ISNAN(X)
Definition: GeometryMacros.h:38
OPEN3D_HOST_DEVICE int Sign(int x)
Definition: GeometryMacros.h:62
OPEN3D_HOST_DEVICE bool GetJacobianIntensity(int x, int y, const float depth_outlier_trunc, const NDArrayIndexer &source_depth_indexer, const NDArrayIndexer &target_depth_indexer, const NDArrayIndexer &source_intensity_indexer, const NDArrayIndexer &target_intensity_indexer, const NDArrayIndexer &target_intensity_dx_indexer, const NDArrayIndexer &target_intensity_dy_indexer, const NDArrayIndexer &source_vertex_indexer, const TransformIndexer &ti, float *J_I, float &r_I)
Definition: RGBDOdometryJacobianImpl.h:115
OPEN3D_HOST_DEVICE T * GetDataPtr(int64_t x) const
Definition: GeometryIndexer.h:324
#define OPEN3D_HOST_DEVICE
Definition: CUDAUtils.h:56
OPEN3D_HOST_DEVICE float HuberLoss(float r, float delta)
Definition: RGBDOdometryJacobianImpl.h:52
const char const char value recording_handle imu_sample recording_handle uint8_t size_t data_size k4a_record_configuration_t config target_format k4a_capture_t capture_handle k4a_imu_sample_t imu_sample playback_handle k4a_logging_message_cb_t void min_level device_handle k4a_imu_sample_t timeout_in_ms capture_handle capture_handle capture_handle image_handle temperature_c int
Definition: K4aPlugin.cpp:479
OPEN3D_HOST_DEVICE bool GetJacobianHybrid(int x, int y, const float depth_outlier_trunc, const NDArrayIndexer &source_depth_indexer, const NDArrayIndexer &target_depth_indexer, const NDArrayIndexer &source_intensity_indexer, const NDArrayIndexer &target_intensity_indexer, const NDArrayIndexer &target_depth_dx_indexer, const NDArrayIndexer &target_depth_dy_indexer, const NDArrayIndexer &target_intensity_dx_indexer, const NDArrayIndexer &target_intensity_dy_indexer, const NDArrayIndexer &source_vertex_indexer, const TransformIndexer &ti, float *J_I, float *J_D, float &r_I, float &r_D)
Definition: RGBDOdometryJacobianImpl.h:184
OPEN3D_HOST_DEVICE float HuberDeriv(float r, float delta)
Definition: RGBDOdometryJacobianImpl.h:47
Definition: PinholeCameraIntrinsic.cpp:35
OPEN3D_HOST_DEVICE bool InBoundary(float x, float y) const
Definition: GeometryIndexer.h:302
#define max(x, y)
Definition: SVD3x3CPU.h:38
OPEN3D_HOST_DEVICE bool GetJacobianPointToPlane(int x, int y, const float depth_outlier_trunc, const NDArrayIndexer &source_vertex_indexer, const NDArrayIndexer &target_vertex_indexer, const NDArrayIndexer &target_normal_indexer, const TransformIndexer &ti, float *J_ij, float &r)
Definition: RGBDOdometryJacobianImpl.h:57