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

View File

@ -58,7 +58,7 @@ ENDIF(APPLE AND BUILD_AS_BUNDLE)
####### SOURCES (Projects) ####### ####### SOURCES (Projects) #######
ADD_SUBDIRECTORY( src ) ADD_SUBDIRECTORY( src )
ADD_SUBDIRECTORY( example )

43
example/CMakeLists.txt Normal file
View File

@ -0,0 +1,43 @@
### Qt Gui stuff ###
SET(headers_ui
../src/ObjWidget.h
../src/Camera.h
)
#This will generate moc_* for Qt
QT4_WRAP_CPP(moc_srcs ${headers_ui})
### Qt Gui stuff end###
SET(SRC_FILES
main.cpp
../src/ObjWidget.cpp
../src/KeypointItem.cpp
../src/qtipl.cpp
../src/Settings.cpp
../src/Camera.cpp
${moc_srcs}
)
SET(INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}
${OpenCV_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/../src
)
INCLUDE(${QT_USE_FILE})
SET(LIBRARIES
${OpenCV_LIBS}
${QT_LIBRARIES}
)
# Make sure the compiler can find include files from our library.
INCLUDE_DIRECTORIES(${INCLUDE_DIRS})
# Add binary called "example" that is built from the source file "main.cpp".
# The extension is automatically found.
ADD_EXECUTABLE(example ${SRC_FILES})
TARGET_LINK_LIBRARIES(example ${LIBRARIES})
SET_TARGET_PROPERTIES( example
PROPERTIES OUTPUT_NAME ${PROJECT_PREFIX}-example)

236
example/main.cpp Normal file
View File

