コード例 #1
0
        public void Init(int nparams, int nerrs, CvTermCriteria criteria, bool completeSymmFlag)
        {
            if (Param != null || /*Param.Rows != nparams ||*/ nerrs != ((Err != null) ? Err.Rows : 0))
            {
                Clear();
            }

            Mask = new CvMat(nparams, 1, MatrixType.U8C1);
            Cv.Set(Mask, CvScalar.ScalarAll(1));
            PrevParam = new CvMat(nparams, 1, MatrixType.F64C1);
            Param     = new CvMat(nparams, 1, MatrixType.F64C1);
            JtJ       = new CvMat(nparams, nparams, MatrixType.F64C1);
            JtJN      = new CvMat(nparams, nparams, MatrixType.F64C1);
            JtJV      = new CvMat(nparams, nparams, MatrixType.F64C1);
            JtJW      = new CvMat(nparams, 1, MatrixType.F64C1);
            JtErr     = new CvMat(nparams, 1, MatrixType.F64C1);
            if (nerrs > 0)
            {
                J   = new CvMat(nerrs, nparams, MatrixType.F64C1);
                Err = new CvMat(nerrs, 1, MatrixType.F64C1);
            }
            PrevErrNorm = double.MaxValue;
            LambdaLg10  = -3;
            Criteria    = criteria;
            if ((criteria.Type & CriteriaType.Iteration) == CriteriaType.Iteration)
            {
                criteria.MaxIter = Math.Min(Math.Max(criteria.MaxIter, 1), 1000);
            }
            else
            {
                criteria.MaxIter = 30;
            }
            if ((criteria.Type & CriteriaType.Epsilon) == CriteriaType.Epsilon)
            {
                criteria.Epsilon = Math.Max(criteria.Epsilon, 0);
            }
            else
            {
                criteria.Epsilon = double.Epsilon;
            }
            State            = LevMarqState.Started;
            Iters            = 0;
            CompleteSymmFlag = completeSymmFlag;
        }
コード例 #2
0
        public unsafe bool UpdateAlt(out CvMat _param, out CvMat _JtJ, out CvMat _JtErr, out double _errNorm)
        {
            _JtJ     = null;
            _JtErr   = null;
            _errNorm = 0;

            double change;

            if (State == LevMarqState.Done)
            {
                _param = Param;
                return(false);
            }

            if (State == LevMarqState.Started)
            {
                _param = Param;
                Cv.Zero(JtJ);
                Cv.Zero(JtErr);
                _errNorm = 0;
                _JtJ     = JtJ;
                _JtErr   = JtErr;
                _errNorm = ErrNorm;
                State    = LevMarqState.CalcJ;
                return(true);
            }

            if (State == LevMarqState.CalcJ)
            {
                Cv.Copy(Param, PrevParam);
                Step();
                _param      = Param;
                PrevErrNorm = ErrNorm;
                ErrNorm     = 0;
                _errNorm    = ErrNorm;
                State       = LevMarqState.CheckErr;
                return(true);
            }

            Debug.Assert(State == LevMarqState.CheckErr);
            if (ErrNorm > PrevErrNorm)
            {
                LambdaLg10++;
                Step();
                _param   = Param;
                ErrNorm  = 0;
                _errNorm = ErrNorm;
                State    = LevMarqState.CheckErr;
                return(true);
            }

            LambdaLg10 = Math.Max(LambdaLg10 - 1, -16);
            if (++Iters >= Criteria.MaxIter ||
                (change = Cv.Norm(Param, PrevParam, NormType.RelativeL2)) < Criteria.Epsilon)
            {
                _param = Param;
                State  = LevMarqState.Done;
                return(false);
            }

            PrevErrNorm = ErrNorm;
            Cv.Zero(JtJ);
            Cv.Zero(JtErr);
            _param = Param;
            _JtJ   = JtJ;
            _JtErr = JtErr;
            State  = LevMarqState.CalcJ;
            return(true);
        }
