Visual Servoing Platform
version 3.7.0
Toggle main menu visibility
Loading...
Searching...
No Matches
vpTemplateTrackerMIForwardCompositional.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
#include <visp3/tt_mi/vpTemplateTrackerMIForwardCompositional.h>
38
39
BEGIN_VISP_NAMESPACE
40
vpTemplateTrackerMIForwardCompositional::vpTemplateTrackerMIForwardCompositional
(
vpTemplateTrackerWarp
*_warp)
41
:
vpTemplateTrackerMI
(_warp),
CompoInitialised
(false)
42
{ }
43
44
void
vpTemplateTrackerMIForwardCompositional::initCompo
()
45
{
46
ptTemplateSupp =
new
vpTemplateTrackerPointSuppMIInv[
templateSize
];
47
for
(
unsigned
int
point = 0; point <
templateSize
; point++) {
48
int
i =
ptTemplate
[point].y;
49
int
j =
ptTemplate
[point].x;
50
X1
[0] = j;
51
X1
[1] = i;
52
Warp
->computeDenom(
X1
,
p
);
53
ptTemplate
[point].dW =
new
double
[2 *
nbParam
];
54
Warp
->getdWdp0(i, j,
ptTemplate
[point].
dW
);
55
56
double
Tij =
ptTemplate
[point].val;
57
int
ct =
static_cast<
int
>
((Tij * (
Nc
- 1)) / 255.);
58
double
et = (Tij * (
Nc
- 1)) / 255. - ct;
59
ptTemplateSupp[point].et = et;
60
ptTemplateSupp[point].ct = ct;
61
ptTemplateSupp[point].Bt =
new
double
[4];
62
ptTemplateSupp[point].dBt =
new
double
[4];
63
for
(
char
it = -1; it <= 2; it++) {
64
ptTemplateSupp[point].Bt[it + 1] = vpTemplateTrackerBSpline::Bspline4(-it + et);
65
ptTemplateSupp[point].dBt[it + 1] = vpTemplateTrackerMIBSpline::dBspline4(-it + et);
66
}
67
}
68
CompoInitialised
=
true
;
69
}
70
void
vpTemplateTrackerMIForwardCompositional::initHessienDesired
(
const
vpImage<unsigned char>
&I)
71
{
72
initCompo
();
73
74
dW
= 0;
75
76
if
(
blur
)
77
vpImageFilter::filter
(I,
BI
,
fgG
,
taillef
);
78
vpImageFilter::getGradXGauss2D
(I,
dIx
,
fgG
,
fgdG
,
taillef
);
79
vpImageFilter::getGradYGauss2D
(I,
dIy
,
fgG
,
fgdG
,
taillef
);
80
81
int
Nbpoint = 0;
82
83
double
IW, dx, dy;
84
int
cr, ct;
85
double
er, et;
86
87
Nbpoint = 0;
88
89
zeroProbabilities
();
90
91
Warp
->computeCoeff(
p
);
92
for
(
unsigned
int
point = 0; point <
templateSize
; point++) {
93
int
i =
ptTemplate
[point].y;
94
int
j =
ptTemplate
[point].x;
95
X1
[0] = j;
96
X1
[1] = i;
97
98
Warp
->computeDenom(
X1
,
p
);
99
Warp
->warpX(
X1
,
X2
,
p
);
100
101
double
j2 =
X2
[0];
102
double
i2 =
X2
[1];
103
104
if
((i2 >= 0) && (j2 >= 0) && (i2 < I.getHeight() - 1) && (j2 < I.getWidth() - 1)) {
105
Nbpoint++;
106
if
(!
blur
)
107
IW = I.getValue(i2, j2);
108
else
109
IW =
BI
.getValue(i2, j2);
110
111
dx =
dIx
.getValue(i2, j2) * (
Nc
- 1) / 255.;
112
dy =
dIy
.getValue(i2, j2) * (
Nc
- 1) / 255.;
113
114
cr = ptTemplateSupp[point].ct;
115
er = ptTemplateSupp[point].et;
116
ct =
static_cast<
int
>
((IW * (
Nc
- 1)) / 255.);
117
et = (
static_cast<
double
>
(IW) * (
Nc
- 1)) / 255. - ct;
118
119
Warp
->dWarpCompo(
X1
,
X2
,
p
,
ptTemplate
[point].
dW
,
dW
);
120
121
double
*tptemp =
new
double
[
nbParam
];
122
for
(
unsigned
int
it = 0; it <
nbParam
; it++)
123
tptemp[it] =
dW
[0][it] * dx +
dW
[1][it] * dy;
124
125
vpTemplateTrackerMIBSpline::PutTotPVBspline(
PrtTout
, cr, er, ct, et,
Nc
, tptemp,
nbParam
,
bspline
);
126
127
delete
[] tptemp;
128
}
129
}
130
double
MI;
131
computeProba
(Nbpoint);
132
computeMI
(MI);
133
computeHessien
(
Hdesire
);
134
135
lambda
=
lambdaDep
;
136
137
vpMatrix::computeHLM
(
Hdesire
,
lambda
,
HLMdesire
);
138
HLMdesireInverse
=
HLMdesire
.inverseByLU();
139
}
140
141
void
vpTemplateTrackerMIForwardCompositional::trackNoPyr
(
const
vpImage<unsigned char>
&I)
142
{
143
if
(!
CompoInitialised
) {
144
std::cout <<
"Compositionnal tracking not initialised.\nUse initCompo() function."
<< std::endl;
145
}
146
dW
= 0;
147
148
if
(
blur
) {
149
vpImageFilter::filter
(I,
BI
,
fgG
,
taillef
);
150
}
151
vpImageFilter::getGradXGauss2D
(I,
dIx
,
fgG
,
fgdG
,
taillef
);
152
vpImageFilter::getGradYGauss2D
(I,
dIy
,
fgG
,
fgdG
,
taillef
);
153
154
lambda
=
lambdaDep
;
155
double
MI = 0, MIprec = -1000;
156
157
MI_preEstimation
= -
getCost
(I,
p
);
158
159
initPosEvalRMS
(
p
);
160
161
double
i2, j2;
162
double
IW;
163
int
cr, ct;
164
double
er, et;
165
double
dx, dy;
166
167
vpColVector
dpinv(
nbParam
);
168
double
alpha = 2.;
169
170
int
i, j;
171
unsigned
int
iteration = 0;
172
173
double
evolRMS_init = 0;
174
double
evolRMS_prec = 0;
175
double
evolRMS_delta;
176
177
do
{
178
int
Nbpoint = 0;
179
MIprec = MI;
180
MI = 0;
181
182
zeroProbabilities
();
183
184
Warp
->computeCoeff(
p
);
185
186
for
(
unsigned
int
point = 0; point <
templateSize
; point++) {
187
i =
ptTemplate
[point].y;
188
j =
ptTemplate
[point].x;
189
X1
[0] = j;
190
X1
[1] = i;
191
Warp
->warpX(i, j, i2, j2,
p
);
192
X2
[0] = j2;
193
X2
[1] = i2;
194
195
Warp
->computeDenom(
X1
,
p
);
196
if
((i2 >= 0) && (j2 >= 0) && (i2 < I.getHeight() - 1) && (j2 < I.getWidth() - 1)) {
197
Nbpoint++;
198
if
(!
blur
)
199
IW = I.getValue(i2, j2);
200
else
201
IW =
BI
.getValue(i2, j2);
202
203
dx =
dIx
.getValue(i2, j2) * (
Nc
- 1) / 255.;
204
dy =
dIy
.getValue(i2, j2) * (
Nc
- 1) / 255.;
205
206
ct =
static_cast<
int
>
((IW * (
Nc
- 1)) / 255.);
207
et = (
static_cast<
double
>
(IW) * (
Nc
- 1)) / 255. - ct;
208
cr = ptTemplateSupp[point].ct;
209
er = ptTemplateSupp[point].et;
210
211
Warp
->dWarpCompo(
X1
,
X2
,
p
,
ptTemplate
[point].
dW
,
dW
);
212
213
double
*tptemp =
new
double
[
nbParam
];
214
for
(
unsigned
int
it = 0; it <
nbParam
; it++)
215
tptemp[it] =
dW
[0][it] * dx +
dW
[1][it] * dy;
216
217
if
(
ApproxHessian
==
HESSIAN_NONSECOND
||
hessianComputation
==
vpTemplateTrackerMI::USE_HESSIEN_DESIRE
)
218
vpTemplateTrackerMIBSpline::PutTotPVBsplineNoSecond(
PrtTout
, cr, er, ct, et,
Nc
, tptemp,
nbParam
,
bspline
);
219
else
if
(
ApproxHessian
==
HESSIAN_0
||
ApproxHessian
==
HESSIAN_NEW
)
220
vpTemplateTrackerMIBSpline::PutTotPVBspline(
PrtTout
, cr, er, ct, et,
Nc
, tptemp,
nbParam
,
bspline
);
221
222
delete
[] tptemp;
223
}
224
}
225
if
(Nbpoint == 0) {
226
diverge
=
true
;
227
MI = 0;
228
throw
(
vpTrackingException
(
vpTrackingException::notEnoughPointError
,
"No points in the template"
));
229
}
230
else
{
231
computeProba
(Nbpoint);
232
computeMI
(MI);
233
if
(
hessianComputation
!=
vpTemplateTrackerMI::USE_HESSIEN_DESIRE
)
234
computeHessien
(
H
);
235
computeGradient
();
236
237
vpMatrix::computeHLM
(
H
,
lambda
,
HLM
);
238
239
try
{
240
switch
(
hessianComputation
) {
241
case
vpTemplateTrackerMI::USE_HESSIEN_DESIRE
:
242
dp
=
gain
*
HLMdesireInverse
*
G
;
243
break
;
244
case
vpTemplateTrackerMI::USE_HESSIEN_BEST_COND
:
245
if
(
HLM
.cond() >
HLMdesire
.cond())
246
dp
=
gain
*
HLMdesireInverse
*
G
;
247
else
248
dp
=
gain
* 0.2 *
HLM
.inverseByLU() *
G
;
249
break
;
250
default
:
251
dp
=
gain
* 0.2 *
HLM
.inverseByLU() *
G
;
252
break
;
253
}
254
}
255
catch
(
const
vpException
&e) {
256
throw
(e);
257
}
258
}
259
260
if
(
ApproxHessian
==
HESSIAN_NONSECOND
)
261
dp
= -0.04 *
dp
;
262
// else
263
// dp = 1. * dp;
264
265
if
(
useBrent
) {
266
alpha = 2.;
267
computeOptimalBrentGain
(I,
p
, -MI,
dp
, alpha);
268
dp
= alpha *
dp
;
269
}
270
Warp
->pRondp(
p
,
dp
,
p
);
271
computeEvalRMS
(
p
);
272
273
if
(iteration == 0) {
274
evolRMS_init =
evolRMS
;
275
}
276
277
iteration++;
278
279
evolRMS_delta = std::fabs(
evolRMS
- evolRMS_prec);
280
evolRMS_prec =
evolRMS
;
281
282
}
while
((std::fabs(MI - MIprec) > std::fabs(MI) * std::numeric_limits<double>::epsilon()) &&
283
(iteration <
iterationMax
) && (evolRMS_delta > std::fabs(evolRMS_init) *
evolRMS_eps
));
284
285
nbIteration
= iteration;
286
287
MI_postEstimation
= -
getCost
(I,
p
);
288
if
(
MI_preEstimation
>
MI_postEstimation
) {
289
MI_postEstimation
= -1;
290
}
291
}
292
END_VISP_NAMESPACE
vpColVector
Implementation of column vector and the associated operations.
Definition
vpColVector.h:191
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
vpTemplateTrackerMIForwardCompositional::trackNoPyr
void trackNoPyr(const vpImage< unsigned char > &I)
Definition
vpTemplateTrackerMIForwardCompositional.cpp:141
vpTemplateTrackerMIForwardCompositional::initHessienDesired
void initHessienDesired(const vpImage< unsigned char > &I)
Definition
vpTemplateTrackerMIForwardCompositional.cpp:70
vpTemplateTrackerMIForwardCompositional::initCompo
void initCompo()
Definition
vpTemplateTrackerMIForwardCompositional.cpp:44
vpTemplateTrackerMIForwardCompositional::CompoInitialised
bool CompoInitialised
Definition
vpTemplateTrackerMIForwardCompositional.h:66
vpTemplateTrackerMIForwardCompositional::vpTemplateTrackerMIForwardCompositional
VP_EXPLICIT vpTemplateTrackerMIForwardCompositional(vpTemplateTrackerWarp *_warp)
Definition
vpTemplateTrackerMIForwardCompositional.cpp:40
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::lambdaDep
double lambdaDep
Definition
vpTemplateTracker.h:126
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::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::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
vpTemplateTrackerMIForwardCompositional.cpp
Generated by
1.17.0