From 3d3e3fd4702661fdae9c7cb995ea953333ecb71a Mon Sep 17 00:00:00 2001 From: ozantonkal Date: Thu, 4 Jul 2013 16:15:20 +0300 Subject: [PATCH] plane widget implementation --- modules/viz/include/opencv2/viz/widgets.hpp | 7 ++++ modules/viz/src/simple_widgets.cpp | 42 ++++++++++++++++++++- modules/viz/test/test_viz3d.cpp | 4 ++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/modules/viz/include/opencv2/viz/widgets.hpp b/modules/viz/include/opencv2/viz/widgets.hpp index 2da99fae23..fc2660d7bb 100644 --- a/modules/viz/include/opencv2/viz/widgets.hpp +++ b/modules/viz/include/opencv2/viz/widgets.hpp @@ -42,6 +42,13 @@ namespace temp_viz void setLineWidth(float line_width); float getLineWidth(); }; + + class CV_EXPORTS PlaneWidget : public Widget + { + public: + PlaneWidget(const Vec4f& coefs, const Color &color = Color::white()); + PlaneWidget(const Vec4f& coefs, const Point3f& pt, const Color &color = Color::white()); + }; } diff --git a/modules/viz/src/simple_widgets.cpp b/modules/viz/src/simple_widgets.cpp index f059974ce2..27e4789647 100644 --- a/modules/viz/src/simple_widgets.cpp +++ b/modules/viz/src/simple_widgets.cpp @@ -1,6 +1,7 @@ #include "precomp.hpp" - +/////////////////////////////////////////////////////////////////////////////////////////////// +/// line widget implementation temp_viz::LineWidget::LineWidget(const Point3f &pt1, const Point3f &pt2, const Color &color) { vtkSmartPointer line = vtkSmartPointer::New(); @@ -27,4 +28,43 @@ float temp_viz::LineWidget::getLineWidth() { vtkSmartPointer actor = WidgetAccessor::getActor(*this); return actor->GetProperty()->GetLineWidth(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////// +/// plane widget implementation + +temp_viz::PlaneWidget::PlaneWidget(const Vec4f& coefs, const Color &color) +{ + vtkSmartPointer plane = vtkSmartPointer::New (); + plane->SetNormal (coefs[0], coefs[1], coefs[2]); + double norm = cv::norm(cv::Vec3f(coefs.val)); + plane->Push (-coefs[3] / norm); + + vtkSmartPointer mapper = vtkSmartPointer::New (); + mapper->SetInput(plane->GetOutput ()); + + vtkSmartPointer actor = WidgetAccessor::getActor(*this); + actor->SetMapper(mapper); + + setColor(color); +} + +temp_viz::PlaneWidget::PlaneWidget(const Vec4f& coefs, const Point3f& pt, const Color &color) +{ + vtkSmartPointer plane = vtkSmartPointer::New (); + cv::Point3f coefs3(coefs[0], coefs[1], coefs[2]); + double norm_sqr = 1.0 / coefs3.dot (coefs3); + plane->SetNormal(coefs[0], coefs[1], coefs[2]); + + double t = coefs3.dot(pt) + coefs[3]; + cv::Vec3f p_center = pt - coefs3 * t * norm_sqr; + plane->SetCenter (p_center[0], p_center[1], p_center[2]); + + vtkSmartPointer mapper = vtkSmartPointer::New (); + mapper->SetInput(plane->GetOutput ()); + + vtkSmartPointer actor = WidgetAccessor::getActor(*this); + actor->SetMapper(mapper); + + setColor(color); } \ No newline at end of file diff --git a/modules/viz/test/test_viz3d.cpp b/modules/viz/test/test_viz3d.cpp index 856c105ed3..f3ddfc7e31 100644 --- a/modules/viz/test/test_viz3d.cpp +++ b/modules/viz/test/test_viz3d.cpp @@ -95,7 +95,9 @@ TEST(Viz_viz3d, accuracy) v.showSphere("sphere1", cv::Point3f(0,0,0), 0.5, temp_viz::Color(0,0,255)); v.showArrow("arrow1", cv::Point3f(0,0,0), cv::Point3f(1,1,1), temp_viz::Color(255,0,0)); temp_viz::LineWidget lw(cv::Point3f(0.0,0.0,0.0), cv::Point3f(1.0,1.0,1.0), temp_viz::Color(0,255,0)); + temp_viz::PlaneWidget pw(cv::Vec4f(0.0,1.0,2.0,3.0)); v.showWidget("line", lw); + v.showWidget("plane", pw); temp_viz::LineWidget lw2 = lw; @@ -117,6 +119,8 @@ TEST(Viz_viz3d, accuracy) lw2.setColor(temp_viz::Color(col_blue, col_green, col_red)); lw.setLineWidth(lw.getLineWidth()+pos_x * 10); + pw.setColor(temp_viz::Color(col_blue, col_green, col_red)); + angle_x += 0.1f; angle_y -= 0.1f; angle_z += 0.1f; -- 2.34.1