コード例 #1
0
ファイル: CASM.cs プロジェクト: siayou/active-shape-model
        public long realignAll()
        {
            int i;

            long start = CSettings.currentTimeMillis();

            CXYVector.realign(_trainingData[0], _mean, _weight);
            _newMean = new CXYVector(_trainingData[0]);
            for (i = 1; i < _numSamples; i++)
            {
                CXYVector.realign(_trainingData[i], _mean, _weight);
                _newMean.add(_trainingData[i]);
            }
            _newMean.divide(_numSamples);

            return(CSettings.currentTimeMillis() - start);
        }
コード例 #2
0
ファイル: CASM.cs プロジェクト: siayou/active-shape-model
 public void normalizeMean()
 {
     CXYVector.realign(_newMean, _normalShape, _weight);
     _energy = _mean.distance(_newMean);
     _mean   = new CXYVector(_newMean);
 }
コード例 #3
0
ファイル: CASM.cs プロジェクト: siayou/active-shape-model
        public bool doStep()
        {
            if (_stepCounter >= maxStep)
            {
                return(false);
            }
            _stepCounter++;
            if (isConverge())
            {
                return(false);
            }

            int i, j;
            // Calculate Movement
            int detectedEdgeCnt = calculateMovement(_XdX);

            // Compute Change
            CXYVector  currentShape = new CXYVector(_PDMData.mean);
            CMatrix3x3 pose         = CXYVector.realign(currentShape, _XdX, _weight);

            // Get Residual Adjustment
            CXYVector XdX = new CXYVector(_XdX);

            XdX.transform(pose.inverse());
            double [] dx = XdX.substractDouble(_PDMData.mean);

            // Translate Into Model Parameter
            double  [] db = new double[_PDMData.freedom];
            double [,] vectorsPtr = _PDMData.eigen.vectors;
            double dimension = _size * 2;

            for (i = 0; i < _PDMData.freedom; i++)
            {
                db[i] = 0;
                for (j = 0; j < dimension; j++)
                {
                    db[i] += vectorsPtr[j, i] * dx[j];
                }
            }

            // Find Out If Parameter Is Out Of Limit
            double dm = 0.0;

            for (i = 0; i < _PDMData.freedom; i++)
            {
                dm += (db[i] * db[i]) / _PDMData.eigen.values[i];
            }

            // If It Does, Apply Limit
            dm = Math.Sqrt(dm);
            if (dm > 3.0)
            {
                for (i = 0; i < _PDMData.freedom; i++)
                {
                    db[i] *= 3.0 / dm;
                }
            }

            // Update Parameter
            currentShape = PDMData.generateNewVariation(-1, db);
            CXYVector.realign(currentShape, _XdX, _weight);
            //currentShape.transform(pose);
            _energy    = _ASMResult.distance(currentShape);
            _ASMResult = currentShape;

            return(detectedEdgeCnt > (_ASMResult.size / 10));
        }