mirror of
https://github.com/opencv/opencv.git
synced 2025-08-06 14:36:36 +08:00
transplant 8p's normalization to 7p
use const instead of constexpr
This commit is contained in:
parent
e970eccbf1
commit
331a96c670
@ -490,12 +490,47 @@ static int run7Point( const Mat& _m1, const Mat& _m2, Mat& _fmatrix )
|
|||||||
double* fmatrix = _fmatrix.ptr<double>();
|
double* fmatrix = _fmatrix.ptr<double>();
|
||||||
int i, k, n;
|
int i, k, n;
|
||||||
|
|
||||||
|
Point2d m1c(0, 0), m2c(0, 0);
|
||||||
|
double t, scale1 = 0, scale2 = 0;
|
||||||
|
const int count = 7;
|
||||||
|
|
||||||
|
// compute centers and average distances for each of the two point sets
|
||||||
|
for( i = 0; i < count; i++ )
|
||||||
|
{
|
||||||
|
m1c += Point2d(m1[i]);
|
||||||
|
m2c += Point2d(m2[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate the normalizing transformations for each of the point sets:
|
||||||
|
// after the transformation each set will have the mass center at the coordinate origin
|
||||||
|
// and the average distance from the origin will be ~sqrt(2).
|
||||||
|
t = 1./count;
|
||||||
|
m1c *= t;
|
||||||
|
m2c *= t;
|
||||||
|
|
||||||
|
for( i = 0; i < count; i++ )
|
||||||
|
{
|
||||||
|
scale1 += norm(Point2d(m1[i].x - m1c.x, m1[i].y - m1c.y));
|
||||||
|
scale2 += norm(Point2d(m2[i].x - m2c.x, m2[i].y - m2c.y));
|
||||||
|
}
|
||||||
|
|
||||||
|
scale1 *= t;
|
||||||
|
scale2 *= t;
|
||||||
|
|
||||||
|
if( scale1 < FLT_EPSILON || scale2 < FLT_EPSILON )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
scale1 = std::sqrt(2.)/scale1;
|
||||||
|
scale2 = std::sqrt(2.)/scale2;
|
||||||
|
|
||||||
// form a linear system: i-th row of A(=a) represents
|
// form a linear system: i-th row of A(=a) represents
|
||||||
// the equation: (m2[i], 1)'*F*(m1[i], 1) = 0
|
// the equation: (m2[i], 1)'*F*(m1[i], 1) = 0
|
||||||
for( i = 0; i < 7; i++ )
|
for( i = 0; i < 7; i++ )
|
||||||
{
|
{
|
||||||
double x0 = m1[i].x, y0 = m1[i].y;
|
double x0 = (m1[i].x - m1c.x)*scale1;
|
||||||
double x1 = m2[i].x, y1 = m2[i].y;
|
double y0 = (m1[i].y - m1c.y)*scale1;
|
||||||
|
double x1 = (m2[i].x - m2c.x)*scale2;
|
||||||
|
double y1 = (m2[i].y - m2c.y)*scale2;
|
||||||
|
|
||||||
a[i*9+0] = x1*x0;
|
a[i*9+0] = x1*x0;
|
||||||
a[i*9+1] = x1*y0;
|
a[i*9+1] = x1*y0;
|
||||||
@ -559,6 +594,10 @@ static int run7Point( const Mat& _m1, const Mat& _m2, Mat& _fmatrix )
|
|||||||
if( n < 1 || n > 3 )
|
if( n < 1 || n > 3 )
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
|
// transformation matrices
|
||||||
|
Matx33d T1( scale1, 0, -scale1*m1c.x, 0, scale1, -scale1*m1c.y, 0, 0, 1 );
|
||||||
|
Matx33d T2( scale2, 0, -scale2*m2c.x, 0, scale2, -scale2*m2c.y, 0, 0, 1 );
|
||||||
|
|
||||||
for( k = 0; k < n; k++, fmatrix += 9 )
|
for( k = 0; k < n; k++, fmatrix += 9 )
|
||||||
{
|
{
|
||||||
// for each root form the fundamental matrix
|
// for each root form the fundamental matrix
|
||||||
@ -577,6 +616,14 @@ static int run7Point( const Mat& _m1, const Mat& _m2, Mat& _fmatrix )
|
|||||||
|
|
||||||
for( i = 0; i < 8; i++ )
|
for( i = 0; i < 8; i++ )
|
||||||
fmatrix[i] = f1[i]*lambda + f2[i]*mu;
|
fmatrix[i] = f1[i]*lambda + f2[i]*mu;
|
||||||
|
|
||||||
|
// de-normalize
|
||||||
|
Mat F(3, 3, CV_64F, fmatrix);
|
||||||
|
F = T2.t() * F * T1;
|
||||||
|
|
||||||
|
// make F(3,3) = 1
|
||||||
|
if(fabs(F.at<double>(8)) > FLT_EPSILON )
|
||||||
|
F *= 1. / F.at<double>(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
|
Loading…
Reference in New Issue
Block a user