| 43 | #include "okvis/cameras/RadialTangentialDistortion8.hpp" |
| 44 | |
| 45 | TEST(PinholeCamera, functions) { |
| 46 | const size_t NUM_POINTS = 100; |
| 47 | |
| 48 | // instantiate all possible versions of test cameras |
| 49 | std::vector<std::shared_ptr<okvis::cameras::CameraBase> > cameras; |
| 50 | cameras.push_back(okvis::cameras::PinholeCamera<okvis::cameras::NoDistortion>::createTestObject()); |
| 51 | cameras.push_back(okvis::cameras::PinholeCamera<okvis::cameras::RadialTangentialDistortion>::createTestObject()); |
| 52 | cameras.push_back(okvis::cameras::PinholeCamera<okvis::cameras::EquidistantDistortion>::createTestObject()); |
| 53 | cameras.push_back(okvis::cameras::PinholeCamera<okvis::cameras::RadialTangentialDistortion8>::createTestObject()); |
| 54 | |
| 55 | for (size_t c = 0; c < cameras.size(); ++c) { |
| 56 | // std::cout << "Testing " << cameras.at(c)->type() << std::endl; |
| 57 | // try quite a lot of points: |
| 58 | for (size_t i = 0; i < NUM_POINTS; ++i) { |
| 59 | // create a random point in the field of view: |
| 60 | Eigen::Vector2d imagePoint = cameras.at(c)->createRandomImagePoint(); |
| 61 | |
| 62 | // backProject |
| 63 | Eigen::Vector3d ray; |
| 64 | EXPECT_TRUE(cameras.at(c)->backProject(imagePoint, &ray)); |
| 65 | |
| 66 | // randomise distance |
| 67 | ray.normalize(); |
| 68 | ray *= (0.2 + 8 * (Eigen::Vector2d::Random()[0] + 1.0)); |
| 69 | |
| 70 | // project |
| 71 | Eigen::Vector2d imagePoint2; |
| 72 | Eigen::Matrix<double, 2, 3> J; |
| 73 | Eigen::Matrix2Xd J_intrinsics; |
| 74 | EXPECT_TRUE(cameras.at(c)->project(ray, &imagePoint2, &J, &J_intrinsics) == |
| 75 | okvis::cameras::CameraBase::ProjectionStatus::Successful); |
| 76 | |
| 77 | // check they are the same |
| 78 | EXPECT_TRUE((imagePoint2 - imagePoint).norm() < 0.01); |
| 79 | |
| 80 | // check point Jacobian vs. NumDiff |
| 81 | const double dp = 1.0e-7; |
| 82 | Eigen::Matrix<double, 2, 3> J_numDiff; |
| 83 | for (size_t d = 0; d < 3; ++d) { |
| 84 | Eigen::Vector3d point_p = ray + Eigen::Vector3d(d == 0 ? dp : 0, d == 1 ? dp : 0, d == 2 ? dp : 0); |
| 85 | Eigen::Vector3d point_m = ray - Eigen::Vector3d(d == 0 ? dp : 0, d == 1 ? dp : 0, d == 2 ? dp : 0); |
| 86 | Eigen::Vector2d imagePoint_p; |
| 87 | Eigen::Vector2d imagePoint_m; |
| 88 | cameras.at(c)->project(point_p, &imagePoint_p); |
| 89 | cameras.at(c)->project(point_m, &imagePoint_m); |
| 90 | J_numDiff.col(d) = (imagePoint_p - imagePoint_m) / (2 * dp); |
| 91 | } |
| 92 | EXPECT_TRUE((J_numDiff - J).norm() < 0.0001); |
| 93 | |
| 94 | // check intrinsics Jacobian |
| 95 | const int numIntrinsics = cameras.at(c)->noIntrinsicsParameters(); |
| 96 | Eigen::VectorXd intrinsics; |
| 97 | cameras.at(c)->getIntrinsics(intrinsics); |
| 98 | Eigen::Matrix2Xd J_numDiff_intrinsics; |
| 99 | J_numDiff_intrinsics.resize(2, numIntrinsics); |
| 100 | for (int d = 0; d < numIntrinsics; ++d) { |
| 101 | Eigen::VectorXd di; |
| 102 | di.resize(numIntrinsics); |
nothing calls this directly
no test coverage detected