Visual Servoing Platform  version 3.6.1 under development (2024-05-20)
manGeometricFeatures.cpp
1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2023 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * See the file LICENSE.txt at the root directory of this source
11  * distribution for additional information about the GNU GPL.
12  *
13  * For using ViSP with software that can not be combined with the GNU
14  * GPL, please contact Inria about acquiring a ViSP Professional
15  * Edition License.
16  *
17  * See https://visp.inria.fr for more information.
18  *
19  * This software was developed at:
20  * Inria Rennes - Bretagne Atlantique
21  * Campus Universitaire de Beaulieu
22  * 35042 Rennes Cedex
23  * France
24  *
25  * If you have questions regarding the use of this file, please contact
26  * Inria at visp@inria.fr
27  *
28  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30  *
31  * Description:
32  * Geometric features example.
33  *
34 *****************************************************************************/
48 #include <visp3/core/vpDebug.h>
49 #include <visp3/io/vpImageIo.h>
50 // For 2D image
51 #include <visp3/core/vpImage.h>
52 // Video device interface
53 #include <visp3/core/vpDisplay.h>
54 #include <visp3/gui/vpDisplayGDI.h>
55 #include <visp3/gui/vpDisplayGTK.h>
56 #include <visp3/gui/vpDisplayOpenCV.h>
57 #include <visp3/gui/vpDisplayX.h>
58 
59 // For frame transformation and projection
60 #include <visp3/core/vpCameraParameters.h>
61 #include <visp3/core/vpHomogeneousMatrix.h>
62 
63 // Needed geometric features
64 #include <visp3/core/vpCircle.h>
65 #include <visp3/core/vpCylinder.h>
66 #include <visp3/core/vpLine.h>
67 #include <visp3/core/vpPoint.h>
68 #include <visp3/core/vpSphere.h>
69 
70 #include <iostream>
71 
72 int main()
73 {
74  try {
75  std::cout << "ViSP geometric features display example" << std::endl;
76  unsigned int height = 288;
77  unsigned int width = 384;
78  vpImage<unsigned char> I(height, width);
79  I = 255; // I is a white image
80 
81  // create a display window
82 #if defined(VISP_HAVE_X11)
84 #elif defined(VISP_HAVE_GDI)
86 #elif defined(HAVE_OPENCV_HIGHGUI)
88 #elif defined(VISP_HAVE_GTK)
90 #else
91  std::cout << "Please install X11, GDI, OpenCV or GTK to see the result of this example" << std::endl;
92 #endif
93 
94 #if defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV) || defined(VISP_HAVE_GTK)
95  // initialize a display attached to image I
96  display.init(I, 100, 100, "ViSP geometric features display");
97 #endif
98 
99  // camera parameters to digitalize the image plane
100  vpCameraParameters cam(600, 600, width / 2, height / 2); // px,py,u0,v0
101 
102  // pose of the camera with reference to the scene
103  vpTranslationVector t(0, 0, 1);
104  vpRxyzVector rxyz(-M_PI / 4, 0, 0);
105  vpRotationMatrix R(rxyz);
106  vpHomogeneousMatrix cMo(t, R);
107 
108  // scene building, geometric features definition
109  vpPoint point;
110  point.setWorldCoordinates(0, 0, 0); // (X0=0,Y0=0,Z0=0)
111  vpLine line;
112  line.setWorldCoordinates(1, 1, 0, 0, 0, 0, 1, 0); // planes:(X+Y=0)&(Z=0)
113  vpCylinder cylinder;
114  cylinder.setWorldCoordinates(1, -1, 0, 0, 0, 0,
115  0.1); // alpha=1,beta=-1,gamma=0,
116  // X0=0,Y0=0,Z0=0,R=0.1
117  vpCircle circle;
118  circle.setWorldCoordinates(0, 0, 1, 0, 0, 0,
119  0.1); // plane:(Z=0),X0=0,Y0=0,Z=0,R=0.1
120  vpSphere sphere;
121  sphere.setWorldCoordinates(0, 0, 0, 0.1); // X0=0,Y0=0,Z0=0,R=0.1
122 
123  // change frame to be the camera frame and project features in the image
124  // plane
125  point.project(cMo);
126  line.project(cMo);
127  cylinder.project(cMo);
128  circle.project(cMo);
129  sphere.project(cMo);
130 
131  // display the scene
132  vpDisplay::display(I); // display I
133  // draw the projections of the 3D geometric features in the image plane.
134  point.display(I, cam, vpColor::black); // draw a black cross over I
135  line.display(I, cam, vpColor::blue); // draw a blue line over I
136  cylinder.display(I, cam, vpColor::red); // draw two red lines over I
137  circle.display(I, cam, vpColor::orange); // draw an orange ellipse over I
138  sphere.display(I, cam, vpColor::black); // draw a black ellipse over I
139 
140  vpDisplay::flush(I); // flush the display buffer
141  vpDisplay::displayText(I, 10, 10, "Click in the display to exit", vpColor::red);
142  vpDisplay::getClick(I); // wait for a click in the display to exit
143 
144 #if defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV) || defined(VISP_HAVE_GTK)
145  // save the drawing
146  vpImage<vpRGBa> Ic;
147  vpDisplay::getImage(I, Ic);
148  std::cout << "ViSP creates \"./geometricFeatures.ppm\" image" << std::endl;
149  vpImageIo::write(Ic, "./geometricFeatures.ppm");
150 #endif
151  }
152  catch (const vpException &e) {
153  std::cout << "Catch an exception: " << e << std::endl;
154  return EXIT_FAILURE;
155  }
156 
157  return EXIT_SUCCESS;
158 }
Generic class defining intrinsic camera parameters.
Class that defines a 3D circle in the object frame and allows forward projection of a 3D circle in th...
Definition: vpCircle.h:86
void display(const vpImage< unsigned char > &I, const vpCameraParameters &cam, const vpColor &color=vpColor::green, unsigned int thickness=1) vp_override
Definition: vpCircle.cpp:314
void setWorldCoordinates(const vpColVector &oP) vp_override
Definition: vpCircle.cpp:57
static const vpColor red
Definition: vpColor.h:211
static const vpColor black
Definition: vpColor.h:205
static const vpColor orange
Definition: vpColor.h:221
static const vpColor blue
Definition: vpColor.h:217
Class that defines a 3D cylinder in the object frame and allows forward projection of a 3D cylinder i...
Definition: vpCylinder.h:99
void display(const vpImage< unsigned char > &I, const vpCameraParameters &cam, const vpColor &color=vpColor::green, unsigned int thickness=1) vp_override
Definition: vpCylinder.cpp:404
void setWorldCoordinates(const vpColVector &oP) vp_override
Definition: vpCylinder.cpp:62
Display for windows using GDI (available on any windows 32 platform).
Definition: vpDisplayGDI.h:128
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
Definition: vpDisplayGTK.h:128
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition: vpDisplayX.h:128
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void getImage(const vpImage< unsigned char > &Is, vpImage< vpRGBa > &Id)
Definition: vpDisplay.cpp:138
static void flush(const vpImage< unsigned char > &I)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
error that can be emitted by ViSP classes.
Definition: vpException.h:59
Implementation of an homogeneous matrix and operations on such kind of matrices.
static void write(const vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition: vpImageIo.cpp:287
Class that defines a 3D line in the object frame and allows forward projection of the line in the cam...
Definition: vpLine.h:101
void setWorldCoordinates(const double &oA1, const double &oB1, const double &oC1, const double &oD1, const double &oA2, const double &oB2, const double &oC2, const double &oD2)
Definition: vpLine.cpp:82
void display(const vpImage< unsigned char > &I, const vpCameraParameters &cam, const vpColor &color=vpColor::green, unsigned int thickness=1) vp_override
Definition: vpLine.cpp:438
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
Definition: vpPoint.h:77
void display(const vpImage< unsigned char > &I, const vpCameraParameters &cam, const vpColor &color=vpColor::green, unsigned int thickness=1) vp_override
Definition: vpPoint.cpp:423
void setWorldCoordinates(double oX, double oY, double oZ)
Definition: vpPoint.cpp:110
Implementation of a rotation matrix and operations on such kind of matrices.
Implementation of a rotation vector as Euler angle minimal representation.
Definition: vpRxyzVector.h:176
Class that defines a 3D sphere in the object frame and allows forward projection of a 3D sphere in th...
Definition: vpSphere.h:78
void setWorldCoordinates(const vpColVector &oP) vp_override
Definition: vpSphere.cpp:59
void display(const vpImage< unsigned char > &I, const vpCameraParameters &cam, const vpColor &color=vpColor::green, unsigned int thickness=1) vp_override
Definition: vpSphere.cpp:281
Class that consider the case of a translation vector.
void display(vpImage< unsigned char > &I, const std::string &title)
Display a gray-scale image.