@ -0,0 +1,236 @@
/*
* main.cpp
*
* Created on: 2011-11-15
* Author: matlab
*/
#include <stdio.h>
// Qt stuff
#include <QtCore/QTime>
#include <QtCore/QTimer>
#include <QtGui/QApplication>
#include <QtGui/QGraphicsRectItem>
#include <QtGui/QPen>
#include <QtGui/QColor>
// OpenCV stuff
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/calib3d/calib3d.hpp> // for homography
// From this project (see src folder)
#include "ObjWidget.h"
void showUsage()
{
printf("\n");
printf("Usage :\n");
printf(" ./example object.png scene.png\n");
exit(1);
}
int main(int argc, char * argv[])
{
if(argc<3)
{
showUsage();
}
QTime time;
time.start();
// GUI stuff
QApplication app(argc, argv);
ObjWidget objWidget;
ObjWidget sceneWidget;
//Load as grayscale
IplImage * objectImg = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
IplImage * sceneImg = cvLoadImage(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
if(objectImg && sceneImg)
{
std::vector<cv::KeyPoint> objectKeypoints;
std::vector<cv::KeyPoint> sceneKeypoints;
cv::Mat objectDescriptors;
cv::Mat sceneDescriptors;
////////////////////////////
// EXTRACT KEYPOINTS
////////////////////////////
// The detector can be any of (see OpenCV features2d.hpp):
// cv::FeatureDetector * detector = new cv::FastFeatureDetector();
// cv::FeatureDetector * detector = new cv::SiftFeatureDetector();
// cv::FeatureDetector * detector = new cv::SurfFeatureDetector();
// cv::FeatureDetector * detector = new cv::StarFeatureDetector();
cv::FeatureDetector * detector = new cv::SurfFeatureDetector();
detector->detect(objectImg, objectKeypoints);
printf("Object: %d keypoints detected in %d ms\n", (int)objectKeypoints.size(), time.restart());
detector->detect(sceneImg, sceneKeypoints);
printf("Scene: %d keypoints detected in %d ms\n", (int)sceneKeypoints.size(), time.restart());
////////////////////////////
// EXTRACT DESCRIPTORS
////////////////////////////
// The extractor can be any of (see OpenCV features2d.hpp):
// cv::DescriptorExtractor * detector = new cv::BriefDescriptorExtractor();
// cv::DescriptorExtractor * detector = new cv::SiftFeatureDetector();
// cv::DescriptorExtractor * detector = new cv::SurfFeatureDetector();
cv::DescriptorExtractor * extractor = new cv::SurfDescriptorExtractor();
extractor->compute(objectImg, objectKeypoints, objectDescriptors);
printf("Object: %d descriptors extracted in %d ms\n", objectDescriptors.rows, time.restart());
extractor->compute(sceneImg, sceneKeypoints, sceneDescriptors);
printf("Scene: %d descriptors extracted in %d ms\n", sceneDescriptors.rows, time.restart());
////////////////////////////
// NEAREST NEIGHBOR MATCHING USING FLANN LIBRARY (included in OpenCV)
////////////////////////////
// Format descriptors for Flann
cv::Mat objectData;
cv::Mat sceneData;
if(objectDescriptors.type()!=CV_32F) {
objectDescriptors.convertTo(objectData, CV_32F); // make sure it's CV_32F
}
else {
objectData = objectDescriptors;
}
if(sceneDescriptors.type()!=CV_32F) {
sceneDescriptors.convertTo(sceneData, CV_32F); // make sure it's CV_32F
}
else {
sceneData = sceneDescriptors;
}
// Create Flann index
cv::flann::Index treeFlannIndex(sceneData, cv::flann::KDTreeIndexParams());
printf("Time creating FLANN index = %d ms\n", time.restart());
// search (nearest neighbor)
int k=2; // find the 2 nearest neighbors
cv::Mat results(objectData.rows, k, CV_32SC1); // Results index
cv::Mat dists(objectData.rows, k, CV_32FC1); // Distance results are CV_32FC1
treeFlannIndex.knnSearch(objectData, results, dists, k, cv::flann::SearchParams() ); // maximum number of leafs checked
printf("Time nearest neighbor search = %d ms\n", time.restart());
////////////////////////////
// PROCESS NEAREST NEIGHBOR RESULTS
////////////////////////////
// Set gui data
objWidget.setData(objectKeypoints, objectDescriptors, objectImg);
sceneWidget.setData(sceneKeypoints, sceneDescriptors, sceneImg);
// Find correspondences by NNDR (Nearest Neighbor Distance Ratio)
float nndrRatio = 0.6;
std::vector<cv::Point2f> mpts_1, mpts_2; // Used for homography
std::vector<int> indexes_1, indexes_2; // Used for homography
std::vector<uchar> outlier_mask; // Used for homography
for(unsigned int i=0; i<objectData.rows; ++i)
{
// Check if this descriptor matches with those of the objects
// Apply NNDR
if(dists.at<float>(i,0) <= nndrRatio * dists.at<float>(i,1))
{
mpts_1.push_back(objectKeypoints.at(i).pt);
indexes_1.push_back(i);
mpts_2.push_back(sceneKeypoints.at(results.at<int>(i,0)).pt);
indexes_2.push_back(results.at<int>(i,0));
}
}
// FIND HOMOGRAPHY
int minInliers = 8;
if(mpts_1.size() >= minInliers)
{
cv::Mat H = findHomography(mpts_1,
mpts_2,
cv::RANSAC,
1.0,
outlier_mask);
int inliers=0, outliers=0;
for(int k=0; k<mpts_1.size();++k)
{
if(outlier_mask.at(k))
{
++inliers;
}
else
{
++outliers;
}
}
QTransform hTransform(
H.at<double>(0,0), H.at<double>(1,0), H.at<double>(2,0),
H.at<double>(0,1), H.at<double>(1,1), H.at<double>(2,1),
H.at<double>(0,2), H.at<double>(1,2), H.at<double>(2,2));
// GUI : Change color and add homography rectangle
QColor color(Qt::red);
int alpha = 130;
color.setAlpha(alpha);
for(int k=0; k<mpts_1.size();++k)
{
if(outlier_mask.at(k))
{
objWidget.setKptColor(indexes_1.at(k), color);
sceneWidget.setKptColor(indexes_2.at(k), color);
}
else
{
objWidget.setKptColor(indexes_1.at(k), QColor(0,0,0,alpha));
}
}
QPen rectPen(color);
rectPen.setWidth(4);
QGraphicsRectItem * rectItem = new QGraphicsRectItem(objWidget.image().rect());
rectItem->setPen(rectPen);
rectItem->setTransform(hTransform);
sceneWidget.addRect(rectItem);
printf("Inliers=%d Outliers=%d\n", inliers, outliers);
}
else
{
printf("Not enough matches (%d) for homography...\n", (int)mpts_1.size());
}
// Wait for gui
objWidget.setGraphicsViewMode(false);
objWidget.setWindowTitle("Object");
objWidget.show();
sceneWidget.setGraphicsViewMode(false);
sceneWidget.setWindowTitle("Scene");
sceneWidget.show();
int r = app.exec();
////////////////////////////
//Cleanup
////////////////////////////
delete detector;
delete extractor;
if(objectImg) {
cvReleaseImage(&objectImg);
}
if(sceneImg) {
cvReleaseImage(&sceneImg);
}
return r;
}
else
{
if(objectImg) {
cvReleaseImage(&objectImg);
}
if(sceneImg) {
cvReleaseImage(&sceneImg);
}
printf("Images are not valid!\n");
showUsage();
}
return 1;
}

View File

@ -1,7 +1,7 @@
#include "AddObjectDialog.h" #include "AddObjectDialog.h"
#include "ui_addObjectDialog.h" #include "ui_addObjectDialog.h"
#include "Object.h" #include "ObjWidget.h"
#include "KeypointItem.h" #include "KeypointItem.h"
#include "Camera.h" #include "Camera.h"
#include "qtipl.h" #include "qtipl.h"
@ -15,7 +15,7 @@
#include <opencv2/imgproc/imgproc_c.h> #include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui_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), QDialog(parent, f),
camera_(0), camera_(0),
objects_(objects), objects_(objects),
@ -191,7 +191,7 @@ void AddObjectDialog::setState(int state)
selectedKeypoints.at(i).pt.y -= roi.y; 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_); cvResetImageROI(cvImage_);

