32 #define TEST_NAME "base/database"
61 std::thread thread1([&database]() {
63 std::this_thread::sleep_for(std::chrono::milliseconds(100));
66 std::thread thread2([&database]() {
68 std::this_thread::sleep_for(std::chrono::milliseconds(100));
78 BOOST_CHECK_EQUAL(database.
NumImages(), 0);
95 for (
image_t i = 0; i < 20; ++i) {
96 for (
image_t j = 0; j < 20; ++j) {
102 BOOST_CHECK_EQUAL(i, image_id1);
103 BOOST_CHECK_EQUAL(j, image_id2);
105 BOOST_CHECK_EQUAL(i, image_id2);
106 BOOST_CHECK_EQUAL(j, image_id1);
160 BOOST_CHECK_EQUAL(database.
NumImages(), 0);
162 image.SetName(
"test");
164 image.SetQvecPrior(Eigen::Vector4d(0.1, 0.2, 0.3, 0.4));
165 image.SetTvecPrior(Eigen::Vector3d(0.1, 0.2, 0.3));
167 BOOST_CHECK_EQUAL(database.
NumImages(), 1);
187 image.TvecPrior(0) += 2;
211 BOOST_CHECK_EQUAL(database.
NumImages(), 2);
216 BOOST_CHECK_EQUAL(database.
NumImages(), 0);
224 image.SetName(
"test");
233 BOOST_CHECK_EQUAL(keypoints.size(), keypoints_read.size());
234 for (
size_t i = 0; i < keypoints.size(); ++i) {
235 BOOST_CHECK_EQUAL(keypoints[i].
x, keypoints_read[i].
x);
236 BOOST_CHECK_EQUAL(keypoints[i].
y, keypoints_read[i].
y);
237 BOOST_CHECK_EQUAL(keypoints[i].a11, keypoints_read[i].a11);
238 BOOST_CHECK_EQUAL(keypoints[i].a12, keypoints_read[i].a12);
239 BOOST_CHECK_EQUAL(keypoints[i].a21, keypoints_read[i].a21);
240 BOOST_CHECK_EQUAL(keypoints[i].a22, keypoints_read[i].a22);
246 image.SetName(
"test2");
263 image.SetName(
"test");
272 BOOST_CHECK_EQUAL(
descriptors.rows(), descriptors_read.rows());
273 BOOST_CHECK_EQUAL(
descriptors.cols(), descriptors_read.cols());
276 BOOST_CHECK_EQUAL(
descriptors(r, c), descriptors_read(r, c));
283 image.SetName(
"test2");
303 BOOST_CHECK_EQUAL(matches.size(), matches_read.size());
304 for (
size_t i = 0; i < matches.size(); ++i) {
305 BOOST_CHECK_EQUAL(matches[i].point2D_idx1, matches_read[i].point2D_idx1);
306 BOOST_CHECK_EQUAL(matches[i].point2D_idx2, matches_read[i].point2D_idx2);
311 BOOST_CHECK_EQUAL(database.
NumMatches(), 1000);
315 BOOST_CHECK_EQUAL(database.
NumMatches(), 1000);
326 two_view_geometry.
config =
327 TwoViewGeometry::ConfigurationType::PLANAR_OR_PANORAMIC;
328 two_view_geometry.
F = Eigen::Matrix3d::Random();
329 two_view_geometry.
E = Eigen::Matrix3d::Random();
330 two_view_geometry.
H = Eigen::Matrix3d::Random();
331 two_view_geometry.
qvec = Eigen::Vector4d::Random();
332 two_view_geometry.
tvec = Eigen::Vector3d::Random();
338 for (
size_t i = 0; i < two_view_geometry_read.
inlier_matches.size(); ++i) {
339 BOOST_CHECK_EQUAL(two_view_geometry.
inlier_matches[i].point2D_idx1,
341 BOOST_CHECK_EQUAL(two_view_geometry.
inlier_matches[i].point2D_idx2,
345 BOOST_CHECK_EQUAL(two_view_geometry.
config, two_view_geometry_read.
config);
346 BOOST_CHECK_EQUAL(two_view_geometry.
F, two_view_geometry_read.
F);
347 BOOST_CHECK_EQUAL(two_view_geometry.
E, two_view_geometry_read.
E);
348 BOOST_CHECK_EQUAL(two_view_geometry.
H, two_view_geometry_read.
H);
349 BOOST_CHECK_EQUAL(two_view_geometry.
qvec, two_view_geometry_read.
qvec);
350 BOOST_CHECK_EQUAL(two_view_geometry.
tvec, two_view_geometry_read.
tvec);
354 BOOST_CHECK_EQUAL(two_view_geometry_read_inv.
inlier_matches.size(),
356 for (
size_t i = 0; i < two_view_geometry_read.
inlier_matches.size(); ++i) {
357 BOOST_CHECK_EQUAL(two_view_geometry_read_inv.
inlier_matches[i].point2D_idx2,
359 BOOST_CHECK_EQUAL(two_view_geometry_read_inv.
inlier_matches[i].point2D_idx1,
363 BOOST_CHECK_EQUAL(two_view_geometry_read_inv.
config,
364 two_view_geometry_read.
config);
365 BOOST_CHECK_EQUAL(two_view_geometry_read_inv.
F.transpose(),
366 two_view_geometry_read.
F);
367 BOOST_CHECK_EQUAL(two_view_geometry_read_inv.
E.transpose(),
368 two_view_geometry_read.
E);
369 BOOST_CHECK(two_view_geometry_read_inv.
H.inverse().eval().isApprox(
370 two_view_geometry_read.
H));
372 Eigen::Vector4d read_inv_qvec_inv;
373 Eigen::Vector3d read_inv_tvec_inv;
375 &read_inv_qvec_inv, &read_inv_tvec_inv);
376 BOOST_CHECK_EQUAL(read_inv_qvec_inv, two_view_geometry_read.
qvec);
377 BOOST_CHECK(read_inv_tvec_inv.isApprox(two_view_geometry_read.
tvec));
379 std::vector<image_pair_t> image_pair_ids;
380 std::vector<TwoViewGeometry> two_view_geometries;
382 BOOST_CHECK_EQUAL(image_pair_ids.size(), 1);
383 BOOST_CHECK_EQUAL(two_view_geometries.size(), 1);
384 BOOST_CHECK_EQUAL(image_pair_ids[0],
386 BOOST_CHECK_EQUAL(two_view_geometry.
config, two_view_geometries[0].config);
387 BOOST_CHECK_EQUAL(two_view_geometry.
F, two_view_geometries[0].F);
388 BOOST_CHECK_EQUAL(two_view_geometry.
E, two_view_geometries[0].E);
389 BOOST_CHECK_EQUAL(two_view_geometry.
H, two_view_geometries[0].H);
390 BOOST_CHECK_EQUAL(two_view_geometry.
qvec, two_view_geometries[0].qvec);
391 BOOST_CHECK_EQUAL(two_view_geometry.
tvec, two_view_geometries[0].tvec);
393 two_view_geometries[0].inlier_matches.size());
394 std::vector<std::pair<image_t, image_t>> image_pairs;
395 std::vector<int> num_inliers;
397 BOOST_CHECK_EQUAL(image_pairs.size(), 1);
398 BOOST_CHECK_EQUAL(num_inliers.size(), 1);
399 BOOST_CHECK_EQUAL(image_pairs[0].first, image_id1);
400 BOOST_CHECK_EQUAL(image_pairs[0].second, image_id2);
401 BOOST_CHECK_EQUAL(num_inliers[0], two_view_geometry.
inlier_matches.size());
422 image.SetQvecPrior(Eigen::Vector4d(0.1, 0.2, 0.3, 0.4));
423 image.SetTvecPrior(Eigen::Vector3d(0.1, 0.2, 0.3));
425 image.SetName(
"test1");
427 image.SetName(
"test2");
429 image.SetName(
"test3");
431 image.SetName(
"test4");
435 keypoints1[0].x = 100;
437 keypoints2[0].x = 200;
439 keypoints3[0].x = 300;
441 keypoints4[0].x = 400;
443 const auto descriptors1 = FeatureDescriptors::Random(10, 128);
444 const auto descriptors2 = FeatureDescriptors::Random(20, 128);
445 const auto descriptors3 = FeatureDescriptors::Random(30, 128);
446 const auto descriptors4 = FeatureDescriptors::Random(40, 128);
463 BOOST_CHECK_EQUAL(merged_database.
NumCameras(), 2);
464 BOOST_CHECK_EQUAL(merged_database.
NumImages(), 4);
467 BOOST_CHECK_EQUAL(merged_database.
NumMatches(), 20);
469 BOOST_CHECK_EQUAL(merged_database.
ReadAllImages()[0].CameraId(), 1);
470 BOOST_CHECK_EQUAL(merged_database.
ReadAllImages()[1].CameraId(), 1);
471 BOOST_CHECK_EQUAL(merged_database.
ReadAllImages()[2].CameraId(), 2);
472 BOOST_CHECK_EQUAL(merged_database.
ReadAllImages()[3].CameraId(), 2);
473 BOOST_CHECK_EQUAL(merged_database.
ReadKeypoints(1).size(), 10);
474 BOOST_CHECK_EQUAL(merged_database.
ReadKeypoints(2).size(), 20);
475 BOOST_CHECK_EQUAL(merged_database.
ReadKeypoints(3).size(), 30);
476 BOOST_CHECK_EQUAL(merged_database.
ReadKeypoints(4).size(), 40);
477 BOOST_CHECK_EQUAL(merged_database.
ReadKeypoints(1)[0].x, 100);
478 BOOST_CHECK_EQUAL(merged_database.
ReadKeypoints(2)[0].x, 200);
479 BOOST_CHECK_EQUAL(merged_database.
ReadKeypoints(3)[0].x, 300);
480 BOOST_CHECK_EQUAL(merged_database.
ReadKeypoints(4)[0].x, 400);
482 descriptors1.size());
484 descriptors2.size());
486 descriptors3.size());
488 descriptors4.size());
494 BOOST_CHECK_EQUAL(merged_database.
NumCameras(), 0);
495 BOOST_CHECK_EQUAL(merged_database.
NumImages(), 0);
498 BOOST_CHECK_EQUAL(merged_database.
NumMatches(), 0);
std::shared_ptr< core::Tensor > image
void InitializeWithName(const std::string &model_name, const double focal_length, const size_t width, const size_t height)
camera_t CameraId() const
void SetFocalLength(const double focal_length)
double FocalLength() const
void SetCameraId(const camera_t camera_id)
double PrincipalPointX() const
double PrincipalPointY() const
void ClearCameras() const
void WriteDescriptors(const image_t image_id, const FeatureDescriptors &descriptors) const
size_t NumMatches() const
static const size_t kMaxNumImages
FeatureDescriptors ReadDescriptors(const image_t image_id) const
void ClearDescriptors() const
static void Merge(const Database &database1, const Database &database2, Database *merged_database)
size_t NumMatchedImagePairs() const
void ReadTwoViewGeometryNumInliers(std::vector< std::pair< image_t, image_t >> *image_pairs, std::vector< int > *num_inliers) const
size_t MaxNumDescriptors() const
void ClearAllTables() const
FeatureMatches ReadMatches(const image_t image_id1, const image_t image_id2) const
bool ExistsImage(const image_t image_id) const
void DeleteInlierMatches(const image_t image_id1, const image_t image_id2) const
void WriteMatches(const image_t image_id1, const image_t image_id2, const FeatureMatches &matches) const
bool ExistsMatches(const image_t image_id1, const image_t image_id2) const
FeatureKeypoints ReadKeypoints(const image_t image_id) const
size_t NumInlierMatches() const
void ClearKeypoints() const
size_t NumDescriptors() const
size_t NumKeypoints() const
void WriteTwoViewGeometry(const image_t image_id1, const image_t image_id2, const TwoViewGeometry &two_view_geometry) const
size_t NumVerifiedImagePairs() const
void WriteKeypoints(const image_t image_id, const FeatureKeypoints &keypoints) const
std::vector< std::pair< image_pair_t, FeatureMatches > > ReadAllMatches() const
static image_pair_t ImagePairToPairId(const image_t image_id1, const image_t image_id2)
size_t NumKeypointsForImage(const image_t image_id) const
std::vector< Camera > ReadAllCameras() const
bool ExistsCamera(const camera_t camera_id) const
void DeleteMatches(const image_t image_id1, const image_t image_id2) const
size_t NumDescriptorsForImage(const image_t image_id) const
void ReadTwoViewGeometries(std::vector< image_pair_t > *image_pair_ids, std::vector< TwoViewGeometry > *two_view_geometries) const
void ClearTwoViewGeometries() const
static bool SwapImagePair(const image_t image_id1, const image_t image_id2)
void ClearMatches() const
void UpdateCamera(const Camera &camera) const
size_t MaxNumKeypoints() const
TwoViewGeometry ReadTwoViewGeometry(const image_t image_id1, const image_t image_id2) const
static void PairIdToImagePair(const image_pair_t pair_id, image_t *image_id1, image_t *image_id2)
Camera ReadCamera(const camera_t camera_id) const
void UpdateImage(const Image &image) const
image_t WriteImage(const Image &image, const bool use_image_id=false) const
size_t NumCameras() const
std::vector< Image > ReadAllImages() const
camera_t WriteCamera(const Camera &camera, const bool use_camera_id=false) const
Image ReadImage(const image_t image_id) const
void SetName(const std::string &name)
const Eigen::Vector3d & TvecPrior() const
const Eigen::Vector4d & QvecPrior() const
void SetImageId(const image_t image_id)
camera_t CameraId() const
static const std::string kMemoryDatabasePath
BOOST_AUTO_TEST_CASE(TestOpenCloseConstructorDestructor)
void InvertPose(const Eigen::Vector4d &qvec, const Eigen::Vector3d &tvec, Eigen::Vector4d *inv_qvec, Eigen::Vector3d *inv_tvec)
Eigen::Matrix< uint8_t, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > FeatureDescriptors
std::vector< FeatureKeypoint > FeatureKeypoints
std::vector< FeatureMatch > FeatureMatches
Eigen::MatrixXd::Index Index
FeatureMatches inlier_matches