From 2a8e614e18bd8156c411791dbb2a4487b1b3e972 Mon Sep 17 00:00:00 2001 From: ALouis38 Date: Mon, 18 Jul 2016 17:20:14 +0200 Subject: [PATCH 1/7] Added options to the World and Camera view to visualize only the landmarks seen by the current camera. --- gui/CameraView.cxx | 52 +++++++++++++++++++- gui/CameraView.h | 5 ++ gui/CameraView.ui | 34 +++++++++++-- gui/MainWindow.cxx | 46 +++++++++++++++++ gui/WorldView.cxx | 120 +++++++++++++++++++++++++++++++++++++++++++++ gui/WorldView.h | 2 + gui/WorldView.ui | 32 +++++++++++- 7 files changed, 285 insertions(+), 6 deletions(-) diff --git a/gui/CameraView.cxx b/gui/CameraView.cxx index cc6d8514f..f14e1dbff 100644 --- a/gui/CameraView.cxx +++ b/gui/CameraView.cxx @@ -203,11 +203,14 @@ class CameraViewPrivate LandmarkCloud landmarks; SegmentCloud residuals; + LandmarkCloud visibleLandmarks; QHash landmarkData; PointOptions* landmarkOptions; + PointOptions* visibleLandmarksOptions; + double imageBounds[6]; bool featuresDirty; @@ -249,7 +252,6 @@ CameraViewPrivate::PointCloud::PointCloud() void CameraViewPrivate::PointCloud::addPoint(double x, double y, double z) { auto const vid = this->points->InsertNextPoint(x, y, z); - this->verts->InsertNextCell(1); this->verts->InsertCellPoint(vid); @@ -376,6 +378,7 @@ void CameraViewPrivate::setTransforms(int imageHeight) this->featureRep->GetTrailsActor()->SetUserMatrix(xf.GetPointer()); this->landmarks.actor->SetUserMatrix(xf.GetPointer()); this->residuals.actor->SetUserMatrix(xf.GetPointer()); + this->visibleLandmarks.actor->SetUserMatrix(xf.GetPointer()); } //----------------------------------------------------------------------------- @@ -438,6 +441,20 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) connect(d->landmarkOptions, SIGNAL(modified()), d->UI.renderWidget, SLOT(update())); + d->visibleLandmarksOptions = new PointOptions("CameraView/VisibleLandmarks", + this); + d->visibleLandmarksOptions->setDefaultColor(Qt::magenta); + d->visibleLandmarksOptions->addActor(d->visibleLandmarks.actor.GetPointer()); + d->visibleLandmarksOptions->addMapper(d->visibleLandmarks.mapper.GetPointer()); + + d->visibleLandmarks.actor->SetVisibility(d->UI.actionShowVisibleLandmarks-> + isChecked()); + + d->setPopup(d->UI.actionShowVisibleLandmarks, d->visibleLandmarksOptions); + + connect(d->visibleLandmarksOptions, SIGNAL(modified()), + d->UI.renderWidget, SLOT(update())); + auto const residualsOptions = new ActorColorOption("CameraView/Residuals", this); residualsOptions->setDefaultColor(QColor(255, 128, 0)); @@ -453,6 +470,7 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) this->addAction(d->UI.actionViewResetFullExtents); this->addAction(d->UI.actionShowFeatures); this->addAction(d->UI.actionShowLandmarks); + this->addAction(d->UI.actionShowVisibleLandmarks); this->addAction(d->UI.actionShowResiduals); connect(d->UI.actionViewReset, SIGNAL(triggered()), @@ -466,6 +484,8 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) featureOptions, SLOT(setFeaturesVisible(bool))); connect(d->UI.actionShowLandmarks, SIGNAL(toggled(bool)), this, SLOT(setLandmarksVisible(bool))); + connect(d->UI.actionShowVisibleLandmarks, SIGNAL(toggled(bool)), + this, SLOT(setVisibleLandmarksVisible(bool))); connect(d->UI.actionShowResiduals, SIGNAL(toggled(bool)), this, SLOT(setResidualsVisible(bool))); @@ -488,6 +508,7 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) d->renderer->AddActor(d->featureRep->GetTrailsActor()); d->renderer->AddActor(d->landmarks.actor.GetPointer()); d->renderer->AddActor(d->residuals.actor.GetPointer()); + d->renderer->AddActor(d->visibleLandmarks.actor.GetPointer()); d->renderer->AddViewProp(d->imageActor.GetPointer()); d->imageActor->SetPosition(0.0, 0.0, -0.5); @@ -596,6 +617,9 @@ void CameraView::setLandmarksData(kwiver::vital::landmark_map const& lm) d->landmarkOptions->setTrueColorAvailable(haveColor); d->landmarkOptions->setDataFields(fields); + + d->visibleLandmarksOptions->setTrueColorAvailable(haveColor); + d->visibleLandmarksOptions->setDataFields(fields); } //----------------------------------------------------------------------------- @@ -625,6 +649,16 @@ void CameraView::addLandmark( d->UI.renderWidget->update(); } +//----------------------------------------------------------------------------- +void CameraView::addVisibleLandmark( + kwiver::vital::landmark_id_t id, double x, double y) +{ + QTE_D(); + + d->visibleLandmarks.addPoint(x, y, 1.0, d->landmarkData.value(id)); + d->UI.renderWidget->update(); +} + //----------------------------------------------------------------------------- void CameraView::addResidual( kwiver::vital::track_id_t id, double x1, double y1, double x2, double y2) @@ -652,6 +686,13 @@ void CameraView::clearResiduals() d->residuals.clear(); } +//----------------------------------------------------------------------------- +void CameraView::clearVisibleLandmarks() +{ + QTE_D(); + d->visibleLandmarks.clear(); +} + //----------------------------------------------------------------------------- void CameraView::setImageVisible(bool state) { @@ -670,6 +711,15 @@ void CameraView::setLandmarksVisible(bool state) d->UI.renderWidget->update(); } +//----------------------------------------------------------------------------- +void CameraView::setVisibleLandmarksVisible(bool state) +{ + QTE_D(); + + d->visibleLandmarks.actor->SetVisibility(state); + d->UI.renderWidget->update(); +} + //----------------------------------------------------------------------------- void CameraView::setResidualsVisible(bool state) { diff --git a/gui/CameraView.h b/gui/CameraView.h index 8c3ed78ce..dfed8cf5f 100644 --- a/gui/CameraView.h +++ b/gui/CameraView.h @@ -67,11 +67,15 @@ public slots: void setActiveFrame(unsigned); void addLandmark(kwiver::vital::landmark_id_t id, double x, double y); + + void addVisibleLandmark(kwiver::vital::landmark_id_t id, double x, double y); + void addResidual(kwiver::vital::track_id_t id, double x1, double y1, double x2, double y2); void clearLandmarks(); + void clearVisibleLandmarks(); void clearResiduals(); void resetView(); @@ -80,6 +84,7 @@ public slots: protected slots: void setImageVisible(bool); void setLandmarksVisible(bool); + void setVisibleLandmarksVisible(bool); void setResidualsVisible(bool); void updateFeatures(); diff --git a/gui/CameraView.ui b/gui/CameraView.ui index d2d3f5cd6..a701719f3 100644 --- a/gui/CameraView.ui +++ b/gui/CameraView.ui @@ -6,15 +6,24 @@ 0 0 - 595 - 300 + 654 + 302 Form - + + 0 + + + 0 + + + 0 + + 0 @@ -27,6 +36,7 @@ + @@ -194,6 +204,24 @@ I + + + true + + + false + + + + :/icons/22x22/landmark:/icons/22x22/landmark + + + Visible Landmarks + + + Toggle visibility of the landmarks seen by the current camera + + diff --git a/gui/MainWindow.cxx b/gui/MainWindow.cxx index 8affaa60b..13e5a30c9 100644 --- a/gui/MainWindow.cxx +++ b/gui/MainWindow.cxx @@ -422,7 +422,33 @@ void MainWindowPrivate::setActiveCamera(int id) { this->activeCameraIndex = id; this->UI.worldView->setActiveCamera(this->cameras[id].camera); + + kwiver::vital::landmark_map::map_landmark_t visibleLandmarks; + this->updateCameraView(); + + if (this->tracks) + { + auto const& tracks = this->tracks->tracks(); + foreach (auto const& track, tracks) + { + auto const& state = track->find(this->activeCameraIndex); + if (state != track->end() && state->feat) + { + auto const& id = track->id(); + auto const& landmark = landmarks->landmarks()[id]; + + if (landmark) + { + visibleLandmarks.insert(std::pair(id,landmark)); + } + } + } + } + + this->UI.worldView->setVisibleLandmarks( + kwiver::vital::simple_landmark_map(visibleLandmarks)); } //----------------------------------------------------------------------------- @@ -494,6 +520,26 @@ void MainWindowPrivate::updateCameraView() } } } + + // Show landmarks visible by the current camera + this->UI.cameraView->clearVisibleLandmarks(); + if (this->tracks) + { + auto const& tracks = this->tracks->tracks(); + foreach (auto const& track, tracks) + { + auto const& state = track->find(this->activeCameraIndex); + if (state != track->end() && state->feat) + { + auto const id = track->id(); + if (landmarkPoints.contains(id)) + { + auto const& lp = landmarkPoints[id]; + this->UI.cameraView->addVisibleLandmark(id, lp[0], lp[1]); + } + } + } + } } //----------------------------------------------------------------------------- diff --git a/gui/WorldView.cxx b/gui/WorldView.cxx index 638cfefa6..a30c40087 100644 --- a/gui/WorldView.cxx +++ b/gui/WorldView.cxx @@ -122,6 +122,14 @@ class WorldViewPrivate vtkNew landmarkMapper; vtkNew landmarkActor; + vtkNew visibleLandmarkPoints; + vtkNew visibleLandmarkVerts; + vtkNew visibleLandmarkElevations; + vtkNew visibleLandmarkColors; + vtkNew visibleLandmarkObservations; + vtkNew visibleLandmarkMapper; + vtkNew visibleLandmarkActor; + vtkNew imageActor; vtkNew emptyImage; @@ -133,6 +141,7 @@ class WorldViewPrivate ImageOptions* imageOptions; CameraOptions* cameraOptions; PointOptions* landmarkOptions; + PointOptions* visibleLandmarkOptions; vtkNew imageProjection; vtkNew imageLocalTransform; @@ -301,6 +310,13 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) connect(d->landmarkOptions, SIGNAL(modified()), d->UI.renderWidget, SLOT(update())); + d->visibleLandmarkOptions = new PointOptions("WorldView/VisibleLandmarks", this); + d->visibleLandmarkOptions->addActor(d->visibleLandmarkActor.GetPointer()); + d->setPopup(d->UI.actionShowVisibleLandmarks, d->visibleLandmarkOptions); + + connect(d->visibleLandmarkOptions, SIGNAL(modified()), + d->UI.renderWidget, SLOT(update())); + // Connect actions this->addAction(d->UI.actionViewReset); this->addAction(d->UI.actionViewResetLandmarks); @@ -332,6 +348,8 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) this, SLOT(setCamerasVisible(bool))); connect(d->UI.actionShowLandmarks, SIGNAL(toggled(bool)), this, SLOT(setLandmarksVisible(bool))); + connect(d->UI.actionShowVisibleLandmarks, SIGNAL(toggled(bool)), + this, SLOT(setVisibleLandmarksVisible(bool))); connect(d->UI.actionShowGroundPlane, SIGNAL(toggled(bool)), this, SLOT(setGroundPlaneVisible(bool))); @@ -381,6 +399,33 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) d->landmarkOptions->addMapper(d->landmarkMapper.GetPointer()); + // Set up visible landmarks actor + vtkNew visibleLandmarkPolyData; + + auto const visibleLandmarkPointData = visibleLandmarkPolyData->GetPointData(); + + d->visibleLandmarkColors->SetName(TrueColor); + d->visibleLandmarkColors->SetNumberOfComponents(3); + + d->visibleLandmarkElevations->SetName(Elevation); + d->visibleLandmarkElevations->SetNumberOfComponents(1); + + d->visibleLandmarkObservations->SetName(Observations); + d->visibleLandmarkObservations->SetNumberOfComponents(1); + + visibleLandmarkPolyData->SetPoints(d->visibleLandmarkPoints.GetPointer()); + visibleLandmarkPolyData->SetVerts(d->visibleLandmarkVerts.GetPointer()); + visibleLandmarkPointData->AddArray(d->visibleLandmarkColors.GetPointer()); + visibleLandmarkPointData->AddArray(d->visibleLandmarkElevations.GetPointer()); + visibleLandmarkPointData->AddArray(d->visibleLandmarkObservations.GetPointer()); + d->visibleLandmarkMapper->SetInputData(visibleLandmarkPolyData.GetPointer()); + + d->visibleLandmarkActor->SetMapper(d->visibleLandmarkMapper.GetPointer()); + d->visibleLandmarkActor->SetVisibility(d->UI.actionShowVisibleLandmarks->isChecked()); + d->renderer->AddActor(d->visibleLandmarkActor.GetPointer()); + + d->visibleLandmarkOptions->addMapper(d->visibleLandmarkMapper.GetPointer()); + // Set up ground plane grid d->groundPlane->SetOrigin(-10.0, -10.0, 0.0); d->groundPlane->SetPoint1(+10.0, -10.0, 0.0); @@ -564,6 +609,72 @@ void WorldView::setLandmarks(kwiver::vital::landmark_map const& lm) d->updateAxes(this); } +//----------------------------------------------------------------------------- +void WorldView::setVisibleLandmarks(kwiver::vital::landmark_map const& lm) +{ + QTE_D(); + + auto const& landmarks = lm.landmarks(); + auto const size = static_cast(landmarks.size()); + + auto const defaultColor = kwiver::vital::rgb_color{}; + auto haveColor = false; + auto maxObservations = unsigned{0}; + auto minZ = qInf(), maxZ = -qInf(); + + d->visibleLandmarkPoints->Reset(); + d->visibleLandmarkVerts->Reset(); + d->visibleLandmarkColors->Reset(); + d->visibleLandmarkElevations->Reset(); + d->visibleLandmarkObservations->Reset(); + d->visibleLandmarkPoints->Allocate(size); + d->visibleLandmarkVerts->Allocate(size); + d->visibleLandmarkColors->Allocate(3 * size); + d->visibleLandmarkElevations->Allocate(size); + d->visibleLandmarkObservations->Allocate(size); + + vtkIdType vertIndex = 0; + foreach (auto const& lm, landmarks) + { + auto const& pos = lm.second->loc(); + auto const& color = lm.second->color(); + auto const observations = lm.second->observations(); + + d->visibleLandmarkPoints->InsertNextPoint(pos.data()); + d->visibleLandmarkVerts->InsertNextCell(1); + d->visibleLandmarkVerts->InsertCellPoint(vertIndex++); + d->visibleLandmarkColors->InsertNextValue(color.r); + d->visibleLandmarkColors->InsertNextValue(color.g); + d->visibleLandmarkColors->InsertNextValue(color.b); + d->visibleLandmarkElevations->InsertNextValue(pos[2]); + d->visibleLandmarkObservations->InsertNextValue(observations); + + haveColor = haveColor || (color != defaultColor); + maxObservations = qMax(maxObservations, observations); + minZ = qMin(minZ, pos[2]); + maxZ = qMax(maxZ, pos[2]); + } + + auto fields = QHash{}; + fields.insert("Elevation", FieldInformation{Elevation, {minZ, maxZ}}); + if (maxObservations) + { + auto const upper = static_cast(maxObservations); + fields.insert("Observations", FieldInformation{Observations, {0.0, upper}}); + } + + d->visibleLandmarkOptions->setTrueColorAvailable(haveColor); + d->visibleLandmarkOptions->setDataFields(fields); + + d->visibleLandmarkPoints->Modified(); + d->visibleLandmarkVerts->Modified(); + d->visibleLandmarkColors->Modified(); + d->visibleLandmarkObservations->Modified(); + + d->updateScale(this); + d->updateAxes(this); +} + //----------------------------------------------------------------------------- void WorldView::setImageVisible(bool state) { @@ -590,6 +701,15 @@ void WorldView::setLandmarksVisible(bool state) d->updateAxes(this, true); } +//----------------------------------------------------------------------------- +void WorldView::setVisibleLandmarksVisible(bool state) +{ + QTE_D(); + + d->visibleLandmarkActor->SetVisibility(state); + d->updateAxes(this, true); +} + //----------------------------------------------------------------------------- void WorldView::setGroundPlaneVisible(bool state) { diff --git a/gui/WorldView.h b/gui/WorldView.h index 1fefd3629..1fac53522 100644 --- a/gui/WorldView.h +++ b/gui/WorldView.h @@ -57,12 +57,14 @@ public slots: void addCamera(int id, vtkMaptkCamera* camera); void setLandmarks(kwiver::vital::landmark_map const&); + void setVisibleLandmarks(kwiver::vital::landmark_map const&); void setImageData(vtkImageData* data, QSize const& dimensions); void setImageVisible(bool); void setCamerasVisible(bool); void setLandmarksVisible(bool); + void setVisibleLandmarksVisible(bool); void setGroundPlaneVisible(bool); void setAxesVisible(bool); diff --git a/gui/WorldView.ui b/gui/WorldView.ui index bf500865d..b4aa7fbe3 100644 --- a/gui/WorldView.ui +++ b/gui/WorldView.ui @@ -6,7 +6,7 @@ 0 0 - 560 + 649 300 @@ -14,7 +14,16 @@ Form - + + 0 + + + 0 + + + 0 + + 0 @@ -27,6 +36,7 @@ + @@ -243,6 +253,24 @@ I + + + true + + + false + + + + :/icons/22x22/landmark:/icons/22x22/landmark + + + Visible Landmarks + + + Toggle visibility of landmarks visible by the current camera + + From 645e2f1938d3dfbfe2d3d4b549c58032839848aa Mon Sep 17 00:00:00 2001 From: ALouis38 Date: Mon, 18 Jul 2016 17:27:01 +0200 Subject: [PATCH 2/7] Added a release note --- doc/rel_notes/0.9.0.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/rel_notes/0.9.0.txt b/doc/rel_notes/0.9.0.txt index 325898c23..e72f40140 100644 --- a/doc/rel_notes/0.9.0.txt +++ b/doc/rel_notes/0.9.0.txt @@ -51,6 +51,9 @@ Visualization Application * The GUI now accepts a list of files to be opened on the command line. + * Added options to the World and Camera view to visualize the landmarks seen + by the current camera. Those landmarks can also be colored and thresholded. + Tools * Updated the bundle_adjust_tracks tool to use the configurable abstract From cd3f2f75eda46251f6d5a0f683c7e0cbaffc577f Mon Sep 17 00:00:00 2001 From: ALouis38 Date: Tue, 26 Jul 2016 09:52:28 +0200 Subject: [PATCH 3/7] Moved Visible Landmarks menu under Landmarks menu and load visible landmarks as application start --- gui/CMakeLists.txt | 3 + gui/CameraView.cxx | 47 +++++---- gui/CameraView.h | 2 + gui/CameraView.ui | 19 ---- gui/MainWindow.cxx | 70 ++++++------- gui/PointOptions.cxx | 43 ++++++++ gui/PointOptions.h | 7 ++ gui/PointOptions.ui | 51 ++++++++-- gui/VisibleLandmarksOptions.cxx | 174 ++++++++++++++++++++++++++++++++ gui/VisibleLandmarksOptions.h | 74 ++++++++++++++ gui/VisibleLandmarksOptions.ui | 66 ++++++++++++ gui/WorldView.cxx | 39 ++++--- gui/WorldView.h | 1 + gui/WorldView.ui | 19 ---- 14 files changed, 495 insertions(+), 120 deletions(-) create mode 100644 gui/VisibleLandmarksOptions.cxx create mode 100644 gui/VisibleLandmarksOptions.h create mode 100644 gui/VisibleLandmarksOptions.ui diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index b1f8ad6e6..931d9226f 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -42,6 +42,7 @@ set(gui_ui FeatureOptions.ui ImageOptions.ui PointOptions.ui + VisibleLandmarksOptions.ui ) set(gui_resources @@ -67,6 +68,7 @@ set(gui_moc_headers MatchMatrixWindow.h PointOptions.h WorldView.h + VisibleLandmarksOptions.h tools/AbstractTool.h tools/BundleAdjustTool.h tools/CanonicalTransformTool.h @@ -93,6 +95,7 @@ set(gui_sources PointOptions.cxx Project.cxx WorldView.cxx + VisibleLandmarksOptions.cxx main.cxx vtkMaptkCamera.cxx vtkMaptkCameraRepresentation.cxx diff --git a/gui/CameraView.cxx b/gui/CameraView.cxx index 15a76c458..977ff2dd6 100644 --- a/gui/CameraView.cxx +++ b/gui/CameraView.cxx @@ -208,7 +208,7 @@ class CameraViewPrivate PointOptions* landmarkOptions; - PointOptions* visibleLandmarksOptions; +// PointOptions* visibleLandmarksOptions; double imageBounds[6]; @@ -431,26 +431,13 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) d->landmarkOptions->setDefaultColor(Qt::magenta); d->landmarkOptions->addActor(d->landmarks.actor.GetPointer()); d->landmarkOptions->addMapper(d->landmarks.mapper.GetPointer()); + d->landmarkOptions->addVisibleLandmarksActor(d->visibleLandmarks.actor.GetPointer()); d->setPopup(d->UI.actionShowLandmarks, d->landmarkOptions); connect(d->landmarkOptions, SIGNAL(modified()), d->UI.renderWidget, SLOT(update())); - d->visibleLandmarksOptions = new PointOptions("CameraView/VisibleLandmarks", - this); - d->visibleLandmarksOptions->setDefaultColor(Qt::magenta); - d->visibleLandmarksOptions->addActor(d->visibleLandmarks.actor.GetPointer()); - d->visibleLandmarksOptions->addMapper(d->visibleLandmarks.mapper.GetPointer()); - - d->visibleLandmarks.actor->SetVisibility(d->UI.actionShowVisibleLandmarks-> - isChecked()); - - d->setPopup(d->UI.actionShowVisibleLandmarks, d->visibleLandmarksOptions); - - connect(d->visibleLandmarksOptions, SIGNAL(modified()), - d->UI.renderWidget, SLOT(update())); - auto const residualsOptions = new ActorColorOption("CameraView/Residuals", this); residualsOptions->setDefaultColor(QColor(255, 128, 0)); @@ -466,7 +453,6 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) this->addAction(d->UI.actionViewResetFullExtents); this->addAction(d->UI.actionShowFeatures); this->addAction(d->UI.actionShowLandmarks); - this->addAction(d->UI.actionShowVisibleLandmarks); this->addAction(d->UI.actionShowResiduals); connect(d->UI.actionViewReset, SIGNAL(triggered()), @@ -480,11 +466,12 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) featureOptions, SLOT(setFeaturesVisible(bool))); connect(d->UI.actionShowLandmarks, SIGNAL(toggled(bool)), this, SLOT(setLandmarksVisible(bool))); - connect(d->UI.actionShowVisibleLandmarks, SIGNAL(toggled(bool)), - this, SLOT(setVisibleLandmarksVisible(bool))); connect(d->UI.actionShowResiduals, SIGNAL(toggled(bool)), this, SLOT(setResidualsVisible(bool))); + connect(d->landmarkOptions, SIGNAL(showVisibleLandmarksOnly(bool)), + this, SLOT(setVisibleLandmarksVisibleOnly(bool))); + // Set up ortho view d->renderer->GetActiveCamera()->ParallelProjectionOn(); d->renderer->GetActiveCamera()->SetClippingRange(1.0, 3.0); @@ -613,9 +600,6 @@ void CameraView::setLandmarksData(kwiver::vital::landmark_map const& lm) d->landmarkOptions->setTrueColorAvailable(haveColor); d->landmarkOptions->setDataFields(fields); - - d->visibleLandmarksOptions->setTrueColorAvailable(haveColor); - d->visibleLandmarksOptions->setDataFields(fields); } //----------------------------------------------------------------------------- @@ -682,6 +666,16 @@ void CameraView::clearResiduals() d->residuals.clear(); } +//----------------------------------------------------------------------------- +void CameraView::setVisibleLandmarksVisibleOnly(bool state) +{ + QTE_D(); + + d->landmarks.actor->SetVisibility(!state); + + d->UI.renderWidget->update(); +} + //----------------------------------------------------------------------------- void CameraView::clearVisibleLandmarks() { @@ -704,6 +698,17 @@ void CameraView::setLandmarksVisible(bool state) QTE_D(); d->landmarks.actor->SetVisibility(state); + + if(!state) + { + d->visibleLandmarks.actor->SetVisibility(false); + } + else + { + d->visibleLandmarks.actor->SetVisibility( + d->landmarkOptions->isVisibleLandmarksChecked()); + } + d->UI.renderWidget->update(); } diff --git a/gui/CameraView.h b/gui/CameraView.h index dfed8cf5f..7bb480952 100644 --- a/gui/CameraView.h +++ b/gui/CameraView.h @@ -78,6 +78,8 @@ public slots: void clearVisibleLandmarks(); void clearResiduals(); + void setVisibleLandmarksVisibleOnly(bool); + void resetView(); void resetViewToFullExtents(); diff --git a/gui/CameraView.ui b/gui/CameraView.ui index a701719f3..e64c145dd 100644 --- a/gui/CameraView.ui +++ b/gui/CameraView.ui @@ -36,7 +36,6 @@ - @@ -204,24 +203,6 @@ I - - - true - - - false - - - - :/icons/22x22/landmark:/icons/22x22/landmark - - - Visible Landmarks - - - Toggle visibility of the landmarks seen by the current camera - - diff --git a/gui/MainWindow.cxx b/gui/MainWindow.cxx index db5955bde..daa76c504 100644 --- a/gui/MainWindow.cxx +++ b/gui/MainWindow.cxx @@ -223,6 +223,7 @@ class MainWindowPrivate QString imagePath; // Full path to camera image data QString depthMapPath; // Full path to depth map data + kwiver::vital::landmark_map::map_landmark_t *visibleLandmarks; }; // Methods @@ -340,6 +341,8 @@ void MainWindowPrivate::addFrame( cd.imagePath = imagePath; + cd.visibleLandmarks = new kwiver::vital::landmark_map::map_landmark_t(); + if (camera) { this->orphanImages.clear(); @@ -424,32 +427,10 @@ void MainWindowPrivate::setActiveCamera(int id) this->activeCameraIndex = id; this->UI.worldView->setActiveCamera(this->cameras[id].camera); - kwiver::vital::landmark_map::map_landmark_t visibleLandmarks; - this->updateCameraView(); - if (this->tracks) - { - auto const& tracks = this->tracks->tracks(); - foreach (auto const& track, tracks) - { - auto const& state = track->find(this->activeCameraIndex); - if (state != track->end() && state->feat) - { - auto const& id = track->id(); - auto const& landmark = landmarks->landmarks()[id]; - - if (landmark) - { - visibleLandmarks.insert(std::pair(id,landmark)); - } - } - } - } - - this->UI.worldView->setVisibleLandmarks( - kwiver::vital::simple_landmark_map(visibleLandmarks)); + this->UI.worldView->setVisibleLandmarks(kwiver::vital::simple_landmark_map( + *this->cameras[id].visibleLandmarks)); auto& cd = this->cameras[id]; if (!cd.depthMapPath.isEmpty()) @@ -531,22 +512,12 @@ void MainWindowPrivate::updateCameraView() // Show landmarks visible by the current camera this->UI.cameraView->clearVisibleLandmarks(); - if (this->tracks) + foreach (auto const& landmark, *this->cameras[this->activeCameraIndex].visibleLandmarks) { - auto const& tracks = this->tracks->tracks(); - foreach (auto const& track, tracks) - { - auto const& state = track->find(this->activeCameraIndex); - if (state != track->end() && state->feat) - { - auto const id = track->id(); - if (landmarkPoints.contains(id)) - { - auto const& lp = landmarkPoints[id]; - this->UI.cameraView->addVisibleLandmark(id, lp[0], lp[1]); - } - } - } + auto coord = landmark.second->loc(); + double pp[2]; + this->cameras[this->activeCameraIndex].camera->ProjectPoint(coord,pp); + this->UI.cameraView->addVisibleLandmark(landmark.first,pp[0],pp[1]); } } @@ -864,6 +835,27 @@ void MainWindow::loadProject(QString const& path) } } + // Set visible landmarks for each cameras all at once + if (d->tracks) + { + auto const& tracks = d->tracks->tracks(); + foreach (auto const& track, tracks) + { + auto const& all_frame_ids = track->all_frame_ids(); + foreach (auto frame_id, all_frame_ids) + { + auto const& id = track->id(); + auto const& landmark = d->landmarks->landmarks()[id]; + + if (landmark) + { + d->cameras[frame_id].visibleLandmarks->insert( + std::make_pair(id, landmark)); + } + } + } + } + #ifdef VTKWEBGLEXPORTER d->UI.actionWebGLScene->setEnabled(true); #endif diff --git a/gui/PointOptions.cxx b/gui/PointOptions.cxx index e41062326..533d4da11 100644 --- a/gui/PointOptions.cxx +++ b/gui/PointOptions.cxx @@ -35,6 +35,7 @@ #include "DataColorOptions.h" #include "DataFilterOptions.h" #include "FieldInformation.h" +#include "VisibleLandmarksOptions.h" #include #include @@ -99,6 +100,7 @@ class PointOptionsPrivate DataColorOptions* dataColorOptions; DataFilterOptions* dataFilterOptions; + VisibleLandmarksOptions* visibleLandmarksOptions; QList actors; QList mappers; @@ -249,6 +251,10 @@ PointOptions::PointOptions(QString const& settingsGroup, d->UI.dataFilterMenu->setText(d->dataFilterOptions->iconText() + " "); d->filterState = Qt::Unchecked; + d->visibleLandmarksOptions = + new VisibleLandmarksOptions(settingsGroup+"VsibleLandmarksOptions", this); + d->setPopup(d->UI.visibleLandmarksMenu, d->visibleLandmarksOptions); + // Set up option persistence d->uiState.setCurrentGroup(settingsGroup); @@ -275,6 +281,15 @@ PointOptions::PointOptions(QString const& settingsGroup, connect(&d->colorMode, SIGNAL(buttonClicked(int)), this, SLOT(setColorMode(int))); + connect(d->UI.showVisibleLandmarks, SIGNAL(toggled(bool)), + this, SLOT(showVisibleLandmarks(bool))); + + connect(d->UI.showVisibleLandmarksOnly, SIGNAL(toggled(bool)), + this, SIGNAL(showVisibleLandmarksOnly(bool))); + + connect(d->visibleLandmarksOptions, SIGNAL(visibleLandmarksChanged()), + this, SIGNAL(modified())); + connect(d->dataColorOptions, SIGNAL(iconChanged(QIcon)), this, SLOT(setDataColorIcon(QIcon))); } @@ -341,6 +356,15 @@ void PointOptions::addActor(vtkActor* actor) actor->GetProperty()->SetPointSize(d->UI.size->value()); d->actors.append(actor); + std::cout << "d->actors.size() = " << d->actors.size() << std::endl; +} + +//----------------------------------------------------------------------------- +void PointOptions::addVisibleLandmarksActor(vtkActor *actor) +{ + QTE_D(); + + d->visibleLandmarksOptions->addActor(actor); } //----------------------------------------------------------------------------- @@ -353,6 +377,13 @@ void PointOptions::addMapper(vtkMapper* mapper) d->mappers.append(mapper); } +bool PointOptions::isVisibleLandmarksChecked() +{ + QTE_D(); + + return d->UI.showVisibleLandmarks->isChecked(); +} + //----------------------------------------------------------------------------- void PointOptions::setSize(int size) { @@ -386,6 +417,18 @@ void PointOptions::setDataColorIcon(QIcon const& icon) d->UI.dataColorMenu->setIcon(icon); } +//----------------------------------------------------------------------------- +void PointOptions::showVisibleLandmarks(bool state) +{ + QTE_D(); + + d->visibleLandmarksOptions->setVisibility(state); + + d->UI.showVisibleLandmarksOnly->setEnabled(state); + + emit this->modified(); +} + //----------------------------------------------------------------------------- void PointOptions::updateActiveDataField() { diff --git a/gui/PointOptions.h b/gui/PointOptions.h index 8c6164c83..5494fc58d 100644 --- a/gui/PointOptions.h +++ b/gui/PointOptions.h @@ -52,16 +52,23 @@ class PointOptions : public QWidget virtual ~PointOptions(); void addActor(vtkActor*); + void addVisibleLandmarksActor(vtkActor*); void addMapper(vtkMapper*); + bool isVisibleLandmarksChecked(); + void setDefaultColor(QColor const&); public slots: void setTrueColorAvailable(bool); void setDataFields(QHash const&); + + void showVisibleLandmarks(bool); signals: void modified(); + void visibleLandmarksDisplayChanged(); + void showVisibleLandmarksOnly(bool); protected slots: void setSize(int); diff --git a/gui/PointOptions.ui b/gui/PointOptions.ui index 357dbb03e..cc8a4fd0e 100644 --- a/gui/PointOptions.ui +++ b/gui/PointOptions.ui @@ -6,17 +6,14 @@ 0 0 - 207 - 169 + 305 + 271 Form - - QFormLayout::AllNonFixedFieldsGrow - @@ -57,7 +54,7 @@ - + 255 255 @@ -127,7 +124,7 @@ - + @@ -157,6 +154,46 @@ + + + + + + Show visible landmarks + + + + + + + true + + + + + + QToolButton::InstantPopup + + + Qt::ToolButtonTextOnly + + + true + + + + + + + + + false + + + Show visible landmarks only + + + diff --git a/gui/VisibleLandmarksOptions.cxx b/gui/VisibleLandmarksOptions.cxx new file mode 100644 index 000000000..607b95c94 --- /dev/null +++ b/gui/VisibleLandmarksOptions.cxx @@ -0,0 +1,174 @@ +/*ckwg +29 + * Copyright 2016 by Kitware, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name Kitware, Inc. nor the names of any contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "VisibleLandmarksOptions.h" + +#include "ui_VisibleLandmarksOptions.h" + +#include "DataColorOptions.h" +#include "DataFilterOptions.h" +#include "FieldInformation.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +namespace +{ + +//----------------------------------------------------------------------------- +enum ColorMode +{ + SolidColor, + TrueColor, + DataColor, +}; + +//----------------------------------------------------------------------------- +template +Container sorted(Container c) +{ + qSort(c); + return c; +} + +} + +/////////////////////////////////////////////////////////////////////////////// + +//BEGIN VisibleLandmarksOptionsPrivate + +QTE_IMPLEMENT_D_FUNC(VisibleLandmarksOptions) + +//----------------------------------------------------------------------------- +class VisibleLandmarksOptionsPrivate +{ +public: + + Ui::VisibleLandmarksOptions UI; + qtUiState uiState; + + vtkActor* actor; + +}; + +//END VisibleLandmarksOptionsPrivate + +/////////////////////////////////////////////////////////////////////////////// + +//BEGIN VisibleLandmarksOptions + +//----------------------------------------------------------------------------- +VisibleLandmarksOptions::VisibleLandmarksOptions(QString const& settingsGroup, + QWidget* parent, Qt::WindowFlags flags) + : QWidget(parent, flags), d_ptr(new VisibleLandmarksOptionsPrivate) +{ + QTE_D(); + + // Set up UI + d->UI.setupUi(this); + + // Set up option persistence + d->uiState.setCurrentGroup(settingsGroup); + + d->UI.color->persist(d->uiState, "Color"); + + auto const sizeItem = new qtUiState::Item( + d->UI.size, &QSlider::value, &QSlider::setValue); + d->uiState.map("Size", sizeItem); + + d->uiState.restore(); + + // Connect signals/slots + connect(d->UI.size, SIGNAL(valueChanged(int)), this, SLOT(setSize(int))); + connect(d->UI.color, SIGNAL(colorChanged(QColor)), this, SIGNAL(visibleLandmarksChanged())); +} + +//----------------------------------------------------------------------------- +VisibleLandmarksOptions::~VisibleLandmarksOptions() +{ + QTE_D(); + d->uiState.save(); +} + +//----------------------------------------------------------------------------- +void VisibleLandmarksOptions::setDefaultColor(QColor const& color) +{ + QTE_D(); + + d->UI.color->setColor(color); + d->uiState.restore(); +} + +//----------------------------------------------------------------------------- +void VisibleLandmarksOptions::setVisibility(bool state) +{ + QTE_D(); + + d->actor->SetVisibility(state); + + emit this->visibleLandmarksChanged(); +} + +//----------------------------------------------------------------------------- +void VisibleLandmarksOptions::addActor(vtkActor* actor) +{ + QTE_D(); + + d->UI.color->addActor(actor); + actor->GetProperty()->SetPointSize(d->UI.size->value()); + + d->actor = actor; +} + +//----------------------------------------------------------------------------- +void VisibleLandmarksOptions::setSize(int size) +{ + QTE_D(); + + d->actor->GetProperty()->SetPointSize(size); + + emit this->visibleLandmarksChanged(); +} + +//END VisibleLandmarksOptions diff --git a/gui/VisibleLandmarksOptions.h b/gui/VisibleLandmarksOptions.h new file mode 100644 index 000000000..36490bdcf --- /dev/null +++ b/gui/VisibleLandmarksOptions.h @@ -0,0 +1,74 @@ +/*ckwg +29 + * Copyright 2016 by Kitware, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name Kitware, Inc. nor the names of any contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef VISIBLELANDMARKSOPTIONS_H +#define VISIBLELANDMARKSOPTIONS_H + +#include + +#include + +class vtkActor; + +struct FieldInformation; + +class VisibleLandmarksOptionsPrivate; + +class VisibleLandmarksOptions : public QWidget +{ + Q_OBJECT + +public: + explicit VisibleLandmarksOptions(QString const& settingsGroup, + QWidget* parent = 0, Qt::WindowFlags flags = 0); + virtual ~VisibleLandmarksOptions(); + + void addActor(vtkActor*); + + void setDefaultColor(QColor const&); + +public slots: + void setVisibility(bool); + +signals: + void modified(); + void visibleLandmarksChanged(); + +protected slots: + void setSize(int); + +private: + QTE_DECLARE_PRIVATE_RPTR(VisibleLandmarksOptions) + QTE_DECLARE_PRIVATE(VisibleLandmarksOptions) + + QTE_DISABLE_COPY(VisibleLandmarksOptions) +}; + +#endif diff --git a/gui/VisibleLandmarksOptions.ui b/gui/VisibleLandmarksOptions.ui new file mode 100644 index 000000000..efad53cfa --- /dev/null +++ b/gui/VisibleLandmarksOptions.ui @@ -0,0 +1,66 @@ + + + VisibleLandmarksOptions + + + + 0 + 0 + 142 + 75 + + + + Form + + + + + + Size + + + + + + + Qt::Horizontal + + + + + + + Color + + + + + + + + 255 + 255 + 255 + + + + + + + + + qtColorButton + QPushButton +
qtColorButton.h
+
+ + ActorColorButton + qtColorButton +
ActorColorButton.h
+ 1 +
+
+ + +
diff --git a/gui/WorldView.cxx b/gui/WorldView.cxx index 19d0f1ea8..e676cbc34 100644 --- a/gui/WorldView.cxx +++ b/gui/WorldView.cxx @@ -320,18 +320,12 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) d->landmarkOptions = new PointOptions("WorldView/Landmarks", this); d->landmarkOptions->addActor(d->landmarkActor.GetPointer()); + d->landmarkOptions->addVisibleLandmarksActor(d->visibleLandmarkActor.GetPointer()); d->setPopup(d->UI.actionShowLandmarks, d->landmarkOptions); connect(d->landmarkOptions, SIGNAL(modified()), d->UI.renderWidget, SLOT(update())); - d->visibleLandmarkOptions = new PointOptions("WorldView/VisibleLandmarks", this); - d->visibleLandmarkOptions->addActor(d->visibleLandmarkActor.GetPointer()); - d->setPopup(d->UI.actionShowVisibleLandmarks, d->visibleLandmarkOptions); - - connect(d->visibleLandmarkOptions, SIGNAL(modified()), - d->UI.renderWidget, SLOT(update())); - d->depthMapOptions = new DepthMapOptions("WorldView/DepthMap", this); d->setPopup(d->UI.actionShowDepthMap, d->depthMapOptions); @@ -374,13 +368,14 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) this, SLOT(setCamerasVisible(bool))); connect(d->UI.actionShowLandmarks, SIGNAL(toggled(bool)), this, SLOT(setLandmarksVisible(bool))); - connect(d->UI.actionShowVisibleLandmarks, SIGNAL(toggled(bool)), - this, SLOT(setVisibleLandmarksVisible(bool))); connect(d->UI.actionShowGroundPlane, SIGNAL(toggled(bool)), this, SLOT(setGroundPlaneVisible(bool))); connect(d->UI.actionShowDepthMap, SIGNAL(toggled(bool)), this, SLOT(setDepthMapVisible(bool))); + connect(d->landmarkOptions, SIGNAL(showVisibleLandmarksOnly(bool)), + this, SLOT(setVisibleLandmarksVisibleOnly(bool))); + // Set up render pipeline d->renderer->SetBackground(0, 0, 0); d->renderWindow->AddRenderer(d->renderer.GetPointer()); @@ -449,11 +444,8 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) d->visibleLandmarkMapper->SetInputData(visibleLandmarkPolyData.GetPointer()); d->visibleLandmarkActor->SetMapper(d->visibleLandmarkMapper.GetPointer()); - d->visibleLandmarkActor->SetVisibility(d->UI.actionShowVisibleLandmarks->isChecked()); d->renderer->AddActor(d->visibleLandmarkActor.GetPointer()); - d->visibleLandmarkOptions->addMapper(d->visibleLandmarkMapper.GetPointer()); - // Set up ground plane grid d->groundPlane->SetOrigin(-10.0, -10.0, 0.0); d->groundPlane->SetPoint1(+10.0, -10.0, 0.0); @@ -812,9 +804,6 @@ void WorldView::setVisibleLandmarks(kwiver::vital::landmark_map const& lm) fields.insert("Observations", FieldInformation{Observations, {0.0, upper}}); } - d->visibleLandmarkOptions->setTrueColorAvailable(haveColor); - d->visibleLandmarkOptions->setDataFields(fields); - d->visibleLandmarkPoints->Modified(); d->visibleLandmarkVerts->Modified(); d->visibleLandmarkColors->Modified(); @@ -847,6 +836,26 @@ void WorldView::setLandmarksVisible(bool state) QTE_D(); d->landmarkActor->SetVisibility(state); + + if(!state) + { + d->landmarkOptions->showVisibleLandmarks(false); + } + else + { + d->landmarkOptions->showVisibleLandmarks( + d->landmarkOptions->isVisibleLandmarksChecked()); + } + + d->updateAxes(this, true); +} + +//----------------------------------------------------------------------------- +void WorldView::setVisibleLandmarksVisibleOnly(bool state) +{ + QTE_D(); + + d->landmarkActor->SetVisibility(!state); d->updateAxes(this, true); } diff --git a/gui/WorldView.h b/gui/WorldView.h index 59fc13fef..dad9274b2 100644 --- a/gui/WorldView.h +++ b/gui/WorldView.h @@ -68,6 +68,7 @@ public slots: void setImageVisible(bool); void setCamerasVisible(bool); void setLandmarksVisible(bool); + void setVisibleLandmarksVisibleOnly(bool); void setVisibleLandmarksVisible(bool); void setGroundPlaneVisible(bool); void setAxesVisible(bool); diff --git a/gui/WorldView.ui b/gui/WorldView.ui index 175cdb903..f8b23b5e3 100644 --- a/gui/WorldView.ui +++ b/gui/WorldView.ui @@ -36,7 +36,6 @@ - @@ -254,24 +253,6 @@ I - - - true - - - false - - - - :/icons/22x22/landmark:/icons/22x22/landmark - - - Visible Landmarks - - - Toggle visibility of landmarks visible by the current camera - - true From 8ece367be7bbc0067e2fb2315d84182b6a14f93c Mon Sep 17 00:00:00 2001 From: ALouis38 Date: Tue, 26 Jul 2016 10:12:41 +0200 Subject: [PATCH 4/7] Load the visible landmarks the first time each camera get active. --- gui/MainWindow.cxx | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/gui/MainWindow.cxx b/gui/MainWindow.cxx index daa76c504..d4459ea01 100644 --- a/gui/MainWindow.cxx +++ b/gui/MainWindow.cxx @@ -224,6 +224,7 @@ class MainWindowPrivate QString imagePath; // Full path to camera image data QString depthMapPath; // Full path to depth map data kwiver::vital::landmark_map::map_landmark_t *visibleLandmarks; + bool areVisibleLandmarksLoaded = false; }; // Methods @@ -427,6 +428,30 @@ void MainWindowPrivate::setActiveCamera(int id) this->activeCameraIndex = id; this->UI.worldView->setActiveCamera(this->cameras[id].camera); + //Load visible landmarks for the active camera once + if(!this->cameras[id].areVisibleLandmarksLoaded) + { + + auto const& tracks = this->tracks->tracks(); + foreach (auto const& track, tracks) + { + auto const& all_frame_ids = track->all_frame_ids(); + if (all_frame_ids.count(id)) + { + auto const& landmarkId = track->id(); + auto const& landmark = this->landmarks->landmarks()[landmarkId]; + + if (landmark) + { + this->cameras[id].visibleLandmarks->insert( + std::make_pair(landmarkId, landmark)); + } + } + } + + this->cameras[id].areVisibleLandmarksLoaded = true; + } + this->updateCameraView(); this->UI.worldView->setVisibleLandmarks(kwiver::vital::simple_landmark_map( @@ -835,27 +860,6 @@ void MainWindow::loadProject(QString const& path) } } - // Set visible landmarks for each cameras all at once - if (d->tracks) - { - auto const& tracks = d->tracks->tracks(); - foreach (auto const& track, tracks) - { - auto const& all_frame_ids = track->all_frame_ids(); - foreach (auto frame_id, all_frame_ids) - { - auto const& id = track->id(); - auto const& landmark = d->landmarks->landmarks()[id]; - - if (landmark) - { - d->cameras[frame_id].visibleLandmarks->insert( - std::make_pair(id, landmark)); - } - } - } - } - #ifdef VTKWEBGLEXPORTER d->UI.actionWebGLScene->setEnabled(true); #endif From 4c53c39690ce147ece4036747af88867c9166473 Mon Sep 17 00:00:00 2001 From: ALouis38 Date: Tue, 26 Jul 2016 11:23:28 +0200 Subject: [PATCH 5/7] Fixed landmarks/visible landmarks display when turning on/off visibility --- gui/CameraView.cxx | 9 ++++++++- gui/PointOptions.cxx | 18 ++++++++++++++++++ gui/PointOptions.h | 1 + gui/WorldView.cxx | 14 ++++++++++---- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/gui/CameraView.cxx b/gui/CameraView.cxx index 977ff2dd6..6f05dda32 100644 --- a/gui/CameraView.cxx +++ b/gui/CameraView.cxx @@ -433,6 +433,8 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) d->landmarkOptions->addMapper(d->landmarks.mapper.GetPointer()); d->landmarkOptions->addVisibleLandmarksActor(d->visibleLandmarks.actor.GetPointer()); + d->visibleLandmarks.actor->SetVisibility(d->landmarkOptions->isVisibleLandmarksChecked()); + d->setPopup(d->UI.actionShowLandmarks, d->landmarkOptions); connect(d->landmarkOptions, SIGNAL(modified()), @@ -697,7 +699,12 @@ void CameraView::setLandmarksVisible(bool state) { QTE_D(); - d->landmarks.actor->SetVisibility(state); + if(!d->landmarkOptions->isVisibleLandmarksOnlyChecked() + || (d->landmarkOptions->isVisibleLandmarksOnlyChecked() + && !d->landmarkOptions->isVisibleLandmarksChecked())) + { + d->landmarks.actor->SetVisibility(state); + } if(!state) { diff --git a/gui/PointOptions.cxx b/gui/PointOptions.cxx index 533d4da11..beb2853d6 100644 --- a/gui/PointOptions.cxx +++ b/gui/PointOptions.cxx @@ -377,6 +377,7 @@ void PointOptions::addMapper(vtkMapper* mapper) d->mappers.append(mapper); } +//----------------------------------------------------------------------------- bool PointOptions::isVisibleLandmarksChecked() { QTE_D(); @@ -384,6 +385,14 @@ bool PointOptions::isVisibleLandmarksChecked() return d->UI.showVisibleLandmarks->isChecked(); } +//----------------------------------------------------------------------------- +bool PointOptions::isVisibleLandmarksOnlyChecked() +{ + QTE_D(); + + return d->UI.showVisibleLandmarksOnly->isChecked(); +} + //----------------------------------------------------------------------------- void PointOptions::setSize(int size) { @@ -426,6 +435,15 @@ void PointOptions::showVisibleLandmarks(bool state) d->UI.showVisibleLandmarksOnly->setEnabled(state); + if(!state) + { + emit showVisibleLandmarksOnly(false); + } + else if (state && d->UI.showVisibleLandmarksOnly->isChecked()) + { + emit showVisibleLandmarksOnly(true); + } + emit this->modified(); } diff --git a/gui/PointOptions.h b/gui/PointOptions.h index 5494fc58d..f4ddefeaf 100644 --- a/gui/PointOptions.h +++ b/gui/PointOptions.h @@ -56,6 +56,7 @@ class PointOptions : public QWidget void addMapper(vtkMapper*); bool isVisibleLandmarksChecked(); + bool isVisibleLandmarksOnlyChecked(); void setDefaultColor(QColor const&); diff --git a/gui/WorldView.cxx b/gui/WorldView.cxx index e676cbc34..b8beb8183 100644 --- a/gui/WorldView.cxx +++ b/gui/WorldView.cxx @@ -326,6 +326,8 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) connect(d->landmarkOptions, SIGNAL(modified()), d->UI.renderWidget, SLOT(update())); + d->visibleLandmarkActor->SetVisibility(d->landmarkOptions->isVisibleLandmarksChecked()); + d->depthMapOptions = new DepthMapOptions("WorldView/DepthMap", this); d->setPopup(d->UI.actionShowDepthMap, d->depthMapOptions); @@ -835,15 +837,19 @@ void WorldView::setLandmarksVisible(bool state) { QTE_D(); - d->landmarkActor->SetVisibility(state); - + if(!d->landmarkOptions->isVisibleLandmarksOnlyChecked() + || (d->landmarkOptions->isVisibleLandmarksOnlyChecked() + && !d->landmarkOptions->isVisibleLandmarksChecked())) + { + d->landmarkActor->SetVisibility(state); + } if(!state) { - d->landmarkOptions->showVisibleLandmarks(false); + d->visibleLandmarkActor->SetVisibility(false); } else { - d->landmarkOptions->showVisibleLandmarks( + d->visibleLandmarkActor->SetVisibility( d->landmarkOptions->isVisibleLandmarksChecked()); } From 8536983f35d573eba90c3c4ea400c7eea2745067 Mon Sep 17 00:00:00 2001 From: ALouis38 Date: Tue, 26 Jul 2016 16:47:51 +0200 Subject: [PATCH 6/7] Separated visible from non-visible landmarks in LandmarksActor when displaying visible landmarks --- gui/CameraView.cxx | 56 ++++++++++++----- gui/CameraView.h | 5 ++ gui/MainWindow.cxx | 19 ++++++ gui/PointOptions.cxx | 50 ++++++++------- gui/PointOptions.h | 8 +-- gui/WorldView.cxx | 147 ++++++++++++++++++++++++++++++++++--------- gui/WorldView.h | 5 +- 7 files changed, 215 insertions(+), 75 deletions(-) diff --git a/gui/CameraView.cxx b/gui/CameraView.cxx index 6f05dda32..09b1a1676 100644 --- a/gui/CameraView.cxx +++ b/gui/CameraView.cxx @@ -203,13 +203,12 @@ class CameraViewPrivate LandmarkCloud landmarks; SegmentCloud residuals; LandmarkCloud visibleLandmarks; + LandmarkCloud nonVisibleLandmarks; QHash landmarkData; PointOptions* landmarkOptions; -// PointOptions* visibleLandmarksOptions; - double imageBounds[6]; bool featuresDirty; @@ -378,6 +377,7 @@ void CameraViewPrivate::setTransforms(int imageHeight) this->landmarks.actor->SetUserMatrix(xf.GetPointer()); this->residuals.actor->SetUserMatrix(xf.GetPointer()); this->visibleLandmarks.actor->SetUserMatrix(xf.GetPointer()); + this->nonVisibleLandmarks.actor->SetUserMatrix(xf.GetPointer()); } //----------------------------------------------------------------------------- @@ -432,8 +432,10 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) d->landmarkOptions->addActor(d->landmarks.actor.GetPointer()); d->landmarkOptions->addMapper(d->landmarks.mapper.GetPointer()); d->landmarkOptions->addVisibleLandmarksActor(d->visibleLandmarks.actor.GetPointer()); + d->landmarkOptions->addNonVisibleLandmarksActor(d->nonVisibleLandmarks.actor.GetPointer()); d->visibleLandmarks.actor->SetVisibility(d->landmarkOptions->isVisibleLandmarksChecked()); + d->nonVisibleLandmarks.actor->SetVisibility(false); d->setPopup(d->UI.actionShowLandmarks, d->landmarkOptions); @@ -471,8 +473,8 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) connect(d->UI.actionShowResiduals, SIGNAL(toggled(bool)), this, SLOT(setResidualsVisible(bool))); - connect(d->landmarkOptions, SIGNAL(showVisibleLandmarksOnly(bool)), - this, SLOT(setVisibleLandmarksVisibleOnly(bool))); + connect(d->landmarkOptions, SIGNAL(visibleLandmarksDisplayChanged(bool)), + this, SLOT(switchToVisibleLandmarksMode(bool))); // Set up ortho view d->renderer->GetActiveCamera()->ParallelProjectionOn(); @@ -494,6 +496,7 @@ CameraView::CameraView(QWidget* parent, Qt::WindowFlags flags) d->renderer->AddActor(d->landmarks.actor.GetPointer()); d->renderer->AddActor(d->residuals.actor.GetPointer()); d->renderer->AddActor(d->visibleLandmarks.actor.GetPointer()); + d->renderer->AddActor(d->nonVisibleLandmarks.actor.GetPointer()); d->renderer->AddViewProp(d->imageActor.GetPointer()); d->imageActor->SetPosition(0.0, 0.0, -0.5); @@ -641,6 +644,15 @@ void CameraView::addVisibleLandmark( d->UI.renderWidget->update(); } +//----------------------------------------------------------------------------- +void CameraView::addNonVisibleLandmark(kwiver::vital::landmark_id_t id, double x, double y) +{ + QTE_D(); + + d->nonVisibleLandmarks.addPoint(x, y, 1.0, d->landmarkData.value(id)); + d->UI.renderWidget->update(); +} + //----------------------------------------------------------------------------- void CameraView::addResidual( kwiver::vital::track_id_t id, double x1, double y1, double x2, double y2) @@ -685,6 +697,13 @@ void CameraView::clearVisibleLandmarks() d->visibleLandmarks.clear(); } +//----------------------------------------------------------------------------- +void CameraView::clearNonVisibleLandmarks() +{ + QTE_D(); + d->nonVisibleLandmarks.clear(); +} + //----------------------------------------------------------------------------- void CameraView::setImageVisible(bool state) { @@ -699,21 +718,15 @@ void CameraView::setLandmarksVisible(bool state) { QTE_D(); - if(!d->landmarkOptions->isVisibleLandmarksOnlyChecked() - || (d->landmarkOptions->isVisibleLandmarksOnlyChecked() - && !d->landmarkOptions->isVisibleLandmarksChecked())) - { - d->landmarks.actor->SetVisibility(state); - } - - if(!state) + if(d->landmarkOptions->isVisibleLandmarksChecked()) { - d->visibleLandmarks.actor->SetVisibility(false); + d->visibleLandmarks.actor->SetVisibility(state); + d->nonVisibleLandmarks.actor->SetVisibility(state && !d->landmarkOptions-> + isVisibleLandmarksOnlyChecked()); } else { - d->visibleLandmarks.actor->SetVisibility( - d->landmarkOptions->isVisibleLandmarksChecked()); + d->landmarks.actor->SetVisibility(state); } d->UI.renderWidget->update(); @@ -780,4 +793,17 @@ void CameraView::updateFeatures() } } +//----------------------------------------------------------------------------- +void CameraView::switchToVisibleLandmarksMode(bool state) +{ + QTE_D(); + + d->landmarks.actor->SetVisibility(!state); + d->visibleLandmarks.actor->SetVisibility(state); + d->nonVisibleLandmarks.actor->SetVisibility(state && !d->landmarkOptions-> + isVisibleLandmarksOnlyChecked()); + + d->UI.renderWidget->update(); +} + //END CameraView diff --git a/gui/CameraView.h b/gui/CameraView.h index 7bb480952..1562826cd 100644 --- a/gui/CameraView.h +++ b/gui/CameraView.h @@ -70,12 +70,15 @@ public slots: void addVisibleLandmark(kwiver::vital::landmark_id_t id, double x, double y); + void addNonVisibleLandmark(kwiver::vital::landmark_id_t id, double x, double y); + void addResidual(kwiver::vital::track_id_t id, double x1, double y1, double x2, double y2); void clearLandmarks(); void clearVisibleLandmarks(); + void clearNonVisibleLandmarks(); void clearResiduals(); void setVisibleLandmarksVisibleOnly(bool); @@ -91,6 +94,8 @@ protected slots: void updateFeatures(); + void switchToVisibleLandmarksMode(bool); + private: QTE_DECLARE_PRIVATE_RPTR(CameraView) QTE_DECLARE_PRIVATE(CameraView) diff --git a/gui/MainWindow.cxx b/gui/MainWindow.cxx index d4459ea01..9013cc121 100644 --- a/gui/MainWindow.cxx +++ b/gui/MainWindow.cxx @@ -224,6 +224,7 @@ class MainWindowPrivate QString imagePath; // Full path to camera image data QString depthMapPath; // Full path to depth map data kwiver::vital::landmark_map::map_landmark_t *visibleLandmarks; + kwiver::vital::landmark_map::map_landmark_t *nonVisibleLandmarks; bool areVisibleLandmarksLoaded = false; }; @@ -342,7 +343,9 @@ void MainWindowPrivate::addFrame( cd.imagePath = imagePath; + cd.visibleLandmarks = new kwiver::vital::landmark_map::map_landmark_t(); + cd.nonVisibleLandmarks = new kwiver::vital::landmark_map::map_landmark_t(); if (camera) { @@ -432,6 +435,8 @@ void MainWindowPrivate::setActiveCamera(int id) if(!this->cameras[id].areVisibleLandmarksLoaded) { + *this->cameras[id].nonVisibleLandmarks = landmarks->landmarks(); + auto const& tracks = this->tracks->tracks(); foreach (auto const& track, tracks) { @@ -445,6 +450,7 @@ void MainWindowPrivate::setActiveCamera(int id) { this->cameras[id].visibleLandmarks->insert( std::make_pair(landmarkId, landmark)); + this->cameras[id].nonVisibleLandmarks->erase(landmarkId); } } } @@ -457,6 +463,10 @@ void MainWindowPrivate::setActiveCamera(int id) this->UI.worldView->setVisibleLandmarks(kwiver::vital::simple_landmark_map( *this->cameras[id].visibleLandmarks)); + + this->UI.worldView->setNonVisibleLandmarks(kwiver::vital::simple_landmark_map( + *this->cameras[id].nonVisibleLandmarks)); + auto& cd = this->cameras[id]; if (!cd.depthMapPath.isEmpty()) { @@ -544,6 +554,15 @@ void MainWindowPrivate::updateCameraView() this->cameras[this->activeCameraIndex].camera->ProjectPoint(coord,pp); this->UI.cameraView->addVisibleLandmark(landmark.first,pp[0],pp[1]); } + + this->UI.cameraView->clearNonVisibleLandmarks(); + foreach (auto const& landmark, *this->cameras[this->activeCameraIndex].nonVisibleLandmarks) + { + auto coord = landmark.second->loc(); + double pp[2]; + this->cameras[this->activeCameraIndex].camera->ProjectPoint(coord,pp); + this->UI.cameraView->addNonVisibleLandmark(landmark.first,pp[0],pp[1]); + } } //----------------------------------------------------------------------------- diff --git a/gui/PointOptions.cxx b/gui/PointOptions.cxx index beb2853d6..d9c9ebda5 100644 --- a/gui/PointOptions.cxx +++ b/gui/PointOptions.cxx @@ -106,6 +106,8 @@ class PointOptionsPrivate QList mappers; QHash filters; + vtkActor* nonVisibleLandmarksActor; + QHash fields; QButtonGroup colorMode; @@ -282,10 +284,13 @@ PointOptions::PointOptions(QString const& settingsGroup, this, SLOT(setColorMode(int))); connect(d->UI.showVisibleLandmarks, SIGNAL(toggled(bool)), - this, SLOT(showVisibleLandmarks(bool))); + this, SIGNAL(visibleLandmarksDisplayChanged(bool))); + + connect(d->UI.showVisibleLandmarks, SIGNAL(toggled(bool)), + d->UI.showVisibleLandmarksOnly, SLOT(setEnabled(bool))); connect(d->UI.showVisibleLandmarksOnly, SIGNAL(toggled(bool)), - this, SIGNAL(showVisibleLandmarksOnly(bool))); + this, SLOT(showVisibleLandmarksOnly(bool))); connect(d->visibleLandmarksOptions, SIGNAL(visibleLandmarksChanged()), this, SIGNAL(modified())); @@ -347,6 +352,16 @@ void PointOptions::setDataFields( } } +//----------------------------------------------------------------------------- +void PointOptions::showVisibleLandmarksOnly(bool state) +{ + QTE_D(); + + d->nonVisibleLandmarksActor->SetVisibility(!state); + + emit this->modified(); +} + //----------------------------------------------------------------------------- void PointOptions::addActor(vtkActor* actor) { @@ -356,7 +371,6 @@ void PointOptions::addActor(vtkActor* actor) actor->GetProperty()->SetPointSize(d->UI.size->value()); d->actors.append(actor); - std::cout << "d->actors.size() = " << d->actors.size() << std::endl; } //----------------------------------------------------------------------------- @@ -367,6 +381,15 @@ void PointOptions::addVisibleLandmarksActor(vtkActor *actor) d->visibleLandmarksOptions->addActor(actor); } +//----------------------------------------------------------------------------- +void PointOptions::addNonVisibleLandmarksActor(vtkActor * actor) +{ + QTE_D(); + + d->nonVisibleLandmarksActor = actor; + addActor(actor); +} + //----------------------------------------------------------------------------- void PointOptions::addMapper(vtkMapper* mapper) { @@ -426,27 +449,6 @@ void PointOptions::setDataColorIcon(QIcon const& icon) d->UI.dataColorMenu->setIcon(icon); } -//----------------------------------------------------------------------------- -void PointOptions::showVisibleLandmarks(bool state) -{ - QTE_D(); - - d->visibleLandmarksOptions->setVisibility(state); - - d->UI.showVisibleLandmarksOnly->setEnabled(state); - - if(!state) - { - emit showVisibleLandmarksOnly(false); - } - else if (state && d->UI.showVisibleLandmarksOnly->isChecked()) - { - emit showVisibleLandmarksOnly(true); - } - - emit this->modified(); -} - //----------------------------------------------------------------------------- void PointOptions::updateActiveDataField() { diff --git a/gui/PointOptions.h b/gui/PointOptions.h index f4ddefeaf..f1a1f1801 100644 --- a/gui/PointOptions.h +++ b/gui/PointOptions.h @@ -53,6 +53,7 @@ class PointOptions : public QWidget void addActor(vtkActor*); void addVisibleLandmarksActor(vtkActor*); + void addNonVisibleLandmarksActor(vtkActor*); void addMapper(vtkMapper*); bool isVisibleLandmarksChecked(); @@ -64,12 +65,11 @@ public slots: void setTrueColorAvailable(bool); void setDataFields(QHash const&); - - void showVisibleLandmarks(bool); + void showVisibleLandmarksOnly(bool); signals: void modified(); - void visibleLandmarksDisplayChanged(); - void showVisibleLandmarksOnly(bool); + void visibleLandmarksDisplayChanged(bool); + void visibleLandmarksOnlyDisplayChanged(bool); protected slots: void setSize(int); diff --git a/gui/WorldView.cxx b/gui/WorldView.cxx index b8beb8183..b2111960a 100644 --- a/gui/WorldView.cxx +++ b/gui/WorldView.cxx @@ -137,6 +137,14 @@ class WorldViewPrivate vtkNew visibleLandmarkMapper; vtkNew visibleLandmarkActor; + vtkNew nonVisibleLandmarkPoints; + vtkNew nonVisibleLandmarkVerts; + vtkNew nonVisibleLandmarkElevations; + vtkNew nonVisibleLandmarkColors; + vtkNew nonVisibleLandmarkObservations; + vtkNew nonVisibleLandmarkMapper; + vtkNew nonVisibleLandmarkActor; + vtkNew imageActor; vtkNew emptyImage; @@ -320,6 +328,7 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) d->landmarkOptions = new PointOptions("WorldView/Landmarks", this); d->landmarkOptions->addActor(d->landmarkActor.GetPointer()); + d->landmarkOptions->addNonVisibleLandmarksActor(d->nonVisibleLandmarkActor.GetPointer()); d->landmarkOptions->addVisibleLandmarksActor(d->visibleLandmarkActor.GetPointer()); d->setPopup(d->UI.actionShowLandmarks, d->landmarkOptions); @@ -375,8 +384,8 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) connect(d->UI.actionShowDepthMap, SIGNAL(toggled(bool)), this, SLOT(setDepthMapVisible(bool))); - connect(d->landmarkOptions, SIGNAL(showVisibleLandmarksOnly(bool)), - this, SLOT(setVisibleLandmarksVisibleOnly(bool))); + connect(d->landmarkOptions, SIGNAL(visibleLandmarksDisplayChanged(bool)), + this, SLOT(switchToVisibleLandmarksMode(bool))); // Set up render pipeline d->renderer->SetBackground(0, 0, 0); @@ -448,6 +457,31 @@ WorldView::WorldView(QWidget* parent, Qt::WindowFlags flags) d->visibleLandmarkActor->SetMapper(d->visibleLandmarkMapper.GetPointer()); d->renderer->AddActor(d->visibleLandmarkActor.GetPointer()); + // Set up non-visible landmarks actor + vtkNew nonVisibleLandmarkPolyData; + + auto const nonVisibleLandmarkPointData = nonVisibleLandmarkPolyData->GetPointData(); + + d->nonVisibleLandmarkColors->SetName(TrueColor); + d->visibleLandmarkColors->SetNumberOfComponents(3); + + d->nonVisibleLandmarkElevations->SetName(Elevation); + d->nonVisibleLandmarkElevations->SetNumberOfComponents(1); + + d->nonVisibleLandmarkObservations->SetName(Observations); + d->nonVisibleLandmarkObservations->SetNumberOfComponents(1); + + nonVisibleLandmarkPolyData->SetPoints(d->nonVisibleLandmarkPoints.GetPointer()); + nonVisibleLandmarkPolyData->SetVerts(d->nonVisibleLandmarkVerts.GetPointer()); + nonVisibleLandmarkPointData->AddArray(d->nonVisibleLandmarkColors.GetPointer()); + nonVisibleLandmarkPointData->AddArray(d->nonVisibleLandmarkElevations.GetPointer()); + nonVisibleLandmarkPointData->AddArray(d->nonVisibleLandmarkObservations.GetPointer()); + d->nonVisibleLandmarkMapper->SetInputData(nonVisibleLandmarkPolyData.GetPointer()); + + d->nonVisibleLandmarkActor->SetMapper(d->nonVisibleLandmarkMapper.GetPointer()); + d->nonVisibleLandmarkActor->SetVisibility(false); + d->renderer->AddActor(d->nonVisibleLandmarkActor.GetPointer()); + // Set up ground plane grid d->groundPlane->SetOrigin(-10.0, -10.0, 0.0); d->groundPlane->SetPoint1(+10.0, -10.0, 0.0); @@ -815,6 +849,69 @@ void WorldView::setVisibleLandmarks(kwiver::vital::landmark_map const& lm) d->updateAxes(this); } +//----------------------------------------------------------------------------- +void WorldView::setNonVisibleLandmarks(kwiver::vital::landmark_map const& lm) +{ + QTE_D(); + + auto const& landmarks = lm.landmarks(); + auto const size = static_cast(landmarks.size()); + + auto const defaultColor = kwiver::vital::rgb_color{}; + auto haveColor = false; + auto maxObservations = unsigned{0}; + auto minZ = qInf(), maxZ = -qInf(); + + d->nonVisibleLandmarkPoints->Reset(); + d->nonVisibleLandmarkVerts->Reset(); + d->nonVisibleLandmarkColors->Reset(); + d->nonVisibleLandmarkElevations->Reset(); + d->nonVisibleLandmarkObservations->Reset(); + d->nonVisibleLandmarkPoints->Allocate(size); + d->nonVisibleLandmarkVerts->Allocate(size); + d->nonVisibleLandmarkColors->Allocate(3 * size); + d->nonVisibleLandmarkElevations->Allocate(size); + d->nonVisibleLandmarkObservations->Allocate(size); + + vtkIdType vertIndex = 0; + foreach (auto const& lm, landmarks) + { + auto const& pos = lm.second->loc(); + auto const& color = lm.second->color(); + auto const observations = lm.second->observations(); + + d->nonVisibleLandmarkPoints->InsertNextPoint(pos.data()); + d->nonVisibleLandmarkVerts->InsertNextCell(1); + d->nonVisibleLandmarkVerts->InsertCellPoint(vertIndex++); + d->nonVisibleLandmarkColors->InsertNextValue(color.r); + d->nonVisibleLandmarkColors->InsertNextValue(color.g); + d->nonVisibleLandmarkColors->InsertNextValue(color.b); + d->nonVisibleLandmarkElevations->InsertNextValue(pos[2]); + d->nonVisibleLandmarkObservations->InsertNextValue(observations); + + haveColor = haveColor || (color != defaultColor); + maxObservations = qMax(maxObservations, observations); + minZ = qMin(minZ, pos[2]); + maxZ = qMax(maxZ, pos[2]); + } + + auto fields = QHash{}; + fields.insert("Elevation", FieldInformation{Elevation, {minZ, maxZ}}); + if (maxObservations) + { + auto const upper = static_cast(maxObservations); + fields.insert("Observations", FieldInformation{Observations, {0.0, upper}}); + } + + d->nonVisibleLandmarkPoints->Modified(); + d->nonVisibleLandmarkVerts->Modified(); + d->nonVisibleLandmarkColors->Modified(); + d->nonVisibleLandmarkObservations->Modified(); + + d->updateScale(this); + d->updateAxes(this); +} + //----------------------------------------------------------------------------- void WorldView::setImageVisible(bool state) { @@ -837,43 +934,20 @@ void WorldView::setLandmarksVisible(bool state) { QTE_D(); - if(!d->landmarkOptions->isVisibleLandmarksOnlyChecked() - || (d->landmarkOptions->isVisibleLandmarksOnlyChecked() - && !d->landmarkOptions->isVisibleLandmarksChecked())) - { - d->landmarkActor->SetVisibility(state); - } - if(!state) + if(d->landmarkOptions->isVisibleLandmarksChecked()) { - d->visibleLandmarkActor->SetVisibility(false); + d->visibleLandmarkActor->SetVisibility(state); + d->nonVisibleLandmarkActor->SetVisibility(state && !d->landmarkOptions-> + isVisibleLandmarksOnlyChecked()); } else { - d->visibleLandmarkActor->SetVisibility( - d->landmarkOptions->isVisibleLandmarksChecked()); + d->landmarkActor->SetVisibility(state); } d->updateAxes(this, true); } -//----------------------------------------------------------------------------- -void WorldView::setVisibleLandmarksVisibleOnly(bool state) -{ - QTE_D(); - - d->landmarkActor->SetVisibility(!state); - d->updateAxes(this, true); -} - -//----------------------------------------------------------------------------- -void WorldView::setVisibleLandmarksVisible(bool state) -{ - QTE_D(); - - d->visibleLandmarkActor->SetVisibility(state); - d->updateAxes(this, true); -} - //----------------------------------------------------------------------------- void WorldView::setGroundPlaneVisible(bool state) { @@ -1176,6 +1250,19 @@ void WorldView::updateDepthMapThresholds() d->depthMapLoaded = true; } +//----------------------------------------------------------------------------- +void WorldView::switchToVisibleLandmarksMode(bool state) +{ + QTE_D(); + + d->landmarkActor->SetVisibility(!state); + d->visibleLandmarkActor->SetVisibility(state); + d->nonVisibleLandmarkActor->SetVisibility(state && !d->landmarkOptions-> + isVisibleLandmarksOnlyChecked()); + + d->UI.renderWidget->update(); +} + //----------------------------------------------------------------------------- void WorldView::exportWebGLScene(QString const& path) { diff --git a/gui/WorldView.h b/gui/WorldView.h index dad9274b2..2d734f561 100644 --- a/gui/WorldView.h +++ b/gui/WorldView.h @@ -61,6 +61,7 @@ public slots: void addCamera(int id, vtkMaptkCamera* camera); void setLandmarks(kwiver::vital::landmark_map const&); void setVisibleLandmarks(kwiver::vital::landmark_map const&); + void setNonVisibleLandmarks(kwiver::vital::landmark_map const&); void setActiveDepthMap(vtkMaptkCamera* camera, QString const& depthMapPath); void setImageData(vtkImageData* data, QSize const& dimensions); @@ -68,8 +69,6 @@ public slots: void setImageVisible(bool); void setCamerasVisible(bool); void setLandmarksVisible(bool); - void setVisibleLandmarksVisibleOnly(bool); - void setVisibleLandmarksVisible(bool); void setGroundPlaneVisible(bool); void setAxesVisible(bool); void setDepthMapVisible(bool); @@ -98,6 +97,8 @@ protected slots: void updateDepthMapDisplayMode(); void updateDepthMapThresholds(); + void switchToVisibleLandmarksMode(bool); + private: QTE_DECLARE_PRIVATE_RPTR(WorldView) QTE_DECLARE_PRIVATE(WorldView) From ca3fedb180fe64a619ea9874ad91005dd18d83a5 Mon Sep 17 00:00:00 2001 From: ALouis38 Date: Tue, 26 Jul 2016 16:57:45 +0200 Subject: [PATCH 7/7] using find(id) instead of count(id) --- gui/MainWindow.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gui/MainWindow.cxx b/gui/MainWindow.cxx index 9013cc121..f4441f6ed 100644 --- a/gui/MainWindow.cxx +++ b/gui/MainWindow.cxx @@ -440,8 +440,7 @@ void MainWindowPrivate::setActiveCamera(int id) auto const& tracks = this->tracks->tracks(); foreach (auto const& track, tracks) { - auto const& all_frame_ids = track->all_frame_ids(); - if (all_frame_ids.count(id)) + if (track->find(id) != track->end()) { auto const& landmarkId = track->id(); auto const& landmark = this->landmarks->landmarks()[landmarkId];