19 const double SOBEL_SCALE = 0.125;
20 const double LAMBDA_HYBRID_DEPTH = 0.968;
30 std::vector<Eigen::Vector6d, utility::Vector6d_allocator> &J_r,
31 std::vector<double> &r,
32 std::vector<double> &w,
38 const Eigen::Matrix3d &intrinsic,
39 const Eigen::Matrix4d &extrinsic,
41 Eigen::Matrix3d R = extrinsic.block<3, 3>(0, 0);
42 Eigen::Vector3d t = extrinsic.block<3, 1>(0, 3);
44 int u_s = corresps[row](0);
45 int v_s = corresps[row](1);
46 int u_t = corresps[row](2);
47 int v_t = corresps[row](3);
50 double dIdx = SOBEL_SCALE * (*target_dx.
color_.
PointerAt<
float>(u_t, v_t));
51 double dIdy = SOBEL_SCALE * (*target_dy.
color_.
PointerAt<
float>(u_t, v_t));
52 Eigen::Vector3d p3d_mat(*source_xyz.
PointerAt<
float>(u_s, v_s, 0),
53 *source_xyz.
PointerAt<
float>(u_s, v_s, 1),
54 *source_xyz.
PointerAt<
float>(u_s, v_s, 2));
55 Eigen::Vector3d p3d_trans = R * p3d_mat + t;
56 double invz = 1. / p3d_trans(2);
57 double c0 = dIdx * intrinsic(0, 0) * invz;
58 double c1 = dIdy * intrinsic(1, 1) * invz;
59 double c2 = -(c0 * p3d_trans(0) + c1 * p3d_trans(1)) * invz;
62 J_r[0](0) = -p3d_trans(2) * c1 + p3d_trans(1) * c2;
63 J_r[0](1) = p3d_trans(2) * c0 - p3d_trans(0) * c2;
64 J_r[0](2) = -p3d_trans(1) * c0 + p3d_trans(0) * c1;
76 std::vector<Eigen::Vector6d, utility::Vector6d_allocator> &J_r,
77 std::vector<double> &r,
78 std::vector<double> &w,
84 const Eigen::Matrix3d &intrinsic,
85 const Eigen::Matrix4d &extrinsic,
87 double sqrt_lamba_dep, sqrt_lambda_img;
88 sqrt_lamba_dep = sqrt(LAMBDA_HYBRID_DEPTH);
89 sqrt_lambda_img = sqrt(1.0 - LAMBDA_HYBRID_DEPTH);
91 const double fx = intrinsic(0, 0);
92 const double fy = intrinsic(1, 1);
93 Eigen::Matrix3d R = extrinsic.block<3, 3>(0, 0);
94 Eigen::Vector3d t = extrinsic.block<3, 1>(0, 3);
96 int u_s = corresps[row](0);
97 int v_s = corresps[row](1);
98 int u_t = corresps[row](2);
99 int v_t = corresps[row](3);
102 double dIdx = SOBEL_SCALE * (*target_dx.
color_.
PointerAt<
float>(u_t, v_t));
103 double dIdy = SOBEL_SCALE * (*target_dy.
color_.
PointerAt<
float>(u_t, v_t));
104 double dDdx = SOBEL_SCALE * (*target_dx.
depth_.
PointerAt<
float>(u_t, v_t));
105 double dDdy = SOBEL_SCALE * (*target_dy.
depth_.
PointerAt<
float>(u_t, v_t));
106 if (std::isnan(dDdx)) dDdx = 0;
107 if (std::isnan(dDdy)) dDdy = 0;
108 Eigen::Vector3d p3d_mat(*source_xyz.
PointerAt<
float>(u_s, v_s, 0),
109 *source_xyz.
PointerAt<
float>(u_s, v_s, 1),
110 *source_xyz.
PointerAt<
float>(u_s, v_s, 2));
111 Eigen::Vector3d p3d_trans = R * p3d_mat + t;
113 double diff_geo = *target.
depth_.
PointerAt<
float>(u_t, v_t) - p3d_trans(2);
114 double invz = 1. / p3d_trans(2);
115 double c0 = dIdx * fx * invz;
116 double c1 = dIdy * fy * invz;
117 double c2 = -(c0 * p3d_trans(0) + c1 * p3d_trans(1)) * invz;
118 double d0 = dDdx * fx * invz;
119 double d1 = dDdy * fy * invz;
120 double d2 = -(d0 * p3d_trans(0) + d1 * p3d_trans(1)) * invz;
125 J_r[0](0) = sqrt_lambda_img * (-p3d_trans(2) * c1 + p3d_trans(1) * c2);
126 J_r[0](1) = sqrt_lambda_img * (p3d_trans(2) * c0 - p3d_trans(0) * c2);
127 J_r[0](2) = sqrt_lambda_img * (-p3d_trans(1) * c0 + p3d_trans(0) * c1);
128 J_r[0](3) = sqrt_lambda_img * (c0);
129 J_r[0](4) = sqrt_lambda_img * (c1);
130 J_r[0](5) = sqrt_lambda_img * (c2);
131 double r_photo = sqrt_lambda_img * diff_photo;
135 J_r[1](0) = sqrt_lamba_dep *
136 ((-p3d_trans(2) * d1 + p3d_trans(1) * d2) - p3d_trans(1));
137 J_r[1](1) = sqrt_lamba_dep *
138 ((p3d_trans(2) * d0 - p3d_trans(0) * d2) + p3d_trans(0));
139 J_r[1](2) = sqrt_lamba_dep * ((-p3d_trans(1) * d0 + p3d_trans(0) * d1));
140 J_r[1](3) = sqrt_lamba_dep * (d0);
141 J_r[1](4) = sqrt_lamba_dep * (d1);
142 J_r[1](5) = sqrt_lamba_dep * (d2 - 1.0f);
143 double r_geo = sqrt_lamba_dep * diff_geo;
The Image class stores image with customizable width, height, num of channels and bytes per channel.
T * PointerAt(int u, int v) const
Function to access the raw data of a single-channel Image.
RGBDImage is for a pair of registered color and depth images,.
Image color_
The color image.
Image depth_
The depth image.
void ComputeJacobianAndResidual(int row, std::vector< Eigen::Vector6d, utility::Vector6d_allocator > &J_r, std::vector< double > &r, std::vector< double > &w, const geometry::RGBDImage &source, const geometry::RGBDImage &target, const geometry::Image &source_xyz, const geometry::RGBDImage &target_dx, const geometry::RGBDImage &target_dy, const Eigen::Matrix3d &intrinsic, const Eigen::Matrix4d &extrinsic, const CorrespondenceSetPixelWise &corresps) const override
Parameterized Constructor.
void ComputeJacobianAndResidual(int row, std::vector< Eigen::Vector6d, utility::Vector6d_allocator > &J_r, std::vector< double > &r, std::vector< double > &w, const geometry::RGBDImage &source, const geometry::RGBDImage &target, const geometry::Image &source_xyz, const geometry::RGBDImage &target_dx, const geometry::RGBDImage &target_dy, const Eigen::Matrix3d &intrinsic, const Eigen::Matrix4d &extrinsic, const CorrespondenceSetPixelWise &corresps) const override
Parameterized Constructor.
std::vector< Eigen::Vector4i, utility::Vector4i_allocator > CorrespondenceSetPixelWise
Generic file read and write utility for python interface.