コード例 #3
0
        public bool Update(out CvMat param, out CvMat matJ, out CvMat err)
        {
            double change;

            matJ = err = null;

            if (State == LevMarqState.Done)
            {
                param = Param;
                return(false);
            }

            if (State == LevMarqState.Started)
            {
                param = Param;
                Cv.Zero(J);
                Cv.Zero(Err);
                matJ  = J;
                err   = Err;
                State = LevMarqState.CalcJ;
                return(true);
            }

            if (State == LevMarqState.CalcJ)
            {
                Cv.MulTransposed(J, JtJ, true);
                Cv.GEMM(J, Err, 1, null, 0, JtErr, GemmOperation.A_T);
                Cv.Copy(Param, PrevParam);
                Step();
                if (Iters == 0)
                {
                    PrevErrNorm = Cv.Norm(Err, null, NormType.L2);
                }
                param = Param;
                Cv.Zero(Err);
                err   = Err;
                State = LevMarqState.CheckErr;
                return(true);
            }

            if (State != LevMarqState.CheckErr)
            {
                throw new OpenCvSharpException();
            }
            ErrNorm = Cv.Norm(Err, null, NormType.L2);
            if (ErrNorm > PrevErrNorm)
            {
                LambdaLg10++;
                Step();
                param = Param;
                Cv.Zero(Err);
                err   = Err;
                State = LevMarqState.CalcJ;
                return(true);
            }

            LambdaLg10 = Math.Max(LambdaLg10 - 1, -16);
            if (++Iters >= Criteria.MaxIter ||
                (change = Cv.Norm(Param, PrevParam, NormType.RelativeL2)) < Criteria.Epsilon)
            {
                param = Param;
                State = LevMarqState.Done;
                return(true);
            }

            PrevErrNorm = ErrNorm;
            param       = Param;
            Cv.Zero(J);
            matJ  = J;
            err   = Err;
            State = LevMarqState.CalcJ;
            return(true);
        }
コード例 #4
0
ファイル: CvLevMarq.cs プロジェクト: neoxeo/opencvsharp
        public unsafe bool UpdateAlt(out CvMat _param, out CvMat _JtJ, out CvMat _JtErr, out double _errNorm)
        {
            _JtJ = null;
            _JtErr = null;
            _errNorm = 0;

            double change;

            if (State == LevMarqState.Done)
            {
                _param = Param;
                return false;
            }

            if (State == LevMarqState.Started)
            {
                _param = Param;
                Cv.Zero(JtJ);
                Cv.Zero(JtErr);
                _errNorm = 0;
                _JtJ = JtJ;
                _JtErr = JtErr;
                _errNorm = ErrNorm;
                State = LevMarqState.CalcJ;
                return true;
            }

            if (State == LevMarqState.CalcJ)
            {
                Cv.Copy(Param, PrevParam);
                Step();
                _param = Param;
                PrevErrNorm = ErrNorm;
                ErrNorm = 0;
                _errNorm = ErrNorm;
                State = LevMarqState.CheckErr;
                return true;
            }

            Debug.Assert(State == LevMarqState.CheckErr);
            if (ErrNorm > PrevErrNorm)
            {
                LambdaLg10++;
                Step();
                _param = Param;
                ErrNorm = 0;
                _errNorm = ErrNorm;
                State = LevMarqState.CheckErr;
                return true;
            }

            LambdaLg10 = Math.Max(LambdaLg10 - 1, -16);
            if (++Iters >= Criteria.MaxIter ||
                (change = Cv.Norm(Param, PrevParam, NormType.RelativeL2)) < Criteria.Epsilon)
            {
                _param = Param;
                State = LevMarqState.Done;
                return false;
            }

            PrevErrNorm = ErrNorm;
            Cv.Zero(JtJ);
            Cv.Zero(JtErr);
            _param = Param;
            _JtJ = JtJ;
            _JtErr = JtErr;
            State = LevMarqState.CalcJ;
            return true;
        }
