34 #include "DGtal/base/Common.h" 36 #include "DGtal/shapes/ShapeFactory.h" 37 #include "DGtal/shapes/Shapes.h" 38 #include "DGtal/helpers/StdDefs.h" 39 #include "DGtal/topology/helpers/Surfaces.h" 42 #include "DGtal/geometry/curves/FreemanChain.h" 43 #include "DGtal/geometry/curves/GridCurve.h" 46 #include "DGtal/geometry/curves/ArithmeticalDSSComputer.h" 47 #include "DGtal/geometry/curves/estimation/MostCenteredMaximalSegmentEstimator.h" 48 #include "DGtal/geometry/curves/estimation/SegmentComputerEstimators.h" 51 #include <boost/program_options/options_description.hpp> 52 #include <boost/program_options/parsers.hpp> 53 #include <boost/program_options/variables_map.hpp> 60 using namespace DGtal;
117 template<
typename I,
typename O>
118 void estimationFromLength(
double h,
const I& itb,
const I& ite,
const O& ito )
120 typedef ArithmeticalDSSComputer<I,int,4> SegmentComputer;
122 typedef CurvatureFromDSSLengthEstimator<SegmentComputer> SCEstimator;
124 typedef MostCenteredMaximalSegmentEstimator<SegmentComputer,SCEstimator> Estimator;
125 Estimator CurvatureEstimator(sc, f);
127 CurvatureEstimator.init( h, itb, ite );
128 CurvatureEstimator.eval( itb, ite, ito );
139 template<
typename I,
typename O>
140 void estimationFromLengthAndWidth(
double h,
const I& itb,
const I& ite,
const O& ito )
142 typedef ArithmeticalDSSComputer<I,int,4> SegmentComputer;
144 typedef CurvatureFromDSSEstimator<SegmentComputer> SCEstimator;
146 typedef MostCenteredMaximalSegmentEstimator<SegmentComputer,SCEstimator> Estimator;
147 Estimator CurvatureEstimator(sc, f);
149 CurvatureEstimator.init( h, itb, ite );
150 CurvatureEstimator.eval( itb, ite, ito );
155 namespace po = boost::program_options;
157 int main(
int argc,
char** argv )
160 po::options_description general_opt(
"Allowed options are");
161 general_opt.add_options()
162 (
"help,h",
"display this message")
163 (
"input,i", po::value<std::string>(),
"input FreemanChain file name")
164 (
"GridStep,step", po::value<double>()->default_value(1.0),
"Grid step");
168 po::variables_map vm;
170 po::store(po::parse_command_line(argc, argv, general_opt), vm);
171 }
catch(
const std::exception& ex){
173 trace.info()<<
"Error checking program options: "<< ex.what()<< endl;
177 if(!parseOK || vm.count(
"help")||argc<=1 || (!(vm.count(
"input"))) )
179 trace.info() <<
"Estimates curvature using length of most centered segment computers. " << std::endl;
180 trace.info() <<
"Basic usage: " << std::endl
181 <<
"\t curvatureMCMS [options] --input <fileName> "<< std::endl
182 << general_opt <<
"\n";
187 double h = vm[
"GridStep"].as<
double>();
189 if(vm.count(
"input")){
190 string fileName = vm[
"input"].as<
string>();
192 typedef Z2i::Space Space;
193 typedef Space::Point Point;
194 typedef Space::Integer Integer;
195 typedef Z2i::KSpace KSpace;
196 typedef FreemanChain<Integer> FreemanChain;
198 vector< FreemanChain > vectFcs = PointListReader< Point >::getFreemanChainsFromFile<Integer> (fileName);
200 for(
unsigned int i=0; i<vectFcs.size(); i++){
203 FreemanChain fc = vectFcs.at(i);
205 GridCurve<> gridcurve;
206 gridcurve.initFromPointsRange( fc.begin(), fc.end() );
208 cout <<
"# grid curve " << i+1 <<
"/" 209 << gridcurve.size() <<
" " 210 << ( (gridcurve.isClosed())?
"closed":
"open" ) << endl;
213 typedef GridCurve<KSpace>::PointsRange Range;
214 Range r = gridcurve.getPointsRange();
217 cout <<
"# Curvature estimation from maximal segments" << endl;
218 std::vector<double> estimations1;
219 std::vector<double> estimations2;
220 if (gridcurve.isOpen())
222 cout <<
"# open grid curve" << endl;
223 estimationFromLength( h, r.begin(), r.end(), back_inserter(estimations1) );
224 estimationFromLengthAndWidth( h, r.begin(), r.end(), back_inserter(estimations2) );
228 cout <<
"# closed grid curve" << endl;
229 estimationFromLength( h, r.c(), r.c(), back_inserter(estimations1) );
230 estimationFromLengthAndWidth( h, r.c(), r.c(), back_inserter(estimations2) );
234 cout <<
"# id curvatureFromLength curvatureFromLengthAndWidth" << endl;
236 for ( Range::ConstIterator it = r.begin(), itEnd = r.end();
237 it != itEnd; ++it, ++j ) {
238 cout << j << setprecision( 15 )
239 <<
" " << estimations1[ j ]
240 <<
" " << estimations2[ j ] << endl;