int main(int argc, char **argv){ std::string filename(""); unsigned int scale = 5, dmst = 2, window = 3, detectorType = 0, descriptorType = 0, distanceType = 2, strategy = 0; double baseSigma = 0.2, sigmaStep = 1.4, minPeak = 0.34, minPeakDistance = 0.001, acceptanceSigma = 0.1, success = 0.95, inlier = 0.4, matchingThreshold = 0.4; bool useMaxRange = false; int i = 1; while(i < argc){ if(strncmp("-filename", argv[i], sizeof("-filename")) == 0 ){ filename = argv[++i]; i++; } else if(strncmp("-detector", argv[i], sizeof("-detector")) == 0 ){ detectorType = atoi(argv[++i]); i++; } else if(strncmp("-descriptor", argv[i], sizeof("-descriptor")) == 0 ){ descriptorType = atoi(argv[++i]); i++; } else if(strncmp("-distance", argv[i], sizeof("-distance")) == 0 ){ distanceType = atoi(argv[++i]); i++; } else if(strncmp("-strategy", argv[i], sizeof("-strategy")) == 0 ){ strategy = atoi(argv[++i]); i++; } else if(strncmp("-baseSigma", argv[i], sizeof("-baseSigma")) == 0 ){ baseSigma = strtod(argv[++i], NULL); i++; } else if(strncmp("-sigmaStep", argv[i], sizeof("-sigmaStep")) == 0 ){ sigmaStep = strtod(argv[++i], NULL); i++; } else if(strncmp("-minPeak", argv[i], sizeof("-minPeak")) == 0 ){ minPeak = strtod(argv[++i], NULL); i++; } else if(strncmp("-minPeakDistance", argv[i], sizeof("-minPeakDistance")) == 0 ){ minPeakDistance = strtod(argv[++i], NULL); i++; } else if(strncmp("-scale", argv[i], sizeof("-scale")) == 0 ){ scale = atoi(argv[++i]); i++; } else if(strncmp("-dmst", argv[i], sizeof("-dmst")) == 0 ){ dmst = atoi(argv[++i]); i++; } else if(strncmp("-window", argv[i], sizeof("-window")) == 0 ){ window = atoi(argv[++i]); i++; } else if(strncmp("-acceptanceSigma", argv[i], sizeof("-acceptanceSigma")) == 0 ){ acceptanceSigma = strtod(argv[++i], NULL); i++; } else if(strncmp("-success", argv[i], sizeof("-success")) == 0 ){ success = strtod(argv[++i], NULL); i++; } else if(strncmp("-inlier", argv[i], sizeof("-inlier")) == 0 ){ inlier = strtod(argv[++i], NULL); i++; } else if(strncmp("-matchingThreshold", argv[i], sizeof("-matchingThreshold")) == 0 ){ matchingThreshold = strtod(argv[++i], NULL); i++; } else if(strncmp("-localSkip", argv[i], sizeof("-localSkip")) == 0 ){ m_localSkip = atoi(argv[++i]); i++; } else if(strncmp("-help", argv[i], sizeof("-localSkip")) == 0 ){ help(); exit(0); } else { i++; } } if(!filename.size()){ help(); exit(-1); } CarmenLogWriter writer; CarmenLogReader reader; m_sensorReference = LogSensorStream(&reader, &writer); m_sensorReference.load(filename); SimpleMinMaxPeakFinder *m_peakMinMax = new SimpleMinMaxPeakFinder(minPeak, minPeakDistance); std::string detector(""); switch(detectorType){ case 0: m_detectorCurvature = new CurvatureDetector(m_peakMinMax, scale, baseSigma, sigmaStep, dmst); m_detectorCurvature->setUseMaxRange(useMaxRange); m_detector = m_detectorCurvature; detector = "curvature"; break; case 1: m_detectorNormalEdge = new NormalEdgeDetector(m_peakMinMax, scale, baseSigma, sigmaStep, window); m_detectorNormalEdge->setUseMaxRange(useMaxRange); m_detector = m_detectorNormalEdge; detector = "edge"; break; case 2: m_detectorNormalBlob = new NormalBlobDetector(m_peakMinMax, scale, baseSigma, sigmaStep, window); m_detectorNormalBlob->setUseMaxRange(useMaxRange); m_detector = m_detectorNormalBlob; detector = "blob"; break; case 3: m_detectorRange = new RangeDetector(m_peakMinMax, scale, baseSigma, sigmaStep); m_detectorRange->setUseMaxRange(useMaxRange); m_detector = m_detectorRange; detector = "range"; break; default: std::cerr << "Wrong detector type" << std::endl; exit(-1); } HistogramDistance<double> *dist = NULL; std::string distance(""); switch(distanceType){ case 0: dist = new EuclideanDistance<double>(); distance = "euclid"; break; case 1: dist = new Chi2Distance<double>(); distance = "chi2"; break; case 2: dist = new SymmetricChi2Distance<double>(); distance = "symchi2"; break; case 3: dist = new BatthacharyyaDistance<double>(); distance = "batt"; break; case 4: dist = new KullbackLeiblerDistance<double>(); distance = "kld"; break; case 5: dist = new JensenShannonDistance<double>(); distance = "jsd"; break; default: std::cerr << "Wrong distance type" << std::endl; exit(-1); } std::string descriptor(""); switch(descriptorType){ case 0: m_betaGenerator = new BetaGridGenerator(0.02, 0.5, 4, 12); m_betaGenerator->setDistanceFunction(dist); m_descriptor = m_betaGenerator; descriptor = "beta"; break; case 1: m_shapeGenerator = new ShapeContextGenerator(0.02, 0.5, 4, 12); m_shapeGenerator->setDistanceFunction(dist); m_descriptor = m_shapeGenerator; descriptor = "shape"; break; default: std::cerr << "Wrong descriptor type" << std::endl; exit(-1); } switch(strategy){ case 0: m_ransac = new RansacFeatureSetMatcher(acceptanceSigma * acceptanceSigma * 5.99, success, inlier, matchingThreshold, acceptanceSigma * acceptanceSigma * 3.84, false); break; case 1: m_ransac = new RansacMultiFeatureSetMatcher(acceptanceSigma * acceptanceSigma * 5.99, success, inlier, matchingThreshold, acceptanceSigma * acceptanceSigma * 3.84, false); break; default: std::cerr << "Wrong strategy type" << std::endl; exit(-1); } std::cerr << "Processing file:\t" << filename << "\nDetector:\t\t" << detector << "\nDescriptor:\t\t" << descriptor << "\nDistance:\t\t" << distance << std::endl; m_sensorReference.seek(0,END); unsigned int end = m_sensorReference.tell(); m_sensorReference.seek(0,BEGIN); m_pointsReference.resize(end + 1); m_posesReference.resize(end + 1); detectLog(); countLog(); describeLog(); std::string outfile = filename; timerclear(&ransacTime); std::string bar(50,' '); bar[0] = '#'; unsigned int progress = 0; for(unsigned int i =0; i < m_pointsReference.size(); i++){ unsigned int currentProgress = (i*100)/(m_pointsReference.size() - 1); if (progress < currentProgress){ progress = currentProgress; bar[progress/2] = '#'; std::cout << "\rMatching [" << bar << "] " << progress << "%" << std::flush; } match(i); } std::cout << " done." << std::endl; std::stringstream matchFile; std::stringstream errorFile; std::stringstream timeFile; matchFile << outfile << "_" << detector << "_" << descriptor << "_" << distance << "_match.dat"; errorFile << outfile << "_" << detector << "_" << descriptor << "_" << distance << "_error.dat"; timeFile << outfile << "_" << detector << "_" << descriptor << "_" << distance << "_time.dat"; std::ofstream matchOut(matchFile.str().c_str()); std::ofstream errorOut(errorFile.str().c_str()); std::ofstream timeOut(timeFile.str().c_str()); matchOut << "# Number of matches according to various strategies" << std::endl; matchOut << "# The valid matches are the one with at least n correspondences in the inlier set " << std::endl; matchOut << "# where n = {0, 3, 5, 7, 9, 11, 13, 15}, one for each line " << std::endl; matchOut << "# optimal \t correspondence \t residual \v valid" << std::endl; errorOut << "# Mean error according to various strategies" << std::endl; errorOut << "# The valid matches are the one with at least n correspondences in the inlier set " << std::endl; errorOut << "# where n = {0, 3, 5, 7, 9, 11, 13, 15}, one for each line " << std::endl; errorOut << "# optimal \t correspondence \t residual \v valid" << std::endl; timeOut << "# Total time spent for the various steps" << std::endl; timeOut << "# detection \t description \t RANSAC" << std::endl; for(unsigned int c = 0; c < 8; c++){ matchOut << m_match[c] << "\t" << m_matchC[c] << "\t" << m_matchR[c] << "\t" << m_valid[c] << std::endl; errorOut << m_error[c]/m_valid[c] << "\t" << m_errorC[c]/m_valid[c] << "\t" << m_errorR[c]/m_valid[c] << "\t" << m_valid[c] << std::endl; } timeOut << double(detectTime.tv_sec) + 1e-06 * double(detectTime.tv_usec) << "\t" << double(describeTime.tv_sec) + 1e-06 * double(describeTime.tv_usec) << "\t" << double(ransacTime.tv_sec) + 1e-06 * double(ransacTime.tv_usec) << std::endl; }
int main(int argc, char **argv){ std::string filename(""), vocabulary("Vocabulary.voc"); unsigned int scale = 5, dmst = 2, window = 3, detectorType = 0, descriptorType = 0, distanceType = 2; double baseSigma = 0.2, sigmaStep = 1.4, minPeak = 0.34, minPeakDistance = 0.001; bool useMaxRange = false; int i = 1; while(i < argc){ if(strncmp("-filename", argv[i], sizeof("-filename")) == 0 ){ filename = argv[++i]; i++; } else if(strncmp("-vocabulary", argv[i], sizeof("-vocabulary")) == 0 ){ vocabulary = argv[++i]; i++; } else if(strncmp("-detector", argv[i], sizeof("-detector")) == 0 ){ detectorType = atoi(argv[++i]); i++; } else if(strncmp("-descriptor", argv[i], sizeof("-descriptor")) == 0 ){ descriptorType = atoi(argv[++i]); i++; } else if(strncmp("-distance", argv[i], sizeof("-distance")) == 0 ){ distanceType = atoi(argv[++i]); i++; } else if(strncmp("-baseSigma", argv[i], sizeof("-baseSigma")) == 0 ){ baseSigma = strtod(argv[++i], NULL); i++; } else if(strncmp("-sigmaStep", argv[i], sizeof("-sigmaStep")) == 0 ){ sigmaStep = strtod(argv[++i], NULL); i++; } else if(strncmp("-minPeak", argv[i], sizeof("-minPeak")) == 0 ){ minPeak = strtod(argv[++i], NULL); i++; } else if(strncmp("-minPeakDistance", argv[i], sizeof("-minPeakDistance")) == 0 ){ minPeakDistance = strtod(argv[++i], NULL); i++; } else if(strncmp("-scale", argv[i], sizeof("-scale")) == 0 ){ scale = atoi(argv[++i]); i++; } else if(strncmp("-dmst", argv[i], sizeof("-dmst")) == 0 ){ dmst = atoi(argv[++i]); i++; } else if(strncmp("-window", argv[i], sizeof("-window")) == 0 ){ window = atoi(argv[++i]); i++; } else if(strncmp("-help", argv[i], sizeof("-localSkip")) == 0 ){ help(); exit(0); } else { i++; } } if(!filename.size()){ help(); exit(-1); } CarmenLogWriter writer; CarmenLogReader reader; m_sensorReference = LogSensorStream(&reader, &writer); m_sensorReference.load(filename); SimpleMinMaxPeakFinder *m_peakMinMax = new SimpleMinMaxPeakFinder(minPeak, minPeakDistance); std::string detector(""); switch(detectorType){ case 0: m_detectorCurvature = new CurvatureDetector(m_peakMinMax, scale, baseSigma, sigmaStep, dmst); m_detectorCurvature->setUseMaxRange(useMaxRange); m_detector = m_detectorCurvature; detector = "curvature"; break; case 1: m_detectorNormalEdge = new NormalEdgeDetector(m_peakMinMax, scale, baseSigma, sigmaStep, window); m_detectorNormalEdge->setUseMaxRange(useMaxRange); m_detector = m_detectorNormalEdge; detector = "edge"; break; case 2: m_detectorNormalBlob = new NormalBlobDetector(m_peakMinMax, scale, baseSigma, sigmaStep, window); m_detectorNormalBlob->setUseMaxRange(useMaxRange); m_detector = m_detectorNormalBlob; detector = "blob"; break; case 3: m_detectorRange = new RangeDetector(m_peakMinMax, scale, baseSigma, sigmaStep); m_detectorRange->setUseMaxRange(useMaxRange); m_detector = m_detectorRange; detector = "range"; break; default: std::cerr << "Wrong detector type" << std::endl; exit(-1); } HistogramDistance<double> *dist = NULL; std::string distance(""); switch(distanceType){ case 0: dist = new EuclideanDistance<double>(); distance = "euclid"; break; case 1: dist = new Chi2Distance<double>(); distance = "chi2"; break; case 2: dist = new SymmetricChi2Distance<double>(); distance = "symchi2"; break; case 3: dist = new BatthacharyyaDistance<double>(); distance = "batt"; break; case 4: dist = new KullbackLeiblerDistance<double>(); distance = "kld"; break; case 5: dist = new JensenShannonDistance<double>(); distance = "jsd"; break; default: std::cerr << "Wrong distance type" << std::endl; exit(-1); } std::string descriptor(""); switch(descriptorType){ case 0: m_betaGenerator = new BetaGridGenerator(0.02, 0.5, 4, 12); m_betaGenerator->setDistanceFunction(dist); m_descriptor = m_betaGenerator; descriptor = "beta"; break; case 1: m_shapeGenerator = new ShapeContextGenerator(0.02, 0.5, 4, 12); m_shapeGenerator->setDistanceFunction(dist); m_descriptor = m_shapeGenerator; descriptor = "shape"; break; default: std::cerr << "Wrong descriptor type" << std::endl; exit(-1); } std::cerr << "Processing file:\t" << filename << "\nDetector:\t\t" << detector << "\nDescriptor:\t\t" << descriptor << "\nDistance:\t\t" << distance << "\nVocabulary:\t\t" << vocabulary << std::endl; std::ifstream vocabularyStream(vocabulary.c_str()); boost::archive::binary_iarchive vocabularyArchive(vocabularyStream); vocabularyArchive >> histogramVocabulary; m_sensorReference.seek(0,END); unsigned int end = m_sensorReference.tell(); m_sensorReference.seek(0,BEGIN); m_pointsReference.resize(end + 1); m_posesReference.resize(end + 1); writePoses(); try { std::string featureFile = filename.substr(0,filename.find_last_of('.')) + ".flt"; std::ifstream featureStream(featureFile.c_str()); boost::archive::binary_iarchive featureArchive(featureStream); std::cout << "Loading feature file " << featureFile << " ..."; featureArchive >> m_pointsReference; std::cout << " done." << std::endl; } catch(boost::archive::archive_exception& exc) { detectLog(); countLog(); describeLog(); } std::string bowFile = filename.substr(0,filename.find_last_of('.')) + ".bow"; std::ofstream bowStream(bowFile.c_str()); writeBoW(bowStream); }
int main(int argc, char **argv){ std::string filename(""); unsigned int scale = 5, dmst = 2, window = 3, detectorType = 0, descriptorType = 0, distanceType = 2, strategy = 0; double baseSigma = 0.2, sigmaStep = 1.4, minPeak = 0.34, minPeakDistance = 0.001, success = 0.95, inlier = 0.4, matchingThreshold = 0.4; bool useMaxRange = false; int i = 1; while(i < argc){ if(strncmp("-filename", argv[i], sizeof("-filename")) == 0 ){ filename = argv[++i]; i++; } else if(strncmp("-detector", argv[i], sizeof("-detector")) == 0 ){ detectorType = atoi(argv[++i]); i++; } else if(strncmp("-descriptor", argv[i], sizeof("-descriptor")) == 0 ){ descriptorType = atoi(argv[++i]); i++; } else if(strncmp("-corresp", argv[i], sizeof("-corresp")) == 0 ){ corresp = atoi(argv[++i]); i++; } else if(strncmp("-distance", argv[i], sizeof("-distance")) == 0 ){ distanceType = atoi(argv[++i]); i++; } else if(strncmp("-baseSigma", argv[i], sizeof("-baseSigma")) == 0 ){ baseSigma = strtod(argv[++i], NULL); i++; } else if(strncmp("-sigmaStep", argv[i], sizeof("-sigmaStep")) == 0 ){ sigmaStep = strtod(argv[++i], NULL); i++; } else if(strncmp("-minPeak", argv[i], sizeof("-minPeak")) == 0 ){ minPeak = strtod(argv[++i], NULL); i++; } else if(strncmp("-minPeakDistance", argv[i], sizeof("-minPeakDistance")) == 0 ){ minPeakDistance = strtod(argv[++i], NULL); i++; } else if(strncmp("-scale", argv[i], sizeof("-scale")) == 0 ){ scale = atoi(argv[++i]); i++; } else if(strncmp("-dmst", argv[i], sizeof("-dmst")) == 0 ){ dmst = atoi(argv[++i]); i++; } else if(strncmp("-window", argv[i], sizeof("-window")) == 0 ){ scale = atoi(argv[++i]); i++; } else if(strncmp("-acceptanceSigma", argv[i], sizeof("-acceptanceSigma")) == 0 ){ acceptanceSigma = strtod(argv[++i], NULL); i++; } else if(strncmp("-success", argv[i], sizeof("-success")) == 0 ){ success = strtod(argv[++i], NULL); i++; } else if(strncmp("-inlier", argv[i], sizeof("-inlier")) == 0 ){ inlier = strtod(argv[++i], NULL); i++; } else if(strncmp("-matchingThreshold", argv[i], sizeof("-matchingThreshold")) == 0 ){ matchingThreshold = strtod(argv[++i], NULL); i++; } else { i++; } } if(!filename.size()){ help(); exit(-1); } CarmenLogWriter writer; CarmenLogReader reader; m_sensorReference = LogSensorStream(&reader, &writer); m_sensorReference.load(filename); SimpleMinMaxPeakFinder *m_peakMinMax = new SimpleMinMaxPeakFinder(minPeak, minPeakDistance); std::string detector(""); switch(detectorType){ case 0: m_detectorCurvature = new CurvatureDetector(m_peakMinMax, scale, baseSigma, sigmaStep, dmst); m_detectorCurvature->setUseMaxRange(useMaxRange); m_detector = m_detectorCurvature; detector = "curvature"; break; case 1: m_detectorNormalEdge = new NormalEdgeDetector(m_peakMinMax, scale, baseSigma, sigmaStep, window); m_detectorNormalEdge->setUseMaxRange(useMaxRange); m_detector = m_detectorNormalEdge; detector = "edge"; break; case 2: m_detectorNormalBlob = new NormalBlobDetector(m_peakMinMax, scale, baseSigma, sigmaStep, window); m_detectorNormalBlob->setUseMaxRange(useMaxRange); m_detector = m_detectorNormalBlob; detector = "blob"; break; case 3: m_detectorRange = new RangeDetector(m_peakMinMax, scale, baseSigma, sigmaStep); m_detectorRange->setUseMaxRange(useMaxRange); m_detector = m_detectorRange; detector = "range"; break; default: std::cerr << "Wrong detector type" << std::endl; exit(-1); } HistogramDistance<double> *dist = NULL; std::string distance(""); switch(distanceType){ case 0: dist = new EuclideanDistance<double>(); distance = "euclid"; break; case 1: dist = new Chi2Distance<double>(); distance = "chi2"; break; case 2: dist = new SymmetricChi2Distance<double>(); distance = "symchi2"; break; case 3: dist = new BatthacharyyaDistance<double>(); distance = "batt"; break; case 4: dist = new KullbackLeiblerDistance<double>(); distance = "kld"; break; case 5: dist = new JensenShannonDistance<double>(); distance = "jsd"; break; default: std::cerr << "Wrong distance type" << std::endl; exit(-1); } std::string descriptor(""); switch(descriptorType){ case 0: m_betaGenerator = new BetaGridGenerator(0.02, 0.5, 4, 12); m_betaGenerator->setDistanceFunction(dist); m_descriptor = m_betaGenerator; descriptor = "beta"; break; case 1: m_shapeGenerator = new ShapeContextGenerator(0.02, 0.5, 4, 12); m_shapeGenerator->setDistanceFunction(dist); m_descriptor = m_shapeGenerator; descriptor = "shape"; break; default: std::cerr << "Wrong descriptor type" << std::endl; exit(-1); } std::cerr << "Processing file:\t" << filename << "\nDetector:\t\t" << detector << "\nDescriptor:\t\t" << descriptor << "\nDistance:\t\t" << distance << std::endl; switch(strategy){ case 0: m_ransac = new RansacFeatureSetMatcher(acceptanceSigma * acceptanceSigma * 5.99, success, inlier, matchingThreshold, acceptanceSigma * acceptanceSigma * 3.84, false); break; case 1: m_ransac = new RansacMultiFeatureSetMatcher(acceptanceSigma * acceptanceSigma * 5.99, success, inlier, matchingThreshold, acceptanceSigma * acceptanceSigma * 3.84, false); break; default: std::cerr << "Wrong strategy type" << std::endl; exit(-1); } m_sensorReference.seek(0,END); unsigned int end = m_sensorReference.tell(); m_sensorReference.seek(0,BEGIN); m_pointsReference.resize(end + 1); m_posesReference.resize(end + 1); computeBoundingBox(); detectLog(); describeLog(); std::stringstream mapFile; mapFile << filename << "_map.png"; /* cairo_surface_t * cairoMapSurface = cairo_pdf_surface_create(mapFile.str().c_str(), sizeX, sizeY); cairo_surface_t * cairoOutSurface = cairo_pdf_surface_create(outFile.str().c_str(), sizeX, sizeY);*/ cairo_surface_t * cairoMapSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, sizeX, sizeY); // cairo_surface_t * cairoMapSurface = cairo_svg_surface_create(mapFile.str().c_str(), sizeX, sizeY); cairoMap = cairo_create(cairoMapSurface); std::stringstream outDir; outDir << filename << "_" << detector << "_" << descriptor << "_" << distance << "/"; mkdir(outDir.str().c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); computeMap(); std::string bar(50,' '); bar[0] = '#'; unsigned int progress = 0; for(unsigned int i =0; i < m_pointsReference.size(); i++){ unsigned int currentProgress = (i*100)/(m_pointsReference.size() - 1); if (progress < currentProgress){ progress = currentProgress; bar[progress/2] = '#'; std::cout << "\rMatching [" << bar << "] " << progress << "%" << std::flush; } std::stringstream outFile; outFile << outDir.str() << "frame_"; outFile.width(4); outFile.fill('0'); outFile << std::right << i << ".png"; cairo_surface_t * cairoOutSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, sizeX, sizeY); // cairo_surface_t * cairoOutSurface = cairo_svg_surface_create(outFile.str().c_str(), sizeX, sizeY); cairoOut = cairo_create(cairoOutSurface); cairo_translate(cairoOut, -offsetX, -offsetY); cairo_scale(cairoOut, scaleFactor, scaleFactor); cairo_set_line_width(cairoOut, 1./scaleFactor); match(i); cairo_surface_write_to_png(cairoOutSurface, outFile.str().c_str()); cairo_surface_destroy(cairoOutSurface); cairo_destroy(cairoOut); } std::cout << " done." << std::endl; cairo_surface_write_to_png(cairoMapSurface, mapFile.str().c_str()); cairo_surface_destroy(cairoMapSurface); cairo_destroy(cairoMap); // cairo_show_page(cairoOut); }