39#include <visp3/core/vpImageFilter.h>
40#include <visp3/tt/vpTemplateTrackerZNCCInverseCompositional.h>
54 for (
unsigned int point = 0; point <
templateSize; point++) {
84 Warp->computeCoeff(
p);
85 double Ic, dIcx = 0., dIcy = 0.;
94 double *tempt =
new double[
nbParam];
101 for (
unsigned int point = 0; point <
templateSize; point++) {
112 if ((i2 >= 0) && (j2 >= 0) && (i2 < I.getHeight() - 1) && (j2 < I.getWidth() - 1)) {
116 Ic = I.getValue(i2, j2);
118 Ic =
BI.getValue(i2, j2);
124 for (
unsigned int it = 0; it <
nbParam; it++)
128 for (
unsigned int it = 0; it <
nbParam; it++)
129 tempt[it] =
dW[0][it] * dIcx +
dW[1][it] * dIcy;
130 double d_Ixx = dIxx.
getValue(i2, j2);
131 double d_Iyy = dIyy.
getValue(i2, j2);
132 double d_Ixy = dIxy.
getValue(i2, j2);
134 for (
unsigned int it = 0; it <
nbParam; it++)
135 for (
unsigned int jt = 0; jt <
nbParam; jt++) {
136 moyd2Iref[it][jt] += (
dW[0][it] * (
dW[0][jt] * d_Ixx +
dW[1][jt] * d_Ixy) +
137 dW[1][it] * (
dW[0][jt] * d_Ixy +
dW[1][jt] * d_Iyy));
142 moyIref = moyIref / Nbpoint;
144 moyd2Iref = moyd2Iref / Nbpoint;
145 moyIc = moyIc / Nbpoint;
147 double covarIref = 0, covarIc = 0;
155 for (
unsigned int point = 0; point <
templateSize; point++) {
168 if ((i2 >= 0) && (j2 >= 0) && (i2 < I.getHeight() - 1) && (j2 < I.getWidth() - 1)) {
172 Ic = I.getValue(i2, j2);
174 Ic =
BI.getValue(i2, j2);
176 dIcx =
dIx.getValue(i2, j2);
177 dIcy =
dIy.getValue(i2, j2);
181 for (
unsigned int it = 0; it <
nbParam; it++) {
182 tempt[it] =
dW[0][it] * dIcx +
dW[1][it] * dIcy;
185 double prodIc = (Ic - moyIc);
187 double d_Ixx = dIxx.
getValue(i2, j2);
188 double d_Iyy = dIyy.
getValue(i2, j2);
189 double d_Ixy = dIxy.
getValue(i2, j2);
191 for (
unsigned int it = 0; it <
nbParam; it++) {
192 for (
unsigned int jt = 0; jt <
nbParam; jt++) {
193 sIcd2Iref[it][jt] += prodIc * (
dW[0][it] * (
dW[0][jt] * d_Ixx +
dW[1][jt] * d_Ixy) +
194 dW[1][it] * (
dW[0][jt] * d_Ixy +
dW[1][jt] * d_Iyy) - moyd2Iref[it][jt]);
195 sdIrefdIref[it][jt] +=
200 for (
unsigned int it = 0; it <
nbParam; it++)
203 covarIref += (Iref - moyIref) * (Iref - moyIref);
204 covarIc += (Ic - moyIc) * (Ic - moyIc);
205 sIcIref += (Iref - moyIref) * (Ic - moyIc);
210 covarIref = sqrt(covarIref);
211 covarIc = sqrt(covarIc);
213 denom = covarIref * covarIc;
215 double NCC = sIcIref / denom;
217 dcovarIref = -sIcdIref / covarIref;
220 dNCC = (sIcdIref / denom - NCC * dcovarIref / covarIref);
222 d2covarIref = -(sIcd2Iref - sdIrefdIref + dcovarIref * dcovarIref.
t()) / covarIref;
226 Hdesire = (sIcd2Iref - sdIrefdIref + dcovarIref * dcovarIref.
t()) / denom;
240 unsigned int iteration = 0;
245 double evolRMS_init = 0;
246 double evolRMS_prec = 0;
247 double evolRMS_delta;
250 unsigned int Nbpoint = 0;
252 Warp->computeCoeff(
p);
255 for (
unsigned int point = 0; point <
templateSize; point++) {
266 if ((i2 >= 0) && (j2 >= 0) && (i2 < I.getHeight() - 1) && (j2 < I.getWidth() - 1)) {
270 Ic = I.getValue(i2, j2);
272 Ic =
BI.getValue(i2, j2);
280 moyIref = moyIref / Nbpoint;
281 moyIc = moyIc / Nbpoint;
283 double covarIref = 0, covarIc = 0;
289 for (
unsigned int point = 0; point <
templateSize; point++) {
300 if ((i2 >= 0) && (j2 >= 0) && (i2 < I.getHeight() - 1) && (j2 < I.getWidth() - 1)) {
304 Ic = I.getValue(i2, j2);
306 Ic =
BI.getValue(i2, j2);
308 double prod = (Ic - moyIc);
309 for (
unsigned int it = 0; it <
nbParam; it++)
311 for (
unsigned int it = 0; it <
nbParam; it++)
314 covarIref += (Iref - moyIref) * (Iref - moyIref);
315 covarIc += (Ic - moyIc) * (Ic - moyIc);
316 sIcIref += (Iref - moyIref) * (Ic - moyIc);
319 covarIref = sqrt(covarIref);
320 covarIc = sqrt(covarIc);
321 double denom = covarIref * covarIc;
323 if (std::fabs(denom) <= std::numeric_limits<double>::epsilon()) {
327 double NCC = sIcIref / denom;
329 dcovarIref = sIrefdIref / covarIref;
330 G = (sIcdIref / denom - NCC * dcovarIref / covarIref);
339 Warp->getParamInverse(
dp, dpinv);
340 Warp->pRondp(
p, dpinv,
p);
348 if (iteration == 0) {
353 evolRMS_delta = std::fabs(
evolRMS - evolRMS_prec);
Implementation of column vector and the associated operations.
error that can be emitted by ViSP classes.
static void getGradX(const vpImage< unsigned char > &I, vpImage< FilterType > &dIx, const vpImage< bool > *p_mask=nullptr)
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)
static void filter(const vpImage< ImageType > &I, vpImage< FilterType > &If, const vpArray2D< FilterType > &M, bool convolve=false, const vpImage< bool > *p_mask=nullptr)
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)
static void getGradY(const vpImage< unsigned char > &I, vpImage< FilterType > &dIy, const vpImage< bool > *p_mask=nullptr)
Definition of the vpImage class member functions.
Type getValue(unsigned int i, unsigned int j) const
Implementation of a matrix and operations on matrices.
static void computeHLM(const vpMatrix &H, const double &alpha, vpMatrix &HLM)
void initHessienDesired(const vpImage< unsigned char > &I)
VP_EXPLICIT vpTemplateTrackerZNCCInverseCompositional(vpTemplateTrackerWarp *warp)
void trackNoPyr(const vpImage< unsigned char > &I)
void initCompInverse(const vpImage< unsigned char > &I)
VP_EXPLICIT vpTemplateTrackerZNCC(vpTemplateTrackerWarp *warp)
vpMatrix HLMdesireInverse
void computeEvalRMS(const vpColVector &p)
unsigned int iterationMax
void initPosEvalRMS(const vpColVector &p)
vpTemplateTrackerPoint * ptTemplate
vpTemplateTrackerWarp * Warp
unsigned int templateSize