42#include <visp3/core/vpConfig.h>
43#include <visp3/core/vpDebug.h>
50#include <visp3/core/vpImage.h>
51#include <visp3/gui/vpDisplayX.h>
52#include <visp3/io/vpImageIo.h>
54#include <visp3/core/vpIoTools.h>
55#include <visp3/io/vpParseArgv.h>
68#define GETOPTARGS "cdi:o:h"
70#ifdef ENABLE_VISP_NAMESPACE
85void usage(
const char *name,
const char *badparam,
const std::string &ipath,
const std::string &opath,
const std::string &user)
88Read an image on the disk, display it using X11, display some\n\
89features (line, circle, characters) in overlay and finally write \n\
90the image and the overlayed features in an image on the disk.\n\
93 %s [-i <input image path>] [-o <output image path>]\n\
100 -i <input image path> %s\n\
101 Set image input path.\n\
102 From this path read \"Klimt/Klimt.pgm\"\n\
103 and \"Klimt/Klimt.ppm\" images.\n\
104 Setting the VISP_INPUT_IMAGE_PATH environment\n\
105 variable produces the same behaviour than using\n\
108 -o <output image path> %s\n\
109 Set image output path.\n\
110 From this directory, creates the \"%s\"\n\
111 subdirectory depending on the username, where \n\
112 Klimt_grey.overlay.ppm output image is written.\n\
115 Disable the mouse click. Useful to automate the \n\
116 execution of this program without human intervention.\n\
119 Disable the image display. This can be useful \n\
120 for automatic tests using crontab under Unix or \n\
121 using the task manager under Windows.\n\
124 Print the help.\n\n",
125 ipath.c_str(), opath.c_str(), user.c_str());
128 fprintf(stderr,
"ERROR: \n");
129 fprintf(stderr,
"\nBad parameter [%s]\n", badparam);
150bool getOptions(
int argc,
const char **argv, std::string &ipath, std::string &opath,
bool &click_allowed,
151 const std::string &user,
bool &display)
159 click_allowed =
false;
171 usage(argv[0],
nullptr, ipath, opath, user);
175 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;
191int main(
int argc,
const char **argv)
194 std::string env_ipath;
195 std::string opt_ipath;
196 std::string opt_opath;
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],
nullptr, 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],
nullptr, 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="") 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 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)