From e6923daf1c1576aebaf0789ac1286572cacb257a Mon Sep 17 00:00:00 2001 From: matlabbe Date: Tue, 26 May 2015 14:15:04 -0400 Subject: [PATCH] Fixed how images are scaled to handle images with different size --- guilib/include/rtabmap/gui/ImageView.h | 1 + guilib/src/ImageView.cpp | 8 ++++++ guilib/src/MainWindow.cpp | 38 +++++++++++++++----------- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/guilib/include/rtabmap/gui/ImageView.h b/guilib/include/rtabmap/gui/ImageView.h index 44fdaf09..ddb3b042 100644 --- a/guilib/include/rtabmap/gui/ImageView.h +++ b/guilib/include/rtabmap/gui/ImageView.h @@ -55,6 +55,7 @@ public: void saveSettings(QSettings & settings, const QString & group = "") const; void loadSettings(QSettings & settings, const QString & group = ""); + QRectF sceneRect() const; bool isImageShown() const; bool isImageDepthShown() const; bool isFeaturesShown() const; diff --git a/guilib/src/ImageView.cpp b/guilib/src/ImageView.cpp index 0fd5e38e..c4efa5a1 100644 --- a/guilib/src/ImageView.cpp +++ b/guilib/src/ImageView.cpp @@ -127,6 +127,11 @@ void ImageView::loadSettings(QSettings & settings, const QString & group) } } +QRectF ImageView::sceneRect() const +{ + return _graphicsView->scene()->sceneRect(); +} + bool ImageView::isImageShown() const { return _showImage->isChecked(); @@ -770,6 +775,9 @@ void ImageView::clear() } _imageDepth = QPixmap(); + _graphicsView->scene()->setSceneRect(QRectF()); + _graphicsView->setScene(_graphicsView->scene()); + if(!_graphicsView->isVisible()) { this->update(); diff --git a/guilib/src/MainWindow.cpp b/guilib/src/MainWindow.cpp index 68b74698..7a4c08d6 100644 --- a/guilib/src/MainWindow.cpp +++ b/guilib/src/MainWindow.cpp @@ -1099,12 +1099,6 @@ void MainWindow::processStats(const rtabmap::Statistics & stat) { _ui->imageView_loopClosure->setImageDepth(lcDepth); } - if(img.rect().isValid()) - { - QRectF sceneRect = img.rect(); - _ui->imageView_source->setSceneRect(sceneRect); - _ui->imageView_loopClosure->setSceneRect(sceneRect); - } } UDEBUG("time= %d ms", time.restart()); @@ -2263,30 +2257,42 @@ void MainWindow::drawKeypoints(const std::multimap & refWords } // Draw lines between corresponding features... - float scale = _ui->imageView_source->viewScale(); - UDEBUG("scale=%f", scale); - float deltaX = _ui->imageView_source->width()/scale; + float scaleSource = _ui->imageView_source->viewScale(); + float scaleLoop = _ui->imageView_loopClosure->viewScale(); + UDEBUG("scale source=%f loop=%f", scaleSource, scaleLoop); + // Delta in actual window pixels + float sourceMarginX = (_ui->imageView_source->width() - _ui->imageView_source->sceneRect().width()*scaleSource)/2.0f; + float sourceMarginY = (_ui->imageView_source->height() - _ui->imageView_source->sceneRect().height()*scaleSource)/2.0f; + float loopMarginX = (_ui->imageView_loopClosure->width() - _ui->imageView_loopClosure->sceneRect().width()*scaleLoop)/2.0f; + float loopMarginY = (_ui->imageView_loopClosure->height() - _ui->imageView_loopClosure->sceneRect().height()*scaleLoop)/2.0f; + + float deltaX = 0; float deltaY = 0; + if(_preferencesDialog->isVerticalLayoutUsed()) { - deltaX = 0; - deltaY = _ui->imageView_source->height()/scale; - deltaY += _ui->label_matchId->height()/scale; + deltaY = _ui->label_matchId->height() + _ui->imageView_source->height(); } + else + { + deltaX = _ui->imageView_source->width(); + } + for(QList >::iterator iter = uniqueCorrespondences.begin(); iter!=uniqueCorrespondences.end(); ++iter) { + _ui->imageView_source->addLine( iter->first.x, iter->first.y, - iter->second.x+deltaX, - iter->second.y+deltaY, + (iter->second.x*scaleLoop+loopMarginX+deltaX-sourceMarginX)/scaleSource, + (iter->second.y*scaleLoop+loopMarginY+deltaY-sourceMarginY)/scaleSource, Qt::cyan); _ui->imageView_loopClosure->addLine( - iter->first.x-deltaX, - iter->first.y-deltaY, + (iter->first.x*scaleSource+sourceMarginX-deltaX-loopMarginX)/scaleLoop, + (iter->first.y*scaleSource+sourceMarginY-deltaY-loopMarginY)/scaleLoop, iter->second.x, iter->second.y, Qt::cyan);