39 #include <visp3/tt_mi/vpTemplateTrackerMIBSpline.h>
41 #ifndef DOXYGEN_SHOULD_SKIP_THIS
43 void vpTemplateTrackerMIBSpline::PutPVBsplineD(
double *Prt,
int cr,
double er,
int ct,
double et,
int Nc,
double val,
48 PutPVBsplineD4(Prt, cr, er, ct, et, Nc, val);
51 PutPVBsplineD3(Prt, cr, er, ct, et, Nc, val);
55 void vpTemplateTrackerMIBSpline::PutPVBsplineD3(
double *Prt,
int cr,
double er,
int ct,
double et,
int Nc,
double val)
67 double *pt = &Prt[((cr + sr) * Nc + (ct + st)) * 9];
68 if (std::fabs(val - 1.) > std::numeric_limits<double>::epsilon()) {
69 for (
int ir = -1; ir <= 1; ir++) {
70 double Bspline3_diff_r_ = Bspline3(ir - er);
71 for (
int it = -1; it <= 1; it++) {
72 *pt++ += Bspline3_diff_r_ * Bspline3(it - et) * val;
76 for (
int ir = -1; ir <= 1; ir++) {
77 double Bspline3_diff_r_ = Bspline3(ir - er);
78 for (
int it = -1; it <= 1; it++) {
79 *pt++ += Bspline3_diff_r_ * Bspline3(it - et);
85 void vpTemplateTrackerMIBSpline::PutPVBsplineD4(
double *Prt,
int cr,
double er,
int ct,
double et,
int Nc,
double val)
89 double *ptBti = &Bti[0];
90 for (
int it = -1; it <= 2; it++) {
91 *ptBti++ = Bspline4i(it - et, it);
94 double *pt = &Prt[(cr * Nc + ct) * 16];
95 if (std::fabs(val - 1.) > std::numeric_limits<double>::epsilon()) {
96 for (
int ir = -1; ir <= 2; ir++) {
97 double Br = Bspline4i(ir - er, ir);
99 for (
int it = -1; it <= 2; it++) {
100 *pt++ += Br * (*ptBti++) * val;
104 for (
int ir = -1; ir <= 2; ir++) {
105 double Br = Bspline4i(ir - er, ir);
107 for (
int it = -1; it <= 2; it++) {
108 *pt++ += Br * (*ptBti++);
114 double vpTemplateTrackerMIBSpline::Bspline3(
double diff)
116 double aDiff = std::fabs(diff);
120 return (-(aDiff * aDiff) + 0.75);
122 double tmp_ = 1.5 - aDiff;
123 return (0.5 * tmp_ * tmp_);
129 double vpTemplateTrackerMIBSpline::Bspline4i(
double diff,
int &interv)
134 double tmp_ = 2. + diff;
135 return (tmp_ * tmp_ * tmp_ / 6.);
138 double diff2_ = diff * diff;
139 return (-diff2_ * diff / 2. - diff2_ + 4. / 6.);
142 double diff2_ = diff * diff;
143 return (diff2_ * diff / 2. - diff2_ + 4. / 6.);
150 double vpTemplateTrackerMIBSpline::dBspline3(
double diff)
152 if ((diff > -1.5) && (diff <= -0.5))
154 else if ((diff > -0.5) && (diff <= 0.5))
156 else if ((diff > 0.5) && (diff <= 1.5))
162 double vpTemplateTrackerMIBSpline::dBspline4(
double diff)
164 if ((diff > -2.) && (diff <= -1.)) {
165 double diff_2_ = diff + 2.;
166 return (diff_2_ * diff_2_ * 0.5);
167 }
else if ((diff > -1.) && (diff <= 0.)) {
168 return -1.5 * diff * diff - 2. * diff;
169 }
else if ((diff > 0.) && (diff <= 1.)) {
170 return 1.5 * diff * diff - 2. * diff;
171 }
else if ((diff > 1.) && (diff <= 2.)) {
172 double diff_2_ = diff - 2.;
173 return (-0.5 * diff_2_ * diff_2_);
179 double vpTemplateTrackerMIBSpline::d2Bspline3(
double diff)
181 if ((diff > -1.5) && (diff <= -0.5))
183 else if ((diff > -0.5) && (diff <= 0.5))
185 else if ((diff > 0.5) && (diff <= 1.5))
191 double vpTemplateTrackerMIBSpline::d2Bspline4(
double diff)
193 if ((diff > -2.) && (diff <= -1.))
195 else if ((diff > -1.) && (diff <= 0.))
196 return -3. * diff - 2.;
197 else if ((diff > 0.) && (diff <= 1.))
198 return 3. * diff - 2.;
199 else if ((diff > 1.) && (diff <= 2.))
205 void vpTemplateTrackerMIBSpline::PutTotPVBspline(
double *Prt,
int cr,
double &er,
int ct,
double &et,
int Nc,
206 double *val,
unsigned int &NbParam,
int °ree)
210 PutTotPVBspline4(Prt, cr, er, ct, et, Nc, val, NbParam);
213 PutTotPVBspline3(Prt, cr, er, ct, et, Nc, val, NbParam);
217 void vpTemplateTrackerMIBSpline::PutTotPVBspline(
double *Prt,
double *dPrt,
double *d2Prt,
int cr,
double &er,
int ct,
218 double &et,
int Ncb,
double *val,
unsigned int &NbParam,
int °ree)
222 PutTotPVBspline4(Prt, dPrt, d2Prt, cr, er, ct, et, Ncb, val, NbParam);
225 PutTotPVBspline3(Prt, dPrt, d2Prt, cr, er, ct, et, Ncb, val, NbParam);
229 void vpTemplateTrackerMIBSpline::PutTotPVBspline3(
double *Prt,
int cr,
double &er,
int ct,
double &et,
int Nc,
230 double *val,
unsigned int &NbParam)
247 double *ptBti = &Bti[0];
248 double *ptdBti = &dBti[0];
249 double *ptd2Bti = &d2Bti[0];
251 for (
short int it = 1; it >= -1; it--) {
252 *ptBti++ = Bspline3(it + et);
253 *ptdBti++ = dBspline3(it + et);
254 *ptd2Bti++ = d2Bspline3(it + et);
257 double *pt = &Prt[((cr + sr) * Nc + (ct + st)) * 9 * (1 + (
int)(NbParam + NbParam * NbParam))];
258 for (
short int ir = -1; ir <= 1; ++ir) {
259 double Br = Bspline3(-ir + er);
261 for (
short unsigned int it = 0; it <= 2; ++it) {
262 *pt++ += Br * (Bti[it]);
264 double v1 = Br * (dBti[it]);
265 for (
short unsigned int ip = 0; ip < NbParam; ++ip) {
266 *pt++ -= v1 * val[ip];
267 double v2 = Br * (d2Bti[it]) * val[ip];
268 for (
short unsigned int ip2 = 0; ip2 < NbParam; ++ip2)
269 *pt++ += v2 * val[ip2];
275 void vpTemplateTrackerMIBSpline::PutTotPVBspline3(
double *Prt,
double *dPrt,
double *d2Prt,
int cr,
double &er,
int ct,
276 double &et,
int Ncb,
double *val,
unsigned int &NbParam)
293 double *ptBti = &Bti[0];
294 double *ptdBti = &dBti[0];
295 double *ptd2Bti = &d2Bti[0];
297 for (
short int it = 1; it >= -1; it--) {
298 *ptBti++ = Bspline3(it + et);
299 *ptdBti++ = dBspline3(it + et);
300 *ptd2Bti++ = d2Bspline3(it + et);
303 int NbParam_ = (int)NbParam;
304 for (
short int ir = -1; ir <= 1; ++ir) {
305 double Br = Bspline3(-ir + er);
306 short int irInd = ir + 1;
307 short int ind = (cr + sr + irInd) * Ncb;
308 for (
short int it = 0; it <= 2; ++it) {
309 Prt[ind + (ct + st + it)] += Br * (Bti[it]);
311 double v1 = Br * (dBti[it]);
312 int ind1 = ((cr + sr + irInd) * Ncb + (ct + st + it)) * NbParam_;
313 for (
int ip = 0; ip < NbParam_; ++ip) {
314 dPrt[ind1 + ip] -= v1 * val[ip];
315 double v2 = Br * (d2Bti[it]) * val[ip];
316 int ind2 = ((cr + sr + irInd) * Ncb + (ct + st + it)) * NbParam_ * NbParam_ + ip * NbParam_;
317 for (
short int ip2 = 0; ip2 < NbParam_; ++ip2)
318 d2Prt[ind2 + ip2] += v2 * val[ip2];
324 void vpTemplateTrackerMIBSpline::PutTotPVBspline3(
double *Prt,
double &er,
double *bt,
unsigned int size)
328 double *bt0 = &bt[0];
333 for (
int ir = -1; ir <= 1; ++ir) {
334 double Br = Bspline3(-ir + er);
335 const double *btend = bt0 + size;
340 for (; bt < btend; bt += LSIZE) {
341 *Prt++ += Br * bt[0];
342 *Prt++ += Br * bt[1];
343 *Prt++ += Br * bt[2];
344 *Prt++ += Br * bt[3];
345 *Prt++ += Br * bt[4];
346 *Prt++ += Br * bt[5];
347 *Prt++ += Br * bt[6];
348 *Prt++ += Br * bt[7];
349 *Prt++ += Br * bt[8];
350 *Prt++ += Br * bt[9];
351 *Prt++ += Br * bt[10];
352 *Prt++ += Br * bt[11];
356 for (; bt < btend; *Prt++ += Br * *bt++) {
362 void vpTemplateTrackerMIBSpline::PutTotPVBspline4(
double *Prt,
int cr,
double er,
int ct,
double et,
int Nc,
363 double *val,
unsigned int &NbParam)
369 double *ptBti = &Bti[0];
370 double *ptdBti = &dBti[0];
371 double *ptd2Bti = &d2Bti[0];
372 for (
char it = -1; it <= 2; it++) {
373 *ptBti++ = vpTemplateTrackerBSpline::Bspline4(-it + et);
374 *ptdBti++ = dBspline4(-it + et);
375 *ptd2Bti++ = d2Bspline4(-it + et);
378 int NbParam_ = (int)NbParam;
380 double *pt = &Prt[(cr * Nc + ct) * 16 * (1 + NbParam_ + NbParam_ * NbParam_)];
381 for (
char ir = -1; ir <= 2; ir++) {
382 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
386 for (
char it = -1; it <= 2; it++) {
387 double Br_ptBti_ = Br * (*ptBti);
388 double Br_ptdBti_ = Br * (*ptdBti);
389 double Br_ptd2Bti_ = Br * (*ptd2Bti);
391 for (
short int ip = 0; ip < NbParam_; ip++) {
392 *pt++ -= Br_ptdBti_ * val[ip];
393 for (
short int ip2 = 0; ip2 < NbParam_; ip2++) {
394 *pt++ += Br_ptd2Bti_ * val[ip] * val[ip2];
404 void vpTemplateTrackerMIBSpline::PutTotPVBspline4(
double *Prt,
double *dPrt,
double *d2Prt,
int cr,
double er,
int ct,
405 double et,
int Ncb,
double *val,
unsigned int &NbParam)
411 for (
size_t i = 0; i < 4; ++i) {
417 double *ptBti = &Bti[0];
418 double *ptdBti = &dBti[0];
419 double *ptd2Bti = &d2Bti[0];
420 for (
char it = -1; it <= 2; it++) {
421 *ptBti++ = vpTemplateTrackerBSpline::Bspline4(-it + et);
422 *ptdBti++ = dBspline4(-it + et);
423 *ptd2Bti++ = d2Bspline4(-it + et);
426 int NbParam_ = (int)NbParam;
428 for (
int ir = -1; ir <= 2; ir++) {
429 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
431 int ind = (cr + irInd) * Ncb + ct;
436 for (
int it = -1; it <= 2; it++) {
437 Prt[ind + it] += Br * *ptBti;
438 int ind1 = ((cr + irInd) * Ncb + (ct + it)) * NbParam_;
439 int ind2 = ind1 * NbParam_;
440 double Br_ptdBti_ = Br * (*ptdBti);
441 double Br_ptd2Bti_ = Br * (*ptd2Bti);
442 for (
int ip = 0; ip < NbParam_; ip++) {
443 dPrt[ind1 + ip] -= Br_ptdBti_ * val[ip];
444 int ind3 = ind2 + ip * NbParam_;
445 for (
int ip2 = 0; ip2 < NbParam_; ip2++)
446 d2Prt[ind3 + ip2] += Br_ptd2Bti_ * val[ip] * val[ip2];
455 void vpTemplateTrackerMIBSpline::PutTotPVBspline4(
double *Prt,
double &er,
double *bt,
unsigned int size)
458 double *bt0 = &bt[0];
460 for (
int ir = -1; ir <= 2; ++ir) {
461 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
462 const double *btend = bt0 + size;
467 for (; bt < btend; bt += LSIZE) {
468 *Prt++ += Br * bt[0];
469 *Prt++ += Br * bt[1];
470 *Prt++ += Br * bt[2];
471 *Prt++ += Br * bt[3];
472 *Prt++ += Br * bt[4];
473 *Prt++ += Br * bt[5];
474 *Prt++ += Br * bt[6];
475 *Prt++ += Br * bt[7];
476 *Prt++ += Br * bt[8];
477 *Prt++ += Br * bt[9];
478 *Prt++ += Br * bt[10];
479 *Prt++ += Br * bt[11];
483 for (; bt < btend; *Prt++ += Br * *bt++) {
489 void vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Nc,
490 double *val,
unsigned int &NbParam,
int °ree)
494 PutTotPVBspline4NoSecond(Prt, cr, er, ct, et, Nc, val, NbParam);
497 PutTotPVBspline3NoSecond(Prt, cr, er, ct, et, Nc, val, NbParam);
501 void vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
double *Prt,
double *dPrt,
int &cr,
double &er,
int &ct,
502 double &et,
int &Ncb,
double *val,
unsigned int &NbParam,
507 PutTotPVBspline4NoSecond(Prt, dPrt, cr, er, ct, et, Ncb, val, NbParam);
510 PutTotPVBspline3NoSecond(Prt, dPrt, cr, er, ct, et, Ncb, val, NbParam);
514 void vpTemplateTrackerMIBSpline::PutTotPVBspline3NoSecond(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
515 int &Nc,
double *val,
unsigned int &NbParam)
531 double *ptBti = &Bti[0];
532 double *ptdBti = &dBti[0];
533 for (
char it = -1; it <= 1; it++) {
534 *ptBti++ = Bspline3(-it + et);
535 *ptdBti++ = dBspline3(-it + et);
538 int NbParam_ = (int)NbParam;
540 double *pt = &Prt[((cr + sr) * Nc + (ct + st)) * 9 * (1 + NbParam_ + NbParam_ * NbParam_)];
541 for (
char ir = -1; ir <= 1; ir++) {
542 double Br = Bspline3(-ir + er);
545 for (
char it = -1; it <= 1; it++) {
546 *pt++ += Br * *ptBti;
547 double Br_ptdBti_ = Br * (*ptdBti);
548 for (
unsigned int ip = 0; ip < NbParam; ip++) {
549 *pt++ -= Br_ptdBti_ * val[ip];
559 void vpTemplateTrackerMIBSpline::PutTotPVBspline3NoSecond(
double *Prt,
double *dPrt,
int &cr,
double &er,
int &ct,
560 double &et,
int &Ncb,
double *val,
unsigned int &NbParam)
576 double *ptBti = &Bti[0];
577 double *ptdBti = &dBti[0];
578 for (
char it = -1; it <= 1; it++) {
579 *ptBti++ = Bspline3(-it + et);
580 *ptdBti++ = dBspline3(-it + et);
583 int NbParam_ =
static_cast<int>(NbParam);
584 int ct_st_ = ct + st;
585 int cr_sr_ = cr + sr;
587 for (
char ir = -1; ir <= 1; ir++) {
588 double Br = Bspline3(-ir + er);
591 int ind = (cr_sr_ + irInd) * Ncb;
595 double Br_ptBti_ = Br * (*ptBti);
596 double Br_ptdBti_ = Br * (*ptdBti);
597 for (
char it = -1; it <= 1; it++) {
598 Prt[ind + (ct_st_ + it)] += Br_ptBti_;
599 int ind1 = (ind + (ct_st_ + it)) * NbParam_;
600 for (
short int ip = 0; ip < NbParam_; ip++) {
601 dPrt[ind1 + ip] -= Br_ptdBti_ * val[ip];
609 void vpTemplateTrackerMIBSpline::PutTotPVBspline4NoSecond(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
610 int &Nc,
double *val,
unsigned int &NbParam)
612 double Bti[4] = {0, 0, 0, 0};
613 double dBti[4] = {0, 0, 0, 0};
615 for (
char it = -1; it <= 2; it++) {
616 Bti[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
617 dBti[it + 1] = dBspline4(-it + et);
620 int NbParam_ = (int)NbParam;
622 double *pt = &Prt[(cr * Nc + ct) * 16 * (1 + NbParam_ + NbParam_ * NbParam_)];
623 for (
int ir = -1; ir <= 2; ir++) {
624 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
625 for (
int it = 0; it <= 3; it++) {
626 (*pt++) += Br * Bti[it];
628 double Br_dBti_ = Br * dBti[it];
629 for (
int ip = 0; ip < NbParam_; ip++) {
630 (*pt++) -= Br_dBti_ * val[ip];
638 void vpTemplateTrackerMIBSpline::PutTotPVBspline4NoSecond(
double *Prt,
double *dPrt,
int &cr,
double &er,
int &ct,
639 double &et,
int &Ncb,
double *val,
unsigned int &NbParam)
641 double Bti[4] = {0, 0, 0, 0};
642 double dBti[4] = {0, 0, 0, 0};
644 for (
char it = -1; it <= 2; it++) {
645 Bti[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
646 dBti[it + 1] = dBspline4(-it + et);
649 int NbParam_ =
static_cast<int>(NbParam);
651 for (
int ir = -1; ir <= 2; ir++) {
652 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
654 int ind = (cr + irInd) * Ncb;
657 for (
int it = 0; it <= 3; it++) {
658 Prt[ind1 + it] += Br * Bti[it];
659 int ind2 = (ind + (ct + it)) * NbParam_;
661 double Br_dBti_ = Br * dBti[it];
662 for (
int ip = 0; ip < NbParam_; ip++) {
663 dPrt[ind2 + ip] -= Br_dBti_ * val[ip];
669 void vpTemplateTrackerMIBSpline::PutTotPVBsplinePrtTout(
double *PrtTout,
int &cr,
double &er,
int &ct,
double &et,
670 int &Nc,
unsigned int &NbParam,
int °ree)
674 PutTotPVBspline4PrtTout(PrtTout, cr, er, ct, et, Nc, NbParam);
677 PutTotPVBspline3PrtTout(PrtTout, cr, er, ct, et, Nc, NbParam);
681 void vpTemplateTrackerMIBSpline::PutTotPVBspline3PrtTout(
double *PrtTout,
int &cr,
double &er,
int &ct,
double &et,
682 int &Nc,
unsigned int &NbParam)
695 double Bti[3] = {0, 0, 0};
697 for (
char it = -1; it <= 1; it++) {
698 Bti[it + 1] = Bspline3(-it + et);
701 int NbParam_ =
static_cast<int>(NbParam);
702 int NbParam_val = NbParam_ + NbParam_ * NbParam_;
704 double *pt = &PrtTout[(
unsigned int)(((cr + sr) * Nc + (ct + st)) * 9 * (1 + NbParam_val))];
705 for (
int ir = -1; ir <= 1; ir++) {
706 double Br = Bspline3(-ir + er);
707 for (
int it = 0; it <= 2; it++) {
708 (*pt++) += Br * Bti[it];
713 void vpTemplateTrackerMIBSpline::PutTotPVBspline4PrtTout(
double *PrtTout,
int &cr,
double &er,
int &ct,
double &et,
714 int &Nc,
unsigned int &NbParam)
716 double Bti[4] = {0, 0, 0, 0};
718 for (
char it = -1; it <= 2; it++) {
719 Bti[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
722 int NbParam_ =
static_cast<int>(NbParam);
723 int NbParam_val = NbParam_ + NbParam_ * NbParam_;
724 double *pt = &PrtTout[(
unsigned int)((cr * Nc + ct) * 16 * (1 + NbParam_val))];
725 for (
int ir = -1; ir <= 2; ir++) {
726 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
727 for (
int it = 0; it <= 3; it++) {
728 (*pt++) += Br * Bti[it];
734 void vpTemplateTrackerMIBSpline::PutTotPVBsplinePrt(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Ncb,
735 unsigned int &NbParam,
int °ree)
739 PutTotPVBspline4PrtTout(Prt, cr, er, ct, et, Ncb, NbParam);
742 PutTotPVBspline3PrtTout(Prt, cr, er, ct, et, Ncb, NbParam);
746 void vpTemplateTrackerMIBSpline::PutTotPVBspline3Prt(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Ncb)
760 double Bti[3] = {0, 0, 0};
762 for (
char it = -1; it <= 1; it++) {
763 Bti[it + 1] = Bspline3(-it + et);
766 int ct_st_ = ct + st;
767 int cr_sr_ = cr + sr;
768 for (
int ir = -1; ir <= 1; ir++) {
769 double Br = Bspline3(-ir + er);
772 int ind = (cr_sr_ + irInd) * Ncb;
773 for (
int it = 0; it <= 2; it++) {
774 Prt[ind + (ct_st_ + it)] += Br * Bti[it];
779 void vpTemplateTrackerMIBSpline::PutTotPVBspline4Prt(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Ncb)
781 double Bti[4] = {0, 0, 0, 0};
783 for (
char it = -1; it <= 2; it++) {
784 Bti[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
787 for (
int ir = -1; ir <= 2; ir++) {
788 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
790 int ind = (cr + irInd) * Ncb + ct;
792 for (
int it = 0; it <= 3; it++) {
793 Prt[ind + it] += Br * Bti[it];
798 void vpTemplateTrackerMIBSpline::computeProbabilities(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Nc,
799 double *dW,
unsigned int &NbParam,
int &bspline,
801 bool use_hessien_des)
805 PutTotPVBspline3NoSecond(Prt, cr, er, ct, et, Nc, dW, NbParam);
807 PutTotPVBspline4NoSecond(Prt, cr, er, ct, et, Nc, dW, NbParam);
810 PutTotPVBspline3(Prt, cr, er, ct, et, Nc, dW, NbParam);
812 PutTotPVBspline4(Prt, cr, er, ct, et, Nc, dW, NbParam);
vpHessienApproximationType