28 #ifndef CObservation3DRangeScan_project3D_impl_H
29 #define CObservation3DRangeScan_project3D_impl_H
38 template <
class POINTMAP>
41 POINTMAP & dest_pointcloud,
42 const bool takeIntoAccountSensorPoseOnRobot,
44 const bool PROJ3D_USE_LUT)
46 using namespace mrpt::math;
50 mrpt::utils::PointCloudAdapter<POINTMAP> pca(dest_pointcloud);
57 const size_t WH = W*H;
86 *kys++ = (r_cx - c) * r_fx_inv;
87 *kzs++ = (r_cy - r) * r_fy_inv;
112 for (
int r=0;r<H;r++)
113 for (
int c=0;c<W;c++)
115 const float Kz = (r_cy - r) * r_fy_inv;
116 const float Ky = (r_cx - c) * r_fx_inv;
117 const float D = src_obs.
rangeImage.coeff(r,c);
118 pca.setPointXYZ(idx++,
141 for (
int r=0;r<H;r++)
142 for (
int c=0;c<W;c++)
144 const float Ky = (r_cx - c) * r_fx_inv;
145 const float Kz = (r_cy - r) * r_fy_inv;
146 const float D = src_obs.
rangeImage.coeff(r,c);
147 pca.setPointXYZ(idx++,
148 D / std::sqrt(1+Ky*Ky+Kz*Kz),
175 if (!isDirectCorresp)
184 T_inv.block<3,3>(0,0)=R_inv.cast<
float>();
185 T_inv.block<3,1>(0,3)=t_inv.cast<
float>();
188 Eigen::Matrix<float,4,1> pt_wrt_color, pt_wrt_depth;
191 int img_idx_x=0, img_idx_y=0;
195 for (
size_t i=0;i<WH;i++)
197 bool pointWithinImage =
false;
200 pointWithinImage=
true;
202 if (img_idx_x>=imgW) {
210 pca.getPointXYZ(i,pt_wrt_depth[0],pt_wrt_depth[1],pt_wrt_depth[2]);
211 pt_wrt_color.noalias() = T_inv*pt_wrt_depth;
214 if (pt_wrt_color[2]) {
218 img_idx_x>=0 && img_idx_x<imgW &&
219 img_idx_y>=0 && img_idx_y<imgH;
223 if (pointWithinImage)
225 if (hasColorIntensityImg) {
233 pCol.
R = pCol.
G = pCol.
B = c;
238 pCol.
R = pCol.
G = pCol.
B = 255;
241 pca.setPointRGBu8(i,pCol.
R,pCol.
G,pCol.
B);
250 if (takeIntoAccountSensorPoseOnRobot || robotPoseInTheWorld)
253 if (takeIntoAccountSensorPoseOnRobot)
255 if (robotPoseInTheWorld)
259 Eigen::Matrix<float,4,1> pt, pt_transf;
262 for (
size_t i=0;i<WH;i++)
264 pca.getPointXYZ(i,pt[0],pt[1],pt[2]);
265 pt_transf.noalias() = HM*pt;
266 pca.setPointXYZ(i,pt_transf[0],pt_transf[1],pt_transf[2]);
272 template <
class POINTMAP>
276 for (
int r=0;r<H;r++)
277 for (
int c=0;c<W;c++)
279 const float D = rangeImage.coeff(r,c);
280 pca.setPointXYZ(idx++,
289 template <
class POINTMAP>
294 const int W_4 = W >> 2;
296 EIGEN_ALIGN16
float xs[4],ys[4],zs[4];
297 for (
int r=0;r<H;r++)
299 const float *D_ptr = &rangeImage.coeffRef(r,0);
301 for (
int c=0;c<W_4;c++)
303 const __m128 D = _mm_load_ps(D_ptr);
305 const __m128 KY = _mm_load_ps(kys);
306 const __m128 KZ = _mm_load_ps(kzs);
308 _mm_storeu_ps(xs , D);
309 _mm_storeu_ps(ys , _mm_mul_ps(KY,D));
310 _mm_storeu_ps(zs , _mm_mul_ps(KZ,D));
315 pca.setPointXYZ(idx++,xs[0],ys[0],zs[0]);
316 pca.setPointXYZ(idx++,xs[1],ys[1],zs[1]);
317 pca.setPointXYZ(idx++,xs[2],ys[2],zs[2]);
318 pca.setPointXYZ(idx++,xs[3],ys[3],zs[3]);