Mouse click manipulations.
#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/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>
#define GETOPTARGS "i:hlt:dc"
#ifdef ENABLE_VISP_NAMESPACE
#endif
typedef enum { vpX11, vpGTK, vpGDI, vpD3D, vpCV } vpDisplayType;
void usage(const char *name, const char *badparam, std::string ipath, vpDisplayType &dtype);
bool getOptions(int argc, const char **argv, std::string &ipath, vpDisplayType &dtype, bool &list, bool &click_allowed,
bool &display);
void usage(const char *name, const char *badparam, std::string ipath, vpDisplayType &dtype)
{
fprintf(stdout, "\n\
Test click functionalities in video devices or display.\n\
\n\
SYNOPSIS\n\
%s [-i <input image path>] \n\
[-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\
-i <input image path> %s\n\
Set image input path.\n\
From this path read \"Klimt/Klimt.pgm\"\n\
and \"Klimt/Klimt.ppm\" images.\n\
Setting the VISP_INPUT_IMAGE_PATH environment\n\
variable produces the same behaviour than using\n\
this option.\n\
\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\
-l\n\
Print the list of video-devices available and exit.\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\
-h\n\
Print the help.\n\n",
ipath.c_str(), display.c_str());
if (badparam)
fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
}
bool getOptions(int argc, const char **argv, std::string &ipath, vpDisplayType &dtype, bool &list, bool &click_allowed,
bool &display)
{
const char *optarg_;
int c;
std::string sDisplayType;
switch (c) {
case 'i':
ipath = optarg_;
break;
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, ipath, dtype);
return false;
break;
case 'c':
click_allowed = false;
break;
case 'd':
display = false;
break;
default:
usage(argv[0], optarg_, ipath, dtype);
return false;
break;
}
}
if ((c == 1) || (c == -1)) {
usage(argv[0], nullptr, ipath, 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 {
std::string env_ipath;
std::string opt_ipath;
bool opt_list = false;
vpDisplayType opt_dtype;
std::string ipath;
std::string filename;
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 (!env_ipath.empty())
ipath = env_ipath;
if (getOptions(argc, argv, opt_ipath, 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;
}
if (!opt_ipath.empty())
ipath = opt_ipath;
if (!opt_ipath.empty() && !env_ipath.empty()) {
if (ipath != env_ipath) {
std::cout << std::endl << "WARNING: " << std::endl;
std::cout << " Since -i <visp image path=" << ipath << "> "
<< " is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
<< " we skip the environment variable." << std::endl;
}
}
if (opt_ipath.empty() && env_ipath.empty()) {
usage(argv[0], nullptr, ipath, opt_dtype);
std::cerr << std::endl << "ERROR:" << std::endl;
std::cerr << " Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
<< " environment variable to specify the location of the " << std::endl
<< " image path where test images are located." << std::endl
<< std::endl;
return EXIT_FAILURE;
}
vpCTRACE << "Load " << filename << std::endl;
switch (opt_dtype) {
case vpX11:
std::cout << "Requested X11 display functionalities..." << std::endl;
#if defined(VISP_HAVE_X11)
display = 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) {
display->init(I, 100, 100, "Display...");
if (opt_click_allowed) {
std::cout << "Click on a pixel to get his coordinates...\n";
std::cout << " You click down on pixel (" << ip << ") ";
switch (button) {
std::cout << "with left button.\n";
break;
std::cout << "with middle button.\n";
break;
std::cout << "with right button.\n";
break;
break;
}
std::cout << " You click up on pixel (" << ip << ") ";
switch (button) {
std::cout << "with left button.\n";
break;
std::cout << "with middle button.\n";
break;
std::cout << "with right button.\n";
break;
break;
}
std::cout << " Pointer poisition : " << ip << std::endl;
std::cout << "A click to exit...\n";
}
}
delete display;
}
catch (...) {
vpERROR_TRACE("Error while displaying the image");
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 bool getClickUp(const vpImage< unsigned char > &I, vpImagePoint &ip, vpMouseButton::vpMouseButtonType &button, bool blocking=true)
static void flush(const vpImage< unsigned char > &I)
static bool getPointerPosition(const vpImage< unsigned char > &I, vpImagePoint &ip)
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)