• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
14 // Third party copyrights are property of their respective owners.
15 //
16 // Redistribution and use in source and binary forms, with or without modification,
17 // are permitted provided that the following conditions are met:
18 //
19 //   * Redistribution's of source code must retain the above copyright notice,
20 //     this list of conditions and the following disclaimer.
21 //
22 //   * Redistribution's in binary form must reproduce the above copyright notice,
23 //     this list of conditions and the following disclaimer in the documentation
24 //     and/or other materials provided with the distribution.
25 //
26 //   * The name of the copyright holders may not be used to endorse or promote products
27 //     derived from this software without specific prior written permission.
28 //
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall the Intel Corporation or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
39 //
40 // Authors:
41 //  * Ozan Tonkal, ozantonkal@gmail.com
42 //  * Anatoly Baksheev, Itseez Inc.  myname.mysurname <> mycompany.com
43 //
44 //M*/
45 
46 #ifndef __OPENCV_VIZ_WIDGETS_HPP__
47 #define __OPENCV_VIZ_WIDGETS_HPP__
48 
49 #include <opencv2/viz/types.hpp>
50 
51 namespace cv
52 {
53     namespace viz
54     {
55 
56 //! @addtogroup viz_widget
57 //! @{
58 
59         /////////////////////////////////////////////////////////////////////////////
60         /// Widget rendering properties
61         enum RenderingProperties
62         {
63             POINT_SIZE,
64             OPACITY,
65             LINE_WIDTH,
66             FONT_SIZE,
67             REPRESENTATION,
68             IMMEDIATE_RENDERING,
69             SHADING
70         };
71 
72         enum RepresentationValues
73         {
74             REPRESENTATION_POINTS,
75             REPRESENTATION_WIREFRAME,
76             REPRESENTATION_SURFACE
77         };
78 
79         enum ShadingValues
80         {
81             SHADING_FLAT,
82             SHADING_GOURAUD,
83             SHADING_PHONG
84         };
85 
86         /////////////////////////////////////////////////////////////////////////////
87 
88         /** @brief Base class of all widgets. Widget is implicitly shared. :
89         */
90         class CV_EXPORTS Widget
91         {
92         public:
93             Widget();
94             Widget(const Widget& other);
95             Widget& operator=(const Widget& other);
96             ~Widget();
97 
98             /** @brief Creates a widget from ply file.
99 
100             @param file_name Ply file name.
101              */
102             static Widget fromPlyFile(const String &file_name);
103 
104             /** @brief Sets rendering property of the widget.
105 
106             @param property Property that will be modified.
107             @param value The new value of the property.
108 
109             **Rendering property** can be one of the following:
110             -   **POINT_SIZE**
111             -   **OPACITY**
112             -   **LINE_WIDTH**
113             -   **FONT_SIZE**
114             -
115             **REPRESENTATION**: Expected values are
116             -   **REPRESENTATION_POINTS**
117             -   **REPRESENTATION_WIREFRAME**
118             -   **REPRESENTATION_SURFACE**
119             -
120             **IMMEDIATE_RENDERING**:
121             -   Turn on immediate rendering by setting the value to 1.
122             -   Turn off immediate rendering by setting the value to 0.
123             -
124             **SHADING**: Expected values are
125             -   **SHADING_FLAT**
126             -   **SHADING_GOURAUD**
127             -   **SHADING_PHONG**
128              */
129             void setRenderingProperty(int property, double value);
130             /** @brief Returns rendering property of the widget.
131 
132             @param property Property.
133 
134             **Rendering property** can be one of the following:
135             -   **POINT_SIZE**
136             -   **OPACITY**
137             -   **LINE_WIDTH**
138             -   **FONT_SIZE**
139             -
140             **REPRESENTATION**: Expected values are
141             :   -   **REPRESENTATION_POINTS**
142             -   **REPRESENTATION_WIREFRAME**
143             -   **REPRESENTATION_SURFACE**
144             -
145             **IMMEDIATE_RENDERING**:
146             :   -   Turn on immediate rendering by setting the value to 1.
147             -   Turn off immediate rendering by setting the value to 0.
148             -
149             **SHADING**: Expected values are
150             :   -   **SHADING_FLAT**
151             -   **SHADING_GOURAUD**
152             -   **SHADING_PHONG**
153              */
154             double getRenderingProperty(int property) const;
155 
156             /** @brief Casts a widget to another.
157 
158             @code
159             // Create a sphere widget
160             viz::WSphere sw(Point3f(0.0f,0.0f,0.0f), 0.5f);
161             // Cast sphere widget to cloud widget
162             viz::WCloud cw = sw.cast<viz::WCloud>();
163             @endcode
164 
165             @note 3D Widgets can only be cast to 3D Widgets. 2D Widgets can only be cast to 2D Widgets.
166              */
167             template<typename _W> _W cast();
168         private:
169             class Impl;
170             Impl *impl_;
171             friend struct WidgetAccessor;
172         };
173 
174         /////////////////////////////////////////////////////////////////////////////
175 
176         /** @brief Base class of all 3D widgets.
177          */
178         class CV_EXPORTS Widget3D : public Widget
179         {
180         public:
Widget3D()181             Widget3D() {}
182 
183             /** @brief Sets pose of the widget.
184 
185             @param pose The new pose of the widget.
186              */
187             void setPose(const Affine3d &pose);
188             /** @brief Updates pose of the widget by pre-multiplying its current pose.
189 
190             @param pose The pose that the current pose of the widget will be pre-multiplied by.
191              */
192             void updatePose(const Affine3d &pose);
193             /** @brief Returns the current pose of the widget.
194              */
195             Affine3d getPose() const;
196 
197             /** @brief Transforms internal widget data (i.e. points, normals) using the given transform.
198 
199             @param transform Specified transformation to apply.
200              */
201             void applyTransform(const Affine3d &transform);
202 
203             /** @brief Sets the color of the widget.
204 
205             @param color color of type Color
206              */
207             void setColor(const Color &color);
208 
209         };
210 
211         /////////////////////////////////////////////////////////////////////////////
212 
213         /** @brief Base class of all 2D widgets.
214         */
215         class CV_EXPORTS Widget2D : public Widget
216         {
217         public:
Widget2D()218             Widget2D() {}
219 
220             /** @brief Sets the color of the widget.
221 
222             @param color color of type Color
223              */
224             void setColor(const Color &color);
225         };
226 
227         /////////////////////////////////////////////////////////////////////////////
228         /// Simple widgets
229 
230         /** @brief This 3D Widget defines a finite line.
231         */
232         class CV_EXPORTS WLine : public Widget3D
233         {
234         public:
235             /** @brief Constructs a WLine.
236 
237             @param pt1 Start point of the line.
238             @param pt2 End point of the line.
239             @param color Color of the line.
240              */
241             WLine(const Point3d &pt1, const Point3d &pt2, const Color &color = Color::white());
242         };
243 
244         /** @brief This 3D Widget defines a finite plane.
245         */
246         class CV_EXPORTS WPlane : public Widget3D
247         {
248         public:
249             /** @brief Constructs a default plane with center point at origin and normal oriented along z-axis.
250 
251             @param size Size of the plane
252             @param color Color of the plane.
253              */
254             WPlane(const Size2d& size = Size2d(1.0, 1.0), const Color &color = Color::white());
255 
256             /** @brief Constructs a repositioned plane
257 
258             @param center Center of the plane
259             @param normal Plane normal orientation
260             @param new_yaxis Up-vector. New orientation of plane y-axis.
261             @param size
262             @param color Color of the plane.
263              */
264             WPlane(const Point3d& center, const Vec3d& normal, const Vec3d& new_yaxis,
265                    const Size2d& size = Size2d(1.0, 1.0), const Color &color = Color::white());
266         };
267 
268         /** @brief This 3D Widget defines a sphere. :
269         */
270         class CV_EXPORTS WSphere : public Widget3D
271         {
272         public:
273             /** @brief Constructs a WSphere.
274 
275             @param center Center of the sphere.
276             @param radius Radius of the sphere.
277             @param sphere_resolution Resolution of the sphere.
278             @param color Color of the sphere.
279              */
280             WSphere(const cv::Point3d &center, double radius, int sphere_resolution = 10, const Color &color = Color::white());
281         };
282 
283         /** @brief This 3D Widget defines an arrow.
284         */
285         class CV_EXPORTS WArrow : public Widget3D
286         {
287         public:
288             /** @brief Constructs an WArrow.
289 
290             @param pt1 Start point of the arrow.
291             @param pt2 End point of the arrow.
292             @param thickness Thickness of the arrow. Thickness of arrow head is also adjusted
293             accordingly.
294             @param color Color of the arrow.
295 
296             Arrow head is located at the end point of the arrow.
297              */
298             WArrow(const Point3d& pt1, const Point3d& pt2, double thickness = 0.03, const Color &color = Color::white());
299         };
300 
301         /** @brief This 3D Widget defines a circle.
302         */
303         class CV_EXPORTS WCircle : public Widget3D
304         {
305         public:
306             /** @brief Constructs default planar circle centred at origin with plane normal along z-axis
307 
308             @param radius Radius of the circle.
309             @param thickness Thickness of the circle.
310             @param color Color of the circle.
311              */
312             WCircle(double radius, double thickness = 0.01, const Color &color = Color::white());
313 
314             /** @brief Constructs repositioned planar circle.
315 
316             @param radius Radius of the circle.
317             @param center Center of the circle.
318             @param normal Normal of the plane in which the circle lies.
319             @param thickness Thickness of the circle.
320             @param color Color of the circle.
321              */
322             WCircle(double radius, const Point3d& center, const Vec3d& normal, double thickness = 0.01, const Color &color = Color::white());
323         };
324 
325         /** @brief This 3D Widget defines a cone. :
326         */
327         class CV_EXPORTS WCone : public Widget3D
328         {
329         public:
330             /** @brief Constructs default cone oriented along x-axis with center of its base located at origin
331 
332             @param length Length of the cone.
333             @param radius Radius of the cone.
334             @param resolution Resolution of the cone.
335             @param color Color of the cone.
336              */
337             WCone(double length, double radius, int resolution = 6.0, const Color &color = Color::white());
338 
339             /** @brief Constructs repositioned planar cone.
340 
341             @param radius Radius of the cone.
342             @param center Center of the cone base.
343             @param tip Tip of the cone.
344             @param resolution Resolution of the cone.
345             @param color Color of the cone.
346 
347              */
348             WCone(double radius, const Point3d& center, const Point3d& tip, int resolution = 6.0, const Color &color = Color::white());
349         };
350 
351         /** @brief This 3D Widget defines a cylinder. :
352         */
353         class CV_EXPORTS WCylinder : public Widget3D
354         {
355         public:
356             /** @brief Constructs a WCylinder.
357 
358             @param axis_point1 A point1 on the axis of the cylinder.
359             @param axis_point2 A point2 on the axis of the cylinder.
360             @param radius Radius of the cylinder.
361             @param numsides Resolution of the cylinder.
362             @param color Color of the cylinder.
363              */
364             WCylinder(const Point3d& axis_point1, const Point3d& axis_point2, double radius, int numsides = 30, const Color &color = Color::white());
365         };
366 
367         /** @brief This 3D Widget defines a cube.
368          */
369         class CV_EXPORTS WCube : public Widget3D
370         {
371         public:
372             /** @brief Constructs a WCube.
373 
374             @param min_point Specifies minimum point of the bounding box.
375             @param max_point Specifies maximum point of the bounding box.
376             @param wire_frame If true, cube is represented as wireframe.
377             @param color Color of the cube.
378 
379             ![Cube Widget](images/cube_widget.png)
380              */
381             WCube(const Point3d& min_point = Vec3d::all(-0.5), const Point3d& max_point = Vec3d::all(0.5),
382                   bool wire_frame = true, const Color &color = Color::white());
383         };
384 
385         /** @brief This 3D Widget defines a poly line. :
386         */
387         class CV_EXPORTS WPolyLine : public Widget3D
388         {
389         public:
390             WPolyLine(InputArray points, InputArray colors);
391             /** @brief Constructs a WPolyLine.
392 
393             @param points Point set.
394             @param color Color of the poly line.
395              */
396             WPolyLine(InputArray points, const Color &color = Color::white());
397         };
398 
399         /////////////////////////////////////////////////////////////////////////////
400         /// Text and image widgets
401 
402         /** @brief This 2D Widget represents text overlay.
403         */
404         class CV_EXPORTS WText : public Widget2D
405         {
406         public:
407             /** @brief Constructs a WText.
408 
409             @param text Text content of the widget.
410             @param pos Position of the text.
411             @param font_size Font size.
412             @param color Color of the text.
413              */
414             WText(const String &text, const Point &pos, int font_size = 20, const Color &color = Color::white());
415 
416             /** @brief Sets the text content of the widget.
417 
418             @param text Text content of the widget.
419              */
420             void setText(const String &text);
421             /** @brief Returns the current text content of the widget.
422             */
423             String getText() const;
424         };
425 
426         /** @brief This 3D Widget represents 3D text. The text always faces the camera.
427         */
428         class CV_EXPORTS WText3D : public Widget3D
429         {
430         public:
431             /** @brief Constructs a WText3D.
432 
433             @param text Text content of the widget.
434             @param position Position of the text.
435             @param text_scale Size of the text.
436             @param face_camera If true, text always faces the camera.
437             @param color Color of the text.
438              */
439             WText3D(const String &text, const Point3d &position, double text_scale = 1., bool face_camera = true, const Color &color = Color::white());
440 
441             /** @brief Sets the text content of the widget.
442 
443             @param text Text content of the widget.
444 
445              */
446             void setText(const String &text);
447             /** @brief Returns the current text content of the widget.
448             */
449             String getText() const;
450         };
451 
452         /** @brief This 2D Widget represents an image overlay. :
453         */
454         class CV_EXPORTS WImageOverlay : public Widget2D
455         {
456         public:
457             /** @brief Constructs an WImageOverlay.
458 
459             @param image BGR or Gray-Scale image.
460             @param rect Image is scaled and positioned based on rect.
461              */
462             WImageOverlay(InputArray image, const Rect &rect);
463             /** @brief Sets the image content of the widget.
464 
465             @param image BGR or Gray-Scale image.
466              */
467             void setImage(InputArray image);
468         };
469 
470         /** @brief This 3D Widget represents an image in 3D space. :
471         */
472         class CV_EXPORTS WImage3D : public Widget3D
473         {
474         public:
475             /** @brief Constructs an WImage3D.
476 
477             @param image BGR or Gray-Scale image.
478             @param size Size of the image.
479              */
480             WImage3D(InputArray image, const Size2d &size);
481 
482             /** @brief Constructs an WImage3D.
483 
484             @param image BGR or Gray-Scale image.
485             @param size Size of the image.
486             @param center Position of the image.
487             @param normal Normal of the plane that represents the image.
488             @param up_vector Determines orientation of the image.
489              */
490             WImage3D(InputArray image, const Size2d &size, const Vec3d &center, const Vec3d &normal, const Vec3d &up_vector);
491 
492             /** @brief Sets the image content of the widget.
493 
494             @param image BGR or Gray-Scale image.
495              */
496             void setImage(InputArray image);
497         };
498 
499         /////////////////////////////////////////////////////////////////////////////
500         /// Compond widgets
501 
502         /** @brief This 3D Widget represents a coordinate system. :
503         */
504         class CV_EXPORTS WCoordinateSystem : public Widget3D
505         {
506         public:
507             /** @brief Constructs a WCoordinateSystem.
508 
509             @param scale Determines the size of the axes.
510              */
511             WCoordinateSystem(double scale = 1.0);
512         };
513 
514         /** @brief This 3D Widget defines a grid. :
515          */
516         class CV_EXPORTS WGrid : public Widget3D
517         {
518         public:
519             /** @brief Constructs a WGrid.
520 
521             @param cells Number of cell columns and rows, respectively.
522             @param cells_spacing Size of each cell, respectively.
523             @param color Color of the grid.
524              */
525             WGrid(const Vec2i &cells = Vec2i::all(10), const Vec2d &cells_spacing = Vec2d::all(1.0), const Color &color = Color::white());
526 
527             //! Creates repositioned grid
528             WGrid(const Point3d& center, const Vec3d& normal, const Vec3d& new_yaxis,
529                   const Vec2i &cells = Vec2i::all(10), const Vec2d &cells_spacing = Vec2d::all(1.0), const Color &color = Color::white());
530         };
531 
532         /** @brief This 3D Widget represents camera position in a scene by its axes or viewing frustum. :
533         */
534         class CV_EXPORTS WCameraPosition : public Widget3D
535         {
536         public:
537             /** @brief Creates camera coordinate frame at the origin.
538 
539             ![Camera coordinate frame](images/cpw1.png)
540              */
541             WCameraPosition(double scale = 1.0);
542             /** @brief Display the viewing frustum
543             @param K Intrinsic matrix of the camera.
544             @param scale Scale of the frustum.
545             @param color Color of the frustum.
546 
547             Creates viewing frustum of the camera based on its intrinsic matrix K.
548 
549             ![Camera viewing frustum](images/cpw2.png)
550             */
551             WCameraPosition(const Matx33d &K, double scale = 1.0, const Color &color = Color::white());
552             /** @brief Display the viewing frustum
553             @param fov Field of view of the camera (horizontal, vertical).
554             @param scale Scale of the frustum.
555             @param color Color of the frustum.
556 
557             Creates viewing frustum of the camera based on its field of view fov.
558 
559             ![Camera viewing frustum](images/cpw2.png)
560              */
561             WCameraPosition(const Vec2d &fov, double scale = 1.0, const Color &color = Color::white());
562             /** @brief Display image on the far plane of the viewing frustum
563 
564             @param K Intrinsic matrix of the camera.
565             @param image BGR or Gray-Scale image that is going to be displayed on the far plane of the frustum.
566             @param scale Scale of the frustum and image.
567             @param color Color of the frustum.
568 
569             Creates viewing frustum of the camera based on its intrinsic matrix K, and displays image on
570             the far end plane.
571 
572             ![Camera viewing frustum with image](images/cpw3.png)
573              */
574             WCameraPosition(const Matx33d &K, InputArray image, double scale = 1.0, const Color &color = Color::white());
575             /** @brief  Display image on the far plane of the viewing frustum
576 
577             @param fov Field of view of the camera (horizontal, vertical).
578             @param image BGR or Gray-Scale image that is going to be displayed on the far plane of the frustum.
579             @param scale Scale of the frustum and image.
580             @param color Color of the frustum.
581 
582             Creates viewing frustum of the camera based on its intrinsic matrix K, and displays image on
583             the far end plane.
584 
585             ![Camera viewing frustum with image](images/cpw3.png)
586              */
587             WCameraPosition(const Vec2d &fov, InputArray image, double scale = 1.0, const Color &color = Color::white());
588         };
589 
590         /////////////////////////////////////////////////////////////////////////////
591         /// Trajectories
592 
593         /** @brief This 3D Widget represents a trajectory. :
594         */
595         class CV_EXPORTS WTrajectory : public Widget3D
596         {
597         public:
598             enum {FRAMES = 1, PATH = 2, BOTH = FRAMES + PATH };
599 
600             /** @brief Constructs a WTrajectory.
601 
602             @param path List of poses on a trajectory. Takes std::vector\<Affine\<T\>\> with T == [float | double]
603             @param display_mode Display mode. This can be PATH, FRAMES, and BOTH.
604             @param scale Scale of the frames. Polyline is not affected.
605             @param color Color of the polyline that represents path.
606 
607             Frames are not affected.
608             Displays trajectory of the given path as follows:
609             -   PATH : Displays a poly line that represents the path.
610             -   FRAMES : Displays coordinate frames at each pose.
611             -   PATH & FRAMES : Displays both poly line and coordinate frames.
612              */
613             WTrajectory(InputArray path, int display_mode = WTrajectory::PATH, double scale = 1.0, const Color &color = Color::white());
614         };
615 
616         /** @brief This 3D Widget represents a trajectory. :
617         */
618         class CV_EXPORTS WTrajectoryFrustums : public Widget3D
619         {
620         public:
621             /** @brief Constructs a WTrajectoryFrustums.
622 
623             @param path List of poses on a trajectory. Takes std::vector\<Affine\<T\>\> with T == [float | double]
624             @param K Intrinsic matrix of the camera.
625             @param scale Scale of the frustums.
626             @param color Color of the frustums.
627 
628             Displays frustums at each pose of the trajectory.
629              */
630             WTrajectoryFrustums(InputArray path, const Matx33d &K, double scale = 1., const Color &color = Color::white());
631 
632             /** @brief Constructs a WTrajectoryFrustums.
633 
634             @param path List of poses on a trajectory. Takes std::vector\<Affine\<T\>\> with T == [float | double]
635             @param fov Field of view of the camera (horizontal, vertical).
636             @param scale Scale of the frustums.
637             @param color Color of the frustums.
638 
639             Displays frustums at each pose of the trajectory.
640              */
641             WTrajectoryFrustums(InputArray path, const Vec2d &fov, double scale = 1., const Color &color = Color::white());
642         };
643 
644         /** @brief This 3D Widget represents a trajectory using spheres and lines
645 
646         where spheres represent the positions of the camera, and lines represent the direction from
647         previous position to the current. :
648          */
649         class CV_EXPORTS WTrajectorySpheres: public Widget3D
650         {
651         public:
652             /** @brief Constructs a WTrajectorySpheres.
653 
654             @param path List of poses on a trajectory. Takes std::vector\<Affine\<T\>\> with T == [float | double]
655             @param line_length Max length of the lines which point to previous position
656             @param radius Radius of the spheres.
657             @param from Color for first sphere.
658             @param to Color for last sphere. Intermediate spheres will have interpolated color.
659              */
660             WTrajectorySpheres(InputArray path, double line_length = 0.05, double radius = 0.007,
661                                const Color &from = Color::red(), const Color &to = Color::white());
662         };
663 
664         /////////////////////////////////////////////////////////////////////////////
665         /// Clouds
666 
667         /** @brief This 3D Widget defines a point cloud. :
668 
669         @note In case there are four channels in the cloud, fourth channel is ignored.
670         */
671         class CV_EXPORTS WCloud: public Widget3D
672         {
673         public:
674             /** @brief Constructs a WCloud.
675 
676             @param cloud Set of points which can be of type: CV_32FC3, CV_32FC4, CV_64FC3, CV_64FC4.
677             @param colors Set of colors. It has to be of the same size with cloud.
678 
679             Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
680              */
681             WCloud(InputArray cloud, InputArray colors);
682 
683             /** @brief Constructs a WCloud.
684             @param cloud Set of points which can be of type: CV_32FC3, CV_32FC4, CV_64FC3, CV_64FC4.
685             @param color A single Color for the whole cloud.
686 
687             Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
688              */
689             WCloud(InputArray cloud, const Color &color = Color::white());
690 
691             /** @brief Constructs a WCloud.
692             @param cloud Set of points which can be of type: CV_32FC3, CV_32FC4, CV_64FC3, CV_64FC4.
693             @param colors Set of colors. It has to be of the same size with cloud.
694             @param normals Normals for each point in cloud. Size and type should match with the cloud parameter.
695 
696             Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
697              */
698             WCloud(InputArray cloud, InputArray colors, InputArray normals);
699 
700             /** @brief Constructs a WCloud.
701             @param cloud Set of points which can be of type: CV_32FC3, CV_32FC4, CV_64FC3, CV_64FC4.
702             @param color A single Color for the whole cloud.
703             @param normals Normals for each point in cloud.
704 
705             Size and type should match with the cloud parameter.
706             Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
707              */
708             WCloud(InputArray cloud, const Color &color, InputArray normals);
709         };
710 
711         class CV_EXPORTS WPaintedCloud: public Widget3D
712         {
713         public:
714             //! Paint cloud with default gradient between cloud bounds points
715             WPaintedCloud(InputArray cloud);
716 
717             //! Paint cloud with default gradient between given points
718             WPaintedCloud(InputArray cloud, const Point3d& p1, const Point3d& p2);
719 
720             //! Paint cloud with gradient specified by given colors between given points
721             WPaintedCloud(InputArray cloud, const Point3d& p1, const Point3d& p2, const Color& c1, const Color c2);
722         };
723 
724         /** @brief This 3D Widget defines a collection of clouds. :
725         @note In case there are four channels in the cloud, fourth channel is ignored.
726         */
727         class CV_EXPORTS WCloudCollection : public Widget3D
728         {
729         public:
730             WCloudCollection();
731 
732             /** @brief Adds a cloud to the collection.
733 
734             @param cloud Point set which can be of type: CV_32FC3, CV_32FC4, CV_64FC3, CV_64FC4.
735             @param colors Set of colors. It has to be of the same size with cloud.
736             @param pose Pose of the cloud. Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
737              */
738             void addCloud(InputArray cloud, InputArray colors, const Affine3d &pose = Affine3d::Identity());
739             /** @brief Adds a cloud to the collection.
740 
741             @param cloud Point set which can be of type: CV_32FC3, CV_32FC4, CV_64FC3, CV_64FC4.
742             @param color A single Color for the whole cloud.
743             @param pose Pose of the cloud. Points in the cloud belong to mask when they are set to (NaN, NaN, NaN).
744              */
745             void addCloud(InputArray cloud, const Color &color = Color::white(), const Affine3d &pose = Affine3d::Identity());
746             /** @brief Finalizes cloud data by repacking to single cloud.
747 
748             Useful for large cloud collections to reduce memory usage
749             */
750             void finalize();
751         };
752 
753         /** @brief This 3D Widget represents normals of a point cloud. :
754         */
755         class CV_EXPORTS WCloudNormals : public Widget3D
756         {
757         public:
758             /** @brief Constructs a WCloudNormals.
759 
760             @param cloud Point set which can be of type: CV_32FC3, CV_32FC4, CV_64FC3, CV_64FC4.
761             @param normals A set of normals that has to be of same type with cloud.
762             @param level Display only every level th normal.
763             @param scale Scale of the arrows that represent normals.
764             @param color Color of the arrows that represent normals.
765 
766             @note In case there are four channels in the cloud, fourth channel is ignored.
767              */
768             WCloudNormals(InputArray cloud, InputArray normals, int level = 64, double scale = 0.1, const Color &color = Color::white());
769         };
770 
771         /** @brief Constructs a WMesh.
772 
773         @param mesh Mesh object that will be displayed.
774         @param cloud Points of the mesh object.
775         @param polygons Points of the mesh object.
776         @param colors Point colors.
777         @param normals Point normals.
778          */
779         class CV_EXPORTS WMesh : public Widget3D
780         {
781         public:
782             WMesh(const Mesh &mesh);
783             WMesh(InputArray cloud, InputArray polygons, InputArray colors = noArray(), InputArray normals = noArray());
784         };
785 
786         /** @brief This class allows to merge several widgets to single one.
787 
788         It has quite limited functionality and can't merge widgets with different attributes. For
789         instance, if widgetA has color array and widgetB has only global color defined, then result
790         of merge won't have color at all. The class is suitable for merging large amount of similar
791         widgets. :
792          */
793         class CV_EXPORTS WWidgetMerger : public Widget3D
794         {
795         public:
796             WWidgetMerger();
797 
798             //! Add widget to merge with optional position change
799             void addWidget(const Widget3D& widget, const Affine3d &pose = Affine3d::Identity());
800 
801             //! Repacks internal structure to single widget
802             void finalize();
803         };
804 
805         /////////////////////////////////////////////////////////////////////////////
806         /// Utility exports
807 
808         template<> CV_EXPORTS Widget2D Widget::cast<Widget2D>();
809         template<> CV_EXPORTS Widget3D Widget::cast<Widget3D>();
810         template<> CV_EXPORTS WLine Widget::cast<WLine>();
811         template<> CV_EXPORTS WPlane Widget::cast<WPlane>();
812         template<> CV_EXPORTS WSphere Widget::cast<WSphere>();
813         template<> CV_EXPORTS WCylinder Widget::cast<WCylinder>();
814         template<> CV_EXPORTS WArrow Widget::cast<WArrow>();
815         template<> CV_EXPORTS WCircle Widget::cast<WCircle>();
816         template<> CV_EXPORTS WCone Widget::cast<WCone>();
817         template<> CV_EXPORTS WCube Widget::cast<WCube>();
818         template<> CV_EXPORTS WCoordinateSystem Widget::cast<WCoordinateSystem>();
819         template<> CV_EXPORTS WPolyLine Widget::cast<WPolyLine>();
820         template<> CV_EXPORTS WGrid Widget::cast<WGrid>();
821         template<> CV_EXPORTS WText3D Widget::cast<WText3D>();
822         template<> CV_EXPORTS WText Widget::cast<WText>();
823         template<> CV_EXPORTS WImageOverlay Widget::cast<WImageOverlay>();
824         template<> CV_EXPORTS WImage3D Widget::cast<WImage3D>();
825         template<> CV_EXPORTS WCameraPosition Widget::cast<WCameraPosition>();
826         template<> CV_EXPORTS WTrajectory Widget::cast<WTrajectory>();
827         template<> CV_EXPORTS WTrajectoryFrustums Widget::cast<WTrajectoryFrustums>();
828         template<> CV_EXPORTS WTrajectorySpheres Widget::cast<WTrajectorySpheres>();
829         template<> CV_EXPORTS WCloud Widget::cast<WCloud>();
830         template<> CV_EXPORTS WPaintedCloud Widget::cast<WPaintedCloud>();
831         template<> CV_EXPORTS WCloudCollection Widget::cast<WCloudCollection>();
832         template<> CV_EXPORTS WCloudNormals Widget::cast<WCloudNormals>();
833         template<> CV_EXPORTS WMesh Widget::cast<WMesh>();
834         template<> CV_EXPORTS WWidgetMerger Widget::cast<WWidgetMerger>();
835 
836 //! @}
837 
838     } /* namespace viz */
839 } /* namespace cv */
840 
841 #endif
842