unsigned int optimize(PanoramaData& pano, const char * userScript) { char * script = 0; unsigned int retval = 0; if (userScript == 0) { std::ostringstream scriptbuf; UIntSet allImg; fill_set(allImg,0, unsigned(pano.getNrOfImages()-1)); pano.printPanoramaScript(scriptbuf, pano.getOptimizeVector(), pano.getOptions(), allImg, true); script = strdup(scriptbuf.str().c_str()); } else { script = const_cast<char *>(userScript); } OptInfo opt; AlignInfo ainf; if (ParseScript( script, &ainf ) == 0) { if( CheckParams( &ainf ) == 0 ) { ainf.fcn = fcnPano; SetGlobalPtr( &ainf ); opt.numVars = ainf.numParam; opt.numData = ainf.numPts; opt.SetVarsToX = SetLMParams; opt.SetXToVars = SetAlignParams; opt.fcn = ainf.fcn; *opt.message = 0; RunLMOptimizer( &opt ); ainf.data = opt.message; // get results from align info. #ifdef DEBUG_WRITE_OPTIM_OUTPUT fullPath path; StringtoFullPath(&path, DEBUG_WRITE_OPTIM_OUTPUT_FILE ); ainf.data = opt.message; WriteResults( script, &path, &ainf, distSquared, 0); #endif pano.updateVariables( GetAlignInfoVariables(ainf) ); pano.updateCtrlPointErrors( GetAlignInfoCtrlPoints(ainf) ); } else { std::cerr << "Bad params" << std::endl; retval = 2; } DisposeAlignInfo( &ainf ); } else { std::cerr << "Bad params" << std::endl; retval = 1; } if (! userScript) { free(script); } return retval; }
int main(int argc,char *argv[]) { aPrefs aP; char* script; OptInfo opt; AlignInfo ainf; fullPath infile; //fullPath outfile; // SetAdjustDefaults(&aP); if(argc != 2) { printf(PT_OPTIMIZER_VERSION); printf("Usage: %s /path/to/script.txt\n", argv[0]); exit(1); } StringtoFullPath(&infile, argv[1]); script = LoadScript( &infile ); if( script != NULL ) { if (ParseScript( script, &ainf ) == 0) { if( CheckParams( &ainf ) == 0 ) { ainf.fcn = fcnPano; SetGlobalPtr( &ainf ); opt.numVars = ainf.numParam; opt.numData = ainf.numPts; opt.SetVarsToX = SetLMParams; opt.SetXToVars = SetAlignParams; opt.fcn = ainf.fcn; *opt.message = 0; RunLMOptimizer( &opt ); ainf.data = opt.message; WriteResults( script, &infile, &ainf, distSquared, 0); exit(0); } //TODO: if optCreatePano is 1 then should call stitcher OR the option removed //if (ainf.sP.optCreatePano == 1) //{ // Stitch(); //} DisposeAlignInfo( &ainf ); } free( script ); } exit(1); }
void PTools::optimize(Panorama & pano, utils::MultiProgressDisplay & progDisplay, int maxIter) { // VariableMapVector res; // setup data structures aPrefs aP; OptInfo opt; SetAdjustDefaults(&aP); AlignInfoWrap aInfo; // copy pano information int libpano data structures if (aInfo.setInfo(pano)) { aInfo.setGlobal(); opt.numVars = aInfo.gl.numParam; opt.numData = aInfo.gl.numPts; opt.SetVarsToX = SetLMParams; opt.SetXToVars = SetAlignParams; opt.fcn = aInfo.gl.fcn; *opt.message = 0; DEBUG_DEBUG("starting optimizer"); RunLMOptimizer( &opt ); #ifdef DEBUG fullPath path; StringtoFullPath(&path, "c:/debug_optimizer.txt"); aInfo.gl.data = opt.message; WriteResults( "debug_test", &path, &aInfo.gl, distSquared, 0); #endif std::ostringstream oss; /* oss << "optimizing images"; for (UIntVector::const_iterator it = imgs.begin(); it != imgs.end(); ++it) { if (it + 1 != imgs.end()) { oss << *it << ","; } else { oss << *it; } } oss << "\n" << opt.message; progDisplay.setMessage(oss.str()); */ DEBUG_DEBUG("optimizer finished:" << opt.message); pano.updateVariables(aInfo.getVariables()); pano.updateCtrlPointErrors( aInfo.getCtrlPoints()); } }