46 #include <visp3/core/vpConfig.h>
47 #include <visp3/core/vpDebug.h>
49 #if (defined(_WIN32) && defined(VISP_HAVE_GDI))
51 #include <visp3/gui/vpDisplayGDI.h>
53 #include <visp3/core/vpImage.h>
54 #include <visp3/core/vpIoTools.h>
55 #include <visp3/io/vpImageIo.h>
56 #include <visp3/io/vpParseArgv.h>
68 #define GETOPTARGS "cdi:o:h"
70 #ifdef ENABLE_VISP_NAMESPACE
87 void usage(
const char *name,
const char *badparam, std::string ipath, std::string opath, std::string user)
90 Read an image on the disk, display it using GDI, display some\n\
91 features (line, circle, characters) in overlay and finally write \n\
92 the image and the overlayed features in an image on the disk\n\
95 %s [-i <input image path>] [-o <output image path>]\n\
102 -i <input image path> %s\n\
103 Set image input path.\n\
104 From this path read \"Klimt/Klimt.pgm\"\n\
106 Setting the VISP_INPUT_IMAGE_PATH environment\n\
107 variable produces the same behaviour than using\n\
110 -o <output image path> %s\n\
111 Set image output path.\n\
112 From this directory, creates the \"%s\"\n\
113 subdirectory depending on the username, where \n\
114 Klimt_grey.overlay.ppm output image is written.\n\
117 Disable the mouse click. Useful to automate the \n\
118 execution of this program without human intervention.\n\
121 Disable the image display. This can be useful \n\
122 for automatic tests using the task manager under \n\
126 Print the help.\n\n",
127 ipath.c_str(), opath.c_str(), user.c_str());
130 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
148 bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &opath,
bool &click_allowed,
149 const std::string &user,
bool &display)
157 click_allowed =
false;
169 usage(argv[0],
nullptr, ipath, opath, user);
174 usage(argv[0], optarg, ipath, opath, user);
180 if ((c == 1) || (c == -1)) {
182 usage(argv[0],
nullptr, ipath, opath, user);
183 std::cerr <<
"ERROR: " << std::endl;
184 std::cerr <<
" Bad argument " << optarg << std::endl << std::endl;
191 int main(
int argc,
const char **argv)
194 std::string env_ipath;
195 std::string opt_ipath;
196 std::string opt_opath;
199 std::string filename;
200 std::string username;
201 bool opt_click_allowed =
true;
202 bool opt_display =
true;
209 if (!env_ipath.empty())
213 opt_opath =
"C:\\temp";
219 if (getOptions(argc, argv, opt_ipath, opt_opath, opt_click_allowed, username, opt_display) ==
false) {
224 if (!opt_ipath.empty())
226 if (!opt_opath.empty())
239 usage(argv[0],
nullptr, ipath, opath, username);
240 std::cerr << std::endl <<
"ERROR:" << std::endl;
241 std::cerr <<
" Cannot create " << odirname << std::endl;
242 std::cerr <<
" Check your -o " << opath <<
" option " << std::endl;
249 if (!opt_ipath.empty() && !env_ipath.empty()) {
250 if (ipath != env_ipath) {
251 std::cout << std::endl <<
"WARNING: " << std::endl;
252 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
253 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
254 <<
" we skip the environment variable." << std::endl;
259 if (opt_ipath.empty() && env_ipath.empty()) {
260 usage(argv[0],
nullptr, ipath, opath, username);
261 std::cerr << std::endl <<
"ERROR:" << std::endl;
262 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
263 <<
" environment variable to specify the location of the " << std::endl
264 <<
" image path where test images are located." << std::endl
283 display.init(I, 100, 100,
"X11 display");
296 for (
unsigned i = 0; i < I.
getHeight(); i += 20) {
313 for (
unsigned i = 0; i < I.
getWidth(); i += 20) {
336 for (
unsigned int i = 0; i < 100; i += 20) {
364 if (opt_click_allowed) {
365 std::cout <<
"\nA click to close the windows..." << std::endl;
387 displayRGBa.
init(Irgba, 100, 100,
"X11 color display");
395 if (opt_click_allowed) {
396 std::cout <<
"\nA click to display a cross..." << std::endl;
402 std::cout <<
"Cross position: " << ip << std::endl;
410 std::cout <<
"Cross position: " << ip << std::endl;
428 if (opt_click_allowed) {
429 std::cout <<
"\nA click to exit the program..." << std::endl;
431 std::cout <<
"Bye" << std::endl;
437 std::cout <<
"Catch an exception: " << e << std::endl;
444 std::cout <<
"You do not have GDI (Graphical Device Interface) functionalities to display images..." << std::endl;
445 std::cout <<
"Tip if you are on a windows system:" << std::endl;
446 std::cout <<
"- Install GDI, configure again ViSP using cmake and build again this example" << std::endl;
static const vpColor orange
static const vpColor blue
static const vpColor yellow
static const vpColor green
Display for windows using GDI (available on any windows 32 platform).
void init(vpImage< unsigned char > &I, int winx=-1, int winy=-1, const std::string &title="") VP_OVERRIDE
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 getImage(const vpImage< unsigned char > &Is, vpImage< vpRGBa > &Id)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
static void close(vpImage< unsigned char > &I)
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 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)
error that can be emitted by ViSP classes.
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
static void write(const 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 ...
unsigned int getWidth() const
unsigned int getHeight() const
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)