mirror of
https://github.com/opencv/opencv.git
synced 2025-08-05 22:19:14 +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>();
|
||||
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
|
||||
// the equation: (m2[i], 1)'*F*(m1[i], 1) = 0
|
||||
for( i = 0; i < 7; i++ )
|
||||
{
|
||||
double x0 = m1[i].x, y0 = m1[i].y;
|
||||
double x1 = m2[i].x, y1 = m2[i].y;
|
||||
double x0 = (m1[i].x - m1c.x)*scale1;
|
||||
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+1] = x1*y0;
|
||||
@ -559,6 +594,10 @@ static int run7Point( const Mat& _m1, const Mat& _m2, Mat& _fmatrix )
|
||||
if( n < 1 || n > 3 )
|
||||
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 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++ )
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user