21 #ifndef DATA_INTERFACE_GPU_H
22 #define DATA_INTERFACE_GPU_H
44 #define CameraT CameraT_
45 #define Point3D Point3D_
66 template <
class CameraX>
72 for (
int i = 0; i < 3; ++i)
73 for (
int j = 0; j < 3; ++j)
m[i][j] = (
float_t)cam.m[i][j];
86 template <
class Float>
92 template <
class Float>
102 template <
class Float>
111 template <
class Float>
116 template <
class Float>
124 template <
class Float>
126 double a = sqrt(r[0] * r[0] + r[1] * r[1] + r[2] * r[2]);
127 double ct = a == 0.0 ? 0.5 : (1.0 - cos(a)) / a / a;
128 double st = a == 0.0 ? 1 : sin(a) / a;
129 m[0][0] =
float_t(1.0 - (r[1] * r[1] + r[2] * r[2]) * ct);
130 m[0][1] =
float_t(r[0] * r[1] * ct - r[2] * st);
131 m[0][2] =
float_t(r[2] * r[0] * ct + r[1] * st);
132 m[1][0] =
float_t(r[0] * r[1] * ct + r[2] * st);
133 m[1][1] =
float_t(1.0 - (r[2] * r[2] + r[0] * r[0]) * ct);
134 m[1][2] =
float_t(r[1] * r[2] * ct - r[0] * st);
135 m[2][0] =
float_t(r[2] * r[0] * ct - r[1] * st);
136 m[2][1] =
float_t(r[1] * r[2] * ct + r[0] * st);
137 m[2][2] =
float_t(1.0 - (r[0] * r[0] + r[1] * r[1]) * ct);
139 template <
class Float>
141 double a = (
m[0][0] +
m[1][1] +
m[2][2] - 1.0) / 2.0;
142 const double epsilon = 0.01;
143 if (
fabs(
m[0][1] -
m[1][0]) < epsilon &&
144 fabs(
m[1][2] -
m[2][1]) < epsilon &&
145 fabs(
m[0][2] -
m[2][0]) < epsilon) {
146 if (
fabs(
m[0][1] +
m[1][0]) < 0.1 &&
fabs(
m[1][2] +
m[2][1]) < 0.1 &&
147 fabs(
m[0][2] +
m[2][0]) < 0.1 && a > 0.9) {
152 const Float ha = Float(sqrt(0.5) * 3.14159265358979323846);
153 double xx = (
m[0][0] + 1.0) / 2.0;
154 double yy = (
m[1][1] + 1.0) / 2.0;
155 double zz = (
m[2][2] + 1.0) / 2.0;
156 double xy = (
m[0][1] +
m[1][0]) / 4.0;
157 double xz = (
m[0][2] +
m[2][0]) / 4.0;
158 double yz = (
m[1][2] +
m[2][1]) / 4.0;
160 if ((xx > yy) && (xx > zz)) {
166 r[0] = Float(
t * 3.14159265358979323846);
167 r[1] = Float(xy /
t * 3.14159265358979323846);
168 r[2] = Float(xz /
t * 3.14159265358979323846);
170 }
else if (yy > zz) {
176 r[0] = Float(xy /
t * 3.14159265358979323846);
177 r[1] = Float(
t * 3.14159265358979323846);
178 r[2] = Float(yz /
t * 3.14159265358979323846);
186 r[0] = Float(xz /
t * 3.14159265358979323846);
187 r[1] = Float(yz /
t * 3.14159265358979323846);
188 r[2] = Float(
t * 3.14159265358979323846);
194 double b = 0.5 * a / sin(a);
195 r[0] = Float(b * (
m[2][1] -
m[1][2]));
196 r[1] = Float(b * (
m[0][2] -
m[2][0]));
197 r[2] = Float(b * (
m[1][0] -
m[0][1]));
201 template <
class Float>
203 double qq = sqrt(q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
204 double qw, qx, qy, qz;
214 m[0][0] =
float_t(qw * qw + qx * qx - qz * qz - qy * qy);
215 m[0][1] =
float_t(2 * qx * qy - 2 * qz * qw);
216 m[0][2] =
float_t(2 * qy * qw + 2 * qz * qx);
217 m[1][0] =
float_t(2 * qx * qy + 2 * qw * qz);
218 m[1][1] =
float_t(qy * qy + qw * qw - qz * qz - qx * qx);
219 m[1][2] =
float_t(2 * qz * qy - 2 * qx * qw);
220 m[2][0] =
float_t(2 * qx * qz - 2 * qy * qw);
221 m[2][1] =
float_t(2 * qy * qz + 2 * qw * qx);
222 m[2][2] =
float_t(qz * qz + qw * qw - qy * qy - qx * qx);
224 template <
class Float>
226 q[0] = 1 +
m[0][0] +
m[1][1] +
m[2][2];
227 if (q[0] > 0.000000001) {
228 q[0] = sqrt(q[0]) / 2.0;
229 q[1] = (
m[2][1] -
m[1][2]) / (4.0 * q[0]);
230 q[2] = (
m[0][2] -
m[2][0]) / (4.0 * q[0]);
231 q[3] = (
m[1][0] -
m[0][1]) / (4.0 * q[0]);
234 if (
m[0][0] >
m[1][1] &&
m[0][0] >
m[2][2]) {
235 s = 2.0 * sqrt(1.0 +
m[0][0] -
m[1][1] -
m[2][2]);
237 q[2] = (
m[0][1] +
m[1][0]) / s;
238 q[3] = (
m[0][2] +
m[2][0]) / s;
239 q[0] = (
m[1][2] -
m[2][1]) / s;
240 }
else if (
m[1][1] >
m[2][2]) {
241 s = 2.0 * sqrt(1.0 +
m[1][1] -
m[0][0] -
m[2][2]);
242 q[1] = (
m[0][1] +
m[1][0]) / s;
244 q[3] = (
m[1][2] +
m[2][1]) / s;
245 q[0] = (
m[0][2] -
m[2][0]) / s;
247 s = 2.0 * sqrt(1.0 +
m[2][2] -
m[0][0] -
m[1][1]);
248 q[1] = (
m[0][2] +
m[2][0]) / s;
249 q[2] = (
m[1][2] +
m[2][1]) / s;
251 q[0] = (
m[0][1] -
m[1][0]) / s;
256 template <
class Float>
259 for (
int i = 0; i < 3; ++i) {
260 for (
int j = 0; j < 3; ++j) {
265 template <
class Float>
268 for (
int i = 0; i < 3; ++i) {
269 for (
int j = 0; j < 3; ++j) {
270 r[k++] = Float(
m[i][j]);
275 return m[0][0] *
m[1][1] *
m[2][2] +
m[0][1] *
m[1][2] *
m[2][0] +
276 m[0][2] *
m[1][0] *
m[2][1] -
m[0][2] *
m[1][1] *
m[2][0] -
277 m[0][1] *
m[1][0] *
m[2][2] -
m[0][0] *
m[1][2] *
m[2][1];
280 template <
class Float>
286 template <
class Float>
293 template <
class Float>
296 for (
int j = 0; j < 3; ++j)
297 t[j] = -
float_t(
m[j][0] * c[0] +
m[j][1] * c[1] +
m[j][2] * c[2]);
299 template <
class Float>
302 for (
int j = 0; j < 3; ++j)
303 c[j] = -
float_t(
m[0][j] *
t[0] +
m[1][j] *
t[1] +
m[2][j] *
t[2]);
306 template <
class Float>
309 for (
int i = 3; i < 9; ++i)
m[0][i] = -
m[0][i];
315 template <
class Float>
319 for (
int i = 3; i < 9; ++i) ci.
m[0][i] = -ci.
m[0][i];
327 template <
class Float>
344 template <
class Float>
367 template <
class Float>
374 template <
class Float>
381 template <
class Float>
383 p[0] = (Float)
xyz[0];
384 p[1] = (Float)
xyz[1];
385 p[2] = (Float)
xyz[2];
387 template <
class Float>
388 void GetPoint(Float& x, Float& y, Float& z)
const {
405 template <
class Float>
409 template <
class Float>
414 template <
class Float>
__host__ __device__ float2 fabs(float2 v)
CameraT_< float > CameraT
Point3D_< float > Point3D
void GetInvertedRT(Float e[3], Float T[3]) const
void GetQuaternionRotation(Float q[4]) const
float_t GetMeasurementDistortion() const
void GetRodriguesRotation(Float r[3]) const
void GetInvertedR9T(Float e[9], Float T[3]) const
void SetTranslation(const Float T[3])
void GetTranslation(Float T[3]) const
void SetMatrixRotation(const Float *r)
void SetMeasurementDistortion(Float r)
void SetProjectionDistortion(const Float *r)
void SetProjectionDistortion(Float r)
float_t GetFocalLength() const
float_t GetNormalizedMeasurementDistortion() const
void SetInvertedR9T(const Float e[9], const Float T[3])
void SetCameraCenterAfterRotation(const Float c[3])
void SetQuaternionRotation(const Float q[4])
void SetInvertedRT(const Float e[3], const Float T[3])
void SetCameraT(const CameraX &cam)
void SetFocalLength(Float F)
void SetRodriguesRotation(const Float r[3])
float_t GetProjectionDistortion() const
void GetCameraCenter(Float c[3])
float GetRotationMatrixDeterminant() const
void GetMatrixRotation(Float *r) const
void SetNormalizedMeasurementDistortion(Float r)
Point2D(Float X, Float Y)
void GetPoint2D(Float &X, Float &Y) const
void SetPoint2D(Float X, Float Y)
void GetPoint(Float *p) const
void SetPoint(Float x, Float y, Float z)
void SetPoint(const Float *p)
void GetPoint(Float &x, Float &y, Float &z) const