int OtsuThresholding<T>::computeThreshold(const Vector<unsigned int>& histogram) const { const Vector<double> criterion = computeCriterion( histogram ); return criterion.maxPos(); #if 0 double s0, ss0, m0, v0, s1, ss1, m1, v1, vmin, vgng; // initialisation des statistiques de la classe 0 m0 = s0 = ss0 = v0 = 0; // initialisation des statistiques de la classe 1 s1 = ss1 = 0; for (g = 0; g < histogram.getSize(); ++g) { n1 += histogram[g]; s1 += g * histogram[g]; ss1 += g * g * histogram[g]; } m1 = s1 / n1; v1 = ss1 / n1 - m1 * m1; vmin = v1; gmin = 0; for (g = 0; g < histogram.getSize(); ++g) { n0 += histogram[g]; n1 -= histogram[g]; vgng = g * histogram[g]; s0 += vgng; s1 -= vgng; ss0 += g * vgng; ss1 -= g * vgng; if ( n0 && n1 ) { m0 = s0 / n0; m1 = s1 / n1; v0 = ss0 / n0 - m0 * m0; v1 = ss1 / n1 - m1 * m1; if ( v0 + v1 < vmin ) { vmin = v0 + v1; gmin = g + 1; } } } return gmin; #endif }
double arlCore::ICP::optimiseLS( void ) { unsigned int i; m_startError = m_endError; arlCore::OptimiseICP_LS optimizer( *this, vnl_least_squares_function::use_gradient ); //optimizer.setObserver(true); vnl_levenberg_marquardt lm(optimizer); const arlCore::vnl_rigid_vector V( m_solution ); vnl_vector<double> init(6); for( i=0 ; i<6 ; ++i ) init(i) = V[i]; lm.minimize_using_gradient(init); //m_startError = lm.get_start_error(); //m_endError = lm.get_end_error(); m_nbIterations = lm.get_num_iterations(); //m_nbIterations = optimizer.getNbIterations(); m_solution.copy(arlCore::vnl_rigid_vector(init)); m_endError = computeCriterion( m_solution ); m_solution.setRMS(m_endError); return m_endError; }
double arlCore::ICP::computeCriterion( const arlCore::vnl_rigid_matrix &M ) { vnl_vector< double > fx; return computeCriterion( M, fx ); }