View File

@ -7,7 +7,7 @@
#include <opencv2/core/core_c.h> #include <opencv2/core/core_c.h>
class Ui_addObjectDialog; class Ui_addObjectDialog;
class Object; class ObjWidget;
class Camera; class Camera;
class KeypointItem; class KeypointItem;
@ -16,7 +16,7 @@ class AddObjectDialog : public QDialog {
Q_OBJECT Q_OBJECT
public: 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(); virtual ~AddObjectDialog();
private slots: private slots:
@ -37,7 +37,7 @@ private:
Ui_addObjectDialog * ui_; Ui_addObjectDialog * ui_;
Camera * camera_; Camera * camera_;
QTimer cameraTimer_; QTimer cameraTimer_;
QList<Object*> * objects_; QList<ObjWidget*> * objects_;
IplImage * cvImage_; IplImage * cvImage_;
enum State{kTakePicture, kSelectFeatures, kVerifySelection, kClosing}; enum State{kTakePicture, kSelectFeatures, kVerifySelection, kClosing};

View File

@ -4,7 +4,7 @@
SET(headers_ui SET(headers_ui
./MainWindow.h ./MainWindow.h
./AddObjectDialog.h ./AddObjectDialog.h
./Object.h ./ObjWidget.h
./Camera.h ./Camera.h
./ParametersToolBox.h ./ParametersToolBox.h
) )
@ -38,7 +38,7 @@ SET(SRC_FILES
./Camera.cpp ./Camera.cpp
./ParametersToolBox.cpp ./ParametersToolBox.cpp
./Settings.cpp ./Settings.cpp
./Object.cpp ./ObjWidget.cpp
${moc_srcs} ${moc_srcs}
${moc_uis} ${moc_uis}
#${srcs_qrc} #${srcs_qrc}

View File

@ -4,7 +4,7 @@
#include "ui_mainWindow.h" #include "ui_mainWindow.h"
#include "qtipl.h" #include "qtipl.h"
#include "KeypointItem.h" #include "KeypointItem.h"
#include "Object.h" #include "ObjWidget.h"
#include "Camera.h" #include "Camera.h"
#include "Settings.h" #include "Settings.h"
#include "ParametersToolBox.h" #include "ParametersToolBox.h"
@ -87,7 +87,7 @@ void MainWindow::loadObjects()
QDataStream in(&file); QDataStream in(&file);
while(!in.atEnd()) while(!in.atEnd())
{ {
Object * obj = new Object(); ObjWidget * obj = new ObjWidget();
obj->load(in); obj->load(in);
bool alreadyLoaded = false; bool alreadyLoaded = false;
for(int i=0; i<objects_.size(); ++i) 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) if(object)
{ {
@ -152,12 +152,12 @@ void MainWindow::addObject()
} }
} }
void MainWindow::showObject(Object * obj) void MainWindow::showObject(ObjWidget * obj)
{ {
if(obj) if(obj)
{ {
obj->setGraphicsViewMode(false); obj->setGraphicsViewMode(false);
QList<Object*> objs = ui_->objects_area->findChildren<Object*>(); QList<ObjWidget*> objs = ui_->objects_area->findChildren<ObjWidget*>();
QVBoxLayout * vLayout = new QVBoxLayout(); QVBoxLayout * vLayout = new QVBoxLayout();
int id = Settings::getGeneral_nextObjID().toInt(); int id = Settings::getGeneral_nextObjID().toInt();
if(obj->id() == 0) if(obj->id() == 0)
@ -183,7 +183,7 @@ void MainWindow::showObject(Object * obj)
vLayout->addLayout(hLayout); vLayout->addLayout(hLayout);
vLayout->addWidget(obj); vLayout->addWidget(obj);
objects_.last()->setDeletable(true); 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 *)), title, SLOT(deleteLater()));
connect(obj, SIGNAL(destroyed(QObject *)), detectedLabel, SLOT(deleteLater())); connect(obj, SIGNAL(destroyed(QObject *)), detectedLabel, SLOT(deleteLater()));
connect(obj, SIGNAL(destroyed(QObject *)), detectorDescriptorType, SLOT(deleteLater())); connect(obj, SIGNAL(destroyed(QObject *)), detectorDescriptorType, SLOT(deleteLater()));
@ -293,6 +293,7 @@ void MainWindow::update()
if(cvImage) if(cvImage)
{ {
QTime time; QTime time;
time.start();
//Convert to grayscale //Convert to grayscale
IplImage * imageGrayScale = 0; IplImage * imageGrayScale = 0;
@ -312,13 +313,11 @@ void MainWindow::update()
} }
// EXTRACT KEYPOINTS // EXTRACT KEYPOINTS
time.start();
cv::FeatureDetector * detector = Settings::createFeaturesDetector(); cv::FeatureDetector * detector = Settings::createFeaturesDetector();
std::vector<cv::KeyPoint> keypoints; std::vector<cv::KeyPoint> keypoints;
detector->detect(img, keypoints); detector->detect(img, keypoints);
delete detector; delete detector;
ui_->label_timeDetection->setText(QString::number(time.elapsed())); ui_->label_timeDetection->setText(QString::number(time.restart()));
time.start();
// EXTRACT DESCRIPTORS // EXTRACT DESCRIPTORS
cv::Mat descriptors; cv::Mat descriptors;
@ -333,8 +332,7 @@ void MainWindow::update()
{ {
cvReleaseImage(&imageGrayScale); cvReleaseImage(&imageGrayScale);
} }
ui_->label_timeExtraction->setText(QString::number(time.elapsed())); ui_->label_timeExtraction->setText(QString::number(time.restart()));
time.start();
// COMPARE // COMPARE
int alpha = 20*255/100; int alpha = 20*255/100;
@ -344,8 +342,7 @@ void MainWindow::update()
cv::Mat environment(descriptors.rows, descriptors.cols, CV_32F); cv::Mat environment(descriptors.rows, descriptors.cols, CV_32F);
descriptors.convertTo(environment, CV_32F); descriptors.convertTo(environment, CV_32F);
cv::flann::Index treeFlannIndex(environment, cv::flann::KDTreeIndexParams()); cv::flann::Index treeFlannIndex(environment, cv::flann::KDTreeIndexParams());
ui_->label_timeIndexing->setText(QString::number(time.elapsed())); ui_->label_timeIndexing->setText(QString::number(time.restart()));
time.start();
// DO NEAREST NEIGHBOR // DO NEAREST NEIGHBOR
int k = 2; int k = 2;
@ -353,8 +350,7 @@ void MainWindow::update()
cv::Mat results(dataTree_.rows, k, CV_32SC1); // results index cv::Mat results(dataTree_.rows, k, CV_32SC1); // results index
cv::Mat dists(dataTree_.rows, k, CV_32FC1); // Distance results are CV_32FC1 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 treeFlannIndex.knnSearch(dataTree_, results, dists, k, cv::flann::SearchParams(emax) ); // maximum number of leafs checked
ui_->label_timeMatching->setText(QString::number(time.elapsed())); ui_->label_timeMatching->setText(QString::number(time.restart()));
time.start();
// PROCESS RESULTS // PROCESS RESULTS
@ -367,7 +363,7 @@ void MainWindow::update()
{ {
// Check if this descriptor matches with those of the objects // Check if this descriptor matches with those of the objects
// Apply NNDR // 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) if(j>0)
{ {
@ -468,13 +464,11 @@ void MainWindow::update()
ui_->label_nfeatures->setText(QString::number(keypoints.size())); ui_->label_nfeatures->setText(QString::number(keypoints.size()));
ui_->imageView_source->update(); ui_->imageView_source->update();
ui_->label_timeGui->setText(QString::number(time.elapsed())); ui_->label_timeGui->setText(QString::number(time.restart()));
cvReleaseImage(&cvImage); cvReleaseImage(&cvImage);
} }
} }
ui_->label_detectorDescriptorType->setText(QString("%1/%2").arg(Settings::currentDetectorType()).arg(Settings::currentDescriptorType())); 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)))); 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))));
//printf("GUI refresh rate %f Hz\n", 1000.0f/(float)(updateRate_.elapsed()));
updateRate_.start();
} }

