44#include <visp3/core/vpConfig.h>
45#include <visp3/core/vpDebug.h>
52#include <visp3/core/vpImage.h>
53#include <visp3/gui/vpDisplayX.h>
54#include <visp3/io/vpImageIo.h>
56#include <visp3/core/vpIoTools.h>
57#include <visp3/io/vpParseArgv.h>
70#define GETOPTARGS "cdi:o:h"
83void usage(
const char *name,
const char *badparam, std::string ipath, std::string opath, std::string user)
86Read an image on the disk, display it using X11, display some\n\
87features (line, circle, characters) in overlay and finally write \n\
88the image and the overlayed features in an image on the disk.\n\
91 %s [-i <input image path>] [-o <output image path>]\n\
98 -i <input image path> %s\n\
99 Set image input path.\n\
100 From this path read \"Klimt/Klimt.pgm\"\n\
101 and \"Klimt/Klimt.ppm\" images.\n\
102 Setting the VISP_INPUT_IMAGE_PATH environment\n\
103 variable produces the same behaviour than using\n\
106 -o <output image path> %s\n\
107 Set image output path.\n\
108 From this directory, creates the \"%s\"\n\
109 subdirectory depending on the username, where \n\
110 Klimt_grey.overlay.ppm output image is written.\n\
113 Disable the mouse click. Useful to automate the \n\
114 execution of this program without human intervention.\n\
117 Disable the image display. This can be useful \n\
118 for automatic tests using crontab under Unix or \n\
119 using the task manager under Windows.\n\
122 Print the help.\n\n",
123 ipath.c_str(), opath.c_str(), user.c_str());
126 fprintf(stderr,
"ERROR: \n");
127 fprintf(stderr,
"\nBad parameter [%s]\n", badparam);
148bool 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], NULL, ipath, opath, user);
174 usage(argv[0], optarg_, ipath, opath, user);
180 if ((c == 1) || (c == -1)) {
182 usage(argv[0], NULL, ipath, opath, user);
183 std::cerr <<
"ERROR: " << std::endl;
184 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
191int 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#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
216 opt_opath =
"C:\\temp";
223 if (getOptions(argc, argv, opt_ipath, opt_opath, opt_click_allowed, username, opt_display) ==
false) {
228 if (!opt_ipath.empty())
230 if (!opt_opath.empty())
243 usage(argv[0], NULL, ipath, opath, username);
244 std::cerr << std::endl <<
"ERROR:" << std::endl;
245 std::cerr <<
" Cannot create " << odirname << std::endl;
246 std::cerr <<
" Check your -o " << opath <<
" option " << std::endl;
253 if (!opt_ipath.empty() && !env_ipath.empty()) {
254 if (ipath != env_ipath) {
255 std::cout << std::endl <<
"WARNING: " << std::endl;
256 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
257 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
258 <<
" we skip the environment variable." << std::endl;
263 if (opt_ipath.empty() && env_ipath.empty()) {
264 usage(argv[0], NULL, ipath, opath, username);
265 std::cerr << std::endl <<
"ERROR:" << std::endl;
266 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH " << std::endl
267 <<
" environment variable to specify the location of the " << std::endl
268 <<
" image path where test images are located." << std::endl
283 std::cerr << std::endl <<
"ERROR:" << std::endl;
284 std::cerr <<
" Cannot read " << filename << std::endl;
285 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
286 <<
" or VISP_INPUT_IMAGE_PATH environment variable." << std::endl;
295 std::cerr << std::endl <<
"ERROR:" << std::endl;
296 std::cerr <<
" Cannot read " << filename << std::endl;
297 std::cerr <<
" Check your -i " << ipath <<
" option " << std::endl
298 <<
" or VISP_INPUT_IMAGE_PATH environment variable." << std::endl;
308 display1.
init(I1, 0, 0,
"X11 Display 1...");
310 display2.
init(I2, 200, 200,
"X11 Display 2...");
316 for (
unsigned int i = 0; i < I1.
getHeight(); i += 20) {
325 for (
unsigned int i = 0; i < I1.
getWidth(); i += 20) {
343 for (
unsigned int i = 0; i < 100; i += 20) {
361 if (opt_click_allowed) {
362 std::cout <<
"\nA click in the first display to draw a cross..." << std::endl;
368 std::cout <<
"Cross position: " << ip << std::endl;
376 std::cout <<
"Cross position: " << ip << std::endl;
392 if (opt_click_allowed) {
393 std::cout <<
"\nA click in the second display to close the windows "
403 std::cout <<
"Catch an exception: " << e << std::endl;
410 std::cout <<
"You do not have X11 functionalities to display images..." << std::endl;
411 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
412 std::cout <<
"- Install X11, configure again ViSP using cmake and build again this example" << std::endl;
static const vpColor blue
static const vpColor yellow
static const vpColor green
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
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 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 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 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 ...
Definition of the vpImage class member functions.
unsigned int getWidth() const
unsigned int getHeight() const
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)