6#ifndef __crossCorrelation_hpp__
7#define __crossCorrelation_hpp__
19template <
typename floatT,
typename sizeT =
size_t>
20void calcDiscreteCrossCorrelation( floatT *cc,
31 sizeT cc_dim1, cc_dim2;
55 cc_dim1 = max_x_lag - min_x_lag + 1;
56 cc_dim2 = max_y_lag - min_y_lag + 1;
59 for( sizeT i = min_x_lag; i < max_x_lag + 1; ++i )
61 for( sizeT j = min_y_lag; j < max_y_lag + 1; ++j )
64 cc[( j - min_y_lag ) * cc_dim1 + ( i - min_x_lag )] = 0;
68 for( sizeT k = 0;
k < dim1; ++
k )
75 for( sizeT l = 0; l < dim2; ++l )
81 cc[( j - min_y_lag ) * cc_dim1 + ( i - min_x_lag )] +=
82 m1[l * dim1 +
k] * m2[( l + j ) * dim1 + ( k + i )];
89template <
class eigenT,
class eigenTin1,
class eigenTin2,
class eigenTmask>
90void xdiscreteCrossCorrelation(
91 eigenT &cc,
const eigenTin1 &m1,
const eigenTin2 &m2, eigenTmask &mask,
int minlag = 0,
int maxlag = 0 )
94 size_t dim1 = m1.rows();
95 size_t dim2 = m2.cols();
97 if( dim1 != m2.rows() || dim2 != m2.cols() || dim1 != mask.rows() || dim2 != mask.cols() )
105 maxlag = std::min( dim1, dim2 );
109 cc.resize( maxlag - minlag + 1, maxlag - minlag + 1 );
111 for(
int i = minlag; i < maxlag + 1; i++ )
113 for(
int j = minlag; j < maxlag + 1; j++ )
115 cc( i - minlag, j - minlag ) = 0;
117 for(
int k = 0;
k < dim1;
k++ )
124 for(
int l = 0; l < dim2; l++ )
130 cc( i - minlag, j - minlag ) +=
131 m1( k, l ) * mask( k, l ) * m2( k + i, l + j ) * mask( k + i, l + j );
138template <
class eigenT,
class eigenTin1,
class eigenTin2>
139void discreteCrossCorrelation(
typename eigenT::Scalar &xlag,
140 typename eigenT::Scalar &ylag,
151 size_t dim1 = m1.rows();
152 size_t dim2 = m1.cols();
154 if( dim1 != m2.rows() || dim2 != m2.cols() )
172 cc.resize( max_x_lag - min_x_lag + 1, max_y_lag - min_y_lag + 1 );
174 calcDiscreteCrossCorrelation<float, int>( (
float *)cc.data(),
184 fitG.setArray( cc.data(), cc.rows(), cc.cols() );
186 typename eigenT::Index row, col;
187 typename eigenT::Scalar maxval;
188 maxval = cc.maxCoeff( &row, &col );
192 fitG.setGuess( 0., 1., row, col, 4., 4., 0. );
197 xlag = min_x_lag + fitG.get_params()[2];
198 ylag = min_y_lag + fitG.get_params()[3];
Class to manage fitting a 2D Gaussian to data via the levmarInterface.
Tools for fitting Gaussians to data.
constexpr units::realT k()
Boltzmann Constant.