Added code example for descriptors extraction

git-svn-id: http://find-object.googlecode.com/svn/trunk/find_object@20 620bd6b2-0a58-f614-fd9a-1bd335dccda9
This commit is contained in:
matlabbe
2011-11-15 16:37:40 +00:00
parent d71dcd00ea
commit a761af58da
13 changed files with 363 additions and 87 deletions
+3 -3
View File
@@ -1,7 +1,7 @@
#include "AddObjectDialog.h"
#include "ui_addObjectDialog.h"
#include "Object.h"
#include "ObjWidget.h"
#include "KeypointItem.h"
#include "Camera.h"
#include "qtipl.h"
@@ -15,7 +15,7 @@
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui_c.h>
AddObjectDialog::AddObjectDialog(QList<Object*> * objects, QWidget * parent, Qt::WindowFlags f) :
AddObjectDialog::AddObjectDialog(QList<ObjWidget*> * objects, QWidget * parent, Qt::WindowFlags f) :
QDialog(parent, f),
camera_(0),
objects_(objects),
@@ -191,7 +191,7 @@ void AddObjectDialog::setState(int state)
selectedKeypoints.at(i).pt.y -= roi.y;
}
}
objects_->append(new Object(0, selectedKeypoints, descriptors, cvImage_, Settings::currentDetectorType(), Settings::currentDescriptorType()));
objects_->append(new ObjWidget(0, selectedKeypoints, descriptors, cvImage_, Settings::currentDetectorType(), Settings::currentDescriptorType()));
cvResetImageROI(cvImage_);
+3 -3
View File
@@ -7,7 +7,7 @@
#include <opencv2/core/core_c.h>
class Ui_addObjectDialog;
class Object;
class ObjWidget;
class Camera;
class KeypointItem;
@@ -16,7 +16,7 @@ class AddObjectDialog : public QDialog {
Q_OBJECT
public:
AddObjectDialog(QList<Object*> * objects, QWidget * parent = 0, Qt::WindowFlags f = 0);
AddObjectDialog(QList<ObjWidget*> * objects, QWidget * parent = 0, Qt::WindowFlags f = 0);
virtual ~AddObjectDialog();
private slots:
@@ -37,7 +37,7 @@ private:
Ui_addObjectDialog * ui_;
Camera * camera_;
QTimer cameraTimer_;
QList<Object*> * objects_;
QList<ObjWidget*> * objects_;
IplImage * cvImage_;
enum State{kTakePicture, kSelectFeatures, kVerifySelection, kClosing};
+2 -2
View File
@@ -4,7 +4,7 @@
SET(headers_ui
./MainWindow.h
./AddObjectDialog.h
./Object.h
./ObjWidget.h
./Camera.h
./ParametersToolBox.h
)
@@ -38,7 +38,7 @@ SET(SRC_FILES
./Camera.cpp
./ParametersToolBox.cpp
./Settings.cpp
./Object.cpp
./ObjWidget.cpp
${moc_srcs}
${moc_uis}
#${srcs_qrc}
+14 -20
View File
@@ -4,7 +4,7 @@
#include "ui_mainWindow.h"
#include "qtipl.h"
#include "KeypointItem.h"
#include "Object.h"
#include "ObjWidget.h"
#include "Camera.h"
#include "Settings.h"
#include "ParametersToolBox.h"
@@ -87,7 +87,7 @@ void MainWindow::loadObjects()
QDataStream in(&file);
while(!in.atEnd())
{
Object * obj = new Object();
ObjWidget * obj = new ObjWidget();
obj->load(in);
bool alreadyLoaded = false;
for(int i=0; i<objects_.size(); ++i)
@@ -132,7 +132,7 @@ void MainWindow::saveObjects()
}
}
void MainWindow::removeObject(Object * object)
void MainWindow::removeObject(ObjWidget * object)
{
if(object)
{
@@ -152,12 +152,12 @@ void MainWindow::addObject()
}
}
void MainWindow::showObject(Object * obj)
void MainWindow::showObject(ObjWidget * obj)
{
if(obj)
{
obj->setGraphicsViewMode(false);
QList<Object*> objs = ui_->objects_area->findChildren<Object*>();
QList<ObjWidget*> objs = ui_->objects_area->findChildren<ObjWidget*>();
QVBoxLayout * vLayout = new QVBoxLayout();
int id = Settings::getGeneral_nextObjID().toInt();
if(obj->id() == 0)
@@ -183,7 +183,7 @@ void MainWindow::showObject(Object * obj)
vLayout->addLayout(hLayout);
vLayout->addWidget(obj);
objects_.last()->setDeletable(true);
connect(obj, SIGNAL(removalTriggered(Object*)), this, SLOT(removeObject(Object*)));
connect(obj, SIGNAL(removalTriggered(ObjWidget*)), this, SLOT(removeObject(ObjWidget*)));
connect(obj, SIGNAL(destroyed(QObject *)), title, SLOT(deleteLater()));
connect(obj, SIGNAL(destroyed(QObject *)), detectedLabel, SLOT(deleteLater()));
connect(obj, SIGNAL(destroyed(QObject *)), detectorDescriptorType, SLOT(deleteLater()));
@@ -293,6 +293,7 @@ void MainWindow::update()
if(cvImage)
{
QTime time;
time.start();
//Convert to grayscale
IplImage * imageGrayScale = 0;
@@ -312,13 +313,11 @@ void MainWindow::update()
}
// EXTRACT KEYPOINTS
time.start();
cv::FeatureDetector * detector = Settings::createFeaturesDetector();
std::vector<cv::KeyPoint> keypoints;
detector->detect(img, keypoints);
delete detector;
ui_->label_timeDetection->setText(QString::number(time.elapsed()));
time.start();
ui_->label_timeDetection->setText(QString::number(time.restart()));
// EXTRACT DESCRIPTORS
cv::Mat descriptors;
@@ -333,8 +332,7 @@ void MainWindow::update()
{
cvReleaseImage(&imageGrayScale);
}
ui_->label_timeExtraction->setText(QString::number(time.elapsed()));
time.start();
ui_->label_timeExtraction->setText(QString::number(time.restart()));
// COMPARE
int alpha = 20*255/100;
@@ -344,8 +342,7 @@ void MainWindow::update()
cv::Mat environment(descriptors.rows, descriptors.cols, CV_32F);
descriptors.convertTo(environment, CV_32F);
cv::flann::Index treeFlannIndex(environment, cv::flann::KDTreeIndexParams());
ui_->label_timeIndexing->setText(QString::number(time.elapsed()));
time.start();
ui_->label_timeIndexing->setText(QString::number(time.restart()));
// DO NEAREST NEIGHBOR
int k = 2;
@@ -353,8 +350,7 @@ void MainWindow::update()
cv::Mat results(dataTree_.rows, k, CV_32SC1); // results index
cv::Mat dists(dataTree_.rows, k, CV_32FC1); // Distance results are CV_32FC1
treeFlannIndex.knnSearch(dataTree_, results, dists, k, cv::flann::SearchParams(emax) ); // maximum number of leafs checked
ui_->label_timeMatching->setText(QString::number(time.elapsed()));
time.start();
ui_->label_timeMatching->setText(QString::number(time.restart()));
// PROCESS RESULTS
@@ -367,7 +363,7 @@ void MainWindow::update()
{
// Check if this descriptor matches with those of the objects
// Apply NNDR
if(dists.at<float>(i,0) <= Settings::getNN_nndrRatio().toFloat() * dists.at<float>(i,1))
if(dists.at<float>(i,0) <= Settings::getNearestNeighbor_nndrRatio().toFloat() * dists.at<float>(i,1))
{
if(j>0)
{
@@ -468,13 +464,11 @@ void MainWindow::update()
ui_->label_nfeatures->setText(QString::number(keypoints.size()));
ui_->imageView_source->update();
ui_->label_timeGui->setText(QString::number(time.elapsed()));
ui_->label_timeGui->setText(QString::number(time.restart()));
cvReleaseImage(&cvImage);
}
}
ui_->label_detectorDescriptorType->setText(QString("%1/%2").arg(Settings::currentDetectorType()).arg(Settings::currentDescriptorType()));
ui_->label_timeRefreshRate->setText(QString("(%1 Hz - %2 Hz)").arg(QString::number(1000/cameraTimer_.interval())).arg(QString::number(int(1000.0f/(float)(updateRate_.elapsed()) + 1))));
//printf("GUI refresh rate %f Hz\n", 1000.0f/(float)(updateRate_.elapsed()));
updateRate_.start();
ui_->label_timeRefreshRate->setText(QString("(%1 Hz - %2 Hz)").arg(QString::number(1000/cameraTimer_.interval())).arg(QString::number(int(1000.0f/(float)(updateRate_.restart()) + 1))));
}
+4 -4
View File
@@ -13,7 +13,7 @@
#include <opencv2/imgproc/imgproc_c.h>
class Ui_mainWindow;
class Object;
class ObjWidget;
class Camera;
class ParametersToolBox;
class QLabel;
@@ -37,15 +37,15 @@ private slots:
void saveObjects();
void update();
void updateData();
void removeObject(Object * object);
void removeObject(ObjWidget * object);
private:
void showObject(Object * obj);
void showObject(ObjWidget * obj);
private:
Ui_mainWindow * ui_;
Camera * camera_;
QList<Object*> objects_;
QList<ObjWidget*> objects_;
QTimer cameraTimer_;
cv::Mat dataTree_;
QList<int> dataRange_;
+40 -37
View File
@@ -13,7 +13,7 @@
* Author: matlab
*/
#include "Object.h"
#include "ObjWidget.h"
#include "KeypointItem.h"
#include "qtipl.h"
#include "Settings.h"
@@ -35,7 +35,7 @@
#include <stdio.h>
Object::Object(QWidget * parent) :
ObjWidget::ObjWidget(QWidget * parent) :
QWidget(parent),
iplImage_(0),
graphicsView_(0),
@@ -46,7 +46,7 @@ Object::Object(QWidget * parent) :
{
setupUi();
}
Object::Object(int id,
ObjWidget::ObjWidget(int id,
const std::vector<cv::KeyPoint> & keypoints,
const cv::Mat & descriptors,
const IplImage * iplImage,
@@ -64,7 +64,7 @@ Object::Object(int id,
setupUi();
this->setData(keypoints, descriptors, iplImage);
}
Object::~Object()
ObjWidget::~ObjWidget()
{
if(iplImage_)
{
@@ -72,14 +72,14 @@ Object::~Object()
}
}
void Object::setupUi()
void ObjWidget::setupUi()
{
graphicsView_ = new QGraphicsView(this);
graphicsView_->setVisible(true);
graphicsView_->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
graphicsView_->setScene(new QGraphicsScene(graphicsView_));
this->setLayout(new QVBoxLayout(graphicsView_));
this->setLayout(new QVBoxLayout(this));
this->layout()->addWidget(graphicsView_);
this->layout()->setContentsMargins(0,0,0,0);
@@ -110,7 +110,7 @@ void Object::setupUi()
connect(graphicsView_->scene(), SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
}
void Object::setId(int id)
void ObjWidget::setId(int id)
{
id_=id;
if(id_)
@@ -119,7 +119,7 @@ void Object::setId(int id)
}
}
void Object::setGraphicsViewMode(bool on)
void ObjWidget::setGraphicsViewMode(bool on)
{
graphicsViewMode_ = on;
graphicsView_->setVisible(on);
@@ -143,7 +143,7 @@ void Object::setGraphicsViewMode(bool on)
this->update();
}
void Object::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)
{
keypoints_ = keypoints;
descriptors_ = descriptors;
@@ -175,7 +175,7 @@ void Object::setData(const std::vector<cv::KeyPoint> & keypoints, const cv::Mat
}
}
void Object::resetKptsColor()
void ObjWidget::resetKptsColor()
{
for(int i=0; i<kptColors_.size(); ++i)
{
@@ -188,7 +188,7 @@ void Object::resetKptsColor()
rectItems_.clear();
}
void Object::setKptColor(unsigned int index, const QColor & color)
void ObjWidget::setKptColor(unsigned int index, const QColor & color)
{
if(index < kptColors_.size())
{
@@ -204,38 +204,38 @@ void Object::setKptColor(unsigned int index, const QColor & color)
}
}
void Object::addRect(QGraphicsRectItem * rect)
void ObjWidget::addRect(QGraphicsRectItem * rect)
{
graphicsView_->scene()->addItem(rect);
rectItems_.append(rect);
}
QList<QGraphicsItem*> Object::selectedItems() const
QList<QGraphicsItem*> ObjWidget::selectedItems() const
{
return graphicsView_->scene()->selectedItems();
}
bool Object::isImageShown() const
bool ObjWidget::isImageShown() const
{
return _showImage->isChecked();
}
bool Object::isFeaturesShown() const
bool ObjWidget::isFeaturesShown() const
{
return _showFeatures->isChecked();
}
bool Object::isMirrorView() const
bool ObjWidget::isMirrorView() const
{
return _mirrorView->isChecked();
}
void Object::setDeletable(bool deletable)
void ObjWidget::setDeletable(bool deletable)
{
_delete->setEnabled(deletable);
}
void Object::save(QDataStream & streamPtr) const
void ObjWidget::save(QDataStream & streamPtr) const
{
streamPtr << id_ << detectorType_ << descriptorType_;
streamPtr << (int)keypoints_.size();
@@ -259,7 +259,7 @@ void Object::save(QDataStream & streamPtr) const
streamPtr << image_;
}
void Object::load(QDataStream & streamPtr)
void ObjWidget::load(QDataStream & streamPtr)
{
std::vector<cv::KeyPoint> kpts;
cv::Mat descriptors;
@@ -291,7 +291,7 @@ void Object::load(QDataStream & streamPtr)
this->setMinimumSize(image_.size());
}
void Object::paintEvent(QPaintEvent *event)
void ObjWidget::paintEvent(QPaintEvent *event)
{
if(graphicsViewMode_)
{
@@ -367,16 +367,16 @@ void Object::paintEvent(QPaintEvent *event)
}
}
void Object::resizeEvent(QResizeEvent* event)
void ObjWidget::resizeEvent(QResizeEvent* event)
{
QWidget::resizeEvent(event);
if(graphicsViewMode_)
{
graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio);
}
QWidget::resizeEvent(event);
}
void Object::contextMenuEvent(QContextMenuEvent * event)
void ObjWidget::contextMenuEvent(QContextMenuEvent * event)
{
QAction * action = _menu->exec(event->globalPos());
if(action == _saveImage)
@@ -431,7 +431,7 @@ void Object::contextMenuEvent(QContextMenuEvent * event)
QWidget::contextMenuEvent(event);
}
QPixmap Object::getSceneAsPixmap()
QPixmap ObjWidget::getSceneAsPixmap()
{
if(graphicsViewMode_)
{
@@ -446,7 +446,7 @@ QPixmap Object::getSceneAsPixmap()
}
}
void Object::updateItemsShown()
void ObjWidget::updateItemsShown()
{
QList<QGraphicsItem*> items = graphicsView_->scene()->items();
for(int i=0; i<items.size(); ++i)
@@ -462,7 +462,7 @@ void Object::updateItemsShown()
}
}
void Object::drawKeypoints(QPainter * painter)
void ObjWidget::drawKeypoints(QPainter * painter)
{
QList<KeypointItem *> items;
KeypointItem * item = 0;
@@ -499,13 +499,13 @@ void Object::drawKeypoints(QPainter * painter)
}
}
QColor Object::defaultColor() const
QColor ObjWidget::defaultColor() const
{
int alpha = 20*255/100;
return QColor(255, 255, 0, alpha);
}
std::vector<cv::KeyPoint> Object::selectedKeypoints() const
std::vector<cv::KeyPoint> ObjWidget::selectedKeypoints() const
{
std::vector<cv::KeyPoint> selected;
if(graphicsViewMode_)
@@ -522,20 +522,23 @@ std::vector<cv::KeyPoint> Object::selectedKeypoints() const
return selected;
}
void Object::setupGraphicsView()
void ObjWidget::setupGraphicsView()
{
graphicsView_->scene()->clear();
graphicsView_->scene()->setSceneRect(image_.rect());
QList<KeypointItem*> items;
if(image_.width() > 0 && image_.height() > 0)
if(!image_.isNull())
{
QRectF sceneRect = graphicsView_->sceneRect();
graphicsView_->scene()->setSceneRect(image_.rect());
QList<KeypointItem*> items;
if(image_.width() > 0 && image_.height() > 0)
{
QRectF sceneRect = graphicsView_->sceneRect();
QGraphicsPixmapItem * pixmapItem = graphicsView_->scene()->addPixmap(image_);
pixmapItem->setVisible(this->isImageShown());
this->drawKeypoints();
QGraphicsPixmapItem * pixmapItem = graphicsView_->scene()->addPixmap(image_);
pixmapItem->setVisible(this->isImageShown());
this->drawKeypoints();
graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio);
graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio);
}
}
}
+9 -9
View File
@@ -1,12 +1,12 @@
/*
* VisualObject.h
* ObjWidget.h
*
* Created on: 2011-10-21
* Author: matlab
*/
#ifndef OBJECT_H_
#define OBJECT_H_
#ifndef OBJWIDGET_H_
#define OBJWIDGET_H_
#include <opencv2/features2d/features2d.hpp>
#include <QtGui/QWidget>
@@ -20,20 +20,20 @@ class QGraphicsScene;
class QGraphicsRectItem;
class QGraphicsItem;
class Object : public QWidget
class ObjWidget : public QWidget
{
Q_OBJECT
public:
Object(QWidget * parent = 0);
Object(int id,
ObjWidget(QWidget * parent = 0);
ObjWidget(int id,
const std::vector<cv::KeyPoint> & keypoints,
const cv::Mat & descriptors,
const IplImage * image,
const QString & detectorType = "NA",
const QString & descriptorType = "NA",
QWidget * parent = 0);
virtual ~Object();
virtual ~ObjWidget();
void setId(int id);
void setData(const std::vector<cv::KeyPoint> & keypoints,
@@ -71,7 +71,7 @@ protected:
virtual void resizeEvent(QResizeEvent* event);
signals:
void removalTriggered(Object *);
void removalTriggered(ObjWidget *);
void selectionChanged();
private:
@@ -106,4 +106,4 @@ private:
};
#endif /* OBJECT_H_ */
#endif /* OBJWIDGET_H_ */
+1 -1
View File
@@ -106,7 +106,7 @@ class Settings
PARAMETER(Surf, upright, bool, false);
PARAMETER(Surf, extended, bool, false);
PARAMETER(NN, nndrRatio, float, 0.8f); // NNDR RATIO
PARAMETER(NearestNeighbor, nndrRatio, float, 0.8f); // NNDR RATIO
PARAMETER(General, nextObjID, unsigned int, 1);
+4 -4
View File
@@ -24,10 +24,10 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="Object" name="cameraView" native="true"/>
<widget class="ObjWidget" name="cameraView" native="true"/>
</item>
<item>
<widget class="Object" name="objectView" native="true"/>
<widget class="ObjWidget" name="objectView" native="true"/>
</item>
</layout>
</item>
@@ -80,9 +80,9 @@
</widget>
<customwidgets>
<customwidget>
<class>Object</class>
<class>ObjWidget</class>
<extends>QWidget</extends>
<header>Object.h</header>
<header>ObjWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
+3 -3
View File
@@ -116,7 +116,7 @@
<number>0</number>
</property>
<item>
<widget class="Object" name="imageView_source" native="true"/>
<widget class="ObjWidget" name="imageView_source" native="true"/>
</item>
</layout>
</widget>
@@ -433,9 +433,9 @@
</widget>
<customwidgets>
<customwidget>
<class>Object</class>
<class>ObjWidget</class>
<extends>QWidget</extends>
<header>Object.h</header>
<header>ObjWidget.h</header>
<container>1</container>
</customwidget>
<customwidget>