Commit 152874ea authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

Merge pull request #5620 from paroj:calibratecpp

parents 76f54b51 9233472b
This diff is collapsed.
...@@ -120,8 +120,6 @@ void CvLevMarq::init( int nparams, int nerrs, CvTermCriteria criteria0, bool _co ...@@ -120,8 +120,6 @@ void CvLevMarq::init( int nparams, int nerrs, CvTermCriteria criteria0, bool _co
bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err ) bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err )
{ {
double change;
matJ = _err = 0; matJ = _err = 0;
assert( !err.empty() ); assert( !err.empty() );
...@@ -174,7 +172,7 @@ bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err ) ...@@ -174,7 +172,7 @@ bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err )
lambdaLg10 = MAX(lambdaLg10-1, -16); lambdaLg10 = MAX(lambdaLg10-1, -16);
if( ++iters >= criteria.max_iter || if( ++iters >= criteria.max_iter ||
(change = cvNorm(param, prevParam, CV_RELATIVE_L2)) < criteria.epsilon ) cvNorm(param, prevParam, CV_RELATIVE_L2) < criteria.epsilon )
{ {
_param = param; _param = param;
state = DONE; state = DONE;
...@@ -193,8 +191,6 @@ bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err ) ...@@ -193,8 +191,6 @@ bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err )
bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, double*& _errNorm ) bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, double*& _errNorm )
{ {
double change;
CV_Assert( !err ); CV_Assert( !err );
if( state == DONE ) if( state == DONE )
{ {
...@@ -243,7 +239,7 @@ bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, d ...@@ -243,7 +239,7 @@ bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, d
lambdaLg10 = MAX(lambdaLg10-1, -16); lambdaLg10 = MAX(lambdaLg10-1, -16);
if( ++iters >= criteria.max_iter || if( ++iters >= criteria.max_iter ||
(change = cvNorm(param, prevParam, CV_RELATIVE_L2)) < criteria.epsilon ) cvNorm(param, prevParam, CV_RELATIVE_L2) < criteria.epsilon )
{ {
_param = param; _param = param;
state = DONE; state = DONE;
...@@ -262,32 +258,38 @@ bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, d ...@@ -262,32 +258,38 @@ bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, d
void CvLevMarq::step() void CvLevMarq::step()
{ {
using namespace cv;
const double LOG10 = log(10.); const double LOG10 = log(10.);
double lambda = exp(lambdaLg10*LOG10); double lambda = exp(lambdaLg10*LOG10);
int i, j, nparams = param->rows; int nparams = param->rows;
Mat _JtJ = cvarrToMat(JtJ);
Mat _JtJN = cvarrToMat(JtJN);
Mat _JtJW = cvarrToMat(JtJW);
Mat _JtJV = cvarrToMat(JtJV);
for( i = 0; i < nparams; i++ ) for( int i = 0; i < nparams; i++ )
if( mask->data.ptr[i] == 0 ) if( mask->data.ptr[i] == 0 )
{ {
double *row = JtJ->data.db + i*nparams, *col = JtJ->data.db + i; _JtJ.row(i) = 0;
for( j = 0; j < nparams; j++ ) _JtJ.col(i) = 0;
row[j] = col[j*nparams] = 0;
JtErr->data.db[i] = 0; JtErr->data.db[i] = 0;
} }
if( !err ) if( !err )
cvCompleteSymm( JtJ, completeSymmFlag ); completeSymm( _JtJ, completeSymmFlag );
_JtJ.copyTo(_JtJN);
#if 1 #if 1
cvCopy( JtJ, JtJN ); _JtJN.diag() *= 1. + lambda;
for( i = 0; i < nparams; i++ )
JtJN->data.db[(nparams+1)*i] *= 1. + lambda;
#else #else
cvSetIdentity(JtJN, cvRealScalar(lambda)); _JtJN.diag() += lambda;
cvAdd( JtJ, JtJN, JtJN );
#endif #endif
cvSVD( JtJN, JtJW, 0, JtJV, CV_SVD_MODIFY_A + CV_SVD_U_T + CV_SVD_V_T ); // solve(JtJN, JtErr, param, DECOMP_SVD);
cvSVBkSb( JtJW, JtJV, JtJV, JtErr, param, CV_SVD_U_T + CV_SVD_V_T ); SVD::compute(_JtJN, _JtJW, noArray(), _JtJV, SVD::MODIFY_A);
for( i = 0; i < nparams; i++ ) SVD::backSubst(_JtJW, _JtJV.t(), _JtJV, cvarrToMat(JtErr), cvarrToMat(param));
for( int i = 0; i < nparams; i++ )
param->data.db[i] = prevParam->data.db[i] - (mask->data.ptr[i] ? param->data.db[i] : 0); param->data.db[i] = prevParam->data.db[i] - (mask->data.ptr[i] ? param->data.db[i] : 0);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment