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_TYPES_HPP__
47 #define __OPENCV_VIZ_TYPES_HPP__
48 
49 #include <string>
50 #include <opencv2/core.hpp>
51 #include <opencv2/core/affine.hpp>
52 
53 namespace cv
54 {
55     namespace viz
56     {
57 
58 //! @addtogroup viz
59 //! @{
60 
61         /** @brief This class a represents BGR color.
62         */
63         class Color : public Scalar
64         {
65         public:
66             Color();
67             Color(double gray);
68             Color(double blue, double green, double red);
69 
70             Color(const Scalar& color);
71 
72             operator Vec3b() const;
73 
74             static Color black();
75             static Color blue();
76             static Color green();
77             static Color cyan();
78 
79             static Color red();
80             static Color magenta();
81             static Color yellow();
82             static Color white();
83 
84             static Color gray();
85 
86             static Color mlab();
87 
88             static Color navy();
89             static Color olive();
90             static Color maroon();
91             static Color teal();
92             static Color rose();
93             static Color azure();
94             static Color lime();
95             static Color gold();
96             static Color brown();
97             static Color orange();
98             static Color chartreuse();
99             static Color orange_red();
100             static Color purple();
101             static Color indigo();
102 
103             static Color pink();
104             static Color cherry();
105             static Color bluberry();
106             static Color raspberry();
107             static Color silver();
108             static Color violet();
109             static Color apricot();
110             static Color turquoise();
111             static Color celestial_blue();
112             static Color amethyst();
113 
114             static Color not_set();
115         };
116 
117         /** @brief This class wraps mesh attributes, and it can load a mesh from a ply file. :
118         */
119         class CV_EXPORTS Mesh
120         {
121         public:
122             Mat cloud, colors, normals;
123 
124             //! Raw integer list of the form: (n,id1,id2,...,idn, n,id1,id2,...,idn, ...)
125             //! where n is the number of points in the poligon, and id is a zero-offset index into an associated cloud.
126             Mat polygons;
127 
128             Mat texture, tcoords;
129 
130             /** @brief Loads a mesh from a ply file.
131 
132             @param file File name (for now only PLY is supported)
133              */
134             static Mesh load(const String& file);
135         };
136 
137         /** @brief This class wraps intrinsic parameters of a camera.
138 
139         It provides several constructors that can extract the intrinsic parameters from field of
140         view, intrinsic matrix and projection matrix. :
141          */
142         class CV_EXPORTS Camera
143         {
144         public:
145 
146             /** @brief Constructs a Camera.
147 
148             @param fx Horizontal focal length.
149             @param fy Vertical focal length.
150             @param cx x coordinate of the principal point.
151             @param cy y coordinate of the principal point.
152             @param window_size Size of the window. This together with focal length and principal
153             point determines the field of view.
154              */
155             Camera(double fx, double fy, double cx, double cy, const Size &window_size);
156             /** @overload
157             @param fov Field of view (horizontal, vertical)
158             @param window_size Size of the window. Principal point is at the center of the window
159             by default.
160             */
161             explicit Camera(const Vec2d &fov, const Size &window_size);
162             /** @overload
163             @param K Intrinsic matrix of the camera.
164             @param window_size Size of the window. This together with intrinsic matrix determines
165             the field of view.
166             */
167             explicit Camera(const Matx33d &K, const Size &window_size);
168             /** @overload
169             @param proj Projection matrix of the camera.
170             @param window_size Size of the window. This together with projection matrix determines
171             the field of view.
172             */
173             explicit Camera(const Matx44d &proj, const Size &window_size);
174 
getClip() const175             const Vec2d & getClip() const { return clip_; }
setClip(const Vec2d & clip)176             void setClip(const Vec2d &clip) { clip_ = clip; }
177 
getWindowSize() const178             const Size & getWindowSize() const { return window_size_; }
179             void setWindowSize(const Size &window_size);
180 
getFov() const181             const Vec2d& getFov() const { return fov_; }
setFov(const Vec2d & fov)182             void setFov(const Vec2d& fov) { fov_ = fov; }
183 
getPrincipalPoint() const184             const Vec2d& getPrincipalPoint() const { return principal_point_; }
getFocalLength() const185             const Vec2d& getFocalLength() const { return focal_; }
186 
187             /** @brief Computes projection matrix using intrinsic parameters of the camera.
188 
189             @param proj Output projection matrix.
190              */
191             void computeProjectionMatrix(Matx44d &proj) const;
192 
193             /** @brief Creates a Kinect Camera.
194 
195             @param window_size Size of the window. This together with intrinsic matrix of a Kinect Camera
196             determines the field of view.
197              */
198             static Camera KinectCamera(const Size &window_size);
199 
200         private:
201             void init(double fx, double fy, double cx, double cy, const Size &window_size);
202 
203             Vec2d clip_;
204             Vec2d fov_;
205             Size window_size_;
206             Vec2d principal_point_;
207             Vec2d focal_;
208         };
209 
210         /** @brief This class represents a keyboard event.
211         */
212         class CV_EXPORTS KeyboardEvent
213         {
214         public:
215             enum { NONE = 0, ALT = 1, CTRL = 2, SHIFT = 4 };
216             enum Action { KEY_UP = 0, KEY_DOWN = 1 };
217 
218             /** @brief Constructs a KeyboardEvent.
219 
220             @param action Signals if key is pressed or released.
221             @param symbol Name of the key.
222             @param code Code of the key.
223             @param modifiers Signals if alt, ctrl or shift are pressed or their combination.
224              */
225             KeyboardEvent(Action action, const String& symbol, unsigned char code, int modifiers);
226 
227             Action action;
228             String symbol;
229             unsigned char code;
230             int modifiers;
231         };
232 
233         /** @brief This class represents a mouse event.
234         */
235         class CV_EXPORTS MouseEvent
236         {
237         public:
238             enum Type { MouseMove = 1, MouseButtonPress, MouseButtonRelease, MouseScrollDown, MouseScrollUp, MouseDblClick } ;
239             enum MouseButton { NoButton = 0, LeftButton, MiddleButton, RightButton, VScroll } ;
240 
241             /** @brief Constructs a MouseEvent.
242 
243             @param type Type of the event. This can be **MouseMove**, **MouseButtonPress**,
244             **MouseButtonRelease**, **MouseScrollDown**, **MouseScrollUp**, **MouseDblClick**.
245             @param button Mouse button. This can be **NoButton**, **LeftButton**, **MiddleButton**,
246             **RightButton**, **VScroll**.
247             @param pointer Position of the event.
248             @param modifiers Signals if alt, ctrl or shift are pressed or their combination.
249              */
250             MouseEvent(const Type& type, const MouseButton& button, const Point& pointer, int modifiers);
251 
252             Type type;
253             MouseButton button;
254             Point pointer;
255             int modifiers;
256         };
257 
258 //! @} viz
259 
260     } /* namespace viz */
261 } /* namespace cv */
262 
263 //! @cond IGNORED
264 
265 //////////////////////////////////////////////////////////////////////////////////////////////////////
266 /// cv::viz::Color
267 
Color()268 inline cv::viz::Color::Color() : Scalar(0, 0, 0) {}
Color(double _gray)269 inline cv::viz::Color::Color(double _gray) : Scalar(_gray, _gray, _gray) {}
Color(double _blue,double _green,double _red)270 inline cv::viz::Color::Color(double _blue, double _green, double _red) : Scalar(_blue, _green, _red) {}
Color(const Scalar & color)271 inline cv::viz::Color::Color(const Scalar& color) : Scalar(color) {}
272 
operator cv::Vec3b() const273 inline cv::viz::Color::operator cv::Vec3b() const { return cv::Vec3d(val); }
274 
black()275 inline cv::viz::Color cv::viz::Color::black()   { return Color(  0,   0,   0); }
green()276 inline cv::viz::Color cv::viz::Color::green()   { return Color(  0, 255,   0); }
blue()277 inline cv::viz::Color cv::viz::Color::blue()    { return Color(255,   0,   0); }
cyan()278 inline cv::viz::Color cv::viz::Color::cyan()    { return Color(255, 255,   0); }
red()279 inline cv::viz::Color cv::viz::Color::red()     { return Color(  0,   0, 255); }
yellow()280 inline cv::viz::Color cv::viz::Color::yellow()  { return Color(  0, 255, 255); }
magenta()281 inline cv::viz::Color cv::viz::Color::magenta() { return Color(255,   0, 255); }
white()282 inline cv::viz::Color cv::viz::Color::white()   { return Color(255, 255, 255); }
gray()283 inline cv::viz::Color cv::viz::Color::gray()    { return Color(128, 128, 128); }
284 
mlab()285 inline cv::viz::Color cv::viz::Color::mlab()    { return Color(255, 128, 128); }
286 
navy()287 inline cv::viz::Color cv::viz::Color::navy()       { return Color(0,     0, 128); }
olive()288 inline cv::viz::Color cv::viz::Color::olive()      { return Color(0,   128, 128); }
maroon()289 inline cv::viz::Color cv::viz::Color::maroon()     { return Color(0,     0, 128); }
teal()290 inline cv::viz::Color cv::viz::Color::teal()       { return Color(128, 128,   0); }
rose()291 inline cv::viz::Color cv::viz::Color::rose()       { return Color(128,   0, 255); }
azure()292 inline cv::viz::Color cv::viz::Color::azure()      { return Color(255, 128,   0); }
lime()293 inline cv::viz::Color cv::viz::Color::lime()       { return Color(0,   255, 191); }
gold()294 inline cv::viz::Color cv::viz::Color::gold()       { return Color(0,   215, 255); }
brown()295 inline cv::viz::Color cv::viz::Color::brown()      { return Color(0,    75, 150); }
orange()296 inline cv::viz::Color cv::viz::Color::orange()     { return Color(0,   165, 255); }
chartreuse()297 inline cv::viz::Color cv::viz::Color::chartreuse() { return Color(0,   255, 128); }
orange_red()298 inline cv::viz::Color cv::viz::Color::orange_red() { return Color(0,    69, 255); }
purple()299 inline cv::viz::Color cv::viz::Color::purple()     { return Color(128,   0, 128); }
indigo()300 inline cv::viz::Color cv::viz::Color::indigo()     { return Color(130,   0,  75); }
301 
pink()302 inline cv::viz::Color cv::viz::Color::pink()           { return Color(203, 192, 255); }
cherry()303 inline cv::viz::Color cv::viz::Color::cherry()         { return Color( 99,  29, 222); }
bluberry()304 inline cv::viz::Color cv::viz::Color::bluberry()       { return Color(247, 134,  79); }
raspberry()305 inline cv::viz::Color cv::viz::Color::raspberry()      { return Color( 92,  11, 227); }
silver()306 inline cv::viz::Color cv::viz::Color::silver()         { return Color(192, 192, 192); }
violet()307 inline cv::viz::Color cv::viz::Color::violet()         { return Color(226,  43, 138); }
apricot()308 inline cv::viz::Color cv::viz::Color::apricot()        { return Color(177, 206, 251); }
turquoise()309 inline cv::viz::Color cv::viz::Color::turquoise()      { return Color(208, 224,  64); }
celestial_blue()310 inline cv::viz::Color cv::viz::Color::celestial_blue() { return Color(208, 151,  73); }
amethyst()311 inline cv::viz::Color cv::viz::Color::amethyst()       { return Color(204, 102, 153); }
312 
not_set()313 inline cv::viz::Color cv::viz::Color::not_set()        { return Color(-1, -1, -1); }
314 
315 //! @endcond
316 
317 #endif
318