34#include <visp3/tt_mi/vpTemplateTrackerMIBSpline.h>
36#ifndef DOXYGEN_SHOULD_SKIP_THIS
38void vpTemplateTrackerMIBSpline::PutPVBsplineD(
double *Prt,
int cr,
double er,
int ct,
double et,
int Nc,
double val,
43 PutPVBsplineD4(Prt, cr, er, ct, et, Nc, val);
46 PutPVBsplineD3(Prt, cr, er, ct, et, Nc, val);
50void vpTemplateTrackerMIBSpline::PutPVBsplineD3(
double *Prt,
int cr,
double er,
int ct,
double et,
int Nc,
double val)
62 double *pt = &Prt[((cr + sr) * Nc + (ct + st)) * 9];
63 if (std::fabs(val - 1.) > std::numeric_limits<double>::epsilon()) {
64 for (
int ir = -1; ir <= 1; ir++) {
65 double Bspline3_diff_r_ = Bspline3(ir - er);
66 for (
int it = -1; it <= 1; it++) {
67 *pt++ += Bspline3_diff_r_ * Bspline3(it - et) * val;
72 for (
int ir = -1; ir <= 1; ir++) {
73 double Bspline3_diff_r_ = Bspline3(ir - er);
74 for (
int it = -1; it <= 1; it++) {
75 *pt++ += Bspline3_diff_r_ * Bspline3(it - et);
81void vpTemplateTrackerMIBSpline::PutPVBsplineD4(
double *Prt,
int cr,
double er,
int ct,
double et,
int Nc,
double val)
85 double *ptBti = &Bti[0];
86 for (
int it = -1; it <= 2; it++) {
87 *ptBti++ = Bspline4i(it - et, it);
90 double *pt = &Prt[(cr * Nc + ct) * 16];
91 if (std::fabs(val - 1.) > std::numeric_limits<double>::epsilon()) {
92 for (
int ir = -1; ir <= 2; ir++) {
93 double Br = Bspline4i(ir - er, ir);
95 for (
int it = -1; it <= 2; it++) {
96 *pt++ += Br * (*ptBti++) * val;
101 for (
int ir = -1; ir <= 2; ir++) {
102 double Br = Bspline4i(ir - er, ir);
104 for (
int it = -1; it <= 2; it++) {
105 *pt++ += Br * (*ptBti++);
111double vpTemplateTrackerMIBSpline::Bspline3(
double diff)
113 double aDiff = std::fabs(diff);
117 return (-(aDiff * aDiff) + 0.75);
119 double tmp_ = 1.5 - aDiff;
120 return (0.5 * tmp_ * tmp_);
126double vpTemplateTrackerMIBSpline::Bspline4i(
double diff,
int &interv)
131 double tmp_ = 2. + diff;
132 return (tmp_ * tmp_ * tmp_ / 6.);
135 double diff2_ = diff * diff;
136 return (-diff2_ * diff / 2. - diff2_ + 4. / 6.);
139 double diff2_ = diff * diff;
140 return (diff2_ * diff / 2. - diff2_ + 4. / 6.);
147double vpTemplateTrackerMIBSpline::dBspline3(
double diff)
149 if ((diff > -1.5) && (diff <= -0.5))
151 else if ((diff > -0.5) && (diff <= 0.5))
153 else if ((diff > 0.5) && (diff <= 1.5))
159double vpTemplateTrackerMIBSpline::dBspline4(
double diff)
161 if ((diff > -2.) && (diff <= -1.)) {
162 double diff_2_ = diff + 2.;
163 return (diff_2_ * diff_2_ * 0.5);
165 else if ((diff > -1.) && (diff <= 0.)) {
166 return -1.5 * diff * diff - 2. * diff;
168 else if ((diff > 0.) && (diff <= 1.)) {
169 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_);
180double vpTemplateTrackerMIBSpline::d2Bspline3(
double diff)
182 if ((diff > -1.5) && (diff <= -0.5))
184 else if ((diff > -0.5) && (diff <= 0.5))
186 else if ((diff > 0.5) && (diff <= 1.5))
192double vpTemplateTrackerMIBSpline::d2Bspline4(
double diff)
194 if ((diff > -2.) && (diff <= -1.))
196 else if ((diff > -1.) && (diff <= 0.))
197 return -3. * diff - 2.;
198 else if ((diff > 0.) && (diff <= 1.))
199 return 3. * diff - 2.;
200 else if ((diff > 1.) && (diff <= 2.))
206void vpTemplateTrackerMIBSpline::PutTotPVBspline(
double *Prt,
int cr,
double &er,
int ct,
double &et,
int Nc,
207 double *val,
unsigned int &NbParam,
int °ree)
211 PutTotPVBspline4(Prt, cr, er, ct, et, Nc, val, NbParam);
214 PutTotPVBspline3(Prt, cr, er, ct, et, Nc, val, NbParam);
218void vpTemplateTrackerMIBSpline::PutTotPVBspline(
double *Prt,
double *dPrt,
double *d2Prt,
int cr,
double &er,
int ct,
219 double &et,
int Ncb,
double *val,
unsigned int &NbParam,
int °ree)
223 PutTotPVBspline4(Prt, dPrt, d2Prt, cr, er, ct, et, Ncb, val, NbParam);
226 PutTotPVBspline3(Prt, dPrt, d2Prt, cr, er, ct, et, Ncb, val, NbParam);
230void vpTemplateTrackerMIBSpline::PutTotPVBspline3(
double *Prt,
int cr,
double &er,
int ct,
double &et,
int Nc,
231 double *val,
unsigned int &NbParam)
248 double *ptBti = &Bti[0];
249 double *ptdBti = &dBti[0];
250 double *ptd2Bti = &d2Bti[0];
252 for (
short int it = 1; it >= -1; it--) {
253 *ptBti++ = Bspline3(it + et);
254 *ptdBti++ = dBspline3(it + et);
255 *ptd2Bti++ = d2Bspline3(it + et);
258 double *pt = &Prt[((cr + sr) * Nc + (ct + st)) * 9 * (1 +
static_cast<int>(NbParam + NbParam * NbParam))];
259 for (
short int ir = -1; ir <= 1; ++ir) {
260 double Br = Bspline3(-ir + er);
262 for (
short unsigned int it = 0; it <= 2; ++it) {
263 *pt++ += Br * (Bti[it]);
265 double v1 = Br * (dBti[it]);
266 for (
short unsigned int ip = 0; ip < NbParam; ++ip) {
267 *pt++ -= v1 * val[ip];
268 double v2 = Br * (d2Bti[it]) * val[ip];
269 for (
short unsigned int ip2 = 0; ip2 < NbParam; ++ip2)
270 *pt++ += v2 * val[ip2];
276void vpTemplateTrackerMIBSpline::PutTotPVBspline3(
double *Prt,
double *dPrt,
double *d2Prt,
int cr,
double &er,
int ct,
277 double &et,
int Ncb,
double *val,
unsigned int &NbParam)
294 double *ptBti = &Bti[0];
295 double *ptdBti = &dBti[0];
296 double *ptd2Bti = &d2Bti[0];
298 for (
short int it = 1; it >= -1; it--) {
299 *ptBti++ = Bspline3(it + et);
300 *ptdBti++ = dBspline3(it + et);
301 *ptd2Bti++ = d2Bspline3(it + et);
304 int NbParam_ =
static_cast<int>(NbParam);
305 for (
short int ir = -1; ir <= 1; ++ir) {
306 double Br = Bspline3(-ir + er);
307 short int irInd = ir + 1;
308 short int ind = (cr + sr + irInd) * Ncb;
309 for (
short int it = 0; it <= 2; ++it) {
310 Prt[ind + (ct + st + it)] += Br * (Bti[it]);
312 double v1 = Br * (dBti[it]);
313 int ind1 = ((cr + sr + irInd) * Ncb + (ct + st + it)) * NbParam_;
314 for (
int ip = 0; ip < NbParam_; ++ip) {
315 dPrt[ind1 + ip] -= v1 * val[ip];
316 double v2 = Br * (d2Bti[it]) * val[ip];
317 int ind2 = ((cr + sr + irInd) * Ncb + (ct + st + it)) * NbParam_ * NbParam_ + ip * NbParam_;
318 for (
short int ip2 = 0; ip2 < NbParam_; ++ip2)
319 d2Prt[ind2 + ip2] += v2 * val[ip2];
325void vpTemplateTrackerMIBSpline::PutTotPVBspline3(
double *Prt,
double &er,
double *bt,
unsigned int size)
329 double *bt0 = &bt[0];
334 for (
int ir = -1; ir <= 1; ++ir) {
335 double Br = Bspline3(-ir + er);
336 const double *btend = bt0 + size;
341 for (; bt < btend; bt += LSIZE) {
342 *Prt++ += Br * bt[0];
343 *Prt++ += Br * bt[1];
344 *Prt++ += Br * bt[2];
345 *Prt++ += Br * bt[3];
346 *Prt++ += Br * bt[4];
347 *Prt++ += Br * bt[5];
348 *Prt++ += Br * bt[6];
349 *Prt++ += Br * bt[7];
350 *Prt++ += Br * bt[8];
351 *Prt++ += Br * bt[9];
352 *Prt++ += Br * bt[10];
353 *Prt++ += Br * bt[11];
357 for (; bt < btend; *Prt++ += Br * *bt++) {
363void vpTemplateTrackerMIBSpline::PutTotPVBspline4(
double *Prt,
int cr,
double er,
int ct,
double et,
int Nc,
364 double *val,
unsigned int &NbParam)
370 double *ptBti = &Bti[0];
371 double *ptdBti = &dBti[0];
372 double *ptd2Bti = &d2Bti[0];
373 for (
char it = -1; it <= 2; it++) {
374 *ptBti++ = vpTemplateTrackerBSpline::Bspline4(-it + et);
375 *ptdBti++ = dBspline4(-it + et);
376 *ptd2Bti++ = d2Bspline4(-it + et);
379 int NbParam_ =
static_cast<int>(NbParam);
381 double *pt = &Prt[(cr * Nc + ct) * 16 * (1 + NbParam_ + NbParam_ * NbParam_)];
382 for (
char ir = -1; ir <= 2; ir++) {
383 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
387 for (
char it = -1; it <= 2; it++) {
388 double Br_ptBti_ = Br * (*ptBti);
389 double Br_ptdBti_ = Br * (*ptdBti);
390 double Br_ptd2Bti_ = Br * (*ptd2Bti);
392 for (
short int ip = 0; ip < NbParam_; ip++) {
393 *pt++ -= Br_ptdBti_ * val[ip];
394 for (
short int ip2 = 0; ip2 < NbParam_; ip2++) {
395 *pt++ += Br_ptd2Bti_ * val[ip] * val[ip2];
405void vpTemplateTrackerMIBSpline::PutTotPVBspline4(
double *Prt,
double *dPrt,
double *d2Prt,
int cr,
double er,
int ct,
406 double et,
int Ncb,
double *val,
unsigned int &NbParam)
412 for (
size_t i = 0;
i < 4; ++
i) {
418 double *ptBti = &Bti[0];
419 double *ptdBti = &dBti[0];
420 double *ptd2Bti = &d2Bti[0];
421 for (
char it = -1; it <= 2; it++) {
422 *ptBti++ = vpTemplateTrackerBSpline::Bspline4(-it + et);
423 *ptdBti++ = dBspline4(-it + et);
424 *ptd2Bti++ = d2Bspline4(-it + et);
427 int NbParam_ =
static_cast<int>(NbParam);
429 for (
int ir = -1; ir <= 2; ir++) {
430 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
432 int ind = (cr + irInd) * Ncb + ct;
437 for (
int it = -1; it <= 2; it++) {
438 Prt[ind + it] += Br * *ptBti;
439 int ind1 = ((cr + irInd) * Ncb + (ct + it)) * NbParam_;
440 int ind2 = ind1 * NbParam_;
441 double Br_ptdBti_ = Br * (*ptdBti);
442 double Br_ptd2Bti_ = Br * (*ptd2Bti);
443 for (
int ip = 0; ip < NbParam_; ip++) {
444 dPrt[ind1 + ip] -= Br_ptdBti_ * val[ip];
445 int ind3 = ind2 + ip * NbParam_;
446 for (
int ip2 = 0; ip2 < NbParam_; ip2++)
447 d2Prt[ind3 + ip2] += Br_ptd2Bti_ * val[ip] * val[ip2];
456void vpTemplateTrackerMIBSpline::PutTotPVBspline4(
double *Prt,
double &er,
double *bt,
unsigned int size)
459 double *bt0 = &bt[0];
461 for (
int ir = -1; ir <= 2; ++ir) {
462 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
463 const double *btend = bt0 + size;
468 for (; bt < btend; bt += LSIZE) {
469 *Prt++ += Br * bt[0];
470 *Prt++ += Br * bt[1];
471 *Prt++ += Br * bt[2];
472 *Prt++ += Br * bt[3];
473 *Prt++ += Br * bt[4];
474 *Prt++ += Br * bt[5];
475 *Prt++ += Br * bt[6];
476 *Prt++ += Br * bt[7];
477 *Prt++ += Br * bt[8];
478 *Prt++ += Br * bt[9];
479 *Prt++ += Br * bt[10];
480 *Prt++ += Br * bt[11];
484 for (; bt < btend; *Prt++ += Br * *bt++) {
490void vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Nc,
491 double *val,
unsigned int &NbParam,
int °ree)
495 PutTotPVBspline4NoSecond(Prt, cr, er, ct, et, Nc, val, NbParam);
498 PutTotPVBspline3NoSecond(Prt, cr, er, ct, et, Nc, val, NbParam);
502void vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
double *Prt,
double *dPrt,
int &cr,
double &er,
int &ct,
503 double &et,
int &Ncb,
double *val,
unsigned int &NbParam,
508 PutTotPVBspline4NoSecond(Prt, dPrt, cr, er, ct, et, Ncb, val, NbParam);
511 PutTotPVBspline3NoSecond(Prt, dPrt, cr, er, ct, et, Ncb, val, NbParam);
515void vpTemplateTrackerMIBSpline::PutTotPVBspline3NoSecond(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
516 int &Nc,
double *val,
unsigned int &NbParam)
532 double *ptBti = &Bti[0];
533 double *ptdBti = &dBti[0];
534 for (
char it = -1; it <= 1; it++) {
535 *ptBti++ = Bspline3(-it + et);
536 *ptdBti++ = dBspline3(-it + et);
539 int NbParam_ =
static_cast<int>(NbParam);
541 double *pt = &Prt[((cr + sr) * Nc + (ct + st)) * 9 * (1 + NbParam_ + NbParam_ * NbParam_)];
542 for (
char ir = -1; ir <= 1; ir++) {
543 double Br = Bspline3(-ir + er);
546 for (
char it = -1; it <= 1; it++) {
547 *pt++ += Br * *ptBti;
548 double Br_ptdBti_ = Br * (*ptdBti);
549 for (
unsigned int ip = 0; ip < NbParam; ip++) {
550 *pt++ -= Br_ptdBti_ * val[ip];
560void vpTemplateTrackerMIBSpline::PutTotPVBspline3NoSecond(
double *Prt,
double *dPrt,
int &cr,
double &er,
int &ct,
561 double &et,
int &Ncb,
double *val,
unsigned int &NbParam)
577 double *ptBti = &Bti[0];
578 double *ptdBti = &dBti[0];
579 for (
char it = -1; it <= 1; it++) {
580 *ptBti++ = Bspline3(-it + et);
581 *ptdBti++ = dBspline3(-it + et);
584 int NbParam_ =
static_cast<int>(NbParam);
585 int ct_st_ = ct + st;
586 int cr_sr_ = cr + sr;
588 for (
char ir = -1; ir <= 1; ir++) {
589 double Br = Bspline3(-ir + er);
592 int ind = (cr_sr_ + irInd) * Ncb;
596 double Br_ptBti_ = Br * (*ptBti);
597 double Br_ptdBti_ = Br * (*ptdBti);
598 for (
char it = -1; it <= 1; it++) {
599 Prt[ind + (ct_st_ + it)] += Br_ptBti_;
600 int ind1 = (ind + (ct_st_ + it)) * NbParam_;
601 for (
short int ip = 0; ip < NbParam_; ip++) {
602 dPrt[ind1 + ip] -= Br_ptdBti_ * val[ip];
610void vpTemplateTrackerMIBSpline::PutTotPVBspline4NoSecond(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
611 int &Nc,
double *val,
unsigned int &NbParam)
613 double Bti[4] = { 0, 0, 0, 0 };
614 double dBti[4] = { 0, 0, 0, 0 };
616 for (
char it = -1; it <= 2; it++) {
617 Bti[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
618 dBti[it + 1] = dBspline4(-it + et);
621 int NbParam_ =
static_cast<int>(NbParam);
623 double *pt = &Prt[(cr * Nc + ct) * 16 * (1 + NbParam_ + NbParam_ * NbParam_)];
624 for (
int ir = -1; ir <= 2; ir++) {
625 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
626 for (
int it = 0; it <= 3; it++) {
627 (*pt++) += Br * Bti[it];
629 double Br_dBti_ = Br * dBti[it];
630 for (
int ip = 0; ip < NbParam_; ip++) {
631 (*pt++) -= Br_dBti_ * val[ip];
639void vpTemplateTrackerMIBSpline::PutTotPVBspline4NoSecond(
double *Prt,
double *dPrt,
int &cr,
double &er,
int &ct,
640 double &et,
int &Ncb,
double *val,
unsigned int &NbParam)
642 double Bti[4] = { 0, 0, 0, 0 };
643 double dBti[4] = { 0, 0, 0, 0 };
645 for (
char it = -1; it <= 2; it++) {
646 Bti[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
647 dBti[it + 1] = dBspline4(-it + et);
650 int NbParam_ =
static_cast<int>(NbParam);
652 for (
int ir = -1; ir <= 2; ir++) {
653 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
655 int ind = (cr + irInd) * Ncb;
658 for (
int it = 0; it <= 3; it++) {
659 Prt[ind1 + it] += Br * Bti[it];
660 int ind2 = (ind + (ct + it)) * NbParam_;
662 double Br_dBti_ = Br * dBti[it];
663 for (
int ip = 0; ip < NbParam_; ip++) {
664 dPrt[ind2 + ip] -= Br_dBti_ * val[ip];
670void vpTemplateTrackerMIBSpline::PutTotPVBsplinePrtTout(
double *PrtTout,
int &cr,
double &er,
int &ct,
double &et,
671 int &Nc,
unsigned int &NbParam,
int °ree)
675 PutTotPVBspline4PrtTout(PrtTout, cr, er, ct, et, Nc, NbParam);
678 PutTotPVBspline3PrtTout(PrtTout, cr, er, ct, et, Nc, NbParam);
682void vpTemplateTrackerMIBSpline::PutTotPVBspline3PrtTout(
double *PrtTout,
int &cr,
double &er,
int &ct,
double &et,
683 int &Nc,
unsigned int &NbParam)
696 double Bti[3] = { 0, 0, 0 };
698 for (
char it = -1; it <= 1; it++) {
699 Bti[it + 1] = Bspline3(-it + et);
702 int NbParam_ =
static_cast<int>(NbParam);
703 int NbParam_val = NbParam_ + NbParam_ * NbParam_;
705 double *pt = &PrtTout[
static_cast<unsigned int>(((cr + sr) * Nc + (ct + st)) * 9 * (1 + NbParam_val))];
706 for (
int ir = -1; ir <= 1; ir++) {
707 double Br = Bspline3(-ir + er);
708 for (
int it = 0; it <= 2; it++) {
709 (*pt++) += Br * Bti[it];
714void vpTemplateTrackerMIBSpline::PutTotPVBspline4PrtTout(
double *PrtTout,
int &cr,
double &er,
int &ct,
double &et,
715 int &Nc,
unsigned int &NbParam)
717 double Bti[4] = { 0, 0, 0, 0 };
719 for (
char it = -1; it <= 2; it++) {
720 Bti[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
723 int NbParam_ =
static_cast<int>(NbParam);
724 int NbParam_val = NbParam_ + NbParam_ * NbParam_;
725 double *pt = &PrtTout[
static_cast<unsigned int>((cr * Nc + ct) * 16 * (1 + NbParam_val))];
726 for (
int ir = -1; ir <= 2; ir++) {
727 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
728 for (
int it = 0; it <= 3; it++) {
729 (*pt++) += Br * Bti[it];
735void vpTemplateTrackerMIBSpline::PutTotPVBsplinePrt(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Ncb,
736 unsigned int &NbParam,
int °ree)
740 PutTotPVBspline4PrtTout(Prt, cr, er, ct, et, Ncb, NbParam);
743 PutTotPVBspline3PrtTout(Prt, cr, er, ct, et, Ncb, NbParam);
747void vpTemplateTrackerMIBSpline::PutTotPVBspline3Prt(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Ncb)
761 double Bti[3] = { 0, 0, 0 };
763 for (
char it = -1; it <= 1; it++) {
764 Bti[it + 1] = Bspline3(-it + et);
767 int ct_st_ = ct + st;
768 int cr_sr_ = cr + sr;
769 for (
int ir = -1; ir <= 1; ir++) {
770 double Br = Bspline3(-ir + er);
773 int ind = (cr_sr_ + irInd) * Ncb;
774 for (
int it = 0; it <= 2; it++) {
775 Prt[ind + (ct_st_ + it)] += Br * Bti[it];
780void vpTemplateTrackerMIBSpline::PutTotPVBspline4Prt(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Ncb)
782 double Bti[4] = { 0, 0, 0, 0 };
784 for (
char it = -1; it <= 2; it++) {
785 Bti[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
788 for (
int ir = -1; ir <= 2; ir++) {
789 double Br = vpTemplateTrackerBSpline::Bspline4(-ir + er);
791 int ind = (cr + irInd) * Ncb + ct;
793 for (
int it = 0; it <= 3; it++) {
794 Prt[ind + it] += Br * Bti[it];
799void vpTemplateTrackerMIBSpline::computeProbabilities(
double *Prt,
int &cr,
double &er,
int &ct,
double &et,
int &Nc,
800 double *dW,
unsigned int &NbParam,
int &bspline,
802 bool use_hessien_des)
806 PutTotPVBspline3NoSecond(Prt, cr, er, ct, et, Nc, dW, NbParam);
808 PutTotPVBspline4NoSecond(Prt, cr, er, ct, et, Nc, dW, NbParam);
812 PutTotPVBspline3(Prt, cr, er, ct, et, Nc, dW, NbParam);
814 PutTotPVBspline4(Prt, cr, er, ct, et, Nc, dW, NbParam);
vpHessienApproximationType