void StitcherWorkspace::onLoadGeometryClicked() { QString file = QFileDialog::getOpenFileName(0,tr("Load Geometry from File"), QString(), tr("Image Geometry (*.hig)")); if(file.isEmpty()) { return; } QFile fp(file); if(!fp.open(QIODevice::ReadOnly)) { return; } QList<QGraphicsItem *> graphicsItems = _stitcherView->items(); QTextStream in(&fp); QString dumb; int nImages; in >> dumb >> dumb >> nImages; for(int i = 0; i<nImages; i++) { QString id; double dx,dy,dz,theta; in >> dumb >> id; ImageItem * item = NULL; for(int j = 0; j < graphicsItems.size(); j++) { item = qgraphicsitem_cast<ImageItem *>(graphicsItems[j]); if(item && item->identifier() == id) { break; } else { item = NULL; } } in >> dumb >> dx; in >> dumb >> dy; in >> dumb >> dz; in >> dumb >> theta; if(item) { item->setDx(dx); item->setDy(dy); item->setDz(dz); item->setTheta(theta); } } fp.close(); loadGeometry(); }
void StitcherWorkspace::onOptimizeGeometryClicked() { geometrically_constrained_system * gc = geometrically_constrained_system_alloc(); /* create positioned images */ QMap<ImageItem *, positioned_image *> pos_image_map; QList<QGraphicsItem *> graphicsItems = _stitcherView->items(); for(int i = 0; i < graphicsItems.size(); i++) { if(ImageItem * item = qgraphicsitem_cast<ImageItem *>(graphicsItems[i])) { positioned_image * p = create_positioned_image(item->getImage()); set_image_position(p,DeltaX,item->dx()); if(!item->dxLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,DeltaX)); } set_image_position(p,DeltaY,item->dy()); if(!item->dyLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,DeltaY)); } set_image_position(p,Zoom,1.0/item->dz()); if(!item->dzLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,Zoom)); } set_image_position(p,Theta,item->theta()); if(!item->thetaLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,Theta)); } set_image_position(p,Alpha,item->alpha()); if(!item->alphaLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,Alpha)); } pos_image_map.insert(item,p); } } QStandardItemModel * model = qobject_cast<QStandardItemModel *>(constraintsTree->model()); int total_points = 0; for(int i = 0; i<model->rowCount(); i++) { QStandardItem * it = model->item(i,0); geometric_constraint c = geometric_constraint_init((GeometryConstraintType)it->data(Qt::UserRole + 3).toInt(),0); QList<QVariant> item_details = it->data(Qt::UserRole + 1).value<QList<QVariant> >(); QList<QVariant> point_details = it->data(Qt::UserRole + 2).value<QList<QVariant> >(); total_points += item_details.size(); for(int i = 0; i<item_details.size(); i++) { ImageItem * item = item_details[i].value<ImageItem *>(); QPointF pos = point_details[i].value<QPointF>(); positioned_image * a = pos_image_map.value(item); control_point cp = create_control_point(a,pos.x(),pos.y()); geometric_constraint_add_point(&c,cp); } geometrically_constrained_system_add_constraint(gc,c); } if(total_points < gc->n_variables+gc->n_constraints) { QMessageBox::warning(this,"Geometry Optimization","<p>Too few control points." " The number of control points must be equal or greater to the degrees of freedom.</p>" "<p>Optimization aborted!</p>"); return ; } if(model->rowCount()) { geometry_contraint_minimizer(gc); } _stitcherView->clearConstraintFits(); for(int i = 0; i<model->rowCount(); i++) { QStandardItem * it = model->item(i,0); for(int j = 0; j<it->rowCount()-1; j++) { it->child(j,1)->setText(QString("%0").arg(gc->constraints[i].error[j])); } it->child(it->rowCount()-1,1)->setText(QString("%0").arg(gc->constraints[i].best_fit)); _stitcherView->drawConstraintFit(gc); } for(int i = 0; i<gc->n_variables; i++) { ImageItem * item = pos_image_map.keys(gc->variables[i].parent).first(); if(gc->variables[i].type == DeltaX) { item->setDx(gc->variables[i].parent->pos[DeltaX]); } if(gc->variables[i].type == DeltaY) { item->setDy(gc->variables[i].parent->pos[DeltaY]); } if(gc->variables[i].type == Zoom) { item->setDz(1.0/gc->variables[i].parent->pos[Zoom]); } if(gc->variables[i].type == Theta) { item->setTheta(gc->variables[i].parent->pos[Theta]); } if(gc->variables[i].type == Alpha) { item->setAlpha(gc->variables[i].parent->pos[Alpha]); } } loadGeometry(); }