Test connected components.
#include <map>
#include <set>
#include <visp3/core/vpImageTools.h>
#include <visp3/core/vpIoTools.h>
#include <visp3/imgproc/vpImgproc.h>
#include <visp3/io/vpImageIo.h>
#include <visp3/io/vpParseArgv.h>
#define GETOPTARGS "cdi:o:h"
#ifdef ENABLE_VISP_NAMESPACE
#endif
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, std::string user);
void usage(const char *name, const char *badparam, std::string ipath, std::string opath, std::string user)
{
fprintf(stdout, "\n\
Test connected components.\n\
\n\
SYNOPSIS\n\
%s [-i <input image path>] [-o <output image 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 image path> %s\n\
Set image output path.\n\
From this directory, creates the \"%s\"\n\
subdirectory depending on the username, where \n\
output result images are written.\n\
\n\
-h\n\
Print the help.\n\n",
ipath.c_str(), opath.c_str(), user.c_str());
if (badparam)
fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
}
bool getOptions(int argc, const char **argv, std::string &ipath, std::string &opath, 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;
case 'c':
case 'd':
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;
}
{
return false;
std::map<int, std::vector<vpImagePoint> > map_label1, map_label2;
for (
unsigned int i = 0; i < label1.
getHeight(); i++) {
for (
unsigned int j = 0; j < label1.
getWidth(); j++) {
if ((label1[i][j] > 0 && label2[i][j] == 0) || (label1[i][j] == 0 && label2[i][j] > 0)) {
std::cerr << "label1[i][j] > 0 && label2[i][j] == 0 || label1[i][j] "
"== 0 && label2[i][j] > 0"
<< std::endl;
return false;
}
if (label1[i][j])
if (label2[i][j])
}
}
if (map_label1.size() != map_label2.size()) {
std::cerr << "map_label1.size() != map_label2.size()" << std::endl;
return false;
}
for (std::map<int, std::vector<vpImagePoint> >::const_iterator it1 = map_label1.begin(); it1 != map_label1.end();
++it1) {
unsigned int i = (unsigned int)it1->second.front().get_i(), j = (unsigned int)it1->second.front().get_j();
int lab2 = label2[i][j];
std::vector<vpImagePoint>::const_iterator it_pt1 = it1->second.begin();
for (; it_pt1 != it1->second.end(); ++it_pt1) {
i = (unsigned int)it_pt1->get_i();
j = (unsigned int)it_pt1->get_j();
if (label2[i][j] != lab2) {
std::cerr << "label2[i][j] != lab2" << 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(EXIT_FAILURE);
}
if (!opt_ipath.empty())
ipath = opt_ipath;
if (!opt_opath.empty())
opath = opt_opath;
try {
}
catch (...) {
usage(argv[0], nullptr, ipath, opt_opath, username);
std::cerr << std::endl << "ERROR:" << std::endl;
std::cerr << " Cannot create " << opath << std::endl;
std::cerr << " Check your -o " << opt_opath << " option " << std::endl;
exit(EXIT_FAILURE);
}
}
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], nullptr, ipath, opt_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(EXIT_FAILURE);
}
std::cout << "Read image: " << filename << std::endl;
(unsigned char)255);
int nbComponents = 0;
std::cout << "\n4-connexity connected components:" << std::endl;
std::cout << "Time: " << t << " ms" << std::endl;
std::cout << "nbComponents=" << nbComponents << std::endl;
std::cout << "\n8-connexity connected components:" << std::endl;
std::cout << "Time: " << t << " ms" << std::endl;
std::cout << "nbComponents=" << nbComponents << std::endl;
for (
unsigned int i = 0; i < labels_connex4.
getHeight(); i++) {
for (
unsigned int j = 0; j < labels_connex4.
getWidth(); j++) {
if (labels_connex4[i][j] != 0) {
}
}
}
for (
unsigned int i = 0; i < labels_connex8.
getHeight(); i++) {
for (
unsigned int j = 0; j < labels_connex8.
getWidth(); j++) {
if (labels_connex8[i][j] != 0) {
}
}
}
#if (VISP_HAVE_OPENCV_VERSION >= 0x030000) && defined(HAVE_OPENCV_IMGPROC)
cv::Mat matImg;
cv::Mat matLabels_4;
std::set<int> set_labels_connex4_opencv;
vpImage<int> labels_connex4_opencv((
unsigned int)matLabels_4.rows, (
unsigned int)matLabels_4.cols);
for (int i = 0; i < matLabels_4.rows; i++) {
for (int j = 0; j < matLabels_4.cols; j++) {
labels_connex4_opencv[i][j] = matLabels_4.at<int>(i, j);
if (matLabels_4.at<int>(i, j))
set_labels_connex4_opencv.insert(matLabels_4.at<int>(i, j));
}
}
std::cout << "\n4-connexity connected components (OpenCV):" << std::endl;
std::cout << "Time: " << t_opencv << " ms" << std::endl;
std::cout << "nb components: " << set_labels_connex4_opencv.size() << std::endl;
bool check_label = checkLabels(labels_connex4_opencv, labels_connex4);
std::cout << "checkLabels(labels_connex4_opencv, labels_connex4): " << check_label << std::endl;
if (!check_label) {
}
cv::Mat matLabels_8;
std::set<int> set_labels_connex8_opencv;
vpImage<int> labels_connex8_opencv((
unsigned int)matLabels_8.rows, (
unsigned int)matLabels_8.cols);
for (int i = 0; i < matLabels_8.rows; i++) {
for (int j = 0; j < matLabels_8.cols; j++) {
labels_connex8_opencv[i][j] = matLabels_8.at<int>(i, j);
if (matLabels_8.at<int>(i, j))
set_labels_connex8_opencv.insert(matLabels_8.at<int>(i, j));
}
}
std::cout << "\n8-connexity connected components (OpenCV):" << std::endl;
std::cout << "nb components: " << set_labels_connex8_opencv.size() << std::endl;
std::cout << "Time: " << t_opencv << " ms" << std::endl;
check_label = checkLabels(labels_connex8_opencv, labels_connex8);
std::cout << "checkLabels(labels_connex8_opencv, labels_connex8): " << check_label << std::endl;
if (!check_label) {
}
#endif
return EXIT_SUCCESS;
}
std::cerr <<
"Catch an exception: " << e.
what() << std::endl;
return EXIT_FAILURE;
}
}
static vpColor getColor(const unsigned int &i)
error that can be emitted by ViSP classes.
const char * what() const
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
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)
VISP_EXPORT void connectedComponents(const VISP_NAMESPACE_ADDRESSING vpImage< unsigned char > &I, VISP_NAMESPACE_ADDRESSING vpImage< int > &labels, int &nbComponents, const VISP_NAMESPACE_ADDRESSING vpImageMorphology::vpConnexityType &connexity=VISP_NAMESPACE_ADDRESSING vpImageMorphology::CONNEXITY_4)
VISP_EXPORT double measureTimeMs()