コード例 #5
0
ファイル: CvLevMarq.cs プロジェクト: neoxeo/opencvsharp
        public bool Update(out CvMat param, out CvMat matJ, out CvMat err)
        {
            double change;

            matJ = err = null;

            if (State == LevMarqState.Done)
            {
                param = Param;
                return false;
            }

            if (State == LevMarqState.Started)
            {
                param = Param;
                Cv.Zero(J);
                Cv.Zero(Err);
                matJ = J;
                err = Err;
                State = LevMarqState.CalcJ;
                return true;
            }

            if (State == LevMarqState.CalcJ)
            {
                Cv.MulTransposed(J, JtJ, true);
                Cv.GEMM(J, Err, 1, null, 0, JtErr, GemmOperation.A_T);
                Cv.Copy(Param, PrevParam);
                Step();
                if (Iters == 0)
                    PrevErrNorm = Cv.Norm(Err, null, NormType.L2);
                param = Param;
                Cv.Zero(Err);
                err = Err;
                State = LevMarqState.CheckErr;
                return true;
            }

            if (State != LevMarqState.CheckErr)
            {
                throw new OpenCvSharpException();
            }
            ErrNorm = Cv.Norm(Err, null, NormType.L2);
            if (ErrNorm > PrevErrNorm)
            {
                LambdaLg10++;
                Step();
                param = Param;
                Cv.Zero(Err);
                err = Err;
                State = LevMarqState.CalcJ;
                return true;
            }

            LambdaLg10 = Math.Max(LambdaLg10 - 1, -16);
            if (++Iters >= Criteria.MaxIter ||
                (change = Cv.Norm(Param, PrevParam, NormType.RelativeL2)) < Criteria.Epsilon)
            {
                param = Param;
                State = LevMarqState.Done;
                return true;
            }

            PrevErrNorm = ErrNorm;
            param = Param;
            Cv.Zero(J);
            matJ = J;
            err = Err;
            State = LevMarqState.CalcJ;
            return true;
        }
コード例 #6
0
ファイル: CvLevMarq.cs プロジェクト: neoxeo/opencvsharp
        public void Init(int nparams, int nerrs, CvTermCriteria criteria, bool completeSymmFlag)
        {
            if (Param != null || /*Param.Rows != nparams ||*/ nerrs != ((Err != null) ? Err.Rows : 0))
                Clear();

            Mask = new CvMat(nparams, 1, MatrixType.U8C1);
            Cv.Set(Mask, CvScalar.ScalarAll(1));
            PrevParam = new CvMat(nparams, 1, MatrixType.F64C1);
            Param = new CvMat(nparams, 1, MatrixType.F64C1);
            JtJ = new CvMat(nparams, nparams, MatrixType.F64C1);
            JtJN = new CvMat(nparams, nparams, MatrixType.F64C1);
            JtJV = new CvMat(nparams, nparams, MatrixType.F64C1);
            JtJW = new CvMat(nparams, 1, MatrixType.F64C1);
            JtErr = new CvMat(nparams, 1, MatrixType.F64C1);
            if (nerrs > 0)
            {
                J = new CvMat(nerrs, nparams, MatrixType.F64C1);
                Err = new CvMat(nerrs, 1, MatrixType.F64C1);
            }
            PrevErrNorm = double.MaxValue;
            LambdaLg10 = -3;
            Criteria = criteria;
            if ((criteria.Type & CriteriaType.Iteration) == CriteriaType.Iteration)
                criteria.MaxIter = Math.Min(Math.Max(criteria.MaxIter, 1), 1000);
            else
                criteria.MaxIter = 30;
            if ((criteria.Type & CriteriaType.Epsilon) == CriteriaType.Epsilon)
                criteria.Epsilon = Math.Max(criteria.Epsilon, 0);
            else
                criteria.Epsilon = double.Epsilon;
            State = LevMarqState.Started;
            Iters = 0;
            CompleteSymmFlag = completeSymmFlag;
        }