1 #ifndef CALICO_SENSORS_CAMERA_MODELS_H_
2 #define CALICO_SENSORS_CAMERA_MODELS_H_
4 #include "calico/typedefs.h"
8 #include "absl/status/statusor.h"
9 #include "calico/statusor_macros.h"
10 #include "Eigen/Dense"
44 const Eigen::VectorX<T>& intrinsics,
45 const Eigen::Vector3<T>& point)
const;
54 const Eigen::VectorX<T>& intrinsics,
55 const Eigen::Vector2<T>& pixel)
const;
69 static std::unique_ptr<CameraModel>
Create(
81 static constexpr
int kNumberOfParameters = 8;
104 template <
typename T>
106 const Eigen::VectorX<T>& intrinsics,
107 const Eigen::Vector3<T>& point) {
108 if (point.z() <= T(0.0)) {
109 return absl::InvalidArgumentError(
110 "Camera point is behind the camera. Cannot project.");
112 if (intrinsics.size() != kNumberOfParameters) {
113 return absl::InvalidArgumentError(absl::StrCat(
114 "Invalid number of intrinsics parameters provided. Expected ",
115 kNumberOfParameters,
". Got ", intrinsics.size()));
118 const T& f = intrinsics(0);
119 const T& cx = intrinsics(1);
120 const T& cy = intrinsics(2);
121 const T& k1 = intrinsics(3);
122 const T& k2 = intrinsics(4);
123 const T& p1 = intrinsics(5);
124 const T& p2 = intrinsics(6);
125 const T& k3 = intrinsics(7);
126 Eigen::Vector2<T> projection(point.x() / point.z(), point.y() / point.z());
127 const T x = projection.x();
128 const T y = projection.y();
129 const T r2 = projection.squaredNorm();
130 const T s = T(1.0) + r2 * (k1 + r2 * (k2 + r2 * k3));
134 projection.x() += T(2.0) * p1 * x * y + p2 * (r2 + T(2.0) * x * x);
135 projection.y() += T(2.0) * p2 * x * y + p1 * (r2 + T(2.0) * y * y);
138 projection.x() += cx;
139 projection.y() += cy;
156 template <
typename T>
158 const Eigen::VectorX<T>& intrinsics,
159 const Eigen::Vector2<T>& pixel,
160 int max_iterations = 30) {
161 constexpr T kSmallValue = T(1e-14);
162 if (intrinsics.size() != kNumberOfParameters) {
163 return absl::InvalidArgumentError(absl::StrCat(
164 "Expected ", kNumberOfParameters,
" parameters for intrinsics. Got ",
167 const T& f = intrinsics(0);
168 const T& cx = intrinsics(1);
169 const T& cy = intrinsics(2);
170 const T& k1 = intrinsics(3);
171 const T& k2 = intrinsics(4);
172 const T& p1 = intrinsics(5);
173 const T& p2 = intrinsics(6);
174 const T& k3 = intrinsics(7);
175 const T inv_f = T(1.0) / f;
177 const T xd0 = inv_f * (pixel.x() - cx);
178 const T yd0 = inv_f * (pixel.y() - cy);
183 for (
int i = 0; i < max_iterations; ++i) {
186 const T r2 = x2 + y2;
187 const T s = T(1.0) + r2 * (k1 + r2 * (k2 + r2 * k3));
189 const T err_x = xd0 - (s * x + 2 * p1 * x * y + p2 * (r2 + 2 * x2));
190 const T err_y = yd0 - (s * y + 2 * p2 * x * y + p1 * (r2 + 2 * y2));
192 if (std::abs(err_x) + std::abs(err_y) < kSmallValue) {
198 const T ds = 2 * (k1 + r2 * (2 * k2 + 3 * k3 * r2));
199 const T a = ds * x2 + s + 2 * (p1 * y + 3 * p2 * x);
200 const T b = ds * x * y + 2 * (p1 * x + p2 * y);
201 const T c = ds * y2 + s + 2 * (p2 * x + 3 * p1 * y);
203 const T det = T(1.0) / (a * c - b * b);
204 const T alpha = det * c;
205 const T beta = -det * b;
206 const T gamma = det * a;
208 x = x + (alpha * err_x + beta * err_y);
209 y = y + (beta * err_x + gamma * err_y);
211 Eigen::Vector3<T> bearing_vector(x, y, 1);
212 bearing_vector.normalize();
213 return bearing_vector;
221 return kNumberOfParameters;
233 static constexpr
int kNumberOfParameters = 11;
256 template <
typename T>
258 const Eigen::VectorX<T>& intrinsics,
259 const Eigen::Vector3<T>& point) {
260 if (point.z() <= T(0.0)) {
261 return absl::InvalidArgumentError(
262 "Camera point is behind the camera. Cannot project.");
264 if (intrinsics.size() != kNumberOfParameters) {
265 return absl::InvalidArgumentError(absl::StrCat(
266 "Invalid number of intrinsics parameters provided. Expected ",
267 kNumberOfParameters,
". Got ", intrinsics.size()));
270 const T& f = intrinsics(0);
271 const T& cx = intrinsics(1);
272 const T& cy = intrinsics(2);
273 const T& k1 = intrinsics(3);
274 const T& k2 = intrinsics(4);
275 const T& p1 = intrinsics(5);
276 const T& p2 = intrinsics(6);
277 const T& k3 = intrinsics(7);
278 const T& k4 = intrinsics(8);
279 const T& k5 = intrinsics(9);
280 const T& k6 = intrinsics(10);
281 Eigen::Vector2<T> projection(point.x() / point.z(), point.y() / point.z());
282 const T x = projection.x();
283 const T y = projection.y();
284 const T r2 = projection.squaredNorm();
285 const T s_num = T(1.0) + r2 * (k1 + r2 * (k2 + r2 * k3));
286 const T s_den = T(1.0) + r2 * (k4 + r2 * (k5 + r2 * k6));
287 const T s = s_num / s_den;
291 projection.x() += T(2.0) * p1 * x * y + p2 * (r2 + T(2.0) * x * x);
292 projection.y() += T(2.0) * p2 * x * y + p1 * (r2 + T(2.0) * y * y);
295 projection.x() += cx;
296 projection.y() += cy;
313 template <
typename T>
315 const Eigen::VectorX<T>& intrinsics,
316 const Eigen::Vector2<T>& pixel,
317 int max_iterations = 30) {
318 constexpr T kSmallValue = T(1e-14);
319 if (intrinsics.size() != kNumberOfParameters) {
320 return absl::InvalidArgumentError(absl::StrCat(
321 "Expected ", kNumberOfParameters,
" parameters for intrinsics. Got ",
324 const T& f = intrinsics(0);
325 const T& cx = intrinsics(1);
326 const T& cy = intrinsics(2);
327 const T& k1 = intrinsics(3);
328 const T& k2 = intrinsics(4);
329 const T& p1 = intrinsics(5);
330 const T& p2 = intrinsics(6);
331 const T& k3 = intrinsics(7);
332 const T& k4 = intrinsics(8);
333 const T& k5 = intrinsics(9);
334 const T& k6 = intrinsics(10);
335 const T inv_f = T(1.0) / f;
337 const T xd0 = inv_f * (pixel.x() - cx);
338 const T yd0 = inv_f * (pixel.y() - cy);
343 for (
int i = 0; i < max_iterations; ++i) {
346 const T r2 = x2 + y2;
347 const T s_num = T(1.0) + r2 * (k1 + r2 * (k2 + r2 * k3));
348 const T s_den = T(1.0) + r2 * (k4 + r2 * (k5 + r2 * k6));
349 const T s = s_num / s_den;
351 const T err_x = xd0 - (s * x + 2 * p1 * x * y + p2 * (r2 + 2 * x2));
352 const T err_y = yd0 - (s * y + 2 * p2 * x * y + p1 * (r2 + 2 * y2));
354 if (std::abs(err_x) + std::abs(err_y) < kSmallValue) {
360 const T dnum = k1 + r2 * (T(2.0) * k2 + T(3.0) * r2 * k3);
361 const T dden = k4 + r2 * (T(2.0) * k5 + T(3.0) * r2 * k6);
362 const T ds = (dnum - s * dden) / s_den;
363 const T a = ds * x2 + s + 2 * (p1 * y + 3 * p2 * x);
364 const T b = ds * x * y + 2 * (p1 * x + p2 * y);
365 const T c = ds * y2 + s + 2 * (p2 * x + 3 * p1 * y);
367 const T det = T(1.0) / (a * c - b * b);
368 const T alpha = det * c;
369 const T beta = -det * b;
370 const T gamma = det * a;
372 x = x + (alpha * err_x + beta * err_y);
373 y = y + (beta * err_x + gamma * err_y);
375 Eigen::Vector3<T> bearing_vector(x, y, 1);
376 bearing_vector.normalize();
377 return bearing_vector;
385 return kNumberOfParameters;
397 static constexpr
int kNumberOfParameters = 7;
419 template <
typename T>
421 const Eigen::VectorX<T>& intrinsics,
422 const Eigen::Vector3<T>& point) {
423 if (point.z() <= T(0.0)) {
424 return absl::InvalidArgumentError(
425 "Camera point is behind the camera. Cannot project.");
427 if (intrinsics.size() != kNumberOfParameters) {
428 return absl::InvalidArgumentError(absl::StrCat(
429 "Invalid number of intrinsics parameters provided. Expected ",
430 kNumberOfParameters,
". Got ", intrinsics.size()));
433 const T& f = intrinsics(0);
434 const T& cx = intrinsics(1);
435 const T& cy = intrinsics(2);
436 const T& k1 = intrinsics(3);
437 const T& k2 = intrinsics(4);
438 const T& k3 = intrinsics(5);
439 const T& k4 = intrinsics(6);
441 Eigen::Vector2<T> projection(point.x() / point.z(), point.y() / point.z());
442 const T r = projection.norm();
446 s = T(1.0) + r2 * (k1 - T(1.0/3.0) + r2 * (-k1 + k2 + 0.2));
448 const T theta = atan(r);
449 const T theta2 = theta * theta;
450 const T theta_d = theta * (T(1.0) + theta2 *
452 (k2 + theta2 * (k3 + theta2 * k4))));
459 projection.x() += cx;
460 projection.y() += cy;
478 template <
typename T>
480 const Eigen::VectorX<T>& intrinsics,
481 const Eigen::Vector2<T>& pixel,
482 int max_iterations = 100) {
483 constexpr T kSmallValue = T(1e-14);
484 constexpr T kSmallR = T(1e-9);
485 if (intrinsics.size() != kNumberOfParameters) {
486 return absl::InvalidArgumentError(absl::StrCat(
487 "Expected ", kNumberOfParameters,
" parameters for intrinsics. Got ",
490 const T& f = intrinsics(0);
491 const T& cx = intrinsics(1);
492 const T& cy = intrinsics(2);
493 const T& k1 = intrinsics(3);
494 const T& k2 = intrinsics(4);
495 const T& k3 = intrinsics(5);
496 const T& k4 = intrinsics(6);
497 const T inv_f = T(1.0) / f;
499 const T xd0 = inv_f * (pixel.x() - cx);
500 const T yd0 = inv_f * (pixel.y() - cy);
502 if (xd0 * xd0 + yd0 * yd0 < kSmallValue) {
503 return Eigen::Vector3<T>(xd0, yd0, 1.0);
509 for (
int i = 0; i < max_iterations; ++i) {
510 const T r2 = x * x + y * y;
511 const T r = sqrt(r2);
515 s = T(1.0) + r2 * (k1 - T(1.0/3.0) + r2 * (-k1 + k2 + 0.2));
517 const T theta = atan(r);
518 const T theta2 = theta * theta;
519 const T theta_d = theta * (T(1.0) + theta2 *
521 (k2 + theta2 * (k3 + theta2 * k4))));
524 const T err_x = xd0 - s * x;
525 const T err_y = yd0 - s * y;
527 if (std::abs(err_x) + std::abs(err_y) < kSmallValue) {
536 const T q = T(2.0) * (k1 - T(1.0 / 3.0)) + T(4.0) * r2 * (-k1 + k2 + T(0.2));
537 const T dsdx = q * x;
538 const T dsdy = q * y;
543 const T theta = atan(r);
544 const T theta2 = theta * theta;
545 const T theta_d = theta * (1.0 + theta2 *
547 (k2 + theta2 * (k3 + theta2 * k4))));
548 const T s = theta_d / r;
550 const T drdx = x / r;
551 const T drdy = y / r;
552 const T inv_r = T(1.0) / r;
553 const T dthetadr = T(1.0) / (T(1.0) + r2);
554 const T dthetaddtheta =
555 T(1.0) + theta2 * (T(3.0) * k1 + theta2 *
556 (T(5.0) * k2 + theta2 *
557 (T(7.0) * k3 + theta2 * T(9.0) * k4)));
558 const T dthetaddr = dthetaddtheta * dthetadr;
559 const T dsdr = dthetaddr*inv_r + s * inv_r;
560 a = dsdr * drdx * x + s;
561 b = dsdr * x * y / r;
562 c = dsdr * drdy * y + s;
565 const T det = T(1.0) / (a * c - b * b);
566 if (std::isnan(det)) {
567 std::cout <<
"r: " << r << std::endl;
568 std::cout <<
"a, b, c: " << a <<
", " << b <<
", " << c << std::endl;
569 std::cout <<
"det: " << det << std::endl;
571 const T alpha = det * c;
572 const T beta = -det * b;
573 const T gamma = det * a;
575 x = x + (alpha * err_x + beta * err_y);
576 y = y + (beta * err_x + gamma * err_y);
578 Eigen::Vector3<T> bearing_vector(x, y, 1);
579 bearing_vector.normalize();
580 return bearing_vector;
588 return kNumberOfParameters;
598 static constexpr
int kNumberOfParameters = 5;
622 template <
typename T>
624 const Eigen::VectorX<T>& intrinsics,
625 const Eigen::Vector3<T>& point) {
626 if (intrinsics.size() != kNumberOfParameters) {
627 return absl::InvalidArgumentError(absl::StrCat(
628 "Invalid number of intrinsics parameters provided. Expected ",
629 kNumberOfParameters,
". Got ", intrinsics.size()));
631 const T& xi = intrinsics(3);
632 const T& alpha = intrinsics(4);
633 const T w1 = alpha > T(0.5) ?
634 (T(1.0) - alpha) / alpha : alpha / (T(1.0) - alpha);
635 const T num = w1 + xi;
636 const T w2_sq = num * num / (T(2.0) * w1 * xi + xi * xi + T(1.0));
637 const T r2 = point.squaredNorm();
638 if (point.z() * point.z() <= -w2_sq * r2) {
639 return absl::InvalidArgumentError(
640 "Invalid point. Cannot project.");
643 const T& f = intrinsics(0);
644 const T& cx = intrinsics(1);
645 const T& cy = intrinsics(2);
646 const T r = sqrt(r2);
647 const T d = sqrt(r2 * (T(1.0) + xi * xi) + T(2.0) * xi * r * point.z());
648 const T s = T(1.0) / (alpha * d + (T(1.0) - alpha) * (xi * r + point.z()));
650 Eigen::Vector2<T> projection(point.x(), point.y());
654 projection.x() += cx;
655 projection.y() += cy;
673 template <
typename T>
675 const Eigen::VectorX<T>& intrinsics,
676 const Eigen::Vector2<T>& pixel) {
677 if (intrinsics.size() != kNumberOfParameters) {
678 return absl::InvalidArgumentError(absl::StrCat(
679 "Expected ", kNumberOfParameters,
" parameters for intrinsics. Got ",
682 const T& f = intrinsics(0);
683 const T& cx = intrinsics(1);
684 const T& cy = intrinsics(2);
685 const T& xi = intrinsics(3);
686 const T& alpha = intrinsics(4);
687 const T inv_f = T(1.0) / f;
689 T mx = inv_f * (pixel.x() - cx);
690 T my = inv_f * (pixel.y() - cy);
692 const T r2 = mx * mx + my * my;
694 (1.0 - alpha * alpha * r2) /
695 (alpha * sqrt(1.0 - (2.0 * alpha - 1.0) * r2) + 1.0 - alpha);
696 const T mz2 = mz * mz;
697 const T inv_s = (mz * xi + sqrt(mz2 + (1 - xi * xi) * r2)) / (mz2 + r2);
698 Eigen::Vector3<T> bearing_vector(inv_s * mx, inv_s * my, inv_s * mz - xi);
699 bearing_vector.normalize();
700 return bearing_vector;
708 return kNumberOfParameters;
718 static constexpr
int kNumberOfParameters = 4;
739 template <
typename T>
741 const Eigen::VectorX<T>& intrinsics,
742 const Eigen::Vector3<T>& point) {
743 if (intrinsics.size() != kNumberOfParameters) {
744 return absl::InvalidArgumentError(absl::StrCat(
745 "Invalid number of intrinsics parameters provided. Expected ",
746 kNumberOfParameters,
". Got ", intrinsics.size()));
748 const T& f = intrinsics(0);
749 const T& cx = intrinsics(1);
750 const T& cy = intrinsics(2);
751 const T& w = intrinsics(3);
752 if (point.z() <= T(0.0)) {
753 return absl::InvalidArgumentError(
754 "Invalid point. Cannot project.");
757 Eigen::Vector2<T> projection(point.x(), point.y());
758 projection /= point.z();
759 const T r = projection.norm();
766 const T tan_term = T(2.0) * tan(w * T(0.5));
771 s = atan(r * tan_term) / (r * w);
778 projection.x() += cx;
779 projection.y() += cy;
797 template <
typename T>
799 const Eigen::VectorX<T>& intrinsics,
800 const Eigen::Vector2<T>& pixel) {
801 if (intrinsics.size() != kNumberOfParameters) {
802 return absl::InvalidArgumentError(absl::StrCat(
803 "Expected ", kNumberOfParameters,
" parameters for intrinsics. Got ",
806 const T& f = intrinsics(0);
807 const T& cx = intrinsics(1);
808 const T& cy = intrinsics(2);
809 const T& w = intrinsics(3);
810 const T inv_f = T(1.0) / f;
812 const T mx = inv_f * (pixel.x() - cx);
813 const T my = inv_f * (pixel.y() - cy);
815 const T r = sqrt(mx * mx + my * my);
821 const T tan_term = T(2.0) * tan(w * T(0.5));
826 eta = sin(r * w) / (r * tan_term);
829 Eigen::Vector3<T> pm(eta * mx, eta * my, cos(r * w));
839 return kNumberOfParameters;
850 static constexpr
int kNumberOfParameters = 4;
871 template <
typename T>
873 const Eigen::VectorX<T>& intrinsics,
874 const Eigen::Vector3<T>& point) {
875 if (intrinsics.size() != kNumberOfParameters) {
876 return absl::InvalidArgumentError(absl::StrCat(
877 "Invalid number of intrinsics parameters provided. Expected ",
878 kNumberOfParameters,
". Got ", intrinsics.size()));
880 const T& alpha = intrinsics(3);
881 const T w = alpha > T(0.5) ?
882 (T(1.0) - alpha) / alpha : alpha / (T(1.0) - alpha);
883 const T d = point.norm();
884 if (point.z() <= -w * d) {
885 return absl::InvalidArgumentError(
886 "Invalid point. Cannot project.");
888 const T& f = intrinsics(0);
889 const T& cx = intrinsics(1);
890 const T& cy = intrinsics(2);
892 Eigen::Vector2<T> projection(point.x(), point.y());
893 T s = T(1.0) / (alpha * d + (T(1.0) - alpha) * point.z());
898 projection.x() += cx;
899 projection.y() += cy;
919 template <
typename T>
921 const Eigen::VectorX<T>& intrinsics,
922 const Eigen::Vector2<T>& pixel) {
923 if (intrinsics.size() != kNumberOfParameters) {
924 return absl::InvalidArgumentError(absl::StrCat(
925 "Expected ", kNumberOfParameters,
" parameters for intrinsics. Got ",
928 const T& f = intrinsics(0);
929 const T& cx = intrinsics(1);
930 const T& cy = intrinsics(2);
931 const T& alpha = intrinsics(3);
932 const T inv_f = T(1.0) / f;
934 const T one_m_alpha = T(1.0) - alpha;
935 const T mx = one_m_alpha * inv_f * (pixel.x() - cx);
936 const T my = one_m_alpha * inv_f * (pixel.y() - cy);
937 const T r2 = mx * mx + my * my;
938 const T xi = alpha / one_m_alpha;
940 const T s = (xi + sqrt(T(1.0) + (T(1.0) - xi * xi) * r2)) / (T(1.0) + r2);
941 Eigen::Vector3d bearing_vector(mx, my, 1.0);
943 bearing_vector.z() -= xi;
944 bearing_vector.normalize();
945 return bearing_vector;
953 return kNumberOfParameters;
963 static constexpr
int kNumberOfParameters = 5;
984 template <
typename T>
986 const Eigen::VectorX<T>& intrinsics,
987 const Eigen::Vector3<T>& point) {
988 if (intrinsics.size() != kNumberOfParameters) {
989 return absl::InvalidArgumentError(absl::StrCat(
990 "Invalid number of intrinsics parameters provided. Expected ",
991 kNumberOfParameters,
". Got ", intrinsics.size()));
993 const T& alpha = intrinsics(3);
994 const T& beta = intrinsics(4);
995 const T d = sqrt(beta * point.head(2).norm() + point.z() * point.z());
996 const T w = alpha > T(0.5) ?
997 (T(1.0) - alpha) / alpha : alpha / (T(1.0) - alpha);
998 if (point.z() <= -w * d) {
999 return absl::InvalidArgumentError(
1000 "Invalid point. Cannot project.");
1002 const T& f = intrinsics(0);
1003 const T& cx = intrinsics(1);
1004 const T& cy = intrinsics(2);
1006 Eigen::Vector2<T> projection(point.x(), point.y());
1007 T s = T(1.0) / (alpha * d + (T(1.0) - alpha) * point.z());
1012 projection.x() += cx;
1013 projection.y() += cy;
1035 template <
typename T>
1037 const Eigen::VectorX<T>& intrinsics,
1038 const Eigen::Vector2<T>& pixel) {
1039 if (intrinsics.size() != kNumberOfParameters) {
1040 return absl::InvalidArgumentError(absl::StrCat(
1041 "Expected ", kNumberOfParameters,
" parameters for intrinsics. Got ",
1042 intrinsics.size()));
1044 const T& f = intrinsics(0);
1045 const T& cx = intrinsics(1);
1046 const T& cy = intrinsics(2);
1047 const T& alpha = intrinsics(3);
1048 const T& beta = intrinsics(4);
1049 const T inv_f = T(1.0) / f;
1051 const T mx = inv_f * (pixel.x() - cx);
1052 const T my = inv_f * (pixel.y() - cy);
1053 const T r2 = mx * mx + my * my;
1054 const T mz = (T(1.0) - beta * alpha * alpha * r2) /
1055 (alpha * sqrt(T(1.0) - (T(2.0) * alpha - T(1.0)) * beta * r2)
1056 + (T(1.0) - alpha));
1058 const T s = T(1.0) / sqrt(r2 + mz * mz);
1059 Eigen::Vector3d bearing_vector(mx, my, mz);
1060 bearing_vector *= s;
1061 bearing_vector.normalize();
1062 return bearing_vector;
1070 return kNumberOfParameters;
1075 template <
typename T>
1077 const Eigen::VectorX<T>& intrinsics,
1078 const Eigen::Vector3<T>& point)
const {
1079 if (
const auto derived =
dynamic_cast<const OpenCv5Model*
>(
this)) {
1080 return derived->ProjectPoint(intrinsics, point);
1082 if (
const auto derived =
dynamic_cast<const OpenCv8Model*
>(
this)) {
1083 return derived->ProjectPoint(intrinsics, point);
1086 return derived->ProjectPoint(intrinsics, point);
1089 return derived->ProjectPoint(intrinsics, point);
1092 return derived->ProjectPoint(intrinsics, point);
1095 return derived->ProjectPoint(intrinsics, point);
1097 if (
const auto derived =
1099 return derived->ProjectPoint(intrinsics, point);
1101 return absl::InvalidArgumentError(absl::StrCat(
1102 "ProjectPoint for camera model ", this->
GetType(),
" not supported."));
1105 template <
typename T>
1107 const Eigen::VectorX<T>& intrinsics,
1108 const Eigen::Vector2<T>& pixel)
const {
1109 if (
const auto derived =
dynamic_cast<const OpenCv5Model*
>(
this)) {
1110 return derived->UnprojectPixel(intrinsics, pixel);
1112 if (
const auto derived =
dynamic_cast<const OpenCv8Model*
>(
this)) {
1113 return derived->UnprojectPixel(intrinsics, pixel);
1116 return derived->UnprojectPixel(intrinsics, pixel);
1119 return derived->UnprojectPixel(intrinsics, pixel);
1122 return derived->UnprojectPixel(intrinsics, pixel);
1125 return derived->UnprojectPixel(intrinsics, pixel);
1127 if (
const auto derived =
1129 return derived->UnprojectPixel(intrinsics, pixel);
1131 return absl::InvalidArgumentError(absl::StrCat(
1132 "UnprojectPixel for camera model ", this->
GetType(),
" not supported."));
Base class for camera models.
Definition: camera_models.h:36
virtual CameraIntrinsicsModel GetType() const =0
Getter for camera model type.
absl::StatusOr< Eigen::Vector3< T > > UnprojectPixel(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector2< T > &pixel) const
Definition: camera_models.h:1106
virtual int NumberOfParameters() const =0
Getter for the number of parameters for this camera model.
static std::unique_ptr< CameraModel > Create(CameraIntrinsicsModel camera_model)
Definition: camera_models.cpp:5
absl::StatusOr< Eigen::Vector2< T > > ProjectPoint(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector3< T > &point) const
Definition: camera_models.h:1076
Definition: camera_models.h:596
static absl::StatusOr< Eigen::Vector3< T > > UnprojectPixel(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector2< T > &pixel)
Definition: camera_models.h:674
static absl::StatusOr< Eigen::Vector2< T > > ProjectPoint(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector3< T > &point)
Definition: camera_models.h:623
CameraIntrinsicsModel GetType() const final
Getter for camera model type.
Definition: camera_models.h:703
int NumberOfParameters() const final
Getter for the number of parameters for this camera model.
Definition: camera_models.h:707
Definition: camera_models.h:961
int NumberOfParameters() const final
Getter for the number of parameters for this camera model.
Definition: camera_models.h:1069
static absl::StatusOr< Eigen::Vector3< T > > UnprojectPixel(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector2< T > &pixel)
Definition: camera_models.h:1036
CameraIntrinsicsModel GetType() const final
Getter for camera model type.
Definition: camera_models.h:1065
static absl::StatusOr< Eigen::Vector2< T > > ProjectPoint(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector3< T > &point)
Definition: camera_models.h:985
Definition: camera_models.h:716
static absl::StatusOr< Eigen::Vector2< T > > ProjectPoint(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector3< T > &point)
Definition: camera_models.h:740
CameraIntrinsicsModel GetType() const final
Getter for camera model type.
Definition: camera_models.h:834
int NumberOfParameters() const final
Getter for the number of parameters for this camera model.
Definition: camera_models.h:838
static absl::StatusOr< Eigen::Vector3< T > > UnprojectPixel(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector2< T > &pixel)
Definition: camera_models.h:798
Definition: camera_models.h:395
CameraIntrinsicsModel GetType() const final
Getter for camera model type.
Definition: camera_models.h:583
int NumberOfParameters() const final
Getter for the number of parameters for this camera model.
Definition: camera_models.h:587
static absl::StatusOr< Eigen::Vector3< T > > UnprojectPixel(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector2< T > &pixel, int max_iterations=100)
Definition: camera_models.h:479
static absl::StatusOr< Eigen::Vector2< T > > ProjectPoint(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector3< T > &point)
Definition: camera_models.h:420
Definition: camera_models.h:79
static absl::StatusOr< Eigen::Vector3< T > > UnprojectPixel(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector2< T > &pixel, int max_iterations=30)
Definition: camera_models.h:157
static absl::StatusOr< Eigen::Vector2< T > > ProjectPoint(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector3< T > &point)
Definition: camera_models.h:105
CameraIntrinsicsModel GetType() const final
Getter for camera model type.
Definition: camera_models.h:216
int NumberOfParameters() const final
Getter for the number of parameters for this camera model.
Definition: camera_models.h:220
Definition: camera_models.h:231
static absl::StatusOr< Eigen::Vector2< T > > ProjectPoint(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector3< T > &point)
Definition: camera_models.h:257
CameraIntrinsicsModel GetType() const final
Getter for camera model type.
Definition: camera_models.h:380
static absl::StatusOr< Eigen::Vector3< T > > UnprojectPixel(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector2< T > &pixel, int max_iterations=30)
Definition: camera_models.h:314
int NumberOfParameters() const final
Getter for the number of parameters for this camera model.
Definition: camera_models.h:384
Definition: camera_models.h:848
CameraIntrinsicsModel GetType() const final
Getter for camera model type.
Definition: camera_models.h:948
int NumberOfParameters() const final
Getter for the number of parameters for this camera model.
Definition: camera_models.h:952
static absl::StatusOr< Eigen::Vector2< T > > ProjectPoint(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector3< T > &point)
Definition: camera_models.h:872
static absl::StatusOr< Eigen::Vector3< T > > UnprojectPixel(const Eigen::VectorX< T > &intrinsics, const Eigen::Vector2< T > &pixel)
Definition: camera_models.h:920
Sensors namespace.
Definition: accelerometer.cpp:8
CameraIntrinsicsModel
Camera model types.
Definition: camera_models.h:16
@ kExtendedUnifiedCamera
Extended unified camera model.
@ kOpenCv5
5-parameter OpenCV model.
@ kKannalaBrandt
Kannala-Brandt model.
@ kUnifiedCamera
Unified camera model.
@ kFieldOfView
Field-of-View model.
@ kOpenCv8
8-parameter OpenCV model.
@ kDoubleSphere
Double-Sphere model.