Newer
Older
pal.setColor(QPalette::Window, color);
mStatusLabelFPS->setPalette(pal);
}
}
void Petrack::setShowFPS(double fps)
{
if ((fps == 0.) || (mShowFPS == 0))
mShowFPS = fps;
else
mShowFPS = mShowFPS*.9+fps*.1; // glaetten durch Hinzunahme des alten Wertes
setStatusFPS();
}
/**
* @brief Updates the FPS shown to the User
*
* This method calculates the FPS by remembering how long
* it has been since it was called last time. If skipped is
* true, it doesn't directly update the FPS since 2
* skipped frames have essentially a time delay of 0 between
* them, which would make calculations wonky.
*
* @param skipped True, if this is a skipped frame; default false
*/
void Petrack::updateShowFPS(bool skipped) {
static QElapsedTimer lastTime;
static int skippedFrames = 0;
if(skipped){
skippedFrames++;
return;
}
lastTime.invalidate();
if (lastTime.isValid())
{
if (lastTime.elapsed() > 0)
{
int numFrames = skippedFrames > 0 ? skippedFrames+1 : 1;
setShowFPS(numFrames*1000./lastTime.elapsed());
skippedFrames = 0;
}
}
lastTime.start();
}
}
// ohne neue positionsangabe, sinnvoll, wenn berechnungsweise sich in getPosReal geaendert hat
// gebraucht in control.cpp
void Petrack::setStatusPosReal() // pos in cm
{
if (mImageItem)
setStatusPosReal(mImageItem->getPosReal(mMousePosOnImage, getStatusPosRealHeight()));
}
void Petrack::setStatusPosReal(const QPointF &pos) // pos in cm
{
if (mStatusLabelPosReal)
{
QChar deg(0xB0);
QString labelText = QString(" cm from ground:%1cm,%2cm,%3").arg(pos.x(), 6, 'f', 1).arg(pos.y(), 6, 'f', 1).arg(
getImageItem()->getAngleToGround(mMousePosOnImage.x(), mMousePosOnImage.y(), getStatusPosRealHeight()), 5, 'f', 1);
labelText.append(deg);
mStatusLabelPosReal->setText(labelText);
}
}
void Petrack::setStatusPos(const QPoint &pos) // pos in pixel
{
mStatusLabelPos->setText(QString("%1x%2").arg(pos.x(), 4).arg(pos.y(), 4));
}
void Petrack::setStatusColor(const QRgb &col)
{
QString s("#%1%2%3"); // static moeglich?
s = s.arg(qRed(col), 2, 16, QChar('0')).arg(qGreen(col), 2, 16, QChar('0')).arg(qBlue(col), 2, 16, QChar('0'));
if ((qRed(col)+qGreen(col)+qBlue(col))/3 < 128)
mStatusLabelColor->setText(QString("<font color=\"#ffffff\"> %1</font>").arg(s));
else
mStatusLabelColor->setText(QString("<font color=\"#000000\"> %1</font>").arg(s));
QPalette pal = mStatusLabelColor->palette(); // static moeglich?
QColor color(qRed(col), qGreen(col), qBlue(col));
pal.setColor(QPalette::Window, color);
mStatusLabelColor->setPalette(pal);
mControlWidget->getColorPlot()->setCursor(color);
mControlWidget->getColorPlot()->replot();
}
void Petrack::setStatusColor()
{
QPointF pos = getMousePosOnImage();
if (pos.x() >= 0 && pos.x() < mImage->width() && pos.y() > 0 && pos.y() < mImage->height())
setStatusColor(mImage->pixel(pos.toPoint()));
}
}
double Petrack::getStatusPosRealHeight()
{
if (mStatusPosRealHeight)
return mStatusPosRealHeight->value();
else
return 0.;
}
/**
* @brief Reads (and applies) settings form platform-independent persistent storage
*
* The saved size and position of the application window get reconstructed. As well as
* the options about antialiasing and the usage of OpenGL.
* mSeqFileName and mProFileName get set, so the "Open Project" and "Open Sequence"
* dialogues start at correct folder. The old project/sequence is NOT actually loaded.
*/
void Petrack::readSettings()
{
QSettings settings("Forschungszentrum Juelich GmbH", "PeTrack by Maik Boltes, Daniel Salden");
QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
QSize size = settings.value("size", QSize(400, 400)).toSize();
mAntialiasAct->setChecked(settings.value("antialias", false).toBool());
mOpenGLAct->setChecked(settings.value("opengl", false).toBool());
mSeqFileName = settings.value("seqFileName", QDir::currentPath()).toString();
setProFileName(settings.value("proFilePath", QDir::currentPath()).toString());
// nicht ganz sauber, da so immer schon zu anfang in calib file list etwas drin steht und somit auto ausgefuehrt werden kann
// wird aber beim ersten openCalib... ueberschrieben
mAutoCalib.addCalibFile(settings.value("calibFile", QDir::currentPath()).toString());
resize(size);
move(pos);
antialias();
opengl();
mSplitter->restoreState(settings.value("controlSplitterSizes").toByteArray());
/**
* @brief Writes persistent setting.
* @see Petrack::readSettings
*/
void Petrack::writeSettings()
{
QSettings settings("Forschungszentrum Juelich GmbH", "PeTrack by Maik Boltes, Daniel Salden");
settings.setValue("pos", pos());
settings.setValue("size", size());
settings.setValue("antialias", mAntialiasAct->isChecked());
settings.setValue("opengl", mOpenGLAct->isChecked());
settings.setValue("seqFileName", mSeqFileName);
settings.setValue("proFilePath", QFileInfo(mProFileName).path()); // nur path, damit bei saveCurrentProject
if (!mAutoCalib.isEmptyCalibFiles()) //!mCalibFiles.isEmpty()
settings.setValue("calibFile", mAutoCalib.getCalibFile(0));
settings.setValue("controlSplitterSizes", mSplitter->saveState());
int ret = PWarning(this, tr("PeTrack"),
tr("Do you want to save "
"Be sure to save trajectories, background "
PMessageBox::StandardButton::Yes |
PMessageBox::StandardButton::No |
PMessageBox::StandardButton::Cancel,
PMessageBox::StandardButton::Yes);
if (ret == PMessageBox::StandardButton::Yes)
{
if (saveSameProject())
return true;
else
return false;
}
else if (ret == PMessageBox::StandardButton::Cancel)
return false;
else
return true;
}
void Petrack::closeEvent(QCloseEvent *event)
{
if (maybeSave())
{
writeSettings();
event->accept();
}
else
event->ignore();
}
/**
* @brief Sets the mMousePosOnImage member variable and displayed pixel/real coordinates
*
* Gets called from ImageItem::hoverMoveEvent() and enables an easy access
* to the mouse position.
* @param pos Position of mouse cursor in image pixel coordinates
*/
void Petrack::setMousePosOnImage(QPointF pos)
{
if (mImage)
{
mMousePosOnImage = pos;
setStatusPosReal(mImageItem->getPosReal(pos, getStatusPosRealHeight()));
// pixel coordinate
QPoint pos1((int)(pos.x())+1, (int)(pos.y())+1);
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
}
}
void Petrack::keyPressEvent(QKeyEvent * event)
{
switch (event->key()) {
case Qt::Key_Left:
mPlayerWidget->frameBackward();
break;
case Qt::Key_Right:
mPlayerWidget->frameForward();
break;
case Qt::Key_Down:
mViewWidget->zoomOut(1);
break;
case Qt::Key_Up:
mViewWidget->zoomIn(1);
break;
case Qt::Key_Space:
// space wird von buttons, wenn focus drauf ist als Aktivierung vorher abgegriffen und nicht durchgereicht
mPlayerWidget->togglePlayPause();
break;
case Qt::Key_D:
break;
default:
;
}
}
void Petrack::mousePressEvent(QMouseEvent *event)
{
// mouse click in fps status label ?
if( event->pos().x() >= mStatusLabelFPS->pos().x() && event->pos().x() <= mStatusLabelFPS->pos().x()+mStatusLabelFPS->width() )
{
mPlayerWidget->togglePlayerSpeedLimited();
/// update control widget, if image size changed (especially because of changing border)
void Petrack::updateControlImage(cv::Mat &img)
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
{
// auch moeglich hoehe und breite von bild stat border veraenderungen zu checken
static int lastBorderSize = -1;
if( isLoading() )
lastBorderSize = -1;
int diffBorderSize=0;
int iW = img.cols;
int iH = img.rows;
// wird auch nochmal in ImageWidget gemacht, aber ist hier frueher noetig
double cX = mControlWidget->getCalibCxValue(); // merken, da min/max value verandernkann wenn aus dem rahmen
double cY = mControlWidget->getCalibCyValue();
mControlWidget->setCalibCxMin(0 /*iW/2.-50.*/);
mControlWidget->setCalibCxMax(iW /*iW/2.+50.*/);
mControlWidget->setCalibCyMin(0 /*iH/2.-50.*/);
mControlWidget->setCalibCyMax(iH /*iH/2.+50.*/);
if (mControlWidget->fixCenter->checkState() == Qt::Checked)
{
mControlWidget->setCalibCxValue((iW-1)/2.);
mControlWidget->setCalibCyValue((iH-1)/2.);
}
else
{
if (lastBorderSize != -1)
diffBorderSize = getImageBorderSize()-lastBorderSize;
lastBorderSize = getImageBorderSize();
mControlWidget->setCalibCxValue(cX+diffBorderSize);
mControlWidget->setCalibCyValue(cY+diffBorderSize);
}
}
void Petrack::importTracker(QString dest) //default = ""
{
static QString lastFile;
if (lastFile == "")
lastFile = mTrcFileName;
// if no destination file or folder is given
if (dest.isEmpty())
{
dest = QFileDialog::getOpenFileName(this, tr("Select file for importing tracking pathes"), lastFile,
tr("PeTrack tracker (*.trc *.txt);;All files (*.*)"));
}
if (!dest.isEmpty())
{
if (dest.right(4) == ".trc")
{
QFile file(dest);
int i, sz;
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
// errorstring ist je nach Betriebssystem in einer anderen Sprache!!!!
PCritical(this, tr("PeTrack"), tr("Cannot open %1:\n%2").arg(dest).arg(file.errorString()));
return;
}
setTrackChanged(true);// flag changes of track parameters
mTracker->reset();
QTextStream in(&file);
TrackPerson tp;
QString comment;
bool ok; // shows if int stands in first line - that was in the first version of trc file
QString firstLine = in.readLine();
sz = firstLine.toInt(&ok);
if (!ok)
{
if (firstLine.contains("version 4",Qt::CaseInsensitive))
{
trcVersion = 4;
}
else if (firstLine.contains("version 3",Qt::CaseInsensitive))
}
else if(firstLine.contains("version 2",Qt::CaseInsensitive))
}
else
debout << "Error: wrong header while reading TRC file." << std::endl;
Schrödter, Tobias
committed
QMessageBox::critical(this, tr("PeTrack"), tr("Could not import tracker:\nNot supported trc version in file: %1.").arg(dest));
return;
}
in >> sz;
}
else
trcVersion = 1;
if ((sz > 0) && (mTracker->size() != 0))
debout << "Warning: Overlapping trajectories will be joined not until tracking adds new trackpoints." << std::endl;
for (i = 0; i < sz; ++i)
{
if( trcVersion == 2)
{
in >> tp;
}else if( trcVersion >= 3)
{
in >> tp;
}
mTracker->append(tp);
tp.clear(); // loeschen, sonst immer weitere pfade angehangen werden
}
mControlWidget->trackNumberAll->setText(QString("%1").arg(mTracker->size()));
mControlWidget->trackShowOnlyNr->setMaximum(MAX(mTracker->size(),1));
mControlWidget->trackNumberVisible->setText(QString("%1").arg(mTracker->visible(mAnimation->getCurrentFrameNum())));
mControlWidget->colorPlot->replot();
file.close();
debout << "import " << dest << " (" << sz << " person(s), file version " << trcVersion << ")" << std::endl;
mTrcFileName = dest; // fuer Project-File, dann koennte track path direkt mitgeladen werden, wenn er noch da ist
}else
if (dest.right(4) == ".txt") // 3D Koordinaten als Tracking-Daten importieren Zeilenformat: Personennr, Framenr, x, y, z
{
PWarning(this,tr("PeTrack"), tr("Are you sure you want to import 3D data from TXT-File? You have to make sure that the coordinate system now is exactly at the same position and orientation than at export time!"));
QFile file(dest);
// size of person list
int sz = 0;
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
// errorstring ist je nach Betriebssystem in einer anderen Sprache!!!!
PCritical(this, tr("PeTrack"), tr("Cannot open %1:\n%2").arg(dest).arg(file.errorString()));
return;
}
setTrackChanged(true);// flag changes of track parameters
mTracker->reset();
QTextStream in(&file);
TrackPerson tp;
TrackPoint tPoint;
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
QString line;
QString headerline;
bool exec_once_flag = false;
double conversionFactorTo_cm = 1.0;
int personNr = -1, frameNr = -1, current_personNr = 1;
float x, y ,z;
while( 1 )
{
// Falls Datei am Ende letzte Person abspeichern und Lese-Schleife beenden
if( in.atEnd() )
{
tp.setLastFrame(frameNr);
mTracker->append(tp);
++sz;
tp.clear();
break;
}
line = in.readLine();
// Kommentare ueberlesen
if( line.startsWith("#",Qt::CaseInsensitive) )
{
headerline = line;
continue;
}
if ((!exec_once_flag) && (!headerline.contains("cm")))
{
conversionFactorTo_cm = 100.0;
exec_once_flag = true;
PWarning(this,tr("PeTrack"), tr("PeTrack will interpret position data as unit [m]. No header with [cm] found."));
}
QTextStream stream(&line);
// Zeile als Stream einlesen Format: [id frame x y z]
stream >> personNr
>> frameNr
>> x
>> y
>> z;
// convert data to cm
x = x * conversionFactorTo_cm;
y = y * conversionFactorTo_cm;
z = z * conversionFactorTo_cm;
// 3-dimensionale Berechnung/Anzeige des Punktes
if( mControlWidget->getCalibCoordDimension() == 0 )
{
p2d = mExtrCalibration.getImagePoint(cv::Point3f(x,y,z));
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
}
// 2-dimensionale Berechnung/Anzeige des Punktes
else
{
QPointF pos = mImageItem->getPosImage(QPointF(x,y),z);
p2d.x = pos.x();
p2d.y = pos.y();
}
tPoint = TrackPoint(Vec2F(p2d.x,p2d.y),100);
tPoint.setSp(x,y,-mControlWidget->getCalibExtrTrans3()-z); // fuer den Abstand zur Kamera in z-Richtung wie bei einer Stereokamera
// Neue ID ? ==> letzte Person beendet ==> abspeichern
if( personNr > current_personNr )
{
mTracker->append(tp);
++sz;
current_personNr++;
tp.clear();
}
// TrackPerson leer ? ==> Neue TrackPerson erstellen
if ( tp.isEmpty() )
{
tp = TrackPerson(personNr, frameNr, tPoint);
tp.setFirstFrame(frameNr);
tp.setHeight(z);
}
// TrackPoint an TrackPerson anhaengen
else
{
tp.setLastFrame(frameNr);
tp.append(tPoint);
}
}
mControlWidget->trackNumberAll->setText(QString("%1").arg(mTracker->size()));
mControlWidget->trackShowOnlyNr->setMaximum(MAX(mTracker->size(),1));
mControlWidget->trackNumberVisible->setText(QString("%1").arg(mTracker->visible(mAnimation->getCurrentFrameNum())));
mControlWidget->colorPlot->replot();
file.close();
debout << "import " << dest << " (" << sz << " person(s) )" << std::endl;
mTrcFileName = dest; // fuer Project-File, dann koennte track path direkt mitgeladen werden, wenn er noch da ist
}
else
{
PCritical(this, tr("PeTrack"), tr("Cannot load %1 maybe because of wrong file extension.").arg(dest));
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
}
lastFile = dest;
}
}
void Petrack::testTracker()
{
static int idx=0; // index in Fehlerliste, die als letztes angesprungen wurde
QList<int> pers, frame;
mTracker->checkPlausibility(pers, frame,
mControlWidget->testEqual->isChecked(),
mControlWidget->testVelocity->isChecked(),
mControlWidget->testInside->isChecked(),
mControlWidget->testLength->isChecked());
if (pers.length()<=idx)
idx=0;
if (pers.length()>idx)
{
mControlWidget->trackShowOnly->setCheckState(Qt::Checked);
mControlWidget->trackShowOnlyNr->setValue(pers[idx]);
++idx;
}
}
int Petrack::calculateRealTracker()
{
bool autoCorrectOnlyExport = (mReco.getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor
mMultiColorMarkerWidget->autoCorrect->isChecked() &&
mMultiColorMarkerWidget->autoCorrectOnlyExport->isChecked();
int anz = mTrackerReal->calculate(mTracker, mImageItem, mControlWidget->getColorPlot(), getImageBorderSize(),
mControlWidget->anaMissingFrames->checkState(),
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
mStereoWidget->stereoUseForExport->isChecked(),
mControlWidget->trackAlternateHeight->checkState(), mControlWidget->coordAltitude->value(), mStereoWidget->stereoUseCalibrationCenter->isChecked(),
mControlWidget->exportElimTp->isChecked(), mControlWidget->exportElimTrj->isChecked(), mControlWidget->exportSmooth->isChecked(),
mControlWidget->exportViewDir->isChecked(), mControlWidget->exportAngleOfView->isChecked(), mControlWidget->exportMarkerID->isChecked(),
autoCorrectOnlyExport);
mTrackerReal->calcMinMax();
return anz;
}
void Petrack::exportTracker(QString dest) //default = ""
{
static QString lastFile;
if (lastFile == "")
lastFile = mTrcFileName;
if (mTracker)
{
// if no destination file or folder is given
if (dest.isEmpty())
{
QFileDialog fileDialog(this,
tr("Select file for exporting tracking pathes"),
lastFile,
tr("Tracker (*.*);;Petrack tracker (*.trc);;Text (*.txt);;Text for gnuplot(*.dat);;XML Travisto (*.trav);;All supported types (*.txt *.trc *.dat *.trav *.);;All files (*.*)"));
fileDialog.setAcceptMode(QFileDialog::AcceptSave);
fileDialog.setFileMode(QFileDialog::AnyFile);
fileDialog.setDefaultSuffix("");
if( fileDialog.exec() ){
dest = fileDialog.selectedFiles().at(0);
}
}
if (!dest.isEmpty())
{
QList<int> pers, frame;
bool autoCorrectOnlyExport = (mReco.getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor
mMultiColorMarkerWidget->autoCorrect->isChecked() &&
mMultiColorMarkerWidget->autoCorrectOnlyExport->isChecked();
if (dest.right(4) == ".trc")
{
#ifdef TIME_MEASUREMENT
double time1 = 0.0, tstart;
tstart = clock();
#endif
QTemporaryFile file;
int i;
if (!file.open()/*!file.open(QIODevice::WriteOnly | QIODevice::Text)*/)
{
PCritical(this, tr("PeTrack"), tr("Cannot open %1:\n%2.").arg(dest).arg(file.errorString()));
QProgressDialog progress("Export TRC-File",nullptr,0,mTracker->size()+1,this->window());
progress.setWindowTitle("Export .trc-File");
progress.setWindowModality(Qt::WindowModal);
progress.setVisible(true);
progress.setValue(0);
progress.setLabelText(QString("Export tracking data ..."));
qApp->processEvents();
trcVersion = 4;
debout << "export tracking data to " << dest << " (" << mTracker->size() << " person(s), file version " << trcVersion << ")..." << std::endl;
out << "version " << trcVersion << Qt::endl;
out << mTracker->size() << Qt::endl;
for (i = 0; i < mTracker->size(); ++i)
{
qApp->processEvents();
progress.setLabelText(QString("Export person %1 of %2 ...").arg(i+1).arg(mTracker->size()));
progress.setValue(i+1);
out << (*mTracker)[i] << Qt::endl;
}
file.flush();
file.close();
#ifdef TIME_MEASUREMENT
time1 += clock() - tstart;
time1 = time1/CLOCKS_PER_SEC;
cout << " time(writing) = " << time1 << " sec." << endl;
time1 = 0.0;
tstart = clock();
#endif
progress.setLabelText(QString("Save file ..."));
qApp->processEvents();
if (QFile::exists(dest))
QFile::remove(dest);
if( !file.copy(dest) )
PCritical(this, tr("PeTrack"),
tr("Could not export tracking data.\n"
"Please try again!"));
else
statusBar()->showMessage(tr("Saved tracking data to %1.").arg(dest), 5000);
progress.setValue(mTracker->size()+1);
std::cout << " finished " << std::endl;
#ifdef TIME_MEASUREMENT
time1 += clock() - tstart;
time1 = time1/CLOCKS_PER_SEC;
cout << " time(copying) = " << time1 << " sec." << endl;
// time1 = 0.0;
// tstart = clock();
#endif
#ifdef TIME_MEASUREMENT
// time1 += clock() - tstart;
// time1 = time1/CLOCKS_PER_SEC;
// cout << " time(checkPlausibility) = " << time1 << " sec." << endl;
#endif
mTrcFileName = dest; // fuer Project-File, dann koennte track path direkt mitgeladen werden, wenn er noch da ist
}
else if (dest.right(4) == ".txt")
{
QTemporaryFile file;
PCritical(this, tr("PeTrack"), tr("Cannot open %1:\n%2.").arg(dest).arg(file.errorString()));
debout << "export tracking data to " << dest << " (" << mTracker->size() << " person(s))..." << std::endl;
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
#ifdef TIME_MEASUREMENT
double time1 = 0.0, tstart;
tstart = clock();
#endif
// recalcHeight true, wenn personenhoehe ueber trackpoints neu berechnet werden soll (z.b. um waehrend play mehrfachberuecksichtigung von punkten auszuschliessen, aenderungen in altitude neu in berechnung einfliessen zu lassen)
if (mControlWidget->trackRecalcHeight->checkState())
{
if ( mControlWidget->getCalibCoordDimension() == 0 ) // 3D
;//Nothing to be done because z already the right height
else // 2D
mTracker->recalcHeight(mControlWidget->coordAltitude->value());
}
#ifdef TIME_MEASUREMENT
time1 += clock() - tstart;
time1 = time1/CLOCKS_PER_SEC;
cout << " time(recalcHeight) = " << time1 << " sec." << endl;
time1 = 0.0;
tstart = clock();
#endif
mTrackerReal->calculate(mTracker, mImageItem, mControlWidget->getColorPlot(), getImageBorderSize(),
mControlWidget->trackMissingFrames->checkState(),
mStereoWidget->stereoUseForExport->isChecked(),
mControlWidget->trackAlternateHeight->checkState(), mControlWidget->coordAltitude->value(), mStereoWidget->stereoUseCalibrationCenter->isChecked(),
mControlWidget->exportElimTp->isChecked(), mControlWidget->exportElimTrj->isChecked(), mControlWidget->exportSmooth->isChecked(),
mControlWidget->exportViewDir->isChecked(), mControlWidget->exportAngleOfView->isChecked(), mControlWidget->exportMarkerID->isChecked(),
autoCorrectOnlyExport);
#ifdef TIME_MEASUREMENT
time1 += clock() - tstart;
time1 = time1/CLOCKS_PER_SEC;
cout << " time(calculate) = " << time1 << " sec." << endl;
time1 = 0.0;
tstart = clock();
#endif
QTextStream out(&file);
out << "# PeTrack project: " << QFileInfo(getProFileName()).fileName() << Qt::endl;
out << "# raw trajectory file: " << QFileInfo(getTrackFileName()).fileName() << Qt::endl;
out << "# framerate: " << mAnimation->getFPS() << " fps" << Qt::endl;
out << "# personal information:" << Qt::endl;
out << "# ID| Comment" << Qt::endl;
std::cout << std::endl << "Printing comment table..." << std::endl << std::endl;
std::cout << "ID | Comment" << std::endl;
std::cout << "----|----------------" << std::endl;
auto commentSplit = mTracker->at(i).comment().split("\n", Qt::KeepEmptyParts);
out << "#" << qSetFieldWidth(3) << (i+1) << qSetFieldWidth(0) << "|" << commentSplit.at(0) << Qt::endl;
std::cout << std::setw(4) << (i+1) << "|" << commentSplit.at(0) << std::endl;
commentSplit.pop_front();
for (const auto& line : commentSplit)
{
out << "#" << qSetFieldWidth(3) << " " << qSetFieldWidth(0) << "|" << line << Qt::endl;
std::cout << " |" << line << std::endl;
}
}
}
mTrackerReal->exportTxt(out,
mControlWidget->trackAlternateHeight->checkState(),
mStereoWidget->stereoUseForExport->isChecked(),
mControlWidget->exportViewDir->isChecked(),
mControlWidget->exportAngleOfView->isChecked(),
mControlWidget->exportUseM->isChecked(),
mControlWidget->exportMarkerID->isChecked());
//out << *mTrackerReal;
file.flush();
file.close();
if (QFile::exists(dest))
QFile::remove(dest);
if( !file.copy(dest) )
PCritical(this, tr("PeTrack"),
"Please try again!"));
else
statusBar()->showMessage(tr("Saved tracking data to %1.").arg(dest), 5000);
std::cout << " finished" << std::endl;
#ifdef TIME_MEASUREMENT
time1 += clock() - tstart;
time1 = time1/CLOCKS_PER_SEC;
cout << " time(export) = " << time1 << " sec." << endl;
// time1 = 0.0;
// tstart = clock();
#endif
#ifdef TIME_MEASUREMENT
// time1 += clock() - tstart;
// time1 = time1/CLOCKS_PER_SEC;
// cout << " time(checkPlausibility) = " << time1 << " sec." << endl;
#endif
}
else if (dest.right(4) == ".dat")
{
QTemporaryFile fileDat;
if (!fileDat.open()) //!fileDat.open(QIODevice::WriteOnly | QIODevice::Text))
{
PCritical(this, tr("PeTrack"), tr("Cannot open %1:\n%2.").arg(dest).arg(fileDat.errorString()));
return;
}
// recalcHeight true, wenn personenhoehe ueber trackpoints neu berechnet werden soll (z.b. um waehrend play mehrfachberuecksichtigung von punkten auszuschliessen, aenderungen in altitude neu in berechnung einfliessen zu lassen)
if (mControlWidget->trackRecalcHeight->checkState())
{
mTracker->recalcHeight(mControlWidget->coordAltitude->value());
}
mTrackerReal->calculate(mTracker, mImageItem, mControlWidget->getColorPlot(), getImageBorderSize(),
mControlWidget->trackMissingFrames->checkState(),
mStereoWidget->stereoUseForExport->isChecked(),
mControlWidget->trackAlternateHeight->checkState(), mControlWidget->coordAltitude->value(), mStereoWidget->stereoUseCalibrationCenter->isChecked(),
mControlWidget->exportElimTp->isChecked(), mControlWidget->exportElimTrj->isChecked(), mControlWidget->exportSmooth->isChecked(),
mControlWidget->exportViewDir->isChecked(), mControlWidget->exportAngleOfView->isChecked(), mControlWidget->exportMarkerID->isChecked(),
autoCorrectOnlyExport);
debout << "export tracking data to " << dest << " (" << mTracker->size() << " person(s))..." << std::endl;
QTextStream outDat(&fileDat);
mTrackerReal->exportDat(outDat, mControlWidget->trackAlternateHeight->checkState(), mStereoWidget->stereoUseForExport->isChecked());
fileDat.flush();
fileDat.close();
if (QFile::exists(dest))
QFile::remove(dest);
if( !fileDat.copy(dest) )
PCritical(this, tr("PeTrack"),
"Please try again!"));
else
statusBar()->showMessage(tr("Saved tracking data to %1.").arg(dest), 5000);
std::cout << " finished" << std::endl;
}
else if (dest.right(5) == ".trav")
{
// recalcHeight true, wenn personenhoehe ueber trackpoints neu berechnet werden soll (z.b. um waehrend play mehrfachberuecksichtigung von punkten auszuschliessen, aenderungen in altitude neu in berechnung einfliessen zu lassen)
if (mControlWidget->trackRecalcHeight->checkState())
{
mTracker->recalcHeight(mControlWidget->coordAltitude->value());
}
mTrackerReal->calculate(mTracker, mImageItem, mControlWidget->getColorPlot(), getImageBorderSize(),
mControlWidget->trackMissingFrames->checkState(),
mStereoWidget->stereoUseForExport->isChecked(),
mControlWidget->trackAlternateHeight->checkState(), mControlWidget->coordAltitude->value(), mStereoWidget->stereoUseCalibrationCenter->isChecked(),
mControlWidget->exportElimTp->isChecked(), mControlWidget->exportElimTrj->isChecked(), mControlWidget->exportSmooth->isChecked(),
mControlWidget->exportViewDir->isChecked(), mControlWidget->exportAngleOfView->isChecked(), mControlWidget->exportMarkerID->isChecked(),
autoCorrectOnlyExport);
QTemporaryFile fileXml;
if (!fileXml.open()) //!fileXml.open(QIODevice::WriteOnly | QIODevice::Text))
{
PCritical(this, tr("PeTrack"), tr("Cannot open %1:\n%2.").arg(dest).arg(fileXml.errorString()));
debout << "export tracking data to " << dest << " (" << mTracker->size() << " person(s))..." << std::endl;
// already done: mTrackerReal->calculate(mTracker, mImageItem, mControlWidget->getColorPlot(), getImageBorderSize(), mControlWidget->trackMissingFrames->checkState());
QTextStream outXml(&fileXml);
outXml << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << Qt::endl;
outXml << "<trajectoriesDataset>" << Qt::endl;
outXml << " <header version=\"1.0\">" << Qt::endl;
outXml << " <roomCaption>PeTrack: " << mAnimation->getFileBase() << "</roomCaption>" << Qt::endl;
outXml << " <roomID>0</roomID>" << Qt::endl;
outXml << " <agents>" << mTracker->size() << "</agents>" << Qt::endl;
outXml << " <frameRate>" << mAnimation->getFPS() << "</frameRate> <!--per second-->" << Qt::endl;
// outXml << " <timeStep>" << 1000./mAnimation->getFPS() << "</timeStep> <!-- millisecond-->" << endl; inverse von
outXml << " <timeFirstFrame sec=\"" << mAnimation->getFirstFrameSec() << "\" microsec=\"" << mAnimation->getFirstFrameMicroSec()
<< "\"/> <!-- " << mAnimation->getTimeString(0) << " -->" << Qt::endl;
outXml << " </header>" << Qt::endl<< Qt::endl;
mTrackerReal->exportXml(outXml, mControlWidget->trackAlternateHeight->checkState(), mStereoWidget->stereoUseForExport->isChecked());
outXml << "</trajectoriesDataset>" << Qt::endl;
fileXml.flush();
fileXml.close();
if (QFile::exists(dest))
QFile::remove(dest);
if( !fileXml.copy(dest) )
PCritical(this, tr("PeTrack"),
tr("Could not export tracking data.\n"
"Please try again!"));
else
statusBar()->showMessage(tr("Saved tracking data to %1.").arg(dest), 5000);
std::cout << " finished" << std::endl;
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
}
else
{ // wenn keine Dateiendung, dann wird trc und txt herausgeschrieben
exportTracker(dest + ".trc");
exportTracker(dest + ".txt");
}
lastFile = dest;
}
}
}
// fuer anschliessende groessenberechnung
void Petrack::playAll()
{
int memPos = mPlayerWidget->getPos();
int progVal = 0;
QProgressDialog progress("Playing whole sequence...", "Abort playing", 0, mAnimation->getNumFrames(), this);
progress.setWindowModality(Qt::WindowModal); // blocks main window
// vorwaertslaufen ab aktueller Stelle und trackOnlineCalc zum tracken nutzen
do
{
progress.setValue(++progVal); //mPlayerWidget->getPos()
qApp->processEvents();
if (progress.wasCanceled())
break;
}
while (mPlayerWidget->frameForward());
mPlayerWidget->skipToFrame(memPos);
}
/**
* @brief Activates tracking and reco; calcs through the video (in both ways)
*
* This method activates tracking and reco and plays the whole video (from current
* frame on) till the end. Then, if mAutoBackTrack is set, it jumps back to the
* largest first frame, i.e. the last time a new person was added/recognized, and
* tracks backwards till the beginning of the video.
*
* The old settings for tracking and reco will be restored. No interaction with the
* main window is possible for the time of tracking.
*/
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
void Petrack::trackAll()
{
int memPos = mPlayerWidget->getPos();
int progVal = 0;
enum Qt::CheckState memCheckState = mControlWidget->trackOnlineCalc->checkState();
enum Qt::CheckState memRecoState = mControlWidget->performRecognition->checkState();
mControlWidget->trackOnlineCalc->setCheckState(Qt::Checked);
mControlWidget->performRecognition->setCheckState(Qt::Checked);
QProgressDialog progress("Tracking pedestrians through all frames...", "Abort tracking", 0, 2*mAnimation->getNumFrames()-memPos, this);
progress.setWindowModality(Qt::WindowModal); // blocks main window
// vorwaertslaufen ab aktueller Stelle und trackOnlineCalc zum tracken nutzen
do
{
progress.setValue(++progVal); //mPlayerWidget->getPos()
qApp->processEvents();
if (progress.wasCanceled())
break;
}
while (mPlayerWidget->frameForward());
if (mAutoBackTrack)
{
// zuruecksprinegn an die stelle, wo der letzte trackPath nicht vollstaendig
// etwas spaeter, da erste punkte in reco path meist nur ellipse ohne markererkennung
mControlWidget->trackOnlineCalc->setCheckState(Qt::Unchecked);
mPlayerWidget->skipToFrame(mTracker->largestFirstFrame()+5);
mControlWidget->trackOnlineCalc->setCheckState(Qt::Checked);
//progVal = 2*mAnimation->getNumFrames()-memPos-mPlayerWidget->getPos();
progVal += mAnimation->getNumFrames()-mPlayerWidget->getPos();
progress.setValue(progVal); //mPlayerWidget->getPos()
// recognition abstellen, bis an die stelle, wo trackAll begann
// UEBERPRUEFEN, OB TRACKPATH NICHT RECOGNITION PUNKTE UEBERSCHREIBT!!!!!!!!!!
// repeate und repaetQual koennte temporaer umgestellt werden
mControlWidget->performRecognition->setCheckState(Qt::Unchecked);
// rueckwaertslaufen
do
{
if (progVal+1 < 2*mAnimation->getNumFrames()-memPos)
progress.setValue(++progVal); //mPlayerWidget->getPos()
qApp->processEvents();
if (progress.wasCanceled())
break;
if (mPlayerWidget->getPos() == memPos+1)
mControlWidget->performRecognition->setCheckState(Qt::Checked);
}
while (mPlayerWidget->frameBackward());
// bei abbruch koennen es auch mPlayerWidget->getPos() frames sein, die bisher geschrieben wurden
progress.setValue(2*mAnimation->getNumFrames()-memPos);
}
if (mAutoTrackOptimizeColor)
mTracker->optimizeColor();
mControlWidget->performRecognition->setCheckState(memRecoState);
mControlWidget->trackOnlineCalc->setCheckState(Qt::Unchecked);
mPlayerWidget->skipToFrame(memPos);
mControlWidget->trackOnlineCalc->setCheckState(memCheckState);
}
// default: (QPointF *pos=NULL, int pers=-1, int frame=-1);
int Petrack::winSize(QPointF *pos, int pers, int frame, int level)
{
// default of mControlWidget->trackRegionScale->value() is 16, so that
// a factor of 1.6 of the headsize is used
if (level == -1)
level = mControlWidget->trackRegionLevels->value();
return (int)((getHeadSize(pos, pers, frame) / pow(2.,level)) * (mControlWidget->trackRegionScale->value() / 10.));
}
void Petrack::updateImage(bool imageChanged) // default = false (only true for new animation frame)
{
#ifdef TIME_MEASUREMENT
// die reine Ausgabe folgender Zeile kostet 1-2 Millisekunden
// "==========: "