Visual Servoing Platform
version 3.7.0
Toggle main menu visibility
Loading...
Searching...
No Matches
vpTemplateTrackerWarpAffine.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
* Template tracker.
32
*
33
* Authors:
34
* Amaury Dame
35
* Aurelien Yol
36
*/
37
#include <visp3/tt/vpTemplateTrackerWarpAffine.h>
38
39
BEGIN_VISP_NAMESPACE
43
vpTemplateTrackerWarpAffine::vpTemplateTrackerWarpAffine
() {
nbParam
= 6; }
44
51
void
vpTemplateTrackerWarpAffine::getParamPyramidDown
(
const
vpColVector
&p,
vpColVector
&p_down)
52
{
53
p_down[0] = p[0];
54
p_down[1] = p[1];
55
p_down[2] = p[2];
56
p_down[3] = p[3];
57
p_down[4] = p[4] / 2.;
58
p_down[5] = p[5] / 2.;
59
}
60
67
void
vpTemplateTrackerWarpAffine::getParamPyramidUp
(
const
vpColVector
&p,
vpColVector
&p_up)
68
{
69
p_up[0] = p[0];
70
p_up[1] = p[1];
71
p_up[2] = p[2];
72
p_up[3] = p[3];
73
p_up[4] = p[4] * 2.;
74
p_up[5] = p[5] * 2.;
75
}
76
85
void
vpTemplateTrackerWarpAffine::getdW0
(
const
int
&v,
const
int
&u,
const
double
&dv,
const
double
&du,
double
*dIdW)
86
{
87
dIdW[0] = u * du;
88
dIdW[1] = u * dv;
89
dIdW[2] = v * du;
90
dIdW[3] = v * dv;
91
dIdW[4] = du;
92
dIdW[5] = dv;
93
}
94
106
void
vpTemplateTrackerWarpAffine::getdWdp0
(
const
int
&v,
const
int
&u,
double
*dIdW)
107
{
108
dIdW[0] = u;
109
dIdW[1] = 0;
110
dIdW[2] = v;
111
dIdW[3] = 0;
112
dIdW[4] = 1.;
113
dIdW[5] = 0;
114
115
dIdW[6] = 0;
116
dIdW[7] = u;
117
dIdW[8] = 0;
118
dIdW[9] = v;
119
dIdW[10] = 0;
120
dIdW[11] = 1.;
121
}
122
132
void
vpTemplateTrackerWarpAffine::warpX
(
const
int
&v1,
const
int
&u1,
double
&v2,
double
&u2,
const
vpColVector
&p)
133
{
134
u2 = (1 + p[0]) * u1 + p[2] * v1 + p[4];
135
v2 = p[1] * u1 + (1 + p[3]) * v1 + p[5];
136
}
137
145
void
vpTemplateTrackerWarpAffine::warpX
(
const
vpColVector
&X1,
vpColVector
&X2,
const
vpColVector
&p)
146
{
147
X2[0] = (1.0 + p[0]) * X1[0] + p[2] * X1[1] + p[4];
148
X2[1] = p[1] * X1[0] + (1.0 + p[3]) * X1[1] + p[5];
149
}
150
160
void
vpTemplateTrackerWarpAffine::dWarp
(
const
vpColVector
&X,
const
vpColVector
&,
const
vpColVector
&,
vpMatrix
&dM)
161
{
162
double
u = X[0];
163
double
v = X[1];
164
165
dM[0][0] = u;
166
dM[0][1] = 0;
167
dM[0][2] = v;
168
dM[0][3] = 0;
169
dM[0][4] = 1;
170
dM[0][5] = 0;
171
dM[1][0] = 0;
172
dM[1][1] = u;
173
dM[1][2] = 0;
174
dM[1][3] = v;
175
dM[1][4] = 0;
176
dM[1][5] = 1;
177
}
178
186
void
vpTemplateTrackerWarpAffine::dWarpCompo
(
const
vpColVector
&,
const
vpColVector
&,
const
vpColVector
&p,
187
const
double
*dwdp0,
vpMatrix
&dM)
188
{
189
for
(
unsigned
int
i = 0; i <
nbParam
; i++) {
190
dM[0][i] = (1. + p[0]) * dwdp0[i] + p[2] * dwdp0[i +
nbParam
];
191
dM[1][i] = p[1] * dwdp0[i] + (1. + p[3]) * dwdp0[i +
nbParam
];
192
}
193
}
194
202
void
vpTemplateTrackerWarpAffine::warpXInv
(
const
vpColVector
&X1,
vpColVector
&X2,
const
vpColVector
&p)
203
{
204
X2[0] = (1 + p[0]) * X1[0] + p[2] * X1[1] + p[4];
205
X2[1] = p[1] * X1[0] + (1 + p[3]) * X1[1] + p[5];
206
}
207
214
void
vpTemplateTrackerWarpAffine::getParamInverse
(
const
vpColVector
&p,
vpColVector
&p_inv)
const
215
{
216
double
u = p[4];
217
double
v = p[5];
218
double
r_00 = 1 + p[0], r_01 = p[2];
219
double
r_10 = p[1], r_11 = 1 + p[3];
220
double
det = r_00 * r_11 - r_01 * r_10;
221
if
(std::fabs(det) < std::numeric_limits<double>::epsilon()) {
222
throw
(
vpException
(
vpException::fatalError
,
"In vpTemplateTrackerWarpAffine::getParamInverse() "
223
"cannot inverse 2-by-2 matrix. Matrix determinant is 0."
));
224
}
225
226
double
ri_11 = r_00 / det;
227
double
ri_00 = r_11 / det;
228
double
ri_01 = -r_01 / det;
229
double
ri_10 = -r_10 / det;
230
231
p_inv[0] = ri_00 - 1;
232
p_inv[1] = ri_10;
233
p_inv[2] = ri_01;
234
p_inv[3] = ri_11 - 1;
235
p_inv[4] = -(ri_00 * u + ri_01 * v);
236
p_inv[5] = -(ri_10 * u + ri_11 * v);
237
}
238
247
void
vpTemplateTrackerWarpAffine::pRondp
(
const
vpColVector
&p1,
const
vpColVector
&p2,
vpColVector
&p12)
const
248
{
249
double
r1_00 = 1 + p1[0], r1_01 = p1[2];
250
double
r1_10 = p1[1], r1_11 = 1 + p1[3];
251
double
r2_00 = 1 + p2[0], r2_01 = p2[2];
252
double
r2_10 = p2[1], r2_11 = 1 + p2[3];
253
double
u1 = p1[4];
254
double
v1 = p1[5];
255
double
u2 = p2[4];
256
double
v2 = p2[5];
257
258
p12[0] = r1_00 * r2_00 + r1_01 * r2_10 - 1.;
259
p12[1] = r1_10 * r2_00 + r1_11 * r2_10;
260
p12[2] = r1_00 * r2_01 + r1_01 * r2_11;
261
p12[3] = r1_10 * r2_01 + r1_11 * r2_11 - 1.;
262
p12[4] = r1_00 * u2 + r1_01 * v2 + u1;
263
p12[5] = r1_10 * u2 + r1_11 * v2 + v1;
264
}
265
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
vpException::fatalError
@ fatalError
Fatal error.
Definition
vpException.h:72
vpMatrix
Implementation of a matrix and operations on matrices.
Definition
vpMatrix.h:175
vpTemplateTrackerWarpAffine::pRondp
void pRondp(const vpColVector &p1, const vpColVector &p2, vpColVector &p12) const
Definition
vpTemplateTrackerWarpAffine.cpp:247
vpTemplateTrackerWarpAffine::getParamPyramidDown
void getParamPyramidDown(const vpColVector &p, vpColVector &p_down)
Definition
vpTemplateTrackerWarpAffine.cpp:51
vpTemplateTrackerWarpAffine::getdW0
void getdW0(const int &v, const int &u, const double &dv, const double &du, double *dIdW)
Definition
vpTemplateTrackerWarpAffine.cpp:85
vpTemplateTrackerWarpAffine::warpX
void warpX(const vpColVector &X1, vpColVector &X2, const vpColVector &p)
Definition
vpTemplateTrackerWarpAffine.cpp:145
vpTemplateTrackerWarpAffine::vpTemplateTrackerWarpAffine
vpTemplateTrackerWarpAffine()
Definition
vpTemplateTrackerWarpAffine.cpp:43
vpTemplateTrackerWarpAffine::getParamInverse
void getParamInverse(const vpColVector &p, vpColVector &p_inv) const
Definition
vpTemplateTrackerWarpAffine.cpp:214
vpTemplateTrackerWarpAffine::dWarp
void dWarp(const vpColVector &X, const vpColVector &, const vpColVector &, vpMatrix &dM)
Definition
vpTemplateTrackerWarpAffine.cpp:160
vpTemplateTrackerWarpAffine::getParamPyramidUp
void getParamPyramidUp(const vpColVector &p, vpColVector &p_up)
Definition
vpTemplateTrackerWarpAffine.cpp:67
vpTemplateTrackerWarpAffine::warpXInv
void warpXInv(const vpColVector &X1, vpColVector &X2, const vpColVector &p)
Definition
vpTemplateTrackerWarpAffine.cpp:202
vpTemplateTrackerWarpAffine::dWarpCompo
void dWarpCompo(const vpColVector &, const vpColVector &, const vpColVector &p, const double *dwdp0, vpMatrix &dM)
Definition
vpTemplateTrackerWarpAffine.cpp:186
vpTemplateTrackerWarpAffine::getdWdp0
void getdWdp0(const int &v, const int &u, double *dIdW)
Definition
vpTemplateTrackerWarpAffine.cpp:106
vpTemplateTrackerWarp::nbParam
unsigned int nbParam
Number of parameters used to model warp transformation.
Definition
vpTemplateTrackerWarp.h:68
BEGIN_VISP_NAMESPACE
Definition
vpMbtDistanceCircle.cpp:55
modules
tracker
tt
src
warp
vpTemplateTrackerWarpAffine.cpp
Generated by
1.17.0