MCPcopy Create free account
hub / github.com/AutonomousFieldRoboticsLab/SVIn / TEST

Function TEST

okvis_ros/okvis/okvis_cv/test/TestPinholeCamera.cpp:45–120  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

43#include "okvis/cameras/RadialTangentialDistortion8.hpp"
44
45TEST(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);

Callers

nothing calls this directly

Calls 9

RandomClass · 0.85
backProjectMethod · 0.80
normalizeMethod · 0.80
projectMethod · 0.80
getIntrinsicsMethod · 0.80
sizeMethod · 0.45

Tested by

no test coverage detected