44 #include <visp3/core/vpDebug.h>
46 #include <visp3/me/vpNurbs.h>
48 #include <visp3/core/vpImage.h>
49 #include <visp3/core/vpImagePoint.h>
50 #include <visp3/io/vpImageIo.h>
51 #ifdef VISP_HAVE_MODULE_GUI
52 #include <visp3/gui/vpDisplayD3D.h>
53 #include <visp3/gui/vpDisplayGDI.h>
54 #include <visp3/gui/vpDisplayGTK.h>
55 #include <visp3/gui/vpDisplayOpenCV.h>
56 #include <visp3/gui/vpDisplayX.h>
60 #include <visp3/core/vpIoTools.h>
61 #include <visp3/io/vpParseArgv.h>
62 #if defined(VISP_HAVE_DISPLAY) \
63 && (defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
66 #define GETOPTARGS "cdh"
68 void usage(
const char *name,
const char *badparam);
69 bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display);
79 void usage(
const char *name,
const char *badparam)
82 Describe a curve thanks to a Nurbs.\n\
85 %s [-c] [-d] [-h]\n", name);
90 Disable the mouse click. Useful to automaze the \n\
91 execution of this program without humain intervention.\n\
94 Turn off the display.\n\
100 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
115 bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display)
123 click_allowed =
false;
129 usage(argv[0], NULL);
134 usage(argv[0], optarg_);
140 if ((c == 1) || (c == -1)) {
142 usage(argv[0], NULL);
143 std::cerr <<
"ERROR: " << std::endl;
144 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
151 int main(
int argc,
const char **argv)
154 bool opt_click_allowed =
true;
155 bool opt_display =
true;
158 if (getOptions(argc, argv, opt_click_allowed, opt_display) ==
false) {
170 #if defined VISP_HAVE_X11
172 #elif defined VISP_HAVE_GDI
174 #elif defined VISP_HAVE_GTK
176 #elif defined VISP_HAVE_OPENCV
182 display[0].init(I, 100, 100,
"Points as control points");
188 std::list<double> knots;
201 std::list<vpImagePoint> controlPoints;
202 std::list<double> weights;
205 controlPoints.push_back(pt);
206 weights.push_back(1);
208 controlPoints.push_back(pt);
209 weights.push_back(5);
211 controlPoints.push_back(pt);
212 weights.push_back(0.2);
214 controlPoints.push_back(pt);
215 weights.push_back(10);
217 controlPoints.push_back(pt);
218 weights.push_back(1);
220 controlPoints.push_back(pt);
221 weights.push_back(2);
223 controlPoints.push_back(pt);
224 weights.push_back(3);
226 controlPoints.push_back(pt);
227 weights.push_back(1);
234 std::cout <<
"The parameters are :" << std::endl;
235 std::cout <<
"p : " << Nurbs.
get_p() << std::endl;
236 std::cout <<
"" << std::endl;
237 std::cout <<
"The knot vector :" << std::endl;
238 std::list<double> knots_cur;
240 unsigned int i_display = 0;
241 for (std::list<double>::const_iterator it = knots_cur.begin(); it != knots_cur.end(); ++it, ++i_display) {
242 std::cout << i_display <<
" ---> " << *it << std::endl;
244 std::cout <<
"The control points are :" << std::endl;
245 std::list<vpImagePoint> controlPoints_cur;
248 for (std::list<vpImagePoint>::const_iterator it = controlPoints_cur.begin(); it != controlPoints_cur.end();
250 std::cout << i_display <<
" ---> " << *it << std::endl;
252 std::cout <<
"The associated weights are :" << std::endl;
253 std::list<double> weights_cur;
256 for (std::list<double>::const_iterator it = weights_cur.begin(); it != weights_cur.end(); ++it, ++i_display) {
257 std::cout << i_display <<
" ---> " << *it << std::endl;
260 unsigned int i = Nurbs.
findSpan(5 / 2.0);
261 std::cout <<
"The knot interval number for the value u = 5/2 is : " << i << std::endl;
263 vpBasisFunction *N = NULL;
265 std::cout <<
"The nonvanishing basis functions N(u=5/2) are :" << std::endl;
266 for (
unsigned int j = 0; j < Nurbs.
get_p() + 1; j++)
267 std::cout << N[j].value << std::endl;
269 vpBasisFunction **N2 = NULL;
271 std::cout <<
"The first derivatives of the basis functions N'(u=5/2) are :" << std::endl;
272 for (
unsigned int j = 0; j < Nurbs.
get_p() + 1; j++)
273 std::cout << N2[1][j].value << std::endl;
275 std::cout <<
"The second derivatives of the basis functions N''(u=5/2) are :" << std::endl;
276 for (
unsigned int j = 0; j < Nurbs.
get_p() + 1; j++)
277 std::cout << N2[2][j].value << std::endl;
279 if (opt_display && opt_click_allowed) {
286 for (std::list<vpImagePoint>::const_iterator it = controlPoints.begin(); it != controlPoints.end(); ++it) {
297 display[1].init(I2, 100, 100,
"Points interpolation");
308 if (opt_display && opt_click_allowed) {
316 for (std::list<vpImagePoint>::const_iterator it = controlPoints.begin(); it != controlPoints.end(); ++it) {
326 display[2].init(I3, 100, 100,
"Points approximation");
337 if (opt_display && opt_click_allowed) {
345 for (std::list<vpImagePoint>::const_iterator it = controlPoints.begin(); it != controlPoints.end(); ++it) {
356 for (
int j = 0; j <= 2; j++)
363 std::cout <<
"Catch an exception: " << e << std::endl;
368 #elif !(defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
371 std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
377 std::cout <<
"This example requires a video device. " << std::endl
378 <<
"You should install X11, GTK, OpenCV, GDI or Direct3D" << std::endl
379 <<
"to be able to execute this example." << std::endl;
static vpBasisFunction ** computeDersBasisFuns(double l_u, unsigned int l_i, unsigned int l_p, unsigned int l_der, std::vector< double > &l_knots)
static vpBasisFunction * computeBasisFuns(double l_u, unsigned int l_i, unsigned int l_p, std::vector< double > &l_knots)
void get_controlPoints(std::list< vpImagePoint > &list) const
void set_p(unsigned int degree)
unsigned int get_p() const
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 unsigned int findSpan(double l_u, unsigned int l_p, 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...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
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 emited 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)