Describe a curve thanks to a Nurbs.
#include <visp3/core/vpDebug.h>
#include <visp3/me/vpNurbs.h>
#include <visp3/core/vpImage.h>
#include <visp3/core/vpImagePoint.h>
#include <visp3/io/vpImageIo.h>
#ifdef VISP_HAVE_MODULE_GUI
#include <visp3/gui/vpDisplayD3D.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayGTK.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
#endif
#include <cstdlib>
#include <visp3/core/vpIoTools.h>
#include <visp3/io/vpParseArgv.h>
#if defined(VISP_HAVE_DISPLAY) && (defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
#define GETOPTARGS "cdh"
#ifdef ENABLE_VISP_NAMESPACE
#endif
void usage(const char *name, const char *badparam);
bool getOptions(int argc, const char **argv, bool &click_allowed, bool &display);
void usage(const char *name, const char *badparam)
{
fprintf(stdout, "\n\
Describe a curve thanks to a Nurbs.\n\
\n\
SYNOPSIS\n\
%s [-c] [-d] [-h]\n",
name);
fprintf(stdout, "\n\
OPTIONS: Default\n\
-c\n\
Disable the mouse click. Useful to automate the \n\
execution of this program without human intervention.\n\
\n\
-d \n\
Turn off the display.\n\
\n\
-h\n\
Print the help.\n");
if (badparam)
fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
}
bool getOptions(int argc, const char **argv, bool &click_allowed, bool &display)
{
const char *optarg_;
int c;
switch (c) {
case 'c':
click_allowed = false;
break;
case 'd':
display = false;
break;
case 'h':
usage(argv[0], nullptr);
return false;
break;
default:
usage(argv[0], optarg_);
return false;
break;
}
}
if ((c == 1) || (c == -1)) {
usage(argv[0], nullptr);
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 {
bool opt_click_allowed = true;
bool opt_display = true;
if (getOptions(argc, argv, opt_click_allowed, opt_display) == false) {
return EXIT_FAILURE;
}
#if defined(VISP_HAVE_X11)
vpDisplayX display[3];
#elif defined(VISP_HAVE_GDI)
#elif defined(VISP_HAVE_GTK)
#elif defined(HAVE_OPENCV_HIGHGUI)
#endif
if (opt_display) {
display[0].init(I, 100, 100, "Points as control points");
}
std::list<double> knots;
knots.push_back(0);
knots.push_back(0);
knots.push_back(0);
knots.push_back(1);
knots.push_back(2);
knots.push_back(3);
knots.push_back(4);
knots.push_back(4);
knots.push_back(5);
knots.push_back(5);
knots.push_back(5);
std::list<vpImagePoint> controlPoints;
std::list<double> weights;
controlPoints.push_back(pt);
weights.push_back(1);
controlPoints.push_back(pt);
weights.push_back(5);
controlPoints.push_back(pt);
weights.push_back(0.2);
controlPoints.push_back(pt);
weights.push_back(10);
controlPoints.push_back(pt);
weights.push_back(1);
controlPoints.push_back(pt);
weights.push_back(2);
controlPoints.push_back(pt);
weights.push_back(3);
controlPoints.push_back(pt);
weights.push_back(1);
std::cout << "The parameters are :" << std::endl;
std::cout <<
"p : " << Nurbs.
get_p() << std::endl;
std::cout << "" << std::endl;
std::cout << "The knot vector :" << std::endl;
std::list<double> knots_cur;
unsigned int i_display = 0;
for (std::list<double>::const_iterator it = knots_cur.begin(); it != knots_cur.end(); ++it, ++i_display) {
std::cout << i_display << " ---> " << *it << std::endl;
}
std::cout << "The control points are :" << std::endl;
std::list<vpImagePoint> controlPoints_cur;
i_display = 0;
for (std::list<vpImagePoint>::const_iterator it = controlPoints_cur.begin(); it != controlPoints_cur.end();
++it, ++i_display) {
std::cout << i_display << " ---> " << *it << std::endl;
}
std::cout << "The associated weights are :" << std::endl;
std::list<double> weights_cur;
i_display = 0;
for (std::list<double>::const_iterator it = weights_cur.begin(); it != weights_cur.end(); ++it, ++i_display) {
std::cout << i_display << " ---> " << *it << std::endl;
}
unsigned int i = Nurbs.
findSpan(5 / 2.0);
std::cout << "The knot interval number for the value u = 5/2 is : " << i << std::endl;
vpBasisFunction *N = nullptr;
std::cout << "The nonvanishing basis functions N(u=5/2) are :" << std::endl;
for (
unsigned int j = 0; j < Nurbs.
get_p() + 1; j++)
std::cout << N[j].value << std::endl;
vpBasisFunction **N2 = nullptr;
std::cout << "The first derivatives of the basis functions N'(u=5/2) are :" << std::endl;
for (
unsigned int j = 0; j < Nurbs.
get_p() + 1; j++)
std::cout << N2[1][j].value << std::endl;
std::cout << "The second derivatives of the basis functions N''(u=5/2) are :" << std::endl;
for (
unsigned int j = 0; j < Nurbs.
get_p() + 1; j++)
std::cout << N2[2][j].value << std::endl;
if (opt_display && opt_click_allowed) {
double u = 0.0;
while (u <= 5) {
u += 0.01;
}
for (std::list<vpImagePoint>::const_iterator it = controlPoints.begin(); it != controlPoints.end(); ++it) {
}
}
if (opt_display) {
try {
display[1].init(I2, 100, 100, "Points interpolation");
}
catch (...) {
vpERROR_TRACE("Error while displaying the image");
return EXIT_FAILURE;
}
}
if (opt_display && opt_click_allowed) {
double u = 0.0;
while (u <= 1) {
u += 0.01;
}
for (std::list<vpImagePoint>::const_iterator it = controlPoints.begin(); it != controlPoints.end(); ++it) {
}
}
if (opt_display) {
try {
display[2].init(I3, 100, 100, "Points approximation");
}
catch (...) {
vpERROR_TRACE("Error while displaying the image");
return EXIT_FAILURE;
}
}
if (opt_display && opt_click_allowed) {
double u = 0.0;
while (u <= 1) {
u += 0.01;
}
for (std::list<vpImagePoint>::const_iterator it = controlPoints.begin(); it != controlPoints.end(); ++it) {
}
}
if (N != nullptr)
delete[] N;
if (N2 != nullptr) {
for (int j = 0; j <= 2; j++)
delete[] N2[j];
delete[] N2;
}
return EXIT_SUCCESS;
}
std::cout << "Catch an exception: " << e << std::endl;
return EXIT_FAILURE;
}
}
#elif !(defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
int main()
{
std::cout << "Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
return EXIT_SUCCESS;
}
#else
int main()
{
std::cout << "This example requires a video device. " << std::endl
<< "You should install X11, GTK, OpenCV, GDI or Direct3D" << std::endl
<< "to be able to execute this example." << std::endl;
return EXIT_SUCCESS;
}
#endif
void get_controlPoints(std::list< vpImagePoint > &list) const
void set_p(unsigned int degree)
static unsigned int findSpan(double l_u, unsigned int l_p, const std::vector< double > &l_knots)
unsigned int get_p() const
static vpBasisFunction ** computeDersBasisFuns(double l_u, unsigned int l_i, unsigned int l_p, unsigned int l_der, const std::vector< double > &l_knots)
void set_controlPoints(const std::list< vpImagePoint > &list)
void get_knots(std::list< double > &list) const
void set_knots(const std::list< double > &list)
static vpBasisFunction * computeBasisFuns(double l_u, unsigned int l_i, unsigned int l_p, const std::vector< double > &l_knots)
static const vpColor green
Display for windows using GDI (available on any windows 32 platform).
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
static void flush(const vpImage< unsigned char > &I)
error that can be emitted by ViSP classes.
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
void set_ij(double ii, double jj)
Class that provides tools to compute and manipulate a Non Uniform Rational B-Spline curve.
static void globalCurveInterp(std::vector< vpImagePoint > &l_crossingPoints, unsigned int l_p, std::vector< double > &l_knots, std::vector< vpImagePoint > &l_controlPoints, std::vector< double > &l_weights)
void get_weights(std::list< double > &list) const
static vpImagePoint computeCurvePoint(double l_u, unsigned int l_i, unsigned int l_p, std::vector< double > &l_knots, std::vector< vpImagePoint > &l_controlPoints, std::vector< double > &l_weights)
static void globalCurveApprox(std::vector< vpImagePoint > &l_crossingPoints, unsigned int l_p, unsigned int l_n, std::vector< double > &l_knots, std::vector< vpImagePoint > &l_controlPoints, std::vector< double > &l_weights)
void set_weights(const std::list< double > &list)
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)