diff --git a/modules/viz/include/opencv2/viz/widgets.hpp b/modules/viz/include/opencv2/viz/widgets.hpp
index 42e0f1968..ea43976dd 100644
--- a/modules/viz/include/opencv2/viz/widgets.hpp
+++ b/modules/viz/include/opencv2/viz/widgets.hpp
@@ -132,6 +132,9 @@ namespace cv
             void setColor(const Color &color);
         };
 
+        /////////////////////////////////////////////////////////////////////////////
+        /// Simple widgets
+
         class CV_EXPORTS WLine : public Widget3D
         {
         public:
@@ -175,6 +178,9 @@ namespace cv
             WCube(const Point3f& pt_min, const Point3f& pt_max, bool wire_frame = true, const Color &color = Color::white());
         };
 
+        /////////////////////////////////////////////////////////////////////////////
+        /// Compond widgets
+
         class CV_EXPORTS WCoordinateSystem : public Widget3D
         {
         public:
@@ -268,6 +274,9 @@ namespace cv
                                     float sphere_radius = 0.007f, const Color &line_color = Color::white(), const Color &sphere_color = Color::white());
         };
 
+        /////////////////////////////////////////////////////////////////////////////
+        /// Cloud widgets
+
         class CV_EXPORTS WCloud: public Widget3D
         {
         public:
@@ -300,6 +309,9 @@ namespace cv
             WMesh(const Mesh3d &mesh);
         };
 
+        /////////////////////////////////////////////////////////////////////////////
+        /// Utility exports
+
         template<> CV_EXPORTS Widget2D Widget::cast<Widget2D>();
         template<> CV_EXPORTS Widget3D Widget::cast<Widget3D>();
         template<> CV_EXPORTS WLine Widget::cast<WLine>();
diff --git a/modules/viz/src/precomp.hpp b/modules/viz/src/precomp.hpp
index 1beb43587..5994aaa1b 100644
--- a/modules/viz/src/precomp.hpp
+++ b/modules/viz/src/precomp.hpp
@@ -94,7 +94,6 @@
 #include <vtkInteractorStyleTrackballCamera.h>
 #include <vtkProperty.h>
 #include <vtkCamera.h>
-#include <vtkObjectFactory.h>
 #include <vtkPlanes.h>
 #include <vtkImageFlip.h>
 #include <vtkRenderWindow.h>
@@ -111,6 +110,12 @@
 #include <vtkPolyDataNormals.h>
 #include <vtkAlgorithmOutput.h>
 #include <vtkImageMapper.h>
+#include <vtkPoints.h>
+#include <vtkInformation.h>
+#include <vtkInformationVector.h>
+#include <vtkObjectFactory.h>
+#include <vtkPolyDataAlgorithm.h>
+#include <vtkMergeFilter.h>
 
 #include <opencv2/core.hpp>
 #include <opencv2/viz.hpp>
diff --git a/modules/viz/src/viz3d_impl.cpp b/modules/viz/src/viz3d_impl.cpp
index b1173f645..af3f93b71 100644
--- a/modules/viz/src/viz3d_impl.cpp
+++ b/modules/viz/src/viz3d_impl.cpp
@@ -48,9 +48,9 @@
 
 #include "precomp.hpp"
 
-vtkRenderWindowInteractor* vtkRenderWindowInteractorFixNew();
 
-#if 1 || !defined __APPLE__
+#if (1 || !defined __APPLE__) && !defined _MSC_VER
+vtkRenderWindowInteractor* vtkRenderWindowInteractorFixNew();
 vtkRenderWindowInteractor* vtkRenderWindowInteractorFixNew()
 {
   return vtkRenderWindowInteractor::New();
@@ -79,7 +79,11 @@ cv::viz::Viz3d::VizImpl::VizImpl(const String &name)
     style_->UseTimersOn();
 
     /////////////////////////////////////////////////
+#if (1 || !defined __APPLE__) && !defined _MSC_VER
     interactor_ = vtkSmartPointer<vtkRenderWindowInteractor>::Take(vtkRenderWindowInteractorFixNew());
+#else
+    interactor_ = vtkSmartPointer<vtkRenderWindowInteractor>::New();
+#endif
 
     window_->AlphaBitPlanesOff();
     window_->PointSmoothingOff();