Commit ad8258f8 authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

avoid infinite loop in CvLevMarq (thanks to João Lima for the patch; ticket #1839)

parent 563fc2d1
...@@ -166,13 +166,15 @@ bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err ) ...@@ -166,13 +166,15 @@ bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err )
errNorm = cvNorm( err, 0, CV_L2 ); errNorm = cvNorm( err, 0, CV_L2 );
if( errNorm > prevErrNorm ) if( errNorm > prevErrNorm )
{ {
lambdaLg10++; if( ++lambdaLg10 <= 16 )
step(); {
_param = param; step();
cvZero( err ); _param = param;
_err = err; cvZero( err );
state = CHECK_ERR; _err = err;
return true; state = CHECK_ERR;
return true;
}
} }
lambdaLg10 = MAX(lambdaLg10-1, -16); lambdaLg10 = MAX(lambdaLg10-1, -16);
...@@ -233,13 +235,15 @@ bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, d ...@@ -233,13 +235,15 @@ bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, d
assert( state == CHECK_ERR ); assert( state == CHECK_ERR );
if( errNorm > prevErrNorm ) if( errNorm > prevErrNorm )
{ {
lambdaLg10++; if( ++lambdaLg10 <= 16 )
step(); {
_param = param; step();
errNorm = 0; _param = param;
_errNorm = &errNorm; errNorm = 0;
state = CHECK_ERR; _errNorm = &errNorm;
return true; state = CHECK_ERR;
return true;
}
} }
lambdaLg10 = MAX(lambdaLg10-1, -16); lambdaLg10 = MAX(lambdaLg10-1, -16);
......
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