MERGE branch STM 325:449 into trunk

git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@450 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
matlabbe
2012-03-03 01:46:30 +00:00
parent c4aff5f20a
commit a2eb8bcab6
100 changed files with 76652 additions and 5164 deletions

View File

@@ -18,6 +18,7 @@ QT4_WRAP_CPP(moc_srcs ${headers_ui})
SET(SRC_FILES
./main.cpp
./MainWindow.cpp
../../guilib/src/KeypointItem.cpp
${moc_srcs}
${moc_uis}
)
@@ -26,7 +27,7 @@ SET(INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/../include
${CMAKE_CURRENT_SOURCE_DIR}/../src
${CMAKE_CURRENT_SOURCE_DIR}
${UTILITE_INCLUDE_DIR}
${UTILITE_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
${CMAKE_CURRENT_BINARY_DIR} # for qt ui generated in binary dir
)
@@ -34,7 +35,7 @@ SET(INCLUDE_DIRS
INCLUDE(${QT_USE_FILE})
SET(LIBRARIES
${UTILITE_LIBRARY}
${UTILITE_LIBRARIES}
${QT_LIBRARIES}
${OpenCV_LIBRARIES}
#${QWT5_LIBRARY}

View File

@@ -31,6 +31,7 @@
#include <utilite/UTimer.h>
#include "KeypointMemory.h"
#include "rtabmap/core/DBDriver.h"
#include "../../guilib/src/KeypointItem.h"
MainWindow::MainWindow(QWidget * parent) :
QMainWindow(parent),
@@ -237,23 +238,70 @@ void MainWindow::generateLocalGraph()
QString path = QFileDialog::getSaveFileName(this, tr("Save File"), pathDatabase_+"/Graph" + QString::number(id) + ".dot", tr("Graphiz file (*.dot)"));
if(!path.isEmpty())
{
std::map<int, int> ids;
memory_->getNeighborsId(ids, id, margin-1, true);
ids.insert(std::pair<int,int>(id, 0));
std::set<int> idsSet;
for(std::map<int, int>::iterator iter = ids.begin(); iter!=ids.end(); ++iter)
if(memory_->getSignature(id) > 0)
{
idsSet.insert(idsSet.end(), iter->first);
double dbAccessTime = 0.0;
std::map<int, int> ids = memory_->getNeighborsId(dbAccessTime, id, margin, -1, false, false, false);
if(ids.size() > 0)
{
ids.insert(std::pair<int,int>(id, 0));
std::set<int> idsSet;
for(std::map<int, int>::iterator iter = ids.begin(); iter!=ids.end(); ++iter)
{
idsSet.insert(idsSet.end(), iter->first);
UINFO("Node %d", iter->first);
}
UINFO("idsSet=%d", idsSet.size());
memory_->generateGraph(path.toStdString(), idsSet);
}
else
{
QMessageBox::critical(this, tr("Error"), tr("No neighbors found for signature %1.").arg(id));
}
}
else
{
QMessageBox::critical(this, tr("Error"), tr("Signature %1 not found in database.").arg(id));
}
memory_->generateGraph(path.toStdString(), idsSet);
}
}
}
}
void MainWindow::drawKeypoints(const std::multimap<int, cv::KeyPoint> & refWords, QGraphicsScene * scene)
{
if(!scene)
{
return;
}
rtabmap::KeypointItem * item = 0;
int alpha = 70;
for(std::multimap<int, cv::KeyPoint>::const_iterator i = refWords.begin(); i != refWords.end(); ++i )
{
const cv::KeyPoint & r = (*i).second;
int id = (*i).first;
QString info = QString( "WordRef = %1\n"
"Laplacian = %2\n"
"Dir = %3\n"
"Hessian = %4\n"
"X = %5\n"
"Y = %6\n"
"Size = %7").arg(id).arg(1).arg(r.angle).arg(r.response).arg(r.pt.x).arg(r.pt.y).arg(r.size);
float radius = r.size*1.2/9.*2;
item = new rtabmap::KeypointItem(r.pt.x-radius, r.pt.y-radius, radius*2, info, QColor(255, 255, 0, alpha));
scene->addItem(item);
item->setZValue(1);
}
}
void MainWindow::sliderAValueChanged(int value)
{
ui_->label_indexA->setText(QString::number(value));
ui_->label_actionsA->clear();
ui_->label_parentsA->clear();
ui_->label_childrenA->clear();
if(value >= 0 && value < ids_.size())
{
ui_->graphicsView_A->scene()->clear();
@@ -261,6 +309,7 @@ void MainWindow::sliderAValueChanged(int value)
ui_->label_idA->setText(QString::number(id));
if(id>0)
{
// image
QImage img;
QMap<int, QByteArray>::iterator iter = imagesMap_.find(id);
if(iter == imagesMap_.end())
@@ -277,7 +326,7 @@ void MainWindow::sliderAValueChanged(int value)
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
img.save(&buffer, "JPEG"); // writes image into ba in JPEG format
img.save(&buffer, "BMP"); // writes image into ba in BMP format
imagesMap_.insert(id, ba);
}
}
@@ -285,7 +334,16 @@ void MainWindow::sliderAValueChanged(int value)
}
else
{
img.loadFromData(iter.value(), "JPEG");
img.loadFromData(iter.value(), "BMP");
}
if(memory_)
{
std::multimap<int, cv::KeyPoint> words = memory_->getWords(id);
if(words.size())
{
drawKeypoints(words, ui_->graphicsView_A->scene());
}
}
if(!img.isNull())
@@ -296,6 +354,61 @@ void MainWindow::sliderAValueChanged(int value)
{
ULOGGER_DEBUG("Image is empty");
}
// actions
if(id-1 > 0)
{
std::list<rtabmap::NeighborLink> links = memory_->getNeighborLinks(id-1, true, true);
for(std::list<rtabmap::NeighborLink>::iterator iter = links.begin(); iter!=links.end(); ++iter)
{
if(iter->id()>id-1 && iter->actions().size())
{
QString str;
const std::list<std::vector<float> > & actions = iter->actions();
unsigned int j=0;
for(std::list<std::vector<float> >::const_iterator jter=actions.begin(); jter!=actions.end(); ++jter)
{
for(unsigned int i=0; i<jter->size(); ++i)
{
str.append(QString("%1 ").arg(jter->at(i)));
}
if(j+1 < actions.size())
{
str.append(QString("\n"));
}
++j;
}
if(str.size())
{
ui_->label_actionsA->setText(str);
}
break;
}
}
}
// loops
std::set<int> parents;
std::set<int> children;
memory_->getLoopClosureIds(id, parents, children, true);
if(parents.size())
{
QString str;
for(std::set<int>::iterator iter=parents.begin(); iter!=parents.end(); ++iter)
{
str.append(QString("%1 ").arg(*iter));
}
ui_->label_parentsA->setText(str);
}
if(children.size())
{
QString str;
for(std::set<int>::iterator iter=children.begin(); iter!=children.end(); ++iter)
{
str.append(QString("%1 ").arg(*iter));
}
ui_->label_childrenA->setText(str);
}
}
ui_->label_idA->setText(QString::number(id));
@@ -310,6 +423,9 @@ void MainWindow::sliderAValueChanged(int value)
void MainWindow::sliderBValueChanged(int value)
{
ui_->label_indexB->setText(QString::number(value));
ui_->label_actionsB->clear();
ui_->label_parentsB->clear();
ui_->label_childrenB->clear();
if(value >= 0 && value < ids_.size())
{
ui_->graphicsView_B->scene()->clear();
@@ -317,6 +433,7 @@ void MainWindow::sliderBValueChanged(int value)
ui_->label_idB->setText(QString::number(id));
if(id>0)
{
//image
QImage img;
QMap<int, QByteArray>::iterator iter = imagesMap_.find(id);
if(iter == imagesMap_.end())
@@ -334,7 +451,7 @@ void MainWindow::sliderBValueChanged(int value)
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
img.save(&buffer, "JPEG"); // writes image into ba in JPEG format
img.save(&buffer, "BMP"); // writes image into ba in BMP format
imagesMap_.insert(id, ba);
}
}
@@ -342,7 +459,16 @@ void MainWindow::sliderBValueChanged(int value)
}
else
{
img.loadFromData(iter.value(), "JPEG");
img.loadFromData(iter.value(), "BMP");
}
if(memory_)
{
std::multimap<int, cv::KeyPoint> words = memory_->getWords(id);
if(words.size())
{
drawKeypoints(words, ui_->graphicsView_B->scene());
}
}
if(!img.isNull())
@@ -353,6 +479,61 @@ void MainWindow::sliderBValueChanged(int value)
{
ULOGGER_DEBUG("Image is empty");
}
// actions
if(id-1 > 0)
{
std::list<rtabmap::NeighborLink> links = memory_->getNeighborLinks(id-1, true, true);
for(std::list<rtabmap::NeighborLink>::iterator iter = links.begin(); iter!=links.end(); ++iter)
{
if(iter->id()>id-1 && iter->actions().size())
{
QString str("");
const std::list<std::vector<float> > & actions = iter->actions();
unsigned int j=0;
for(std::list<std::vector<float> >::const_iterator jter=actions.begin(); jter!=actions.end(); ++jter)
{
for(unsigned int i=0; i<jter->size(); ++i)
{
str.append(QString("%1 ").arg(jter->at(i)));
}
if(j+1 < actions.size())
{
str.append(QString("\n"));
}
++j;
}
if(str.size())
{
ui_->label_actionsB->setText(str);
}
break;
}
}
}
// loops
std::set<int> parents;
std::set<int> children;
memory_->getLoopClosureIds(id, parents, children, true);
if(parents.size())
{
QString str;
for(std::set<int>::iterator iter=parents.begin(); iter!=parents.end(); ++iter)
{
str.append(QString("%1 ").arg(*iter));
}
ui_->label_parentsB->setText(str);
}
if(children.size())
{
QString str;
for(std::set<int>::iterator iter=children.begin(); iter!=children.end(); ++iter)
{
str.append(QString("%1 ").arg(*iter));
}
ui_->label_childrenB->setText(str);
}
}
ui_->label_idB->setText(QString::number(id));

