Example showing how to open two video devices.
#include <iostream>
#include <stdlib.h>
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpDebug.h>
#include <visp3/core/vpDisplay.h>
#include <visp3/core/vpImage.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>
#include <visp3/io/vpParseArgv.h>
#if (defined(VISP_HAVE_GTK) || defined(VISP_HAVE_X11) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_D3D9) || \
defined(VISP_HAVE_OPENCV))
#define GETOPTARGS "hlt:dc"
#ifdef ENABLE_VISP_NAMESPACE
#endif
typedef enum { vpX11, vpGTK, vpGDI, vpD3D, vpCV } vpDisplayType;
void usage(const char *name, const char *badparam, vpDisplayType &dtype);
bool getOptions(int argc, const char **argv, vpDisplayType &dtype, bool &list, bool &click_allowed, bool &display);
void usage(const char *name, const char *badparam, vpDisplayType &dtype)
{
fprintf(stdout, "\n\
Test to open video devices or display.\n\
\n\
SYNOPSIS\n\
%s [-t <type of video device>] [-l] [-c] [-d] [-h]\n\
",
name);
std::string display;
switch (dtype) {
case vpX11:
display = "X11";
break;
case vpGTK:
display = "GTK";
break;
case vpGDI:
display = "GDI";
break;
case vpD3D:
display = "D3D";
break;
case vpCV:
display = "CV";
break;
}
fprintf(stdout, "\n\
OPTIONS: Default\n\
-t <type of video device> \"%s\"\n\
String specifying the video device to use.\n\
Possible values:\n\
\"X11\": only on UNIX platforms,\n\
\"GTK\": on all plaforms,\n\
\"GDI\": only on Windows platform (Graphics Device Interface),\n\
\"D3D\": only on Windows platform (Direct3D).\n\
\"CV\" : (OpenCV).\n\
\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",
display.c_str());
if (badparam)
fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
}
bool getOptions(int argc, const char **argv, vpDisplayType &dtype, bool &list, bool &click_allowed, bool &display)
{
const char *optarg_;
int c;
std::string sDisplayType;
switch (c) {
case 'l':
list = true;
break;
case 't':
sDisplayType = optarg_;
if (sDisplayType.compare("X11") == 0) {
dtype = vpX11;
}
else if (sDisplayType.compare("GTK") == 0) {
dtype = vpGTK;
}
else if (sDisplayType.compare("GDI") == 0) {
dtype = vpGDI;
}
else if (sDisplayType.compare("D3D") == 0) {
dtype = vpD3D;
}
else if (sDisplayType.compare("CV") == 0) {
dtype = vpCV;
}
break;
case 'h':
usage(argv[0], nullptr, dtype);
return false;
break;
case 'c':
click_allowed = false;
break;
case 'd':
display = false;
break;
default:
usage(argv[0], optarg_, dtype);
return false;
break;
}
}
if ((c == 1) || (c == -1)) {
usage(argv[0], nullptr, dtype);
std::cerr << "ERROR: " << std::endl;
std::cerr << " Bad argument " << optarg_ << std::endl << std::endl;
return false;
}
return true;
}
int main(int argc, const char **argv)
{
try {
bool opt_list = false;
vpDisplayType opt_dtype;
bool opt_click_allowed = true;
bool opt_display = true;
#if defined(VISP_HAVE_GTK)
opt_dtype = vpGTK;
#elif defined(VISP_HAVE_X11)
opt_dtype = vpX11;
#elif defined(VISP_HAVE_GDI)
opt_dtype = vpGDI;
#elif defined(VISP_HAVE_D3D9)
opt_dtype = vpD3D;
#elif defined VISP_HAVE_OPENCV
opt_dtype = vpCV;
#endif
if (getOptions(argc, argv, opt_dtype, opt_list, opt_click_allowed, opt_display) == false) {
return EXIT_FAILURE;
}
if (opt_list) {
unsigned nbDevices = 0;
std::cout << "List of video-devices available: \n";
#if defined(VISP_HAVE_GTK)
std::cout << " GTK (use \"-t GTK\" option to use it)\n";
nbDevices++;
#endif
#if defined(VISP_HAVE_X11)
std::cout << " X11 (use \"-t X11\" option to use it)\n";
nbDevices++;
#endif
#if defined(VISP_HAVE_GDI)
std::cout << " GDI (use \"-t GDI\" option to use it)\n";
nbDevices++;
#endif
#if defined(VISP_HAVE_D3D9)
std::cout << " D3D (use \"-t D3D\" option to use it)\n";
nbDevices++;
#endif
#if defined VISP_HAVE_OPENCV
std::cout << " CV (use \"-t CV\" option to use it)\n";
nbDevices++;
#endif
if (!nbDevices) {
std::cout << " No display is available\n";
}
return EXIT_FAILURE;
}
I1 = 128;
I2 = 255;
switch (opt_dtype) {
case vpX11:
std::cout << "Requested X11 display functionalities..." << std::endl;
#if defined(VISP_HAVE_X11)
d1 = new vpDisplayX;
d2 = new vpDisplayX;
#else
std::cout << " Sorry, X11 video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return EXIT_FAILURE;
#endif
break;
case vpGTK:
std::cout << "Requested GTK display functionalities..." << std::endl;
#if defined(VISP_HAVE_GTK)
#else
std::cout << " Sorry, GTK video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return EXIT_FAILURE;
#endif
break;
case vpGDI:
std::cout << "Requested GDI display functionalities..." << std::endl;
#if defined(VISP_HAVE_GDI)
#else
std::cout << " Sorry, GDI video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return EXIT_FAILURE;
#endif
break;
case vpD3D:
std::cout << "Requested D3D display functionalities..." << std::endl;
#if defined(VISP_HAVE_D3D9)
#else
std::cout << " Sorry, D3D video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return EXIT_FAILURE;
#endif
break;
case vpCV:
std::cout << "Requested OpenCV display functionalities..." << std::endl;
#if defined(HAVE_OPENCV_HIGHGUI)
#else
std::cout << " Sorry, OpenCV video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return EXIT_FAILURE;
#endif
break;
}
if (opt_display) {
int winx1 = 100, winy1 = 200;
d1->init(I1, winx1, winy1, "Display 1");
int winx2 = winx1 + 10 + (int)I1.
getWidth(), winy2 = winy1;
d2->init(I2, winx2, winy2, "Display 2");
}
std::cout << "A click in display 1 to exit..." << std::endl;
if (opt_click_allowed)
delete d1;
delete d2;
return EXIT_SUCCESS;
}
std::cout << "Catch an exception: " << e << std::endl;
return EXIT_FAILURE;
}
}
#else
int main() { vpERROR_TRACE("You do not have display functionalities..."); }
#endif
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...
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Class that defines generic functionalities for display.
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
unsigned int getWidth() const
error that can be emitted by ViSP classes.
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)