NDEVR
API Documentation
RealSensePointSmoother.h
1#pragma once
2#include "RasterPointScanner/Headers/ViewportPointSmoother.hpp"
3#include "RasterPointScanner/Headers/RasterFrame.h"
4#include <librealsense2/rs.hpp>
5namespace NDEVR
6{
12 class RealSensePointSmoother : public ViewportPointSmoother<ColorNormalNode>
13 {
14 public:
18 RealSensePointSmoother(rs2_intrinsics intrinsics)
19 {
20 m_intrinsics.setScreenSize(Vector<2, uint04>(intrinsics.width, intrinsics.height));
21 m_intrinsics.setFx({ intrinsics.fx,intrinsics.fy });
22 m_intrinsics.pp[X] = intrinsics.ppx;
23 m_intrinsics.pp[Y] = intrinsics.ppy;
24 for(uint01 i = 0; i < 5; i++)
25 m_intrinsics.coeffs[i] = intrinsics.coeffs[i];
26 }
27 /*Vertex<3, fltp04> pixelToPoint(Vertex<3, fltp04> pixel) const final override
28 {
29 /*
30 pixel[X] *= m_inv_pixel_multiplier;
31 pixel[Y] *= m_inv_pixel_multiplier;
32 Vector<3, fltp04> location;
33 rs2_deproject_pixel_to_point(&location[0], &m_intrinics, &pixel[0], pixel[2]);
34 return location;
35 pixel[X] *= m_inv_pixel_multiplier;
36 pixel[Y] *= m_inv_pixel_multiplier;
37
38 const auto& intr = m_intrinics;
39 const fltp04 ppx = intr.ppx;
40 const fltp04 ppy = intr.ppy;
41 const fltp04* k = intr.coeffs; // distortion coeffs: [k1, k2, p1, p2, k3]
42
43 fltp04 x = (pixel[X] - ppx) * m_inv_f[X];
44 fltp04 y = (pixel[Y] - ppy) * m_inv_f[Y];
45 const fltp04 xo = x;
46 const fltp04 yo = y;
47
48 for (int i = 0; i < 5; ++i)
49 {
50 const fltp04 r2 = x * x + y * y;
51 const fltp04 r4 = r2 * r2;
52 const fltp04 r6 = r4 * r2;
53
54 // inverse distortion scale
55 const fltp04 icdist = fltp04(1) / (fltp04(1) + k[0] * r2 + k[1] * r4 + k[4] * r6);
56
57 const fltp04 xq = x * icdist;
58 const fltp04 yq = y * icdist;
59
60 const fltp04 xq2 = xq * xq;
61 const fltp04 yq2 = yq * yq;
62
63 const fltp04 delta_x = 2 * k[2] * xq * yq + k[3] * (r2 + 2 * xq2);
64 const fltp04 delta_y = 2 * k[3] * xq * yq + k[2] * (r2 + 2 * yq2);
65
66 x = (xo - delta_x) * icdist;
67 y = (yo - delta_y) * icdist;
68 }
69
70 return {
71 pixel[Z] * x,
72 pixel[Z] * y,
73 pixel[Z]
74 };
75 }
76 Vertex<2, fltp04> pointToPixel(Vertex<3, fltp04> location) const final override
77 {
78 /*
79 if (!m_camera_location_bounds.contains(location.as<2, fltp04>() / cast<fltp04>(location[Z])))
80 return Constant<Vector<2, fltp04>>::Invalid;
81 Vertex<2, fltp04> pixel;
82 rs2_project_point_to_pixel(&pixel[0], &m_intrinics, &location[0]);
83 return m_pixel_multiplier * pixel;
84 }
85 Vertex<2, fltp04> xy;
86 {
87 const fltp04 iz = fltp04(1) / cast<fltp04>(location[Z]);
88 const fltp04 x0 = cast<fltp04>(location[X]) * iz;
89 const fltp04 y0 = cast<fltp04>(location[Y]) * iz;
90 xy[X] = x0;
91 xy[Y] = y0;
92 }
93 if (!m_camera_location_bounds.contains(xy))
94 return Constant<Vector<2, fltp04>>::Invalid;
95
96 const fltp04 x0 = xy[X];
97 const fltp04 y0 = xy[Y];
98 const fltp04 x2 = x0 * x0;
99 const fltp04 y2 = y0 * y0;
100 const fltp04 r2 = x2 + y2;
101
102 const fltp04 k1 = m_intrinics.coeffs[0];
103 const fltp04 k2 = m_intrinics.coeffs[1];
104 const fltp04 p1 = m_intrinics.coeffs[2];
105 const fltp04 p2 = m_intrinics.coeffs[3];
106 const fltp04 k3 = m_intrinics.coeffs[4];
107
108 const fltp04 f = std::fma(std::fma(std::fma(k3, r2, k2), r2, k1), r2, fltp04(1));
109 const fltp04 xr = x0 * f;
110 const fltp04 yr = y0 * f;
111
112 const fltp04 two_xy = fltp04(2) * x0 * y0;
113 const fltp04 dx = xr + p1 * two_xy + p2 * (r2 + fltp04(2) * x2);
114 const fltp04 dy = yr + p2 * two_xy + p1 * (r2 + fltp04(2) * y2);
115
116 Vertex<2, fltp04> pixel;
117 pixel[0] = std::fma(dx, m_intrinics.fx, m_intrinics.ppx);
118 pixel[1] = std::fma(dy, m_intrinics.fy, m_intrinics.ppy);
119 return m_pixel_multiplier * pixel;
120 }*/
121 /*void setViewSize(const Vector<2, uint04>& view_size) final override
122 {
123 ViewportPointSmoother::setViewSize(view_size);
124 m_pixel_multiplier = m_view_size_f[X] / cast<fltp04>(m_intrinics.width);
125 m_inv_pixel_multiplier = 1.0f / m_pixel_multiplier;
126 }
127 RealSensePointSmoother* clone()
128 {
129 RealSensePointSmoother* smoother = new RealSensePointSmoother(m_intrinics);
130 smoother->setViewSize(m_view_size_i);
131 smoother->setBlockTransform(m_block_mat);
132 smoother->m_frame_reduction = m_frame_reduction;
133 return smoother;
134 }*/
135 };
136}
RealSensePointSmoother(rs2_intrinsics intrinsics)
Constructs the point smoother from RealSense camera intrinsics.
A fixed-size array with N dimensions used as the basis for geometric and mathematical types.
Definition Vector.hpp:62
The primary namespace for the NDEVR SDK.
uint8_t uint01
-Defines an alias representing a 1 byte, unsigned integer -Can represent exact integer values 0 throu...