33 #ifndef __INCLUDE_MIST_EPIPOLAR__
34 #define __INCLUDE_MIST_EPIPOLAR__
36 #ifndef __INCLUDE_MIST_H__
40 #ifndef __INCLUDE_MIST_MATRIX__
44 #ifndef __INCLUDE_NUMERIC__
48 #ifndef __INCLUDE_MIST_RANDOM__
58 namespace __epipolar__
72 template <
typename T >
73 inline bool enforce_rank2( matrix< T > &in, matrix< T > &out )
75 matrix < T > u, s, vt;
77 if ( (in.rows() != 3) || (out.cols() != 3) )
83 s( 2, 2 ) =
static_cast< T
> ( 0.0 );
94 mat(0, 0) = 0.0; mat(0, 1) = -vec[2]; mat(0, 2) = vec[1];
95 mat(1, 0) = vec[2]; mat(1, 1) = 0.0; mat(1, 2) = -vec[0];
96 mat(2, 0) = -vec[1]; mat(2, 1) = vec[0]; mat(2, 2) = 0.0;
100 double levi_civita3(
int i,
int j,
int k )
102 if ( (i == j) || (j == k) || (k == i) )
107 if ( ((j - i + 3) % 3 == 1 ) &&
108 ((k - j + 3) % 3 == 1 ) &&
109 ((i - k + 3) % 3 == 1 ) )
130 bool line_triangle_intersection( matrix< double > &origin,
131 matrix< double > &direction,
132 matrix< double > &vert0,
133 matrix< double > &vert1,
134 matrix< double > &vert2,
135 matrix< double > &intersection )
137 matrix< double > e1 = vert1 - vert0;
138 matrix< double > e2 = vert2 - vert0;
139 matrix< double > t = origin - vert0;
140 matrix< double > p = skew_symmetric_matrix3( direction ) * e2;
141 matrix< double > q = skew_symmetric_matrix3( t ) * e1;
143 intersection.
resize(3, 1);
144 intersection[0] = (q.t() * e2)[0];
145 intersection[1] = (p.t() * t)[0];
146 intersection[2] = (q.t() * direction)[0];
148 intersection /= (p.t() * e1)[0];
150 if ( (intersection[1] >= 0.0) && (intersection[2] >= 0.0) &&
151 (intersection[1] + intersection[2] <= 1 ) )
165 template <
typename T >
169 array1< matrix< T > > data_;
177 data_[0].resize( 3, 3 );
178 data_[1].resize( 3, 3 );
179 data_[2].resize( 3, 3 );
185 return data_[ index ];
191 return data_[i](q, r);
207 template <
typename T1,
typename T2 >
209 matrix< T1 > &points2,
210 matrix< T2 > &fundamental_matrix )
213 if ( (points1.cols() != points2.cols()) || (points1.cols() < 8) )
218 size_t point_num = points1.cols();
220 matrix< double > m( point_num, 9 );
222 for (
size_t i = 0; i < point_num; i++ )
224 m( i, 0 ) = points1( 0, i ) * points2( 0, i );
225 m( i, 1 ) = points1( 1, i ) * points2( 0, i );
226 m( i, 2 ) = points2( 0, i );
227 m( i, 3 ) = points1( 0, i ) * points2( 1, i );
228 m( i, 4 ) = points1( 1, i ) * points2( 1, i );
229 m( i, 5 ) = points2( 1, i );
230 m( i, 6 ) = points1( 0, i );
231 m( i, 7 ) = points1( 1, i );
238 matrix< double > eval, evec;
240 eigen( m, eval, evec );
242 fundamental_matrix.resize( 3, 3 );
246 fundamental_matrix( 0, 0 ) =
static_cast< T2
> ( evec( 0, 0 ) );
247 fundamental_matrix( 0, 1 ) =
static_cast< T2
> ( evec( 1, 0 ) );
248 fundamental_matrix( 0, 2 ) =
static_cast< T2
> ( evec( 2, 0 ) );
249 fundamental_matrix( 1, 0 ) =
static_cast< T2
> ( evec( 3, 0 ) );
250 fundamental_matrix( 1, 1 ) =
static_cast< T2
> ( evec( 4, 0 ) );
251 fundamental_matrix( 1, 2 ) =
static_cast< T2
> ( evec( 5, 0 ) );
252 fundamental_matrix( 2, 0 ) =
static_cast< T2
> ( evec( 6, 0 ) );
253 fundamental_matrix( 2, 1 ) =
static_cast< T2
> ( evec( 7, 0 ) );
254 fundamental_matrix( 2, 2 ) =
static_cast< T2
> ( evec( 8, 0 ) );
258 fundamental_matrix( 0, 0 ) =
static_cast< T2
> ( evec( 0, evec.cols() - 1 ) );
259 fundamental_matrix( 0, 1 ) =
static_cast< T2
> ( evec( 1, evec.cols() - 1 ) );
260 fundamental_matrix( 0, 2 ) =
static_cast< T2
> ( evec( 2, evec.cols() - 1 ) );
261 fundamental_matrix( 1, 0 ) =
static_cast< T2
> ( evec( 3, evec.cols() - 1 ) );
262 fundamental_matrix( 1, 1 ) =
static_cast< T2
> ( evec( 4, evec.cols() - 1 ) );
263 fundamental_matrix( 1, 2 ) =
static_cast< T2
> ( evec( 5, evec.cols() - 1 ) );
264 fundamental_matrix( 2, 0 ) =
static_cast< T2
> ( evec( 6, evec.cols() - 1 ) );
265 fundamental_matrix( 2, 1 ) =
static_cast< T2
> ( evec( 7, evec.cols() - 1 ) );
266 fundamental_matrix( 2, 2 ) =
static_cast< T2
> ( evec( 8, evec.cols() - 1 ) );
269 __epipolar__::enforce_rank2( fundamental_matrix, fundamental_matrix );
289 template <
typename T1,
typename T2 >
292 matrix< T2 > &fundamental_matrix,
293 matrix< T1 > &correspondent_lines )
296 size_t point_num = points.cols();
298 matrix< T1 > p( 3, point_num );
300 for (
size_t i = 0; i < point_num; i++ )
302 p( 0, i ) = points( 0, i );
303 p( 1, i ) = points( 1, i );
304 p( 2, i ) =
static_cast< T1
> ( 1.0 );
308 if ( which_image == 0 )
310 correspondent_lines = fundamental_matrix * p;
314 correspondent_lines = fundamental_matrix.t() * p;
328 template <
typename T1,
typename T2 >
330 matrix< T2 > &epipole )
333 if ( (fundamental_matrix.rows() != 3) ||
334 (fundamental_matrix.cols() != 3) )
339 epipole.resize(3, 1);
342 svd( fundamental_matrix, u, s, vt );
343 epipole[0] = u(0, 2);
344 epipole[1] = u(1, 2);
345 epipole[2] = u(2, 2);
349 norm += epipole[0] * epipole[0];
350 norm += epipole[1] * epipole[1];
351 norm += epipole[2] * epipole[2];
376 template <
typename T1,
typename T2 >
385 if ( (essential_matrix.rows() != 3) ||
386 (essential_matrix.cols() != 3) )
392 matrix< T1 > essential = essential_matrix;
395 svd( essential, du, ds, dvt );
397 0.0, (ds(0, 0) + ds(1, 1)) * 0.5, 0.0,
399 essential = du * ds * dvt;
400 svd( essential, du, ds, dvt );
404 w = matrix< T1 >::_33( 0.0, -1.0, 0.0,
408 z = matrix< T1 >::_33( 0.0, 1.0, 0.0,
419 double norm = sqrt(t[0] * t[0] + t[1] * t[1] + t[2] * t[2]);
425 r2 = du * w.
t() * dvt;
443 template <
typename T1,
typename T2 >
446 matrix< T2 > &camera_matrix1,
447 matrix< T2 > &camera_matrix2,
451 if ( (camera_matrix1.rows() != 3) || (camera_matrix1.cols() != 4) ||
452 (camera_matrix2.rows() != 3) || (camera_matrix2.cols() != 4) ||
453 (xc1.size() < 3) || (xc2.size() < 3) )
458 matrix< T1 > mat( 4, 4 );
461 matrix< T1 > pt1( 1, 4 ), pt2( 1, 4 );
466 for (
size_t i = 0; i < 4; i++)
468 pt1(0, i) = camera_matrix1( 2, i );
470 for (
size_t i = 0; i < 4; i++)
472 pt2(0, i) = camera_matrix1( 0, i );
474 row = xc1[0] * pt1 - pt2;
475 for (
size_t i = 0; i < 4; i++)
481 for (
size_t i = 0; i < 4; i++)
483 pt2(0, i) = camera_matrix1( 1, i );
485 row = xc1[1] * pt1 - pt2;
486 for (
size_t i = 0; i < 4; i++)
492 for (
size_t i = 0; i < 4; i++)
494 pt1(0, i) = camera_matrix2( 2, i );
496 for (
size_t i = 0; i < 4; i++)
498 pt2(0, i) = camera_matrix2( 0, i );
500 row = xc2[0] * pt1 - pt2;
501 for (
size_t i = 0; i < 4; i++)
507 for (
size_t i = 0; i < 4; i++)
509 pt2(0, i) = camera_matrix2( 1, i );
511 row = xc2[1] * pt1 - pt2;
512 for (
size_t i = 0; i < 4; i++)
518 matrix< T2 > u, s, vt;
519 svd( mat, u, s, vt );
522 xw[0] = vt( 3, 0 ) / vt(3, 3);
523 xw[1] = vt( 3, 1 ) / vt(3, 3);
524 xw[2] = vt( 3, 2 ) / vt(3, 3);
544 template <
typename T1 >
549 matrix< T1 > mat(9, 27);
551 for (
int s = 0; s < 3; s++)
553 for (
int t = 0; t < 3; t++)
556 for (
int q = 0; q < 3; q++)
558 for (
int r = 0; r < 3; r++)
560 for (
int i = 0; i < 3; i++)
565 for (
int j = 0; j < 3; j++)
567 for (
int k = 0; k < 3; k++)
573 val *= __epipolar__::levi_civita3( j, q, s );
574 val *= __epipolar__::levi_civita3( k, r, t );
578 mat( 3 * s + t, 3 * 3 * i + 3 * q + r ) = sum;
599 template <
typename T1 >
605 matrix< T1 > mat(3, 27);
607 for (
int w = 0; w < 3; w++)
610 for (
int i = 0; i < 3; i++)
612 for (
int q = 0; q < 3; q++)
614 for (
int r = 0; r < 3; r++)
618 for (
int p = 0; p < 3; p++)
624 val *= __epipolar__::levi_civita3(p, i, w);
627 mat( w, i * 3 * 3 + q * 3 + r ) = sum;
647 template <
typename T1,
typename T2 >
651 if ( relations.
cols() != 27 )
661 for (
size_t i = 0; i < 3; i++)
663 for (
size_t q = 0; q < 3; q++)
665 for (
size_t r = 0; r < 3; r++)
667 tensor[i].resize(3, 3);
668 tensor[i](q, r) = vt( vt.
rows() - 1, i * 3 * 3 + q * 3 + r);
685 template <
typename T1,
typename T2 >
696 for (
int i = 0; i < 3; i++)
701 for (
int j = 0; j < 3; j++)
714 for (
int i = 0; i < 3; i++)
718 for (
int j = 0; j < 3; j++)
730 for (
int j = 0; j < 3; j++)
735 double norm = sqrt( epi21[0] * epi21[0]
736 + epi21[1] * epi21[1]
737 + epi21[2] * epi21[2] );
746 for (
int j = 0; j < 3; j++)
750 double norm = sqrt( epi31[0] * epi31[0]
751 + epi31[1] * epi31[1]
752 + epi31[2] * epi31[2] );
771 template <
typename T1,
typename T2>
781 fundamental21.
resize(3, 3);
782 fundamental31.
resize(3, 3);
784 for (
size_t i = 0; i < 3; i++)
788 temp = __epipolar__::skew_symmetric_matrix3( epi21 ) * tensor[i] * epi31;
789 for (
int j = 0; j < 3; j++)
791 fundamental21(j, i) = temp(j, 0);
794 temp = __epipolar__::skew_symmetric_matrix3( epi31 ) * tensor[i].t() * epi21;
795 for (
int j = 0; j < 3; j++)
797 fundamental31(j, i) = temp(j, 0);
817 template <
typename T1,
typename T2 >
825 matrix< T1 > vec1( 3, 1 ), vec2( 3, 1 );
828 matrix< T1 > epi21, epi31;
836 for (
size_t i = 0; i < 3; i++)
838 vec2 = tensor[i] * epi31;
839 mat2( 0, i ) = vec2[0];
840 mat2( 1, i ) = vec2[1];
841 mat2( 2, i ) = vec2[2];
843 for (
size_t i = 0; i < 3; i++)
845 mat2( i, 3 ) = epi21[i];
850 temp_mat = epi31 * epi31.
t() - matrix< T1 >::_33( 1.0, 0.0, 0.0,
853 for (
size_t i = 0; i < 3; i++)
855 vec1 = temp_mat * tensor[i].t() * epi21;
856 mat3( 0, i ) = vec1[0];
857 mat3( 1, i ) = vec1[1];
858 mat3( 2, i ) = vec1[2];
860 for (
size_t i = 0; i < 3; i++)
862 mat3( i, 3 ) = epi31[i];
874 #endif // __INCLUDE_MIST_EPIPOLAR__