diff --git a/modules/viz/include/opencv2/viz/widgets.hpp b/modules/viz/include/opencv2/viz/widgets.hpp index 465517b7d..48616ca3f 100644 --- a/modules/viz/include/opencv2/viz/widgets.hpp +++ b/modules/viz/include/opencv2/viz/widgets.hpp @@ -71,6 +71,8 @@ namespace cv public: PlaneWidget(const Vec4f& coefs, double size = 1.0, const Color &color = Color::white()); PlaneWidget(const Vec4f& coefs, const Point3f& pt, double size = 1.0, const Color &color = Color::white()); + private: + struct SetSizeImpl; }; class CV_EXPORTS SphereWidget : public Widget3D diff --git a/modules/viz/src/shape_widgets.cpp b/modules/viz/src/shape_widgets.cpp index 13241073e..4067ef5e9 100644 --- a/modules/viz/src/shape_widgets.cpp +++ b/modules/viz/src/shape_widgets.cpp @@ -50,6 +50,26 @@ template<> cv::viz::LineWidget cv::viz::Widget::cast() /////////////////////////////////////////////////////////////////////////////////////////////// /// plane widget implementation +struct cv::viz::PlaneWidget::SetSizeImpl +{ + template + static vtkSmartPointer setSize(const Vec<_Tp, 3> ¢er, vtkSmartPointer poly_data, double size) + { + vtkSmartPointer transform = vtkSmartPointer::New(); + transform->PreMultiply(); + transform->Translate(center[0], center[1], center[2]); + transform->Scale(size, size, size); + transform->Translate(-center[0], -center[1], -center[2]); + + vtkSmartPointer transform_filter = vtkSmartPointer::New(); + transform_filter->SetInput(poly_data); + transform_filter->SetTransform(transform); + transform_filter->Update(); + + return transform_filter->GetOutput(); + } +}; + cv::viz::PlaneWidget::PlaneWidget(const Vec4f& coefs, double size, const Color &color) { vtkSmartPointer plane = vtkSmartPointer::New (); @@ -57,12 +77,14 @@ cv::viz::PlaneWidget::PlaneWidget(const Vec4f& coefs, double size, const Color & double norm = cv::norm(Vec3f(coefs.val)); plane->Push (-coefs[3] / norm); + Vec3d p_center; + plane->GetOrigin(p_center.val); + vtkSmartPointer mapper = vtkSmartPointer::New (); - mapper->SetInput(plane->GetOutput ()); + mapper->SetInput(SetSizeImpl::setSize(p_center, plane->GetOutput(), size)); vtkSmartPointer actor = vtkSmartPointer::New(); actor->SetMapper(mapper); - actor->SetScale(size); WidgetAccessor::setProp(*this, actor); setColor(color); @@ -80,11 +102,10 @@ cv::viz::PlaneWidget::PlaneWidget(const Vec4f& coefs, const Point3f& pt, double plane->SetCenter (p_center[0], p_center[1], p_center[2]); vtkSmartPointer mapper = vtkSmartPointer::New (); - mapper->SetInput(plane->GetOutput ()); + mapper->SetInput(SetSizeImpl::setSize(p_center, plane->GetOutput(), size)); vtkSmartPointer actor = vtkSmartPointer::New(); actor->SetMapper(mapper); - actor->SetScale(size); WidgetAccessor::setProp(*this, actor); setColor(color);