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
This commit is contained in:
matlabbe 2011-11-17 20:31:08 +00:00
parent 3db8e21688
commit 495da944ca
5 changed files with 110 additions and 37 deletions

View File

@ -182,6 +182,7 @@ int main(int argc, char * argv[])
else else
{ {
objWidget.setKptColor(indexes_1.at(k), QColor(0,0,0,alpha)); 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); QPen rectPen(color);
@ -200,9 +201,27 @@ int main(int argc, char * argv[])
// Wait for gui // Wait for gui
objWidget.setGraphicsViewMode(false); objWidget.setGraphicsViewMode(false);
objWidget.setWindowTitle("Object"); 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(); objWidget.show();
sceneWidget.setGraphicsViewMode(false); sceneWidget.setGraphicsViewMode(false);
sceneWidget.setWindowTitle("Scene"); 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(); sceneWidget.show();
int r = app.exec(); int r = app.exec();
printf("Closing...\n"); printf("Closing...\n");

View File

@ -126,6 +126,7 @@ void AddObjectDialog::setState(int state)
ui_->cameraView->setVisible(true); ui_->cameraView->setVisible(true);
ui_->objectView->setVisible(false); ui_->objectView->setVisible(false);
ui_->cameraView->setGraphicsViewMode(true); ui_->cameraView->setGraphicsViewMode(true);
updateNextButton();
} }
else if(state == kVerifySelection) else if(state == kVerifySelection)
{ {
@ -156,6 +157,8 @@ void AddObjectDialog::setState(int state)
} }
} }
ui_->objectView->setData(selectedKeypoints, cv::Mat(), cvImage_); ui_->objectView->setData(selectedKeypoints, cv::Mat(), cvImage_);
ui_->objectView->setMinimumSize(roi.width, roi.height);
ui_->objectView->update();
cvResetImageROI(cvImage_); cvResetImageROI(cvImage_);
ui_->pushButton_next->setEnabled(true); ui_->pushButton_next->setEnabled(true);
} }
@ -268,8 +271,8 @@ CvRect AddObjectDialog::computeROI(const std::vector<cv::KeyPoint> & kpts)
roi.y = h1; roi.y = h1;
roi.width = x2-x1; roi.width = x2-x1;
roi.height = h2-h1; roi.height = h2-h1;
printf("ptx=%d, pty=%d\n", (int)kpts.at(i).pt.x, (int)kpts.at(i).pt.y); //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("x=%d, y=%d, w=%d, h=%d\n", roi.x, roi.y, roi.width, roi.height);
} }
return roi; return roi;

View File

