Read a B&W image on the disk and compute the histogram.
#include <visp3/core/vpConfig.h>
#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"
#ifdef ENABLE_VISP_NAMESPACE
#endif
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, characters) in overlay and finally 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], nullptr, 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], nullptr, 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) {
return EXIT_FAILURE;
}
if (!opt_ipath.empty())
ipath = opt_ipath;
if (!opt_opath.empty())
opath = opt_opath;
try {
}
catch (...) {
usage(argv[0], nullptr, 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;
return EXIT_FAILURE;
}
}
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], nullptr, 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;
return EXIT_FAILURE;
}
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;
vpTRACE("List of peaks");
vpTRACE("Nb peaks: %d", nbpeaks);
if (nbpeaks) {
for (std::list<vpHistogramPeak>::const_iterator it = peaks.begin(); it != peaks.end(); ++it) {
}
}
vpTRACE("Sorted list of peaks");
vpTRACE("Nb peaks: %d", nbpeaks);
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(),
}
if (h.
getValey(peak1, peak2, valey) ==
false) {
vpTRACE("No valey found...");
}
else {
}
{
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());
}
else if (ret == 0x01) {
}
else if (ret == 0x11) {
}
}
{
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());
}
else if (ret == 0x01) {
}
else if (ret == 0x11) {
}
}
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(),
}
return EXIT_SUCCESS;
}
std::cout << "Catch an exception: " << e << std::endl;
return EXIT_FAILURE;
}
}
error that can be emitted by ViSP classes.
Declaration of the peak (maximum value) in a gray level image histogram.
unsigned getValue() const
unsigned char getLevel() const
Declaration of the valey (minimum value) in a gray level image histogram.
unsigned char getLevel() const
unsigned getValue() const
Class to compute a gray level image histogram.
unsigned getPeaks(std::list< vpHistogramPeak > &peaks)
void smooth(unsigned int fsize=3)
void calculate(const vpImage< unsigned char > &I, unsigned int nbins=256, unsigned int nbThreads=1)
unsigned sort(std::list< vpHistogramPeak > &peaks)
unsigned getValey(std::list< vpHistogramValey > &valey)
bool write(const std::string &filename)
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)