Read a B&W image on the disk and compute the histogram.
#include <visp3/core/vpDebug.h>
#include <visp3/core/vpHistogram.h>
#include <visp3/core/vpImage.h>
#include <visp3/core/vpIoTools.h>
#include <visp3/io/vpImageIo.h>
#include <visp3/io/vpParseArgv.h>
#include <iomanip>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#define GETOPTARGS "i:o: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 X11, 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 histogram path>]\n\
[-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 histogram path> %s\n\
From this directory, creates the \"%s\"\n\
subdirectory depending on the username, where \n\
\"histogram.txt\" is saved.\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, const std::string &user)
{
const char *optarg_;
int c;
switch (c) {
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;
if (!env_ipath.empty())
ipath = env_ipath;
#if defined(_WIN32)
opt_opath = "C:/temp";
#else
opt_opath = "/tmp";
#endif
if (getOptions(argc, argv, opt_ipath, opt_opath, username) == 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 " << dirname << std::endl;
std::cerr << " Check your -o " << opath << " option " << std::endl;
exit(-1);
}
}
if (opt_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);
}
filename = ipath;
if (opt_ipath.empty())
std::cout << "Read: " << filename << std::endl;
unsigned char distance = 60;
std::cout << "Save the histogram in: " << filename << std::endl;
std::cout << "Save the smoothed histogram in: " << filename << std::endl;
std::list<vpHistogramPeak> peaks;
unsigned int nbpeaks = 0;
if (nbpeaks) {
for (std::list<vpHistogramPeak>::const_iterator it = peaks.begin(); it != peaks.end(); ++it) {
}
}
if (nbpeaks) {
for (std::list<vpHistogramPeak>::const_iterator it = peaks.begin(); it != peaks.end(); ++it) {
}
}
nbpeaks = h.
getPeaks(distance, peak1, peak2);
if (nbpeaks != 2) {
std::cout << "Not a bimodal histogram..." << std::endl;
} else {
vpTRACE(
"Bimodal histogram: main peak1: %d-%d second peak2: %d-%d", peak1.getLevel(), peak1.getValue(),
peak2.getLevel(), peak2.getValue());
}
if (h.
getValey(peak1, peak2, valey) ==
false) {
} else {
vpTRACE(
"Valey: %d-%d", valey.getLevel(), valey.getValue());
}
{
unsigned ret = h.
getValey(distance, peak1, valeyl, valeyr);
if (ret == 0x00) {
vpTRACE(
"No left and right valey for peak %d-%d...", peak1.getLevel(), peak1.getValue());
} else if (ret == 0x10) {
vpTRACE(
"No right valey for peak %d-%d...", peak1.getLevel(), peak1.getValue());
vpTRACE(
"Left valey: %d-%d", valeyl.getLevel(), valeyl.getValue());
} else if (ret == 0x01) {
vpTRACE(
"No left valey for peak %d-%d...", peak1.getLevel(), peak1.getValue());
vpTRACE(
"Right valey: %d-%d", valeyr.getLevel(), valeyr.getValue());
} else if (ret == 0x11) {
vpTRACE(
"Left valey: %d-%d", valeyl.getLevel(), valeyl.getValue());
vpTRACE(
"Right valey: %d-%d", valeyr.getLevel(), valeyr.getValue());
}
}
{
unsigned ret = h.
getValey(distance, peak2, valeyl, valeyr);
if (ret == 0x00) {
vpTRACE(
"No left and right valey for peak %d-%d...", peak2.getLevel(), peak2.getValue());
} else if (ret == 0x10) {
vpTRACE(
"No right valey for peak %d-%d...", peak2.getLevel(), peak2.getValue());
vpTRACE(
"Left valey: %d-%d", valeyl.getLevel(), valeyl.getValue());
} else if (ret == 0x01) {
vpTRACE(
"No left valey for peak %d-%d...", peak2.getLevel(), peak2.getValue());
vpTRACE(
"Right valey: %d-%d", valeyr.getLevel(), valeyr.getValue());
} else if (ret == 0x11) {
vpTRACE(
"Left valey: %d-%d", valeyl.getLevel(), valeyl.getValue());
vpTRACE(
"Right valey: %d-%d", valeyr.getLevel(), valeyr.getValue());
}
}
if (h.
getPeaks(distance, peakl, peakr, valey) ==
false) {
std::cout << "Not a bimodal histogram..." << std::endl;
} else {
vpTRACE(
"Bimodal histogram: valey %d-%d for peakl: %d-%d peakr: %d-%d", valey.getLevel(), valey.getValue(),
peakl.getLevel(), peakl.getValue(), peakr.getLevel(), peakr.getValue());
}
return EXIT_SUCCESS;
std::cout << "Catch an exception: " << e << std::endl;
return EXIT_FAILURE;
}
}