@ -159,6 +159,7 @@ void MainWindow::showObject(ObjWidget * obj)
obj->setGraphicsViewMode(false); obj->setGraphicsViewMode(false);
QList<ObjWidget*> objs = ui_->objects_area->findChildren<ObjWidget*>(); QList<ObjWidget*> objs = ui_->objects_area->findChildren<ObjWidget*>();
QVBoxLayout * vLayout = new QVBoxLayout(); QVBoxLayout * vLayout = new QVBoxLayout();
obj->setMinimumSize(obj->image().width(), obj->image().height());
int id = Settings::getGeneral_nextObjID().toInt(); int id = Settings::getGeneral_nextObjID().toInt();
if(obj->id() == 0) if(obj->id() == 0)
{ {

View File

@ -40,9 +40,9 @@ ObjWidget::ObjWidget(QWidget * parent) :
iplImage_(0), iplImage_(0),
graphicsView_(0), graphicsView_(0),
id_(0), id_(0),
graphicsViewMode_(true),
detectorType_("NA"), detectorType_("NA"),
descriptorType_("NA") descriptorType_("NA"),
graphicsViewInitialized_(false)
{ {
setupUi(); setupUi();
} }
@ -57,9 +57,9 @@ ObjWidget::ObjWidget(int id,
iplImage_(0), iplImage_(0),
graphicsView_(0), graphicsView_(0),
id_(id), id_(id),
graphicsViewMode_(true),
detectorType_(detectorType), detectorType_(detectorType),
descriptorType_(descriptorType) descriptorType_(descriptorType),
graphicsViewInitialized_(false)
{ {
setupUi(); setupUi();
this->setData(keypoints, descriptors, iplImage); this->setData(keypoints, descriptors, iplImage);
@ -75,7 +75,7 @@ ObjWidget::~ObjWidget()
void ObjWidget::setupUi() void ObjWidget::setupUi()
{ {
graphicsView_ = new QGraphicsView(this); graphicsView_ = new QGraphicsView(this);
graphicsView_->setVisible(true); graphicsView_->setVisible(false);
graphicsView_->setTransformationAnchor(QGraphicsView::AnchorUnderMouse); graphicsView_->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
graphicsView_->setScene(new QGraphicsScene(graphicsView_)); graphicsView_->setScene(new QGraphicsScene(graphicsView_));
@ -93,9 +93,13 @@ void ObjWidget::setupUi()
_mirrorView = _menu->addAction(tr("Mirror view")); _mirrorView = _menu->addAction(tr("Mirror view"));
_mirrorView->setCheckable(true); _mirrorView->setCheckable(true);
_mirrorView->setChecked(false); _mirrorView->setChecked(false);
_plainView = _menu->addAction(tr("Plain view")); _graphicsViewMode = _menu->addAction(tr("Graphics view"));
_plainView->setCheckable(true); _graphicsViewMode->setCheckable(true);
_plainView->setChecked(!graphicsViewMode_); _graphicsViewMode->setChecked(false);
_autoScale = _menu->addAction(tr("Scale view"));
_autoScale->setCheckable(true);
_autoScale->setChecked(true);
_autoScale->setEnabled(false);
_menu->addSeparator(); _menu->addSeparator();
_saveImage = _menu->addAction(tr("Save picture...")); _saveImage = _menu->addAction(tr("Save picture..."));
_menu->addSeparator(); _menu->addSeparator();
@ -121,12 +125,13 @@ void ObjWidget::setId(int id)
void ObjWidget::setGraphicsViewMode(bool on) void ObjWidget::setGraphicsViewMode(bool on)
{ {
graphicsViewMode_ = on; _graphicsViewMode->setChecked(on);
graphicsView_->setVisible(on); graphicsView_->setVisible(on);
_autoScale->setEnabled(on);
//update items' color //update items' color
if(on) if(on)
{ {
if(keypointItems_.size() == 0) if(!graphicsViewInitialized_)
{ {
this->setupGraphicsView(); this->setupGraphicsView();
} }
@ -138,9 +143,30 @@ void ObjWidget::setGraphicsViewMode(bool on)
} }
} }
} }
if(_autoScale->isChecked())
{
graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio); graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio);
_plainView->setChecked(!on); }
this->update(); 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<cv::KeyPoint> & keypoints, const cv::Mat & descriptors, const IplImage * image) void ObjWidget::setData(const std::vector<cv::KeyPoint> & keypoints, const cv::Mat & descriptors, const IplImage * image)
@ -150,6 +176,8 @@ void ObjWidget::setData(const std::vector<cv::KeyPoint> & keypoints, const cv::M
kptColors_ = QVector<QColor>(keypoints.size(), defaultColor()); kptColors_ = QVector<QColor>(keypoints.size(), defaultColor());
keypointItems_.clear(); keypointItems_.clear();
rectItems_.clear(); rectItems_.clear();
graphicsView_->scene()->clear();
graphicsViewInitialized_ = false;
if(iplImage_) if(iplImage_)
{ {
cvReleaseImage(&iplImage_); cvReleaseImage(&iplImage_);
@ -167,9 +195,9 @@ void ObjWidget::setData(const std::vector<cv::KeyPoint> & keypoints, const cv::M
cvCopy(image, iplImage_, NULL); cvCopy(image, iplImage_, NULL);
image_ = QPixmap::fromImage(Ipl2QImage(iplImage_)); image_ = QPixmap::fromImage(Ipl2QImage(iplImage_));
this->setMinimumSize(image_.size()); //this->setMinimumSize(image_.size());
} }
if(graphicsViewMode_) if(_graphicsViewMode->isChecked())
{ {
this->setupGraphicsView(); this->setupGraphicsView();
} }
@ -180,11 +208,12 @@ void ObjWidget::resetKptsColor()
for(int i=0; i<kptColors_.size(); ++i) for(int i=0; i<kptColors_.size(); ++i)
{ {
kptColors_[i] = defaultColor(); kptColors_[i] = defaultColor();
if(graphicsViewMode_) if(_graphicsViewMode->isChecked())
{ {
keypointItems_[i]->setColor(this->defaultColor()); keypointItems_[i]->setColor(this->defaultColor());
} }
} }
qDeleteAll(rectItems_.begin(), rectItems_.end());
rectItems_.clear(); rectItems_.clear();
} }
@ -195,7 +224,7 @@ void ObjWidget::setKptColor(unsigned int index, const QColor & color)
kptColors_[index] = color; kptColors_[index] = color;
} }
if(graphicsViewMode_) if(_graphicsViewMode->isChecked())
{ {
if(index < keypointItems_.size()) if(index < keypointItems_.size())
{ {
@ -206,7 +235,11 @@ void ObjWidget::setKptColor(unsigned int index, const QColor & color)
void ObjWidget::addRect(QGraphicsRectItem * rect) void ObjWidget::addRect(QGraphicsRectItem * rect)
{ {
if(graphicsViewInitialized_)
{
graphicsView_->scene()->addItem(rect); graphicsView_->scene()->addItem(rect);
}
rect->setZValue(2);
rectItems_.append(rect); rectItems_.append(rect);
} }
@ -288,12 +321,12 @@ void ObjWidget::load(QDataStream & streamPtr)
descriptors = cv::Mat(rows, cols, type, data.data()).clone(); descriptors = cv::Mat(rows, cols, type, data.data()).clone();
streamPtr >> image_; streamPtr >> image_;
this->setData(kpts, descriptors, 0); this->setData(kpts, descriptors, 0);
this->setMinimumSize(image_.size()); //this->setMinimumSize(image_.size());
} }
void ObjWidget::paintEvent(QPaintEvent *event) void ObjWidget::paintEvent(QPaintEvent *event)
{ {
if(graphicsViewMode_) if(_graphicsViewMode->isChecked())
{ {
QWidget::paintEvent(event); QWidget::paintEvent(event);
} }
@ -304,10 +337,10 @@ void ObjWidget::paintEvent(QPaintEvent *event)
//Scale //Scale
float w = image_.width(); float w = image_.width();
float h = image_.height(); float h = image_.height();
float widthRatio = this->rect().width() / w; float widthRatio = float(this->rect().width()) / w;
float heightRatio = this->rect().height() / h; float heightRatio = float(this->rect().height()) / h;
float ratio = 1.0f; 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) if(widthRatio < heightRatio)
{ {
ratio = widthRatio; ratio = widthRatio;
@ -350,11 +383,13 @@ void ObjWidget::paintEvent(QPaintEvent *event)
{ {
painter.drawPixmap(QPoint(0,0), image_); painter.drawPixmap(QPoint(0,0), image_);
} }
if(_showFeatures->isChecked()) if(_showFeatures->isChecked())
{ {
drawKeypoints(&painter); drawKeypoints(&painter);
} }
for(int i=0; i<rectItems_.size(); ++i) for(int i=0; i<rectItems_.size(); ++i)
{ {
painter.save(); painter.save();
@ -363,6 +398,7 @@ void ObjWidget::paintEvent(QPaintEvent *event)
painter.drawRect(rectItems_.at(i)->rect()); painter.drawRect(rectItems_.at(i)->rect());
painter.restore(); painter.restore();
} }
} }
} }
} }
@ -370,7 +406,7 @@ void ObjWidget::paintEvent(QPaintEvent *event)
void ObjWidget::resizeEvent(QResizeEvent* event) void ObjWidget::resizeEvent(QResizeEvent* event)
{ {
QWidget::resizeEvent(event); QWidget::resizeEvent(event);
if(graphicsViewMode_) if(_graphicsViewMode->isChecked() && _autoScale->isChecked())
{ {
graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio); graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio);
} }
@ -399,7 +435,7 @@ void ObjWidget::contextMenuEvent(QContextMenuEvent * event)
} }
else if(action == _showFeatures || action == _showImage) else if(action == _showFeatures || action == _showImage)
{ {
if(graphicsViewMode_) if(_graphicsViewMode->isChecked())
{ {
this->updateItemsShown(); this->updateItemsShown();
} }
@ -411,7 +447,7 @@ void ObjWidget::contextMenuEvent(QContextMenuEvent * event)
else if(action == _mirrorView) else if(action == _mirrorView)
{ {
graphicsView_->setTransform(QTransform().scale(this->isMirrorView()?-1.0:1.0, 1.0)); 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); graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio);
} }
@ -424,16 +460,20 @@ void ObjWidget::contextMenuEvent(QContextMenuEvent * event)
{ {
emit removalTriggered(this); 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); QWidget::contextMenuEvent(event);
} }
QPixmap ObjWidget::getSceneAsPixmap() QPixmap ObjWidget::getSceneAsPixmap()
{ {
if(graphicsViewMode_) if(_graphicsViewMode->isChecked())
{ {
QPixmap img(graphicsView_->sceneRect().width(), graphicsView_->sceneRect().height()); QPixmap img(graphicsView_->sceneRect().width(), graphicsView_->sceneRect().height());
QPainter p(&img); QPainter p(&img);
@ -472,7 +512,7 @@ void ObjWidget::drawKeypoints(QPainter * painter)
{ {
const cv::KeyPoint & r = *iter; const cv::KeyPoint & r = *iter;
float radius = 14*1.2/9.*2;//r.size*1.2/9.*2; float radius = 14*1.2/9.*2;//r.size*1.2/9.*2;
if(graphicsViewMode_) if(_graphicsViewMode->isChecked())
{ {
QString info = QString( "ID = %1\n" QString info = QString( "ID = %1\n"
"Response = %2\n" "Response = %2\n"
@ -508,7 +548,7 @@ QColor ObjWidget::defaultColor() const
std::vector<cv::KeyPoint> ObjWidget::selectedKeypoints() const std::vector<cv::KeyPoint> ObjWidget::selectedKeypoints() const
{ {
std::vector<cv::KeyPoint> selected; std::vector<cv::KeyPoint> selected;
if(graphicsViewMode_) if(_graphicsViewMode->isChecked())
{ {
QList<QGraphicsItem*> items = graphicsView_->scene()->selectedItems(); QList<QGraphicsItem*> items = graphicsView_->scene()->selectedItems();
for(int i=0; i<items.size(); ++i) for(int i=0; i<items.size(); ++i)
@ -524,7 +564,6 @@ std::vector<cv::KeyPoint> ObjWidget::selectedKeypoints() const
void ObjWidget::setupGraphicsView() void ObjWidget::setupGraphicsView()
{ {
graphicsView_->scene()->clear();
if(!image_.isNull()) if(!image_.isNull())
{ {
graphicsView_->scene()->setSceneRect(image_.rect()); graphicsView_->scene()->setSceneRect(image_.rect());
@ -537,8 +576,17 @@ void ObjWidget::setupGraphicsView()
pixmapItem->setVisible(this->isImageShown()); pixmapItem->setVisible(this->isImageShown());
this->drawKeypoints(); this->drawKeypoints();
for(int i=0; i<rectItems_.size(); ++i)
{
graphicsView_->scene()->addItem(rectItems_.at(i));
}
if(_autoScale->isChecked())
{
graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio); graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio);
} }
} }
graphicsViewInitialized_ = true;
}
} }

View File

@ -42,6 +42,7 @@ public:
void resetKptsColor(); void resetKptsColor();
void setKptColor(unsigned int index, const QColor & color); void setKptColor(unsigned int index, const QColor & color);
void setGraphicsViewMode(bool on); void setGraphicsViewMode(bool on);
void setAutoScale(bool autoScale);
void setDeletable(bool deletable); void setDeletable(bool deletable);
void addRect(QGraphicsRectItem * rect); void addRect(QGraphicsRectItem * rect);
@ -88,11 +89,11 @@ private:
QList<KeypointItem*> keypointItems_; QList<KeypointItem*> keypointItems_;
QGraphicsView * graphicsView_; QGraphicsView * graphicsView_;
int id_; int id_;
bool graphicsViewMode_;
QVector<QColor> kptColors_; QVector<QColor> kptColors_;
QString detectorType_; QString detectorType_;
QString descriptorType_; QString descriptorType_;
QList<QGraphicsRectItem*> rectItems_; QList<QGraphicsRectItem*> rectItems_;
bool graphicsViewInitialized_;
// menu stuff // menu stuff
QString _savedFileName; QString _savedFileName;
@ -102,7 +103,8 @@ private:
QAction * _saveImage; QAction * _saveImage;
QAction * _mirrorView; QAction * _mirrorView;
QAction * _delete; QAction * _delete;
QAction * _plainView; QAction * _graphicsViewMode;
QAction * _autoScale;
}; };