Visual Servoing Platform version 3.6.0
Loading...
Searching...
No Matches
testDisplays.cpp

Test all the displays. Draws several shapes.

Test all the displays. Draws several shapes.

/****************************************************************************
*
* ViSP, open source Visual Servoing Platform software.
* Copyright (C) 2005 - 2023 by Inria. All rights reserved.
*
* This software is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* See the file LICENSE.txt at the root directory of this source
* distribution for additional information about the GNU GPL.
*
* For using ViSP with software that can not be combined with the GNU
* GPL, please contact Inria about acquiring a ViSP Professional
* Edition License.
*
* See https://visp.inria.fr for more information.
*
* This software was developed at:
* Inria Rennes - Bretagne Atlantique
* Campus Universitaire de Beaulieu
* 35042 Rennes Cedex
* France
*
* If you have questions regarding the use of this file, please contact
* Inria at visp@inria.fr
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* Description:
* Test for image display.
*
* Authors:
* Anthony Saunier
*
*****************************************************************************/
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpDebug.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#if defined(VISP_HAVE_GTK) || defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_D3D9) || defined(VISP_HAVE_OPENCV)
#include <visp3/core/vpImage.h>
#include <visp3/core/vpIoTools.h>
#include <visp3/core/vpRect.h>
#include <visp3/io/vpImageIo.h>
#include <visp3/io/vpParseArgv.h>
#include <visp3/gui/vpDisplayD3D.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayGTK.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
// List of allowed command line options
#define GETOPTARGS "hldc"
static void usage(const char *name, const char *badparam)
{
fprintf(stdout, "\n\
Test video devices or display.\n\
\n\
SYNOPSIS\n\
%s [-l] [-c] [-d] [-h]\n\
",
name);
fprintf(stdout, "\n\
OPTIONS: Default\n\
-c\n\
Disable the mouse click. Useful to automate the \n\
execution of this program without human intervention.\n\
\n\
-d \n\
Turn off the display.\n\
\n\
-l\n\
Print the list of video-devices available and exit.\n\
\n\
-h\n\
Print the help.\n\n");
if (badparam)
fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
}
static bool getOptions(int argc, const char **argv, bool &list, bool &click_allowed, bool &display)
{
const char *optarg_;
int c;
while ((c = vpParseArgv::parse(argc, argv, GETOPTARGS, &optarg_)) > 1) {
switch (c) {
case 'l':
list = true;
break;
case 'h':
usage(argv[0], NULL);
return false;
break;
case 'c':
click_allowed = false;
break;
case 'd':
display = false;
break;
default:
usage(argv[0], optarg_);
return false;
break;
}
}
if ((c == 1) || (c == -1)) {
// standalone param or error
usage(argv[0], NULL);
std::cerr << "ERROR: " << std::endl;
std::cerr << " Bad argument " << optarg_ << std::endl << std::endl;
return false;
}
return true;
}
template <typename Type> static void draw(vpImage<Type> &I)
{
vpImagePoint iP1, iP2;
unsigned int w, h;
iP1.set_i(20);
iP1.set_j(10);
iP2.set_i(20);
iP2.set_j(30);
vpDisplay::displayArrow(I, iP1, iP2, vpColor::green, 4, 2, 3);
iP1.set_i(20);
iP1.set_j(60);
iP1.set_i(80);
iP1.set_j(220);
iP2.set_i(80);
iP2.set_j(480);
vpDisplay::displayCircle(I, iP1, 30, vpColor::red, false, 3);
vpDisplay::displayCircle(I, iP2, 30, vpColor::red, true, 3);
iP1.set_i(20);
iP1.set_j(220);
iP1.set_i(140);
iP1.set_j(10);
iP2.set_i(140);
iP2.set_j(50);
iP1.set_i(120);
iP1.set_j(180);
iP2.set_i(160);
iP2.set_j(250);
iP1.set_i(160);
iP1.set_j(280);
iP2.set_i(120);
iP2.set_j(340);
iP1.set_i(220);
iP1.set_j(400);
iP2.set_i(120);
iP2.set_j(400);
iP1.set_i(220);
iP1.set_j(480);
iP2.set_i(120);
iP2.set_j(450);
vpHomogeneousMatrix cMo(vpTranslationVector(0.15, -0.07, 0.37), vpRotationMatrix(vpRxyzVector(0.1, -0.4, 0.41)));
vpCameraParameters cam(600, 600, 320, 240);
vpDisplay::displayFrame(I, cMo, cam, 0.05, vpColor::none, 3);
iP1.set_i(140);
iP1.set_j(80);
iP2.set_i(140);
iP2.set_j(150);
iP1.set_i(140);
iP1.set_j(400);
iP1.set_i(350);
iP1.set_j(20);
w = 60;
h = 50;
vpDisplay::displayRectangle(I, iP1, w, h, vpColor::red, false, 3);
iP1.set_i(350);
iP1.set_j(110);
vpDisplay::displayRectangle(I, iP1, w, h, vpColor::red, true, 3);
iP1.set_i(350);
iP1.set_j(200);
iP2.set_i(400);
iP2.set_j(260);
iP1.set_i(350);
iP1.set_j(290);
iP2.set_i(400);
iP2.set_j(350);
vpRect rectangle(iP1, iP2);
vpDisplay::displayRectangle(I, rectangle, vpColor::yellow, false, 3);
iP1.set_i(380);
iP1.set_j(400);
std::vector<vpImagePoint> polygon;
polygon.push_back(vpImagePoint(250, 500));
polygon.push_back(vpImagePoint(350, 600));
polygon.push_back(vpImagePoint(450, 500));
polygon.push_back(vpImagePoint(350, 400));
polygon.clear();
polygon.push_back(vpImagePoint(300, 500));
polygon.push_back(vpImagePoint(350, 550));
polygon.push_back(vpImagePoint(400, 500));
polygon.push_back(vpImagePoint(350, 450));
vpDisplay::displayPolygon(I, polygon, vpColor::cyan, 3, false);
}
template <typename Type> static void runTest(bool opt_display, bool opt_click_allowed)
{
#if defined(VISP_HAVE_X11)
vpDisplayX *displayX = new vpDisplayX;
Ix.init(480, 640, 255);
if (opt_display) {
displayX->init(Ix, 100, 100, "Display X11");
draw(Ix);
if (opt_click_allowed)
}
#endif
#if defined(HAVE_OPENCV_HIGHGUI)
vpDisplayOpenCV *displayCv = new vpDisplayOpenCV;
Icv.init(480, 640, 255);
if (opt_display) {
displayCv->init(Icv, 100, 100, "Display OpenCV");
draw(Icv);
if (opt_click_allowed)
}
#endif
#if defined(VISP_HAVE_GTK)
vpDisplayGTK *displayGtk = new vpDisplayGTK;
Igtk.init(480, 640, 255);
if (opt_display) {
displayGtk->init(Igtk, 100, 100, "Display GTK");
draw(Igtk);
if (opt_click_allowed)
}
#endif
#if defined(VISP_HAVE_GDI)
vpDisplayGDI *displayGdi = new vpDisplayGDI;
Igdi.init(480, 640, 255);
if (opt_display) {
displayGdi->init(Igdi, 100, 100, "Display GDI");
draw(Igdi);
if (opt_click_allowed)
}
#endif
#if defined(VISP_HAVE_D3D9)
vpDisplayD3D *displayD3d = new vpDisplayD3D;
Id3d.init(480, 640, 255);
if (opt_display) {
displayD3d->init(Id3d, 100, 100, "Display Direct 3D");
draw(Id3d);
if (opt_click_allowed)
}
#endif
#if defined(VISP_HAVE_X11)
delete displayX;
#endif
#if defined(VISP_HAVE_GTK)
delete displayGtk;
#endif
#if defined(HAVE_OPENCV_HIGHGUI)
delete displayCv;
#endif
#if defined(VISP_HAVE_GDI)
delete displayGdi;
#endif
#if defined(VISP_HAVE_D3D9)
delete displayD3d;
#endif
}
int main(int argc, const char **argv)
{
try {
bool opt_list = false; // To print the list of video devices
bool opt_click_allowed = true;
bool opt_display = true;
// Read the command line options
if (getOptions(argc, argv, opt_list, opt_click_allowed, opt_display) == false) {
return EXIT_FAILURE;
}
// Print the list of video-devices available
if (opt_list) {
unsigned nbDevices = 0;
std::cout << "List of video-devices available: \n";
#if defined(VISP_HAVE_GTK)
std::cout << " GTK\n";
nbDevices++;
#endif
#if defined(VISP_HAVE_X11)
std::cout << " X11\n";
nbDevices++;
#endif
#if defined(VISP_HAVE_GDI)
std::cout << " GDI\n";
nbDevices++;
#endif
#if defined(VISP_HAVE_D3D9)
std::cout << " D3D\n";
nbDevices++;
#endif
#if defined VISP_HAVE_OPENCV
std::cout << " OpenCV\n";
nbDevices++;
#endif
if (!nbDevices) {
std::cout << " No display is available\n";
}
return EXIT_FAILURE;
}
// Create a color image for each display.
runTest<vpRGBa>(opt_display, opt_click_allowed);
// Create a grayscale image for each display.
runTest<unsigned char>(opt_display, opt_click_allowed);
return EXIT_SUCCESS;
} catch (const vpException &e) {
std::cout << "Catch an exception: " << e.getMessage() << std::endl;
return EXIT_FAILURE;
}
}
#else
int main()
{
std::cout << "You do not have display functionalities..." << std::endl;
return EXIT_SUCCESS;
}
#endif
Generic class defining intrinsic camera parameters.
static const vpColor red
Definition vpColor.h:211
static const vpColor black
Definition vpColor.h:205
static const vpColor cyan
Definition vpColor.h:220
static const vpColor none
Definition vpColor.h:223
static const vpColor orange
Definition vpColor.h:221
static const vpColor blue
Definition vpColor.h:217
static const vpColor yellow
Definition vpColor.h:219
static const vpColor green
Definition vpColor.h:214
Display for windows using Direct3D 3rd party. Thus to enable this class Direct3D should be installed....
Display for windows using GDI (available on any windows 32 platform).
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="")
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="")
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="")
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition vpDisplayX.h:132
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="")
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void displayCircle(const vpImage< unsigned char > &I, const vpImageCircle &circle, const vpColor &color, bool fill=false, unsigned int thickness=1)
static void display(const vpImage< unsigned char > &I)
static void displayLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1, bool segment=true)
static void displayFrame(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, double size, const vpColor &color=vpColor::none, unsigned int thickness=1, const vpImagePoint &offset=vpImagePoint(0, 0), const std::string &frameName="", const vpColor &textColor=vpColor::black, const vpImagePoint &textOffset=vpImagePoint(15, 15))
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
static void flush(const vpImage< unsigned char > &I)
static void displayArrow(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color=vpColor::white, unsigned int w=4, unsigned int h=2, unsigned int thickness=1)
static void displayPoint(const vpImage< unsigned char > &I, const vpImagePoint &ip, const vpColor &color, unsigned int thickness=1)
static void displayDotLine(const vpImage< unsigned char > &I, const vpImagePoint &ip1, const vpImagePoint &ip2, const vpColor &color, unsigned int thickness=1)
static void displayRectangle(const vpImage< unsigned char > &I, const vpImagePoint &topLeft, unsigned int width, unsigned int height, const vpColor &color, bool fill=false, unsigned int thickness=1)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
static void displayPolygon(const vpImage< unsigned char > &I, const std::vector< vpImagePoint > &vip, const vpColor &color, unsigned int thickness=1, bool closed=true)
error that can be emitted by ViSP classes.
Definition vpException.h:59
const char * getMessage() const
Implementation of an homogeneous matrix and operations on such kind of matrices.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void set_j(double jj)
void set_i(double ii)
Definition of the vpImage class member functions.
Definition vpImage.h:135
void init(unsigned int height, unsigned int width)
Set the size of the image.
Definition vpImage.h:639
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Defines a rectangle in the plane.
Definition vpRect.h:76
Implementation of a rotation matrix and operations on such kind of matrices.
Implementation of a rotation vector as Euler angle minimal representation.
Class that consider the case of a translation vector.