Skip to content

Commit c9f5fad

Browse files
committed
[feat] interactive: add stat_analysis feature preview
1 parent 7244112 commit c9f5fad

File tree

4 files changed

+47
-14
lines changed

4 files changed

+47
-14
lines changed

src/interactive.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ This file is part of Fast Track.
4040
*/
4141
Interactive::Interactive(QWidget *parent) : QMainWindow(parent),
4242
ui(new Ui::Interactive),
43+
video(new VideoReader()),
44+
analysis(new StatAnalysis(this, false)),
4345
videoStatus(false),
4446
settingsFile(new QSettings(QStringLiteral("FastTrack"), QStringLiteral("FastTrackOrg"), this)) {
4547
ui->setupUi(this);
@@ -102,10 +104,12 @@ Interactive::Interactive(QWidget *parent) : QMainWindow(parent),
102104
connect(replayAction, &QAction::toggled, this, [this](bool isChecked) {
103105
if (isChecked) {
104106
ui->interactiveTab->addTab(replay, tr("Replay"));
107+
ui->interactiveTab->addTab(analysis, tr("Analysis")); // Preview feature. Will have a separate action latter if necessary.
105108
ui->interactiveTab->setCurrentIndex(1);
106109
}
107110
else {
108-
ui->interactiveTab->removeTab(1);
111+
ui->interactiveTab->removeTab(1); // Remove Replay tab
112+
ui->interactiveTab->removeTab(1); // Remove Analysis tab
109113
}
110114
});
111115
ui->menuView->addAction(replayAction);
@@ -121,8 +125,11 @@ Interactive::Interactive(QWidget *parent) : QMainWindow(parent),
121125
});
122126

123127
// Stay on the same frame when changing tab
124-
connect(ui->interactiveTab, &QTabWidget::currentChanged, this, [this]() {
128+
connect(ui->interactiveTab, &QTabWidget::currentChanged, this, [this](int index) {
125129
ui->slider->setValue(ui->slider->value());
130+
if (index == 2) {
131+
analysis->reload();
132+
}
126133
});
127134

128135
// Loads prefered style
@@ -378,12 +385,10 @@ Interactive::Interactive(QWidget *parent) : QMainWindow(parent),
378385
});
379386

380387
// Replay tab
381-
video = new VideoReader();
382388
replay = new Replay(this, false, ui->slider, video);
383389
connect(ui->interactiveTab, &QTabWidget::tabCloseRequested, this, [this](int index) {
384390
if (index != 0) {
385-
ui->interactiveTab->removeTab(index);
386-
replayAction->setChecked(false);
391+
replayAction->setChecked(false); // The replayAction takes care of the tabs removing
387392
}
388393
});
389394

