324 if( im.rows() <=
m_refIm.rows() )
330 if( im.cols() <=
m_refIm.cols() )
336 int maxLag_r = ( im.rows() -
m_refIm.rows() ) / 2;
337 int maxLag_c = ( im.cols() -
m_refIm.cols() ) / 2;
344 m_ccIm.resize( 2 * maxLag_r + 1, 2 * maxLag_c + 1 );
346 for(
int rL = -maxLag_r; rL <= maxLag_r; ++rL )
348 for(
int cL = -maxLag_c; cL <= maxLag_c; ++cL )
351 int r0 = 0.5 * im.rows() + rL - 0.5 *
m_refIm.rows();
352 int c0 = 0.5 * im.cols() + cL - 0.5 *
m_refIm.cols();
367 m_ccIm( maxLag_r + rL, maxLag_c + cL ) = 0;
378 if( m_peakMethod == xcorrPeakMethod::gaussfit )
384 m_fitter.setGuess( mn, pk, xLag0, yLag0, 0.2 *
m_ccIm.rows(), 0.2 *
m_ccIm.cols(), 0 );
387 xShift = m_fitter.x0() - maxLag_r;
388 yShift = m_fitter.y0() - maxLag_c;
390 else if( m_peakMethod == xcorrPeakMethod::interp )
399 const Scalar peakValue =
m_ccIm.maxCoeff( &xPeak, &yPeak );
401 xPeak == 0 || yPeak == 0 || xPeak ==
m_ccIm.rows() - 1 || yPeak ==
m_ccIm.cols() - 1 )
405 xShift = xPeak - maxLag_r;
406 yShift = yPeak - maxLag_c;
413 magColsScalar <= 1 || magRowsScalar > std::numeric_limits<int>::max() ||
414 magColsScalar > std::numeric_limits<int>::max() )
420 const int magRows =
static_cast<int>( magRowsScalar );
421 const int magCols =
static_cast<int>( magColsScalar );
422 m_magSize = std::max( magRows, magCols );
423 m_magIm.resize( magRows, magCols );
429 xShift = x * xScale - maxLag_r;
430 yShift = y * yScale - maxLag_c;
435 m_ccIm.maxCoeff( &xPeak, &yPeak );
437 int centroidHalfWidth = std::min( xPeak,
static_cast<int>(
m_ccIm.rows() ) - 1 - xPeak );
438 centroidHalfWidth = std::min( centroidHalfWidth, yPeak );
440 std::min( centroidHalfWidth,
static_cast<int>(
m_ccIm.cols() ) - 1 - yPeak );
442 if( centroidHalfWidth == 0 )
444 xShift = xPeak - maxLag_r;
445 yShift = yPeak - maxLag_c;
449 const int centroidWidth = 2 * centroidHalfWidth + 1;
450 const int x0 = xPeak - centroidHalfWidth;
451 const int y0 = yPeak - centroidHalfWidth;
452 m_magIm =
m_ccIm.block( x0, y0, centroidWidth, centroidWidth );
456 if( !( centroidWeight > 0 ) || !
math::isFinite( centroidWeight ) )
458 xShift = xPeak - maxLag_r;
459 yShift = yPeak - maxLag_c;
465 xShift = x + x0 - maxLag_r;
466 yShift = y + y0 - maxLag_c;
error_t mxlib_error_report(const error_t &code, const std::string &expl, const std::source_location &loc=std::source_location::current())
Print a report to stderr given an mxlib error_t code and explanation and return the code.