// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. #ifndef __OPENCV_TEST_PRECOMP_HPP__ #define __OPENCV_TEST_PRECOMP_HPP__ #include #include #include #include #include "scene.h" #define OPEN_TESTFILE(FNAME,FS) \ FS.open(FNAME, FileStorage::READ); \ if (!FS.isOpened())\ {\ std::cerr << "Cannot find file: " << FNAME << std::endl;\ return;\ } namespace opencv_test { using namespace cv::sfm; template inline void EXPECT_MATRIX_NEAR(const T a, const T b, double tolerance) { bool dims_match = (a.rows == b.rows) && (a.cols == b.cols); EXPECT_EQ((int)a.rows, (int)b.rows); EXPECT_EQ((int)a.cols, (int)b.cols); if (dims_match) { for (int r = 0; r < a.rows; ++r) { for (int c = 0; c < a.cols; ++c) { EXPECT_NEAR(a(r, c), b(r, c), tolerance) << "r=" << r << ", c=" << c << "."; } } } } template inline void EXPECT_VECTOR_NEAR(const T a, const T b, double tolerance) { bool dims_match = (a.rows == b.rows); EXPECT_EQ((int)a.rows,(int)b.rows) << "Matrix rows don't match."; if (dims_match) { for (int r = 0; r < a.rows; ++r) { EXPECT_NEAR(a(r), b(r), tolerance) << "r=" << r << "."; } } } template inline double cosinusBetweenMatrices(const T &a, const T &b) { double s = cv::sum( a.mul(b) )[0]; return ( s / cv::norm(a) / cv::norm(b) ); } // Check that sin(angle(a, b)) < tolerance template inline void EXPECT_MATRIX_PROP(const T a, const T b, double tolerance) { bool dims_match = (a.rows == b.rows) && (a.cols == b.cols); EXPECT_EQ((int)a.rows, (int)b.rows); EXPECT_EQ((int)a.cols, (int)b.cols); if (dims_match) { double c = cosinusBetweenMatrices(a, b); if (c * c < 1) { double s = sqrt(1 - c * c); EXPECT_NEAR(0, s, tolerance); } } } struct TwoViewDataSet { cv::Matx33d K1, K2; // Internal parameters cv::Matx33d R1, R2; // Rotation cv::Vec3d t1, t2; // Translation cv::Matx34d P1, P2; // Projection matrix, P = K(R|t) cv::Matx33d F; // Fundamental matrix cv::Mat_ X; // 3D points cv::Mat_ x1, x2; // Projected points }; void generateTwoViewRandomScene(TwoViewDataSet &data); /** Check the properties of a fundamental matrix: * * 1. The determinant is 0 (rank deficient) * 2. The condition x'T*F*x = 0 is satisfied to precision. */ void expectFundamentalProperties( const cv::Matx33d &F, const cv::Mat_ &ptsA, const cv::Mat_ &ptsB, double precision = 1e-9 ); /** * 2D tracked points * ----------------- * * The format is: * * row1 : x1 y1 x2 y2 ... x36 y36 for track 1 * row2 : x1 y1 x2 y2 ... x36 y36 for track 2 * etc * * i.e. a row gives the 2D measured position of a point as it is tracked * through frames 1 to 36. If there is no match found in a view then x * and y are -1. * * Each row corresponds to a different point. * */ void parser_2D_tracks(const std::string &_filename, std::vector &points2d ); } // namespace #endif