9 # include <vcl_msvc_warnings.h> 13 #include <vnl/algo/vnl_svd.h> 35 for (
int i = 0; i < n; i++) {
38 double x1 = p2[i].x(), x2 = p2[i].y(), x3 = p2[i].z(), x4 = p2[i].w();
39 double y1 = p1[i].x(), y2 = p1[i].y(), y3 = p1[i].z(), y4 = p1[i].w();
41 D(row, 0) = -x2*y1; D(row, 1) = x1*y1; D(row, 2) = 0; D(row, 3) = 0;
42 D(row, 4) = -x2*y2; D(row, 5) = x1*y2; D(row, 6) = 0; D(row, 7) = 0;
43 D(row, 8) = -x2*y3; D(row, 9) = x1*y3; D(row, 10) = 0; D(row, 11) = 0;
44 D(row, 12) = -x2*y4; D(row, 13) = x1*y4; D(row, 14) = 0; D(row, 15) = 0;
46 D(row, 0) = -x3*y1; D(row, 1) = 0; D(row, 2) = x1*y1; D(row, 3) = 0;
47 D(row, 4) = -x3*y2; D(row, 5) = 0; D(row, 6) = x1*y2; D(row, 7) = 0;
48 D(row, 8) = -x3*y3; D(row, 9) = 0; D(row, 10) = x1*y3; D(row, 11) = 0;
49 D(row, 12) = -x3*y4; D(row, 13) = 0; D(row, 14) = x1*y4; D(row, 15) = 0;
51 D(row, 0) = -x4*y1; D(row, 1) = 0; D(row, 2) = 0; D(row, 3) = x1*y1;
52 D(row, 4) = -x4*y2; D(row, 5) = 0; D(row, 6) = 0; D(row, 7) = x1*y2;
53 D(row, 8) = -x4*y3; D(row, 9) = 0; D(row, 10) = 0; D(row, 11) = x1*y3;
54 D(row, 12) = -x4*y4; D(row, 13) = 0; D(row, 14) = 0; D(row, 15) = x1*y4;
56 D(row, 0) = 0; D(row, 1) = -x4*y1; D(row, 2) = 0; D(row, 3) = x2*y1;
57 D(row, 4) = 0; D(row, 5) = -x4*y2; D(row, 6) = 0; D(row, 7) = x2*y2;
58 D(row, 8) = 0; D(row, 9) = -x4*y3; D(row, 10) = 0; D(row, 11) = x2*y3;
59 D(row, 12) = 0; D(row, 13) = -x4*y4; D(row, 14) = 0; D(row, 15) = x2*y4;
61 D(row, 0) = 0; D(row, 1) = 0; D(row, 2) = -x4*y1; D(row, 3) = x3*y1;
62 D(row, 4) = 0; D(row, 5) = 0; D(row, 6) = -x4*y2; D(row, 7) = x3*y2;
63 D(row, 8) = 0; D(row, 9) = 0; D(row, 10) = -x4*y3; D(row, 11) = x3*y3;
64 D(row, 12) = 0; D(row, 13) = 0; D(row, 14) = -x4*y4; D(row, 15) = x3*y4;
66 D(row, 0) = 0; D(row, 1) = -x3*y1; D(row, 2) = x2*y1; D(row, 3) = 0;
67 D(row, 4) = 0; D(row, 5) = -x3*y2; D(row, 6) = x2*y2; D(row, 7) = 0;
68 D(row, 8) = 0; D(row, 9) = -x3*y3; D(row, 10) = x2*y3; D(row, 11) = 0;
69 D(row, 12) = 0; D(row, 13) = -x3*y4; D(row, 14) = x2*y4; D(row, 15) = 0;
74 vnl_svd<double> svd(D);
80 std::cerr <<
"vgl_h_matrix_3d_compute_linear : design matrix has rank < 16\n" 81 <<
"vgl_h_matrix_3d_compute_linear : probably due to degenerate point configuration\n";
85 H.
set(svd.nullvector().data_block());
95 assert(points1.size() == points2.size());
96 int n = points1.size();
99 std::cerr <<
"vgl_h_matrix_3d_compute_linear: Need at least 5 matches.\n";
100 if (n == 0) std::cerr <<
"Could be std::vector setlength idiosyncrasies!\n";
110 std::vector<vgl_homg_point_3d<double> > tpoints1, tpoints2;
111 for (
int i = 0; i<n; i++)
113 tpoints1.push_back(tr1(points1[i]));
114 tpoints2.push_back(tr2(points2[i]));
vgl_h_matrix_3d get_inverse() const
Return the inverse homography.
vgl_h_matrix_3d & set(unsigned int row_index, unsigned int col_index, T value)
Set an element of the 4x4 homography matrix.
Represents a homogeneous 3D point.
constexpr int TM_UNKNOWNS_COUNT
bool solve_linear_problem(std::vector< vgl_homg_point_3d< double > > const &p1, std::vector< vgl_homg_point_3d< double > > const &p2, vgl_h_matrix_3d< double > &H)
Assumes all corresponding points have equal weight.
bool compute_from_points(std::vector< vgl_homg_point_3d< T > > const &points)
compute the normalizing transform.
A class to hold a 3-d projective transformation matrix and to perform common operations using it e....
bool compute_p(std::vector< vgl_homg_point_3d< double > > const &points1, std::vector< vgl_homg_point_3d< double > > const &points2, vgl_h_matrix_3d< double > &H) override
compute from matched points.
contains class vgl_h_matrix_3d_compute_linear
constexpr double DEGENERACY_THRESHOLD
The similarity transform that normalizes a 3-d point set.