avoid infinite loop in CvLevMarq (thanks to João Lima for the patch; ticket #1839)
This commit is contained in:
parent
563fc2d1e5
commit
ad8258f872
@ -166,7 +166,8 @@ 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();
|
step();
|
||||||
_param = param;
|
_param = param;
|
||||||
cvZero( err );
|
cvZero( err );
|
||||||
@ -174,6 +175,7 @@ bool CvLevMarq::update( const CvMat*& _param, CvMat*& matJ, CvMat*& _err )
|
|||||||
state = CHECK_ERR;
|
state = CHECK_ERR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lambdaLg10 = MAX(lambdaLg10-1, -16);
|
lambdaLg10 = MAX(lambdaLg10-1, -16);
|
||||||
if( ++iters >= criteria.max_iter ||
|
if( ++iters >= criteria.max_iter ||
|
||||||
@ -233,7 +235,8 @@ 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();
|
step();
|
||||||
_param = param;
|
_param = param;
|
||||||
errNorm = 0;
|
errNorm = 0;
|
||||||
@ -241,6 +244,7 @@ bool CvLevMarq::updateAlt( const CvMat*& _param, CvMat*& _JtJ, CvMat*& _JtErr, d
|
|||||||
state = CHECK_ERR;
|
state = CHECK_ERR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lambdaLg10 = MAX(lambdaLg10-1, -16);
|
lambdaLg10 = MAX(lambdaLg10-1, -16);
|
||||||
if( ++iters >= criteria.max_iter ||
|
if( ++iters >= criteria.max_iter ||
|
||||||
|
Loading…
x
Reference in New Issue
Block a user