1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#ifdef __GNUC__
# pragma GCC diagnostic ignored "-Wmissing-declarations"
#endif
#ifndef __OPENCV_TEST_PRECOMP_HPP__
#define __OPENCV_TEST_PRECOMP_HPP__
#include <opencv2/sfm.hpp>
#include <opencv2/core/core_c.h>
#include <opencv2/ts.hpp>
#include <opencv2/core.hpp>
#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 cvtest
{
template<typename T>
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<typename T>
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<class T>
inline double
cosinusBetweenMatrices(const T &a, const T &b)
{
double s = cv::sum( a.mul(b) )[0];
return ( s / norm(a) / norm(b) );
}
// Check that sin(angle(a, b)) < tolerance
template<typename T>
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_<double> X; // 3D points
cv::Mat_<double> 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_<double> &ptsA,
const cv::Mat_<double> &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<cv::Mat> &points2d );
} // namespace cvtest
#endif