From 495da944ca24495678a0be8c9e0b82a384896355 Mon Sep 17 00:00:00 2001 From: matlabbe Date: Thu, 17 Nov 2011 20:31:08 +0000 Subject: [PATCH] Added "Scale view" action (only enabled in graphics view mode) git-svn-id: http://find-object.googlecode.com/svn/trunk/find_object@24 620bd6b2-0a58-f614-fd9a-1bd335dccda9 --- example/main.cpp | 19 +++++++ src/AddObjectDialog.cpp | 7 ++- src/MainWindow.cpp | 1 + src/ObjWidget.cpp | 114 ++++++++++++++++++++++++++++------------ src/ObjWidget.h | 6 ++- 5 files changed, 110 insertions(+), 37 deletions(-) diff --git a/example/main.cpp b/example/main.cpp index 624422c1..5aeecf89 100644 --- a/example/main.cpp +++ b/example/main.cpp @@ -182,6 +182,7 @@ int main(int argc, char * argv[]) else { objWidget.setKptColor(indexes_1.at(k), QColor(0,0,0,alpha)); + sceneWidget.setKptColor(indexes_2.at(k), QColor(0,0,0,alpha)); } } QPen rectPen(color); @@ -200,9 +201,27 @@ int main(int argc, char * argv[]) // Wait for gui objWidget.setGraphicsViewMode(false); objWidget.setWindowTitle("Object"); + if(objWidget.image().width() <= 800) + { + objWidget.setGeometry(0, 0, objWidget.image().width(), objWidget.image().height()); + } + else + { + objWidget.setGeometry(0, 0, 800, 600); + objWidget.setAutoScale(false); + } objWidget.show(); sceneWidget.setGraphicsViewMode(false); sceneWidget.setWindowTitle("Scene"); + if(sceneWidget.image().width() <= 800) + { + sceneWidget.setGeometry(0, 0, sceneWidget.image().width(), sceneWidget.image().height()); + } + else + { + sceneWidget.setGeometry(0, 0, 800, 600); + sceneWidget.setAutoScale(false); + } sceneWidget.show(); int r = app.exec(); printf("Closing...\n"); diff --git a/src/AddObjectDialog.cpp b/src/AddObjectDialog.cpp index 9760a1d6..b7d9d44a 100644 --- a/src/AddObjectDialog.cpp +++ b/src/AddObjectDialog.cpp @@ -126,6 +126,7 @@ void AddObjectDialog::setState(int state) ui_->cameraView->setVisible(true); ui_->objectView->setVisible(false); ui_->cameraView->setGraphicsViewMode(true); + updateNextButton(); } else if(state == kVerifySelection) { @@ -156,6 +157,8 @@ void AddObjectDialog::setState(int state) } } ui_->objectView->setData(selectedKeypoints, cv::Mat(), cvImage_); + ui_->objectView->setMinimumSize(roi.width, roi.height); + ui_->objectView->update(); cvResetImageROI(cvImage_); ui_->pushButton_next->setEnabled(true); } @@ -268,8 +271,8 @@ CvRect AddObjectDialog::computeROI(const std::vector & kpts) roi.y = h1; roi.width = x2-x1; roi.height = h2-h1; - printf("ptx=%d, pty=%d\n", (int)kpts.at(i).pt.x, (int)kpts.at(i).pt.y); - printf("x=%d, y=%d, w=%d, h=%d\n", roi.x, roi.y, roi.width, roi.height); + //printf("ptx=%d, pty=%d\n", (int)kpts.at(i).pt.x, (int)kpts.at(i).pt.y); + //printf("x=%d, y=%d, w=%d, h=%d\n", roi.x, roi.y, roi.width, roi.height); } return roi; diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 0efc60c1..939cb7bc 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -159,6 +159,7 @@ void MainWindow::showObject(ObjWidget * obj) obj->setGraphicsViewMode(false); QList objs = ui_->objects_area->findChildren(); QVBoxLayout * vLayout = new QVBoxLayout(); + obj->setMinimumSize(obj->image().width(), obj->image().height()); int id = Settings::getGeneral_nextObjID().toInt(); if(obj->id() == 0) { diff --git a/src/ObjWidget.cpp b/src/ObjWidget.cpp index f0252d36..ba047dd6 100644 --- a/src/ObjWidget.cpp +++ b/src/ObjWidget.cpp @@ -40,9 +40,9 @@ ObjWidget::ObjWidget(QWidget * parent) : iplImage_(0), graphicsView_(0), id_(0), - graphicsViewMode_(true), detectorType_("NA"), - descriptorType_("NA") + descriptorType_("NA"), + graphicsViewInitialized_(false) { setupUi(); } @@ -57,9 +57,9 @@ ObjWidget::ObjWidget(int id, iplImage_(0), graphicsView_(0), id_(id), - graphicsViewMode_(true), detectorType_(detectorType), - descriptorType_(descriptorType) + descriptorType_(descriptorType), + graphicsViewInitialized_(false) { setupUi(); this->setData(keypoints, descriptors, iplImage); @@ -75,7 +75,7 @@ ObjWidget::~ObjWidget() void ObjWidget::setupUi() { graphicsView_ = new QGraphicsView(this); - graphicsView_->setVisible(true); + graphicsView_->setVisible(false); graphicsView_->setTransformationAnchor(QGraphicsView::AnchorUnderMouse); graphicsView_->setScene(new QGraphicsScene(graphicsView_)); @@ -93,9 +93,13 @@ void ObjWidget::setupUi() _mirrorView = _menu->addAction(tr("Mirror view")); _mirrorView->setCheckable(true); _mirrorView->setChecked(false); - _plainView = _menu->addAction(tr("Plain view")); - _plainView->setCheckable(true); - _plainView->setChecked(!graphicsViewMode_); + _graphicsViewMode = _menu->addAction(tr("Graphics view")); + _graphicsViewMode->setCheckable(true); + _graphicsViewMode->setChecked(false); + _autoScale = _menu->addAction(tr("Scale view")); + _autoScale->setCheckable(true); + _autoScale->setChecked(true); + _autoScale->setEnabled(false); _menu->addSeparator(); _saveImage = _menu->addAction(tr("Save picture...")); _menu->addSeparator(); @@ -121,12 +125,13 @@ void ObjWidget::setId(int id) void ObjWidget::setGraphicsViewMode(bool on) { - graphicsViewMode_ = on; + _graphicsViewMode->setChecked(on); graphicsView_->setVisible(on); + _autoScale->setEnabled(on); //update items' color if(on) { - if(keypointItems_.size() == 0) + if(!graphicsViewInitialized_) { this->setupGraphicsView(); } @@ -138,9 +143,30 @@ void ObjWidget::setGraphicsViewMode(bool on) } } } - graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio); - _plainView->setChecked(!on); - this->update(); + if(_autoScale->isChecked()) + { + graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio); + } + else + { + graphicsView_->resetTransform(); + } +} + +void ObjWidget::setAutoScale(bool autoScale) +{ + _autoScale->setChecked(autoScale); + if(_graphicsViewMode) + { + if(autoScale) + { + graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio); + } + else + { + graphicsView_->resetTransform(); + } + } } void ObjWidget::setData(const std::vector & keypoints, const cv::Mat & descriptors, const IplImage * image) @@ -150,6 +176,8 @@ void ObjWidget::setData(const std::vector & keypoints, const cv::M kptColors_ = QVector(keypoints.size(), defaultColor()); keypointItems_.clear(); rectItems_.clear(); + graphicsView_->scene()->clear(); + graphicsViewInitialized_ = false; if(iplImage_) { cvReleaseImage(&iplImage_); @@ -167,9 +195,9 @@ void ObjWidget::setData(const std::vector & keypoints, const cv::M cvCopy(image, iplImage_, NULL); image_ = QPixmap::fromImage(Ipl2QImage(iplImage_)); - this->setMinimumSize(image_.size()); + //this->setMinimumSize(image_.size()); } - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked()) { this->setupGraphicsView(); } @@ -180,11 +208,12 @@ void ObjWidget::resetKptsColor() for(int i=0; iisChecked()) { keypointItems_[i]->setColor(this->defaultColor()); } } + qDeleteAll(rectItems_.begin(), rectItems_.end()); rectItems_.clear(); } @@ -195,7 +224,7 @@ void ObjWidget::setKptColor(unsigned int index, const QColor & color) kptColors_[index] = color; } - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked()) { if(index < keypointItems_.size()) { @@ -206,7 +235,11 @@ void ObjWidget::setKptColor(unsigned int index, const QColor & color) void ObjWidget::addRect(QGraphicsRectItem * rect) { - graphicsView_->scene()->addItem(rect); + if(graphicsViewInitialized_) + { + graphicsView_->scene()->addItem(rect); + } + rect->setZValue(2); rectItems_.append(rect); } @@ -288,12 +321,12 @@ void ObjWidget::load(QDataStream & streamPtr) descriptors = cv::Mat(rows, cols, type, data.data()).clone(); streamPtr >> image_; this->setData(kpts, descriptors, 0); - this->setMinimumSize(image_.size()); + //this->setMinimumSize(image_.size()); } void ObjWidget::paintEvent(QPaintEvent *event) { - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked()) { QWidget::paintEvent(event); } @@ -304,10 +337,10 @@ void ObjWidget::paintEvent(QPaintEvent *event) //Scale float w = image_.width(); float h = image_.height(); - float widthRatio = this->rect().width() / w; - float heightRatio = this->rect().height() / h; + float widthRatio = float(this->rect().width()) / w; + float heightRatio = float(this->rect().height()) / h; float ratio = 1.0f; - //printf("w=%f, h=%f, wR=%f, hR=%f, sW=%f, sH=%f\n", w, h, widthRatio, heightRatio, sceneRect.width(), sceneRect.height()); + //printf("w=%f, h=%f, wR=%f, hR=%f, sW=%d, sH=%d\n", w, h, widthRatio, heightRatio, this->rect().width(), this->rect().height()); if(widthRatio < heightRatio) { ratio = widthRatio; @@ -350,11 +383,13 @@ void ObjWidget::paintEvent(QPaintEvent *event) { painter.drawPixmap(QPoint(0,0), image_); } + if(_showFeatures->isChecked()) { drawKeypoints(&painter); } + for(int i=0; irect()); painter.restore(); } + } } } @@ -370,7 +406,7 @@ void ObjWidget::paintEvent(QPaintEvent *event) void ObjWidget::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked() && _autoScale->isChecked()) { graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio); } @@ -399,7 +435,7 @@ void ObjWidget::contextMenuEvent(QContextMenuEvent * event) } else if(action == _showFeatures || action == _showImage) { - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked()) { this->updateItemsShown(); } @@ -411,7 +447,7 @@ void ObjWidget::contextMenuEvent(QContextMenuEvent * event) else if(action == _mirrorView) { graphicsView_->setTransform(QTransform().scale(this->isMirrorView()?-1.0:1.0, 1.0)); - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked() && _autoScale->isChecked()) { graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio); } @@ -424,16 +460,20 @@ void ObjWidget::contextMenuEvent(QContextMenuEvent * event) { emit removalTriggered(this); } - else if(action == _plainView) + else if(action == _graphicsViewMode) { - this->setGraphicsViewMode(!_plainView->isChecked()); + this->setGraphicsViewMode(_graphicsViewMode->isChecked()); + } + else if(action == _autoScale) + { + this->setAutoScale(_autoScale->isChecked()); } QWidget::contextMenuEvent(event); } QPixmap ObjWidget::getSceneAsPixmap() { - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked()) { QPixmap img(graphicsView_->sceneRect().width(), graphicsView_->sceneRect().height()); QPainter p(&img); @@ -472,7 +512,7 @@ void ObjWidget::drawKeypoints(QPainter * painter) { const cv::KeyPoint & r = *iter; float radius = 14*1.2/9.*2;//r.size*1.2/9.*2; - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked()) { QString info = QString( "ID = %1\n" "Response = %2\n" @@ -508,7 +548,7 @@ QColor ObjWidget::defaultColor() const std::vector ObjWidget::selectedKeypoints() const { std::vector selected; - if(graphicsViewMode_) + if(_graphicsViewMode->isChecked()) { QList items = graphicsView_->scene()->selectedItems(); for(int i=0; i ObjWidget::selectedKeypoints() const void ObjWidget::setupGraphicsView() { - graphicsView_->scene()->clear(); if(!image_.isNull()) { graphicsView_->scene()->setSceneRect(image_.rect()); @@ -537,8 +576,17 @@ void ObjWidget::setupGraphicsView() pixmapItem->setVisible(this->isImageShown()); this->drawKeypoints(); - graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio); + for(int i=0; iscene()->addItem(rectItems_.at(i)); + } + + if(_autoScale->isChecked()) + { + graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio); + } } + graphicsViewInitialized_ = true; } } diff --git a/src/ObjWidget.h b/src/ObjWidget.h index 846da346..848002dc 100644 --- a/src/ObjWidget.h +++ b/src/ObjWidget.h @@ -42,6 +42,7 @@ public: void resetKptsColor(); void setKptColor(unsigned int index, const QColor & color); void setGraphicsViewMode(bool on); + void setAutoScale(bool autoScale); void setDeletable(bool deletable); void addRect(QGraphicsRectItem * rect); @@ -88,11 +89,11 @@ private: QList keypointItems_; QGraphicsView * graphicsView_; int id_; - bool graphicsViewMode_; QVector kptColors_; QString detectorType_; QString descriptorType_; QList rectItems_; + bool graphicsViewInitialized_; // menu stuff QString _savedFileName; @@ -102,7 +103,8 @@ private: QAction * _saveImage; QAction * _mirrorView; QAction * _delete; - QAction * _plainView; + QAction * _graphicsViewMode; + QAction * _autoScale; };