@@ -485,6 +490,7 @@ void Interactive::openFolder() {
485490
ui->display->clear();
486491
video->release();
487492
replay->clear();
493+
analysis->clear();
488494
ui->backgroundProgressBar->setValue(0);
489495
ui->isBin->setCheckable(false);
490496
ui->isSub->setCheckable(false);
@@ -533,6 +539,7 @@ void Interactive::openFolder() {
533539
// Load replay
534540
replay->loadReplay(dir);
535541
if (!replay->trackingData->isEmpty) {
542+
analysis->openTrackingData(replay->trackingData, true);
536543
replayAction->setChecked(true);
537544
}
538545

@@ -853,7 +860,7 @@ void Interactive::getParameters() {
853860
}
854861

855862
/**
856-
* @brief Does a tracing analysis on a sub-part of the image sequence defined by the user. Triggered when previewButton is clicked.
863+
* @brief Does a tracking analysis on a sub-part of the image sequence defined by the user. Triggered when previewButton is clicked.
857864
*/
858865
void Interactive::previewTracking() {
859866
if (videoStatus) {
@@ -863,6 +870,7 @@ void Interactive::previewTracking() {
863870
ui->trackButton->setDisabled(true);
864871
replayAction->setChecked(false);
865872
replay->clear(); // Avoid mixing 2 subsequent analysy
873+
analysis->clear();
866874

867875
QThread *thread = new QThread;
868876
Tracking *tracking = new Tracking(memoryDir.toStdString(), background, ui->startImage->value(), ui->startImage->value() + ui->stopImage->value());
@@ -878,13 +886,15 @@ void Interactive::previewTracking() {
878886
ui->previewButton->setDisabled(false);
879887
ui->trackButton->setDisabled(false);
880888
replay->loadReplay(dir);
889+
analysis->openTrackingData(replay->trackingData, true);
881890
replayAction->setChecked(true);
882891
});
883892
connect(tracking, &Tracking::forceFinished, this, [this](const QString &errorMessage) {
884893
ui->slider->setDisabled(false);
885894
ui->previewButton->setDisabled(false);
886895
ui->trackButton->setDisabled(false);
887896
replay->loadReplay(dir);
897+
analysis->openTrackingData(replay->trackingData, true);
888898
replayAction->setChecked(true);
889899
emit message(errorMessage);
890900
});
@@ -912,6 +922,7 @@ void Interactive::track() {
912922
ui->trackButton->setDisabled(true);
913923
replayAction->setChecked(false);
914924
replay->clear(); // Avoid mixing 2 subsequent analysy
925+
analysis->clear();
915926

916927
QThread *thread = new QThread;
917928
Tracking *tracking = new Tracking(memoryDir.toStdString(), background);
@@ -931,6 +942,7 @@ void Interactive::track() {
931942
ui->previewButton->setDisabled(false);
932943
ui->trackButton->setDisabled(false);
933944
replay->loadReplay(dir);
945+
analysis->openTrackingData(replay->trackingData, true);
934946
replayAction->setChecked(true);
935947
logMap->insert(QStringLiteral("status"), errorMessage);
936948
emit log(*logMap);
@@ -943,6 +955,7 @@ void Interactive::track() {
943955
ui->previewButton->setDisabled(false);
944956
ui->trackButton->setDisabled(false);
945957
replay->loadReplay(dir);
958+
analysis->openTrackingData(replay->trackingData, true);
946959
replayAction->setChecked(true);
947960
logMap->insert(QStringLiteral("status"), QStringLiteral("Done"));
948961
emit log(*logMap);

src/interactive.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ This file is part of Fast Track.
6060
#include "opencv2/highgui/highgui.hpp"
6161
#include "opencv2/imgproc/imgproc.hpp"
6262
#include "replay.h"
63+
#include "statanalysis.h"
6364
#include "tracking.h"
6465
#include "videoreader.h"
6566

@@ -129,8 +130,9 @@ class Interactive : public QMainWindow {
129130
QPixmap resizedPix;
130131
vector<Point3i> colorMap;
131132
double currentZoom;
132-
Replay *replay;
133133
VideoReader *video;
134+
Replay *replay;
135+
StatAnalysis *analysis;
134136
bool videoStatus;
135137

136138
QString style;

src/statanalysis.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ StatAnalysis::StatAnalysis(QWidget* parent, bool isStandalone) : QMainWindow(par
2323
isStandalone(isStandalone),
2424
trackingData(new Data()),
2525
settingsFile(new QSettings(QStringLiteral("FastTrack"), QStringLiteral("FastTrackOrg"), this)),
26-
ruler(1) {
26+
ruler(1),
27+
isData(false) {
2728
ui->setupUi(this);
2829

2930
// Loads settings
@@ -96,28 +97,30 @@ void StatAnalysis::openTrackingData() {
9697
memoryDir = file;
9798
}
9899

99-
void StatAnalysis::openTrackingData(const QString& file) {
100+
void StatAnalysis::openTrackingData(const QString& file, bool loadOnDemand) {
100101
clear();
101102
QString dir = QFileInfo(file).dir().path(); // Data takes the tracking folder.
102103
QApplication::setOverrideCursor(Qt::WaitCursor);
103104
trackingData->setPath(dir);
104-
if (!trackingData->isEmpty) {
105+
if (!trackingData->isEmpty && !loadOnDemand) { // If loadOnDemand is true, need to call reload to actually load data.
105106
loadObjectList();
106107
QList<int> objects = trackingData->getId(0, trackingData->maxFrameIndex);
107108
initPlots(objects);
108109
}
110+
isData = !trackingData->isEmpty;
109111
QApplication::restoreOverrideCursor();
110112
}
111113

112-
void StatAnalysis::openTrackingData(Data* data) {
114+
void StatAnalysis::openTrackingData(Data* data, bool loadOnDemand) {
113115
clear();
114116
QApplication::setOverrideCursor(Qt::WaitCursor);
115117
trackingData = new Data(*data);
116-
if (!trackingData->isEmpty) {
118+
if (!trackingData->isEmpty && !loadOnDemand) { // If loadOnDemand is true, need to call reload to actually load data.
117119
loadObjectList();
118120
QList<int> objects = trackingData->getId(0, trackingData->maxFrameIndex);
119121
initPlots(objects);
120122
}
123+
isData = !trackingData->isEmpty;
121124
QApplication::restoreOverrideCursor();
122125
}
123126

@@ -145,6 +148,19 @@ QList<int> StatAnalysis::getSelectedObjects() {
145148
return objects;
146149
}
147150

151+
void StatAnalysis::reload() {
152+
if (isData) {
153+
QApplication::setOverrideCursor(Qt::WaitCursor);
154+
ui->objectList->setRowCount(0); // Remove all rows
155+
clearPlots();
156+
ruler = 1;
157+
loadObjectList();
158+
QList<int> objects = trackingData->getId(0, trackingData->maxFrameIndex);
159+
initPlots(objects);
160+
QApplication::restoreOverrideCursor();
161+
}
162+
}
163+
148164
void StatAnalysis::refresh() {
149165
QList<int> objects = getSelectedObjects();
150166
refreshPlots(objects);

src/statanalysis.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ class StatAnalysis : public QMainWindow {
5757
StatAnalysis &operator=(StatAnalysis &&T) = delete;
5858
StatAnalysis(StatAnalysis &&T) = delete;
5959
~StatAnalysis();
60-
void openTrackingData(const QString &file);
61-
void openTrackingData(Data *data);
60+
void openTrackingData(const QString &file, bool loadOnDemand = false);
61+
void openTrackingData(Data *data, bool loadOnDemand = false);
62+
void reload();
6263
void clear();
6364

6465
private slots:
@@ -79,6 +80,7 @@ class StatAnalysis : public QMainWindow {
7980
QSettings *settingsFile;
8081
QString memoryDir;
8182
double ruler;
83+
bool isData;
8284
};
8385

8486
#endif // STATANALYSIS_H

0 commit comments

Comments
 (0)