View File

@ -13,7 +13,7 @@
#include <opencv2/imgproc/imgproc_c.h> #include <opencv2/imgproc/imgproc_c.h>
class Ui_mainWindow; class Ui_mainWindow;
class Object; class ObjWidget;
class Camera; class Camera;
class ParametersToolBox; class ParametersToolBox;
class QLabel; class QLabel;
@ -37,15 +37,15 @@ private slots:
void saveObjects(); void saveObjects();
void update(); void update();
void updateData(); void updateData();
void removeObject(Object * object); void removeObject(ObjWidget * object);
private: private:
void showObject(Object * obj); void showObject(ObjWidget * obj);
private: private:
Ui_mainWindow * ui_; Ui_mainWindow * ui_;
Camera * camera_; Camera * camera_;
QList<Object*> objects_; QList<ObjWidget*> objects_;
QTimer cameraTimer_; QTimer cameraTimer_;
cv::Mat dataTree_; cv::Mat dataTree_;
QList<int> dataRange_; QList<int> dataRange_;

View File

@ -13,7 +13,7 @@
* Author: matlab * Author: matlab
*/ */
#include "Object.h" #include "ObjWidget.h"
#include "KeypointItem.h" #include "KeypointItem.h"
#include "qtipl.h" #include "qtipl.h"
#include "Settings.h" #include "Settings.h"
@ -35,7 +35,7 @@
#include <stdio.h> #include <stdio.h>
Object::Object(QWidget * parent) : ObjWidget::ObjWidget(QWidget * parent) :
QWidget(parent), QWidget(parent),
iplImage_(0), iplImage_(0),
graphicsView_(0), graphicsView_(0),
@ -46,7 +46,7 @@ Object::Object(QWidget * parent) :
{ {
setupUi(); setupUi();
} }
Object::Object(int id, ObjWidget::ObjWidget(int id,
const std::vector<cv::KeyPoint> & keypoints, const std::vector<cv::KeyPoint> & keypoints,
const cv::Mat & descriptors, const cv::Mat & descriptors,
const IplImage * iplImage, const IplImage * iplImage,
@ -64,7 +64,7 @@ Object::Object(int id,
setupUi(); setupUi();
this->setData(keypoints, descriptors, iplImage); this->setData(keypoints, descriptors, iplImage);
} }
Object::~Object() ObjWidget::~ObjWidget()
{ {
if(iplImage_) if(iplImage_)
{ {
@ -72,14 +72,14 @@ Object::~Object()
} }
} }
void Object::setupUi() void ObjWidget::setupUi()
{ {
graphicsView_ = new QGraphicsView(this); graphicsView_ = new QGraphicsView(this);
graphicsView_->setVisible(true); graphicsView_->setVisible(true);
graphicsView_->setTransformationAnchor(QGraphicsView::AnchorUnderMouse); graphicsView_->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
graphicsView_->setScene(new QGraphicsScene(graphicsView_)); graphicsView_->setScene(new QGraphicsScene(graphicsView_));
this->setLayout(new QVBoxLayout(graphicsView_)); this->setLayout(new QVBoxLayout(this));
this->layout()->addWidget(graphicsView_); this->layout()->addWidget(graphicsView_);
this->layout()->setContentsMargins(0,0,0,0); this->layout()->setContentsMargins(0,0,0,0);
@ -110,7 +110,7 @@ void Object::setupUi()
connect(graphicsView_->scene(), SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged())); connect(graphicsView_->scene(), SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
} }
void Object::setId(int id) void ObjWidget::setId(int id)
{ {
id_=id; id_=id;
if(id_) if(id_)
@ -119,7 +119,7 @@ void Object::setId(int id)
} }
} }
void Object::setGraphicsViewMode(bool on) void ObjWidget::setGraphicsViewMode(bool on)
{ {
graphicsViewMode_ = on; graphicsViewMode_ = on;
graphicsView_->setVisible(on); graphicsView_->setVisible(on);
@ -143,7 +143,7 @@ void Object::setGraphicsViewMode(bool on)
this->update(); 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; keypoints_ = keypoints;
descriptors_ = descriptors; 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) for(int i=0; i<kptColors_.size(); ++i)
{ {
@ -188,7 +188,7 @@ void Object::resetKptsColor()
rectItems_.clear(); rectItems_.clear();
} }
void Object::setKptColor(unsigned int index, const QColor & color) void ObjWidget::setKptColor(unsigned int index, const QColor & color)
{ {
if(index < kptColors_.size()) 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); graphicsView_->scene()->addItem(rect);
rectItems_.append(rect); rectItems_.append(rect);
} }
QList<QGraphicsItem*> Object::selectedItems() const QList<QGraphicsItem*> ObjWidget::selectedItems() const
{ {
return graphicsView_->scene()->selectedItems(); return graphicsView_->scene()->selectedItems();
} }
bool Object::isImageShown() const bool ObjWidget::isImageShown() const
{ {
return _showImage->isChecked(); return _showImage->isChecked();
} }
bool Object::isFeaturesShown() const bool ObjWidget::isFeaturesShown() const
{ {
return _showFeatures->isChecked(); return _showFeatures->isChecked();
} }
bool Object::isMirrorView() const bool ObjWidget::isMirrorView() const
{ {
return _mirrorView->isChecked(); return _mirrorView->isChecked();
} }
void Object::setDeletable(bool deletable) void ObjWidget::setDeletable(bool deletable)
{ {
_delete->setEnabled(deletable); _delete->setEnabled(deletable);
} }
void Object::save(QDataStream & streamPtr) const void ObjWidget::save(QDataStream & streamPtr) const
{ {
streamPtr << id_ << detectorType_ << descriptorType_; streamPtr << id_ << detectorType_ << descriptorType_;
streamPtr << (int)keypoints_.size(); streamPtr << (int)keypoints_.size();
@ -259,7 +259,7 @@ void Object::save(QDataStream & streamPtr) const
streamPtr << image_; streamPtr << image_;
} }
void Object::load(QDataStream & streamPtr) void ObjWidget::load(QDataStream & streamPtr)
{ {
std::vector<cv::KeyPoint> kpts; std::vector<cv::KeyPoint> kpts;
cv::Mat descriptors; cv::Mat descriptors;
@ -291,7 +291,7 @@ void Object::load(QDataStream & streamPtr)
this->setMinimumSize(image_.size()); this->setMinimumSize(image_.size());
} }
void Object::paintEvent(QPaintEvent *event) void ObjWidget::paintEvent(QPaintEvent *event)
{ {
if(graphicsViewMode_) 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_) if(graphicsViewMode_)
{ {
graphicsView_->fitInView(graphicsView_->sceneRect(), Qt::KeepAspectRatio); 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()); QAction * action = _menu->exec(event->globalPos());
if(action == _saveImage) if(action == _saveImage)
@ -431,7 +431,7 @@ void Object::contextMenuEvent(QContextMenuEvent * event)
QWidget::contextMenuEvent(event); QWidget::contextMenuEvent(event);
} }
QPixmap Object::getSceneAsPixmap() QPixmap ObjWidget::getSceneAsPixmap()
{ {
if(graphicsViewMode_) if(graphicsViewMode_)
{ {
@ -446,7 +446,7 @@ QPixmap Object::getSceneAsPixmap()
} }
} }
void Object::updateItemsShown() void ObjWidget::updateItemsShown()
{ {
QList<QGraphicsItem*> items = graphicsView_->scene()->items(); QList<QGraphicsItem*> items = graphicsView_->scene()->items();
for(int i=0; i<items.size(); ++i) 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; QList<KeypointItem *> items;
KeypointItem * item = 0; 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; int alpha = 20*255/100;
return QColor(255, 255, 0, alpha); 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; std::vector<cv::KeyPoint> selected;
if(graphicsViewMode_) if(graphicsViewMode_)
@ -522,9 +522,11 @@ std::vector<cv::KeyPoint> Object::selectedKeypoints() const
return selected; return selected;
} }
void Object::setupGraphicsView() void ObjWidget::setupGraphicsView()
{ {
graphicsView_->scene()->clear(); graphicsView_->scene()->clear();
if(!image_.isNull())
{
graphicsView_->scene()->setSceneRect(image_.rect()); graphicsView_->scene()->setSceneRect(image_.rect());
QList<KeypointItem*> items; QList<KeypointItem*> items;
if(image_.width() > 0 && image_.height() > 0) if(image_.width() > 0 && image_.height() > 0)
@ -538,4 +540,5 @@ void Object::setupGraphicsView()
graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio); graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio);
} }
} }
}

