Visual Servoing Platform
version 3.7.0
Toggle main menu visibility
Loading...
Searching...
No Matches
vpTemplateTrackerMIForwardAdditional.cpp
1
/*
2
* ViSP, open source Visual Servoing Platform software.
3
* Copyright (C) 2005 - 2025 by Inria. All rights reserved.
4
*
5
* This software is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
9
* See the file LICENSE.txt at the root directory of this source
10
* distribution for additional information about the GNU GPL.
11
*
12
* For using ViSP with software that can not be combined with the GNU
13
* GPL, please contact Inria about acquiring a ViSP Professional
14
* Edition License.
15
*
16
* See https://visp.inria.fr for more information.
17
*
18
* This software was developed at:
19
* Inria Rennes - Bretagne Atlantique
20
* Campus Universitaire de Beaulieu
21
* 35042 Rennes Cedex
22
* France
23
*
24
* If you have questions regarding the use of this file, please contact
25
* Inria at visp@inria.fr
26
*
27
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29
*
30
* Description:
31
* Example of template tracking.
32
*
33
* Authors:
34
* Amaury Dame
35
* Aurelien Yol
36
*/
37
38
#include <visp3/tt_mi/vpTemplateTrackerMIForwardAdditional.h>
39
40
#ifdef VISP_HAVE_OPENMP
41
#include <omp.h>
42
#endif
43
44
BEGIN_VISP_NAMESPACE
45
vpTemplateTrackerMIForwardAdditional::vpTemplateTrackerMIForwardAdditional
(
vpTemplateTrackerWarp
*_warp)
46
:
vpTemplateTrackerMI
(_warp), minimizationMethod(
USE_NEWTON
), p_prec(), G_prec(), KQuasiNewton()
47
{
48
useCompositionnal
=
false
;
49
}
50
51
void
vpTemplateTrackerMIForwardAdditional::initHessienDesired
(
const
vpImage<unsigned char>
&I)
52
{
53
dW
= 0;
54
55
int
Nbpoint = 0;
56
57
if
(
blur
)
58
vpImageFilter::filter
(I,
BI
,
fgG
,
taillef
);
59
vpImageFilter::getGradXGauss2D
(I,
dIx
,
fgG
,
fgdG
,
taillef
);
60
vpImageFilter::getGradYGauss2D
(I,
dIy
,
fgG
,
fgdG
,
taillef
);
61
62
double
Tij;
63
double
IW, dx, dy;
64
int
cr, ct;
65
double
er, et;
66
67
Nbpoint = 0;
68
69
zeroProbabilities
();
70
Warp
->computeCoeff(
p
);
71
for
(
unsigned
int
point = 0; point <
templateSize
; point++) {
72
int
i =
ptTemplate
[point].y;
73
int
j =
ptTemplate
[point].x;
74
X1
[0] = j;
75
X1
[1] = i;
76
X2
[0] = j;
77
X2
[1] = i;
78
79
Warp
->computeDenom(
X1
,
p
);
80
Warp
->warpX(
X1
,
X2
,
p
);
81
82
double
j2 =
X2
[0];
83
double
i2 =
X2
[1];
84
85
if
((i2 >= 0) && (j2 >= 0) && (i2 < I.getHeight() - 1) && (j2 < I.getWidth() - 1)) {
86
Nbpoint++;
87
Tij =
ptTemplate
[point].val;
88
if
(!
blur
)
89
IW = I.getValue(i2, j2);
90
else
91
IW =
BI
.getValue(i2, j2);
92
93
dx =
dIx
.getValue(i2, j2) * (
Nc
- 1) / 255.;
94
dy =
dIy
.getValue(i2, j2) * (
Nc
- 1) / 255.;
95
96
ct =
static_cast<
int
>
((IW * (
Nc
- 1)) / 255.);
97
cr =
static_cast<
int
>
((Tij * (
Nc
- 1)) / 255.);
98
et = (IW * (
Nc
- 1)) / 255. - ct;
99
er = (
static_cast<
double
>
(Tij) * (
Nc
- 1)) / 255. - cr;
100
Warp
->dWarp(
X1
,
X2
,
p
,
dW
);
101
102
double
*tptemp =
new
double
[
nbParam
];
103
for
(
unsigned
int
it = 0; it <
nbParam
; it++)
104
tptemp[it] =
dW
[0][it] * dx +
dW
[1][it] * dy;
105
106
if
(
ApproxHessian
==
HESSIAN_NONSECOND
)
107
vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
PrtTout
, cr, er, ct, et,
Nc
, tptemp,
nbParam
,
bspline
);
108
else
if
(
ApproxHessian
==
HESSIAN_0
||
ApproxHessian
==
HESSIAN_NEW
)
109
vpTemplateTrackerMIBSpline::PutTotPVBspline(
PrtTout
, cr, er, ct, et,
Nc
, tptemp,
nbParam
,
bspline
);
110
111
delete
[] tptemp;
112
}
113
}
114
115
if
(Nbpoint > 0) {
116
double
MI;
117
computeProba
(Nbpoint);
118
computeMI
(MI);
119
computeHessien
(
Hdesire
);
120
121
vpMatrix::computeHLM
(
Hdesire
,
lambda
,
HLMdesire
);
122
try
{
123
HLMdesireInverse
=
HLMdesire
.inverseByLU();
124
}
125
catch
(
const
vpException
&e) {
126
throw
(e);
127
}
128
}
129
}
130
131
void
vpTemplateTrackerMIForwardAdditional::trackNoPyr
(
const
vpImage<unsigned char>
&I)
132
{
133
dW
= 0;
134
135
int
Nbpoint = 0;
136
if
(
blur
)
137
vpImageFilter::filter
(I,
BI
,
fgG
,
taillef
);
138
vpImageFilter::getGradXGauss2D
(I,
dIx
,
fgG
,
fgdG
,
taillef
);
139
vpImageFilter::getGradYGauss2D
(I,
dIy
,
fgG
,
fgdG
,
taillef
);
140
141
double
MI = 0, MIprec = -1000;
142
143
MI_preEstimation
= -
getCost
(I,
p
);
144
145
double
alpha = 2.;
146
147
unsigned
int
iteration = 0;
148
149
initPosEvalRMS
(
p
);
150
double
evolRMS_init = 0;
151
double
evolRMS_prec = 0;
152
double
evolRMS_delta;
153
154
do
{
155
if
(iteration % 5 == 0)
156
initHessienDesired
(I);
157
Nbpoint = 0;
158
MIprec = MI;
159
MI = 0;
160
// erreur=0;
161
162
zeroProbabilities
();
163
164
Warp
->computeCoeff(
p
);
165
#ifdef VISP_HAVE_OPENMP
166
int
nthreads = omp_get_num_procs();
167
// std::cout << "file: " __FILE__ << " line: " << __LINE__ << " function:
168
// " << __FUNCTION__ << " nthread: " << nthreads << std::endl;
169
omp_set_num_threads(nthreads);
170
#pragma omp parallel for default(shared)
171
#endif
172
for
(
int
point = 0; point < static_cast<int>(
templateSize
); point++) {
173
int
i =
ptTemplate
[point].y;
174
int
j =
ptTemplate
[point].x;
175
X1
[0] = j;
176
X1
[1] = i;
177
178
Warp
->computeDenom(
X1
,
p
);
179
Warp
->warpX(
X1
,
X2
,
p
);
180
181
double
j2 =
X2
[0];
182
double
i2 =
X2
[1];
183
184
if
((i2 >= 0) && (j2 >= 0) && (i2 < I.getHeight() - 1) && (j2 < I.getWidth() - 1)) {
185
Nbpoint++;
186
double
Tij =
ptTemplate
[point].val;
187
double
IW;
188
if
(!
blur
)
189
IW = I.getValue(i2, j2);
190
else
191
IW =
BI
.getValue(i2, j2);
192
193
double
dx =
dIx
.getValue(i2, j2) * (
Nc
- 1) / 255.;
194
double
dy =
dIy
.getValue(i2, j2) * (
Nc
- 1) / 255.;
195
196
int
ct =
static_cast<
int
>
((IW * (
Nc
- 1)) / 255.);
197
int
cr =
static_cast<
int
>
((Tij * (
Nc
- 1)) / 255.);
198
double
et = (IW * (
Nc
- 1)) / 255. - ct;
199
double
er = (
static_cast<
double
>
(Tij) * (
Nc
- 1)) / 255. - cr;
200
201
Warp
->dWarp(
X1
,
X2
,
p
,
dW
);
202
203
double
*tptemp =
new
double
[
nbParam
];
204
for
(
unsigned
int
it = 0; it <
nbParam
; it++)
205
tptemp[it] = (
dW
[0][it] * dx +
dW
[1][it] * dy);
206
if
(
ApproxHessian
==
HESSIAN_NONSECOND
||
hessianComputation
==
vpTemplateTrackerMI::USE_HESSIEN_DESIRE
)
207
vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
PrtTout
, cr, er, ct, et,
Nc
, tptemp,
nbParam
,
bspline
);
208
else
if
(
ApproxHessian
==
HESSIAN_0
||
ApproxHessian
==
HESSIAN_NEW
)
209
vpTemplateTrackerMIBSpline::PutTotPVBspline(
PrtTout
, cr, er, ct, et,
Nc
, tptemp,
nbParam
,
bspline
);
210
211
delete
[] tptemp;
212
}
213
}
214
215
if
(Nbpoint == 0) {
216
diverge
=
true
;
217
MI = 0;
218
throw
(
vpTrackingException
(
vpTrackingException::notEnoughPointError
,
"No points in the template"
));
219
}
220
else
{
221
computeProba
(Nbpoint);
222
computeMI
(MI);
223
computeHessien
(
H
);
224
computeGradient
();
225
226
vpMatrix::computeHLM
(
H
,
lambda
,
HLM
);
227
try
{
228
switch
(
hessianComputation
) {
229
case
vpTemplateTrackerMI::USE_HESSIEN_DESIRE
:
230
dp
=
gain
*
HLMdesireInverse
*
G
;
231
break
;
232
case
vpTemplateTrackerMI::USE_HESSIEN_BEST_COND
:
233
if
(
HLM
.cond() >
HLMdesire
.cond())
234
dp
=
gain
*
HLMdesireInverse
*
G
;
235
else
236
dp
=
gain
* 0.2 *
HLM
.inverseByLU() *
G
;
237
break
;
238
default
:
239
dp
=
gain
* 0.2 *
HLM
.inverseByLU() *
G
;
240
break
;
241
}
242
}
243
catch
(
const
vpException
&e) {
244
throw
(e);
245
}
246
}
247
248
switch
(minimizationMethod) {
249
case
vpTemplateTrackerMIForwardAdditional::USE_LMA
: {
250
vpColVector
p_test_LMA(
nbParam
);
251
if
(
ApproxHessian
==
HESSIAN_NONSECOND
)
252
p_test_LMA =
p
- 100000.1 *
dp
;
253
else
254
p_test_LMA =
p
+
dp
;
255
MI = -
getCost
(I,
p
);
256
double
MI_LMA = -
getCost
(I, p_test_LMA);
257
if
(MI_LMA > MI) {
258
p
= p_test_LMA;
259
lambda
= (
lambda
/ 10. < 1e-6) ?
lambda
/ 10. : 1e-6;
260
}
261
else
{
262
lambda
= (
lambda
* 10. < 1e6) ? 1e6 :
lambda
* 10.;
263
}
264
}
break
;
265
case
vpTemplateTrackerMIForwardAdditional::USE_GRADIENT
: {
266
dp
= -
gain
* 6.0 *
G
;
267
if
(
useBrent
) {
268
alpha = 2.;
269
computeOptimalBrentGain
(I,
p
, -MI,
dp
, alpha);
270
dp
= alpha *
dp
;
271
}
272
p
+=
dp
;
273
break
;
274
}
275
276
case
vpTemplateTrackerMIForwardAdditional::USE_QUASINEWTON
: {
277
if
(
iterationGlobale
!= 0) {
278
vpColVector
s_quasi =
p
- p_prec;
279
vpColVector
y_quasi =
G
- G_prec;
280
double
s_scal_y = s_quasi.
t
() * y_quasi;
281
if
(std::fabs(s_scal_y) > std::numeric_limits<double>::epsilon()) {
282
KQuasiNewton = KQuasiNewton + 0.001 * (s_quasi * s_quasi.
t
() / s_scal_y -
283
KQuasiNewton * y_quasi * y_quasi.
t
() * KQuasiNewton /
284
(y_quasi.
t
() * KQuasiNewton * y_quasi));
285
}
286
}
287
dp
= -KQuasiNewton *
G
;
288
p_prec =
p
;
289
G_prec =
G
;
290
p
-= 1.01 *
dp
;
291
}
break
;
292
293
default
: {
294
if
(
ApproxHessian
==
HESSIAN_NONSECOND
)
295
dp
= -0.1 *
dp
;
296
if
(
useBrent
) {
297
alpha = 2.;
298
computeOptimalBrentGain
(I,
p
, -MI,
dp
, alpha);
299
dp
= alpha *
dp
;
300
}
301
302
p
+=
dp
;
303
break
;
304
}
305
}
306
307
computeEvalRMS
(
p
);
308
309
if
(iteration == 0) {
310
evolRMS_init =
evolRMS
;
311
}
312
iteration++;
313
iterationGlobale
++;
314
315
evolRMS_delta = std::fabs(
evolRMS
- evolRMS_prec);
316
evolRMS_prec =
evolRMS
;
317
318
}
while
((std::fabs(MI - MIprec) > std::fabs(MI) * std::numeric_limits<double>::epsilon()) &&
319
(iteration <
iterationMax
) && (evolRMS_delta > std::fabs(evolRMS_init) *
evolRMS_eps
));
320
321
if
(Nbpoint == 0) {
322
throw
(
vpTrackingException
(
vpTrackingException::notEnoughPointError
,
"No points in the template"
));
323
}
324
325
nbIteration
= iteration;
326
MI_postEstimation
= -
getCost
(I,
p
);
327
if
(
MI_preEstimation
>
MI_postEstimation
) {
328
MI_postEstimation
= -1;
329
}
330
}
331
END_VISP_NAMESPACE
vpColVector
Implementation of column vector and the associated operations.
Definition
vpColVector.h:191
vpColVector::t
vpRowVector t() const
Definition
vpColVector.cpp:558
vpException
error that can be emitted by ViSP classes.
Definition
vpException.h:60
vpImageFilter::getGradXGauss2D
static void getGradXGauss2D(const vpImage< ImageType > &I, vpImage< FilterType > &dIx, const FilterType *gaussianKernel, const FilterType *gaussianDerivativeKernel, unsigned int size, const vpImage< bool > *p_mask=nullptr)
Definition
vpImageFilter.h:2038
vpImageFilter::filter
static void filter(const vpImage< ImageType > &I, vpImage< FilterType > &If, const vpArray2D< FilterType > &M, bool convolve=false, const vpImage< bool > *p_mask=nullptr)
Definition
vpImageFilter.h:715
vpImageFilter::getGradYGauss2D
static void getGradYGauss2D(const vpImage< ImageType > &I, vpImage< FilterType > &dIy, const FilterType *gaussianKernel, const FilterType *gaussianDerivativeKernel, unsigned int size, const vpImage< bool > *p_mask=nullptr)
Definition
vpImageFilter.h:2189
vpImage
Definition of the vpImage class member functions.
Definition
vpImage.h:131
vpMatrix::computeHLM
static void computeHLM(const vpMatrix &H, const double &alpha, vpMatrix &HLM)
Definition
vpMatrix.cpp:1882
vpTemplateTrackerMIForwardAdditional::vpTemplateTrackerMIForwardAdditional
vpTemplateTrackerMIForwardAdditional()
Default constructor.
Definition
vpTemplateTrackerMIForwardAdditional.h:82
vpTemplateTrackerMIForwardAdditional::initHessienDesired
void initHessienDesired(const vpImage< unsigned char > &I)
Definition
vpTemplateTrackerMIForwardAdditional.cpp:51
vpTemplateTrackerMIForwardAdditional::trackNoPyr
void trackNoPyr(const vpImage< unsigned char > &I)
Definition
vpTemplateTrackerMIForwardAdditional.cpp:131
vpTemplateTrackerMIForwardAdditional::USE_LMA
@ USE_LMA
Definition
vpTemplateTrackerMIForwardAdditional.h:67
vpTemplateTrackerMIForwardAdditional::USE_GRADIENT
@ USE_GRADIENT
Definition
vpTemplateTrackerMIForwardAdditional.h:67
vpTemplateTrackerMIForwardAdditional::USE_QUASINEWTON
@ USE_QUASINEWTON
Definition
vpTemplateTrackerMIForwardAdditional.h:67
vpTemplateTrackerMIForwardAdditional::USE_NEWTON
@ USE_NEWTON
Definition
vpTemplateTrackerMIForwardAdditional.h:67
vpTemplateTrackerMI::lambda
double lambda
Definition
vpTemplateTrackerMI.h:77
vpTemplateTrackerMI::MI_postEstimation
double MI_postEstimation
Definition
vpTemplateTrackerMI.h:102
vpTemplateTrackerMI::ApproxHessian
vpHessienApproximationType ApproxHessian
Definition
vpTemplateTrackerMI.h:76
vpTemplateTrackerMI::MI_preEstimation
double MI_preEstimation
Definition
vpTemplateTrackerMI.h:101
vpTemplateTrackerMI::hessianComputation
vpHessienType hessianComputation
Definition
vpTemplateTrackerMI.h:75
vpTemplateTrackerMI::getCost
double getCost(const vpImage< unsigned char > &I, const vpColVector &tp) VP_OVERRIDE
Definition
vpTemplateTrackerMI.cpp:145
vpTemplateTrackerMI::computeMI
void computeMI(double &MI)
Definition
vpTemplateTrackerMI.cpp:381
vpTemplateTrackerMI::computeProba
void computeProba(int &nbpoint)
Definition
vpTemplateTrackerMI.cpp:336
vpTemplateTrackerMI::Nc
int Nc
Definition
vpTemplateTrackerMI.h:94
vpTemplateTrackerMI::computeHessien
void computeHessien(vpMatrix &H)
Definition
vpTemplateTrackerMI.cpp:414
vpTemplateTrackerMI::HESSIAN_NONSECOND
@ HESSIAN_NONSECOND
Definition
vpTemplateTrackerMI.h:60
vpTemplateTrackerMI::HESSIAN_NEW
@ HESSIAN_NEW
Definition
vpTemplateTrackerMI.h:65
vpTemplateTrackerMI::HESSIAN_0
@ HESSIAN_0
Definition
vpTemplateTrackerMI.h:61
vpTemplateTrackerMI::computeGradient
void computeGradient()
Definition
vpTemplateTrackerMI.cpp:544
vpTemplateTrackerMI::bspline
int bspline
Definition
vpTemplateTrackerMI.h:92
vpTemplateTrackerMI::PrtTout
double * PrtTout
Definition
vpTemplateTrackerMI.h:85
vpTemplateTrackerMI::vpTemplateTrackerMI
vpTemplateTrackerMI(const vpTemplateTrackerMI &)=delete
vpTemplateTrackerMI::USE_HESSIEN_DESIRE
@ USE_HESSIEN_DESIRE
Definition
vpTemplateTrackerMI.h:69
vpTemplateTrackerMI::USE_HESSIEN_BEST_COND
@ USE_HESSIEN_BEST_COND
Definition
vpTemplateTrackerMI.h:69
vpTemplateTrackerMI::zeroProbabilities
void zeroProbabilities()
Definition
vpTemplateTrackerMI.cpp:571
vpTemplateTrackerWarp
Definition
vpTemplateTrackerWarp.h:65
vpTemplateTracker::nbParam
unsigned int nbParam
Definition
vpTemplateTracker.h:125
vpTemplateTracker::dIx
vpImage< double > dIx
Definition
vpTemplateTracker.h:148
vpTemplateTracker::useBrent
bool useBrent
Definition
vpTemplateTracker.h:117
vpTemplateTracker::dIy
vpImage< double > dIy
Definition
vpTemplateTracker.h:149
vpTemplateTracker::HLMdesireInverse
vpMatrix HLMdesireInverse
Definition
vpTemplateTracker.h:109
vpTemplateTracker::computeEvalRMS
void computeEvalRMS(const vpColVector &p)
Definition
vpTemplateTracker.cpp:790
vpTemplateTracker::Hdesire
vpMatrix Hdesire
Definition
vpTemplateTracker.h:104
vpTemplateTracker::G
vpColVector G
Definition
vpTemplateTracker.h:111
vpTemplateTracker::evolRMS
double evolRMS
Definition
vpTemplateTracker.h:76
vpTemplateTracker::p
vpColVector p
Definition
vpTemplateTracker.h:138
vpTemplateTracker::computeOptimalBrentGain
void computeOptimalBrentGain(const vpImage< unsigned char > &I, vpColVector &tp, double tMI, vpColVector &direction, double &alpha)
Definition
vpTemplateTracker.cpp:371
vpTemplateTracker::H
vpMatrix H
Definition
vpTemplateTracker.h:103
vpTemplateTracker::evolRMS_eps
double evolRMS_eps
Definition
vpTemplateTracker.h:79
vpTemplateTracker::gain
double gain
Definition
vpTemplateTracker.h:113
vpTemplateTracker::X2
vpColVector X2
Definition
vpTemplateTracker.h:143
vpTemplateTracker::taillef
unsigned int taillef
Definition
vpTemplateTracker.h:119
vpTemplateTracker::fgdG
double * fgdG
Definition
vpTemplateTracker.h:121
vpTemplateTracker::iterationMax
unsigned int iterationMax
Definition
vpTemplateTracker.h:127
vpTemplateTracker::initPosEvalRMS
void initPosEvalRMS(const vpColVector &p)
Definition
vpTemplateTracker.cpp:823
vpTemplateTracker::nbIteration
unsigned int nbIteration
Definition
vpTemplateTracker.h:132
vpTemplateTracker::useCompositionnal
bool useCompositionnal
Definition
vpTemplateTracker.h:133
vpTemplateTracker::ptTemplate
vpTemplateTrackerPoint * ptTemplate
Definition
vpTemplateTracker.h:81
vpTemplateTracker::HLMdesire
vpMatrix HLMdesire
Definition
vpTemplateTracker.h:107
vpTemplateTracker::dW
vpMatrix dW
Definition
vpTemplateTracker.h:145
vpTemplateTracker::dp
vpColVector dp
Definition
vpTemplateTracker.h:139
vpTemplateTracker::fgG
double * fgG
Definition
vpTemplateTracker.h:120
vpTemplateTracker::Warp
vpTemplateTrackerWarp * Warp
Definition
vpTemplateTracker.h:136
vpTemplateTracker::diverge
bool diverge
Definition
vpTemplateTracker.h:131
vpTemplateTracker::iterationGlobale
unsigned int iterationGlobale
Definition
vpTemplateTracker.h:129
vpTemplateTracker::blur
bool blur
Definition
vpTemplateTracker.h:116
vpTemplateTracker::BI
vpImage< double > BI
Definition
vpTemplateTracker.h:147
vpTemplateTracker::X1
vpColVector X1
Definition
vpTemplateTracker.h:142
vpTemplateTracker::HLM
vpMatrix HLM
Definition
vpTemplateTracker.h:106
vpTemplateTracker::templateSize
unsigned int templateSize
Definition
vpTemplateTracker.h:84
vpTrackingException
Error that can be emitted by the vpTracker class and its derivatives.
Definition
vpTrackingException.h:55
vpTrackingException::notEnoughPointError
@ notEnoughPointError
Not enough point to track.
Definition
vpTrackingException.h:65
BEGIN_VISP_NAMESPACE
Definition
vpMbtDistanceCircle.cpp:55
modules
tracker
tt_mi
src
mi
vpTemplateTrackerMIForwardAdditional.cpp
Generated by
1.17.0