コード例 #1
0
ファイル: stitcherworkspace.cpp プロジェクト: ng110/hawk
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();
}
コード例 #2
0
ファイル: stitcherworkspace.cpp プロジェクト: ng110/hawk
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();
}