View File

@ -1,12 +1,12 @@
/* /*
* VisualObject.h * ObjWidget.h
* *
* Created on: 2011-10-21 * Created on: 2011-10-21
* Author: matlab * Author: matlab
*/ */
#ifndef OBJECT_H_ #ifndef OBJWIDGET_H_
#define OBJECT_H_ #define OBJWIDGET_H_
#include <opencv2/features2d/features2d.hpp> #include <opencv2/features2d/features2d.hpp>
#include <QtGui/QWidget> #include <QtGui/QWidget>
@ -20,20 +20,20 @@ class QGraphicsScene;
class QGraphicsRectItem; class QGraphicsRectItem;
class QGraphicsItem; class QGraphicsItem;
class Object : public QWidget class ObjWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
Object(QWidget * parent = 0); ObjWidget(QWidget * parent = 0);
Object(int id, ObjWidget(int id,
const std::vector<cv::KeyPoint> & keypoints, const std::vector<cv::KeyPoint> & keypoints,
const cv::Mat & descriptors, const cv::Mat & descriptors,
const IplImage * image, const IplImage * image,
const QString & detectorType = "NA", const QString & detectorType = "NA",
const QString & descriptorType = "NA", const QString & descriptorType = "NA",
QWidget * parent = 0); QWidget * parent = 0);
virtual ~Object(); virtual ~ObjWidget();
void setId(int id); void setId(int id);
void setData(const std::vector<cv::KeyPoint> & keypoints, void setData(const std::vector<cv::KeyPoint> & keypoints,
@ -71,7 +71,7 @@ protected:
virtual void resizeEvent(QResizeEvent* event); virtual void resizeEvent(QResizeEvent* event);
signals: signals:
void removalTriggered(Object *); void removalTriggered(ObjWidget *);
void selectionChanged(); void selectionChanged();
private: private:
@ -106,4 +106,4 @@ private:
}; };
#endif /* OBJECT_H_ */ #endif /* OBJWIDGET_H_ */

View File

@ -106,7 +106,7 @@ class Settings
PARAMETER(Surf, upright, bool, false); PARAMETER(Surf, upright, bool, false);
PARAMETER(Surf, extended, 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); PARAMETER(General, nextObjID, unsigned int, 1);

View File

@ -24,10 +24,10 @@
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="Object" name="cameraView" native="true"/> <widget class="ObjWidget" name="cameraView" native="true"/>
</item> </item>
<item> <item>
<widget class="Object" name="objectView" native="true"/> <widget class="ObjWidget" name="objectView" native="true"/>
</item> </item>
</layout> </layout>
</item> </item>
@ -80,9 +80,9 @@
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
<class>Object</class> <class>ObjWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>Object.h</header> <header>ObjWidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
</customwidgets> </customwidgets>

View File

@ -116,7 +116,7 @@
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="Object" name="imageView_source" native="true"/> <widget class="ObjWidget" name="imageView_source" native="true"/>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -433,9 +433,9 @@
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
<class>Object</class> <class>ObjWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>Object.h</header> <header>ObjWidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget> <customwidget>