#include <visp/vpDebug.h>
#include <visp/vpConfig.h>
#include <stdlib.h>
#ifdef VISP_HAVE_OPENCV
#include <visp/vpImage.h>
#include <visp/vpImageIo.h>
#include <visp/vpDisplayOpenCV.h>
#include <visp/vpParseArgv.h>
#include <visp/vpIoTools.h>
#include <visp/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);
bool getOptions(int argc, const char **argv, std::string &ipath, std::string &opath,
bool &click_allowed, std::string user, bool &display);
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 \"ViSP-images/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, 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;
char *ptenv = getenv("VISP_INPUT_IMAGE_PATH");
if (ptenv != NULL)
env_ipath = ptenv;
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,
"OpenCV 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) {
}
"ViSP is a marvelous software",
if (opt_click_allowed) {
std::cout << "\nA click to close the windows..." << std::endl;
}
}
if (opt_display) {
displayRGBa.
init(Irgba, 100, 100,
"OpenCV 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;
}
}
}
std::cout << "Catch an exception: " << e << std::endl;
return 1;
}
}
#else
int
main()
{
vpERROR_TRACE(
"You do not have OpenCV functionalities to display images...");
}
#endif