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:
parent
d71dcd00ea
commit
a761af58da
@ -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
43
example/CMakeLists.txt
Normal 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
236
example/main.cpp
Normal 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;
|
||||||
|
}
|
||||||
@ -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_);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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};
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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_;
|
||||||
|
|||||||
@ -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,20 +522,23 @@ std::vector<cv::KeyPoint> Object::selectedKeypoints() const
|
|||||||
return selected;
|
return selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::setupGraphicsView()
|
void ObjWidget::setupGraphicsView()
|
||||||
{
|
{
|
||||||
graphicsView_->scene()->clear();
|
graphicsView_->scene()->clear();
|
||||||
graphicsView_->scene()->setSceneRect(image_.rect());
|
if(!image_.isNull())
|
||||||
QList<KeypointItem*> items;
|
|
||||||
if(image_.width() > 0 && image_.height() > 0)
|
|
||||||
{
|
{
|
||||||
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_);
|
QGraphicsPixmapItem * pixmapItem = graphicsView_->scene()->addPixmap(image_);
|
||||||
pixmapItem->setVisible(this->isImageShown());
|
pixmapItem->setVisible(this->isImageShown());
|
||||||
this->drawKeypoints();
|
this->drawKeypoints();
|
||||||
|
|
||||||
graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio);
|
graphicsView_->fitInView(sceneRect, Qt::KeepAspectRatio);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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_ */
|
||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user