#include <iostream>
#include <stdlib.h>
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpDebug.h>
#if defined(VISP_HAVE_OPENCV)
#include <visp3/core/vpImage.h>
#include <visp3/core/vpIoTools.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/io/vpImageIo.h>
#include <visp3/io/vpParseArgv.h>
#include <visp3/core/vpTime.h>
#define GETOPTARGS "cdi:o:p:h"
void usage(const char *name, const char *badparam, std::string ipath, std::string opath, std::string user)
{
fprintf(stdout, "\n\
Read an image on the disk, display it using OpenCV, display some\n\
features (line, circle, caracters) in overlay and finaly write \n\
the image and the overlayed features in an image on the disk.\n\
\n\
SYNOPSIS\n\
%s [-i <input image path>] [-o <output image path>]\n\
[-c] [-d] [-h]\n \
", name);
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\
image.\n\
Setting the VISP_INPUT_IMAGE_PATH environment\n\
variable produces the same behaviour than using\n\
this option.\n\
\n\
-o <output image path> %s\n\
Set image output path.\n\
From this directory, creates the \"%s\"\n\
subdirectory depending on the username, where \n\
Klimt_grey.overlay.ppm output image is written.\n\
\n\
-c\n\
Disable the mouse click. Useful to automate the \n\
execution of this program without humain intervention.\n\
\n\
-d \n\
Disable the image display. This can be useful \n\
for automatic tests using crontab under Unix or \n\
using the task manager under Windows.\n\
\n\
-h\n\
Print the help.\n\n", ipath.c_str(), opath.c_str(), user.c_str());
if (badparam) {
fprintf(stderr, "ERROR: \n");
fprintf(stderr, "\nBad parameter [%s]\n", badparam);
}
}
bool getOptions(int argc, const char **argv, std::string &ipath, std::string &opath, bool &click_allowed,
const std::string &user, bool &display)
{
const char *optarg_;
int c;
switch (c) {
case 'c':
click_allowed = false;
break;
case 'd':
display = false;
break;
case 'i':
ipath = optarg_;
break;
case 'o':
opath = optarg_;
break;
case 'h':
usage(argv[0], NULL, ipath, opath, user);
return false;
break;
default:
usage(argv[0], optarg_, ipath, opath, user);
return false;
break;
}
}
if ((c == 1) || (c == -1)) {
usage(argv[0], NULL, ipath, opath, user);
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;
std::string opt_opath;
std::string ipath;
std::string opath;
std::string filename;
std::string username;
bool opt_click_allowed = true;
bool opt_display = true;
if (!env_ipath.empty())
ipath = env_ipath;
#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__))) // UNIX
opt_opath = "/tmp";
#elif defined(_WIN32)
opt_opath = "C:\\temp";
#endif
if (getOptions(argc, argv, opt_ipath, opt_opath, opt_click_allowed, username, opt_display) == false) {
exit(-1);
}
if (!opt_ipath.empty())
ipath = opt_ipath;
if (!opt_opath.empty())
opath = opt_opath;
try {
} catch (...) {
usage(argv[0], NULL, ipath, opath, username);
std::cerr << std::endl << "ERROR:" << std::endl;
std::cerr << " Cannot create " << odirname << std::endl;
std::cerr << " Check your -o " << opath << " option " << std::endl;
exit(-1);
}
}
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], NULL, ipath, opath, username);
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;
exit(-1);
}
if (opt_display) {
display.
init(I, 100, 100,
"X11 display");
for (
unsigned i = 0; i < I.
getHeight(); i += 20) {
}
for (
unsigned i = 0; i < I.
getWidth(); i += 20) {
}
for (unsigned int i = 0; i < 100; i += 20) {
}
if (opt_click_allowed) {
std::cout << "\nA click to close the windows..." << std::endl;
}
}
if (opt_display) {
displayRGBa.
init(Irgba, 100, 100,
"X11 color display");
if (opt_click_allowed) {
std::cout << "\nA click to display a cross..." << std::endl;
std::cout << "Cross position: " << ip << std::endl;
} else {
std::cout << "Cross position: " << ip << std::endl;
}
if (opt_click_allowed) {
std::cout << "\nA click to exit the program..." << std::endl;
std::cout << "Bye" << std::endl;
}
}
return EXIT_SUCCESS;
std::cout << "Catch an exception: " << e << std::endl;
return EXIT_FAILURE;
}
}
#else
int main()
{
std::cout << "You do not have OpenCV functionalities to display images..." << std::endl;
std::cout << "Tip:" << std::endl;
std::cout << "- Install OpenCV, configure again ViSP using cmake and build again this example" << std::endl;
return EXIT_SUCCESS;
}
#endif