From 0a3691d6acb76c8a557237bc964aa97ada6400a9 Mon Sep 17 00:00:00 2001 From: ozantonkal <ozantonkal@gmail.com> Date: Fri, 19 Jul 2013 18:30:12 +0200 Subject: [PATCH] CameraPositionWidget: constructor with Vec2f fov (tentative) --- modules/viz/include/opencv2/viz/widgets.hpp | 1 + modules/viz/src/shape_widgets.cpp | 40 ++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/modules/viz/include/opencv2/viz/widgets.hpp b/modules/viz/include/opencv2/viz/widgets.hpp index 23ce27fea..7eeaa5d77 100644 --- a/modules/viz/include/opencv2/viz/widgets.hpp +++ b/modules/viz/include/opencv2/viz/widgets.hpp @@ -170,6 +170,7 @@ namespace cv CameraPositionWidget(double scale = 1.0); CameraPositionWidget(const Vec3f &position, const Vec3f &look_at, const Vec3f &up_vector, double scale = 1.0); CameraPositionWidget(const Matx33f &K, double scale = 1.0, const Color &color = Color::white()); + CameraPositionWidget(const Vec2f &fov, double scale = 1.0, const Color &color = Color::white()); }; class CV_EXPORTS CloudWidget : public Widget3D diff --git a/modules/viz/src/shape_widgets.cpp b/modules/viz/src/shape_widgets.cpp index a55ecafb9..6c75b24c7 100644 --- a/modules/viz/src/shape_widgets.cpp +++ b/modules/viz/src/shape_widgets.cpp @@ -895,7 +895,7 @@ cv::viz::CameraPositionWidget::CameraPositionWidget(const Matx33f &K, double sca camera->SetPosition(0.0,0.0,0.0); camera->SetViewUp(0.0,1.0,0.0); camera->SetFocalPoint(0.0,0.0,1.0); - camera->SetClippingRange(0.01, scale * f_y * 0.001); + camera->SetClippingRange(0.01, scale); double planesArray[24]; camera->GetFrustumPlanes(aspect_ratio, planesArray); @@ -922,3 +922,41 @@ cv::viz::CameraPositionWidget::CameraPositionWidget(const Matx33f &K, double sca WidgetAccessor::setProp(*this, actor); setColor(color); } + + +cv::viz::CameraPositionWidget::CameraPositionWidget(const Vec2f &fov, double scale, const Color &color) +{ + vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New(); + + camera->SetViewAngle(fov[1] * 180 / CV_PI); // Vertical field of view + camera->SetPosition(0.0,0.0,0.0); + camera->SetViewUp(0.0,1.0,0.0); + camera->SetFocalPoint(0.0,0.0,1.0); + camera->SetClippingRange(0.01, scale); + + double planesArray[24]; + // Default aspect ratio = 1.0? fovx/fovy? + camera->GetFrustumPlanes(1.0, planesArray); + + vtkSmartPointer<vtkPlanes> planes = vtkSmartPointer<vtkPlanes>::New(); + planes->SetFrustumPlanes(planesArray); + + vtkSmartPointer<vtkFrustumSource> frustumSource = + vtkSmartPointer<vtkFrustumSource>::New(); + frustumSource->SetPlanes(planes); + frustumSource->Update(); + + // Extract the edges so we have the grid + vtkSmartPointer<vtkExtractEdges> filter = vtkSmartPointer<vtkExtractEdges>::New(); + filter->SetInput(frustumSource->GetOutput()); + filter->Update(); + + vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); + mapper->SetInput(filter->GetOutput()); + + vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); + actor->SetMapper(mapper); + + WidgetAccessor::setProp(*this, actor); + setColor(color); +}