View File

@@ -26,13 +26,15 @@
#include <QtCore/QSet>
#include <QtGui/QImage>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <set>
class Ui_MainWindow;
class QGraphicsScene;
namespace rtabmap
{
class Memory;
class KeypointMemory;
}
class MainWindow : public QMainWindow
@@ -57,12 +59,13 @@ private slots:
private:
void updateIds();
QImage ipl2QImage(const IplImage *newImage);
void drawKeypoints(const std::multimap<int, cv::KeyPoint> & refWords, QGraphicsScene * scene);
private:
Ui_MainWindow * ui_;
QMap<int, QByteArray> imagesMap_;
QList<int> ids_;
rtabmap::Memory * memory_;
rtabmap::KeypointMemory * memory_;
QString pathDatabase_;
};

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>550</width>
<height>318</height>
<width>600</width>
<height>350</height>
</rect>
</property>
<property name="windowTitle">
@@ -20,6 +20,52 @@
<item>
<widget class="QGraphicsView" name="graphicsView_A"/>
</item>
<item>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1">
<item row="0" column="1">
<widget class="QLabel" name="label_actionsA">
<property name="text">
<string>Actions</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_parentsA">
<property name="text">
<string>Parents</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_actionsA_2">
<property name="text">
<string>Actions</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_parentsA_2">
<property name="text">
<string>Parents</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_childrenA_2">
<property name="text">
<string>Children</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_childrenA">
<property name="text">
<string>Children</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
@@ -77,6 +123,52 @@
<item>
<widget class="QGraphicsView" name="graphicsView_B"/>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,1">
<item row="0" column="1">
<widget class="QLabel" name="label_actionsB">
<property name="text">
<string>Actions</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_parentsB">
<property name="text">
<string>Parents</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_actionsA_4">
<property name="text">
<string>Actions</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_parentsA_4">
<property name="text">
<string>Parents</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_childrenA_3">
<property name="text">
<string>Children</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_childrenB">
<property name="text">
<string>Children</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
@@ -136,8 +228,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>550</width>
<height>22</height>
<width>600</width>
<height>25</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">