diff --git a/modules/viz/include/opencv2/viz/widgets.hpp b/modules/viz/include/opencv2/viz/widgets.hpp index a7b9b3546e..c63c54f68e 100644 --- a/modules/viz/include/opencv2/viz/widgets.hpp +++ b/modules/viz/include/opencv2/viz/widgets.hpp @@ -180,7 +180,9 @@ namespace cv class CV_EXPORTS TrajectoryWidget : public Widget3D { public: - TrajectoryWidget(const std::vector &path, const Color &color = Color::white(), bool show_frames = false, double scale = 1.0); + enum {DISPLAY_FRAMES = 1, DISPLAY_PATH = 2}; + + TrajectoryWidget(const std::vector &path, int display_mode = TrajectoryWidget::DISPLAY_PATH, const Color &color = Color::white(), double scale = 1.0); TrajectoryWidget(const std::vector &path, const Matx33f &K, double scale = 1.0, const Color &color = Color::white()); // Camera frustums private: diff --git a/modules/viz/src/shape_widgets.cpp b/modules/viz/src/shape_widgets.cpp index 64d05360fc..fc13e0f3e5 100644 --- a/modules/viz/src/shape_widgets.cpp +++ b/modules/viz/src/shape_widgets.cpp @@ -1162,38 +1162,54 @@ struct cv::viz::TrajectoryWidget::ApplyPath } }; -cv::viz::TrajectoryWidget::TrajectoryWidget(const std::vector &path, const Color &color, bool show_frames, double scale) +cv::viz::TrajectoryWidget::TrajectoryWidget(const std::vector &path, int display_mode, const Color &color, double scale) { - vtkIdType nr_points = path.size(); + vtkSmartPointer appendFilter = vtkSmartPointer::New(); - vtkSmartPointer points = vtkSmartPointer::New (); - vtkSmartPointer polyData = vtkSmartPointer::New (); - vtkSmartPointer polyLine = vtkSmartPointer::New (); - - points->SetDataTypeToFloat(); - points->SetNumberOfPoints(nr_points); - polyLine->GetPointIds()->SetNumberOfIds(nr_points); - - Vec3f last_pos(0.0f,0.0f,0.0f); - Vec3f *data_beg = vtkpoints_data(points); - *data_beg = path[0] * last_pos; - - for (vtkIdType i = 0; i < nr_points; ++i) + if (display_mode & TrajectoryWidget::DISPLAY_PATH) { - last_pos = path[i] * last_pos; - *data_beg++ = last_pos; - polyLine->GetPointIds()->SetId(i,i); + // Create a poly line along the path + vtkIdType nr_points = path.size(); + + vtkSmartPointer points = vtkSmartPointer::New (); + vtkSmartPointer polyData = vtkSmartPointer::New (); + vtkSmartPointer polyLine = vtkSmartPointer::New (); + + points->SetDataTypeToFloat(); + points->SetNumberOfPoints(nr_points); + polyLine->GetPointIds()->SetNumberOfIds(nr_points); + + Vec3f last_pos(0.0f,0.0f,0.0f); + Vec3f *data_beg = vtkpoints_data(points); + + for (vtkIdType i = 0; i < nr_points; ++i) + { + last_pos = path[i] * last_pos; + *data_beg++ = last_pos; + polyLine->GetPointIds()->SetId(i,i); + } + + vtkSmartPointer cells = vtkSmartPointer::New(); + cells->InsertNextCell(polyLine); + + polyData->SetPoints(points); + polyData->SetLines(cells); + + // Set the color for polyData + vtkSmartPointer colors = vtkSmartPointer::New(); + colors->SetNumberOfComponents(3); + + // TODO Make this more efficient + for (int i = 0; i < nr_points; ++i) + colors->InsertNextTuple3(color[2], color[1], color[0]); + + polyData->GetPointData()->SetScalars(colors); + appendFilter->AddInputConnection(polyData->GetProducerPort()); } - vtkSmartPointer cells = vtkSmartPointer::New(); - cells->InsertNextCell(polyLine); - - polyData->SetPoints(points); - polyData->SetLines(cells); - - vtkSmartPointer appendFilter = vtkSmartPointer::New(); - if (show_frames) + if (display_mode & TrajectoryWidget::DISPLAY_FRAMES) { + // Create frames and transform along the path vtkSmartPointer axes = vtkSmartPointer::New(); axes->SetOrigin (0, 0, 0); axes->SetScaleFactor (scale); @@ -1220,18 +1236,6 @@ cv::viz::TrajectoryWidget::TrajectoryWidget(const std::vector &path, c ApplyPath::applyPath(axes_tubes->GetOutput(), appendFilter, path); } - // Set the color for polyData - vtkSmartPointer colors = vtkSmartPointer::New(); - colors->SetNumberOfComponents(3); - - // TODO Make this more efficient - for (int i = 0; i < nr_points; ++i) - colors->InsertNextTuple3(color[2], color[1], color[0]); - - polyData->GetPointData()->SetScalars(colors); - - appendFilter->AddInputConnection(polyData->GetProducerPort()); - vtkSmartPointer mapper = vtkSmartPointer::New(); mapper->SetScalarModeToUsePointData (); mapper->SetInput(appendFilter->GetOutput());