|
|
|
@ -632,6 +632,8 @@ static bool ipp_sqrDistance(const Mat& src, const Mat& tpl, Mat& dst) |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#include "opencv2/core/hal/hal.hpp" |
|
|
|
|
|
|
|
|
|
void crossCorr( const Mat& img, const Mat& _templ, Mat& corr, |
|
|
|
|
Size corrsize, int ctype, |
|
|
|
|
Point anchor, double delta, int borderType ) |
|
|
|
@ -698,6 +700,9 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr, |
|
|
|
|
|
|
|
|
|
buf.resize(bufSize); |
|
|
|
|
|
|
|
|
|
hal::DftContext c; |
|
|
|
|
hal::dftInit2D(c, dftsize.width, dftsize.height, dftTempl.depth(), 1, 1, CV_HAL_DFT_IS_INPLACE, templ.rows); |
|
|
|
|
|
|
|
|
|
// compute DFT of each template plane
|
|
|
|
|
for( k = 0; k < tcn; k++ ) |
|
|
|
|
{ |
|
|
|
@ -721,9 +726,11 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr, |
|
|
|
|
Mat part(dst, Range(0, templ.rows), Range(templ.cols, dst.cols)); |
|
|
|
|
part = Scalar::all(0); |
|
|
|
|
} |
|
|
|
|
dft(dst, dst, 0, templ.rows); |
|
|
|
|
hal::dftRun2D(c, dst.data, (int)dst.step, dst.data, (int)dst.step); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
hal::dftFree2D(c); |
|
|
|
|
|
|
|
|
|
int tileCountX = (corr.cols + blocksize.width - 1)/blocksize.width; |
|
|
|
|
int tileCountY = (corr.rows + blocksize.height - 1)/blocksize.height; |
|
|
|
|
int tileCount = tileCountX * tileCountY; |
|
|
|
@ -740,6 +747,16 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr, |
|
|
|
|
} |
|
|
|
|
borderType |= BORDER_ISOLATED; |
|
|
|
|
|
|
|
|
|
bool useHalDft = tileCount > 1; |
|
|
|
|
hal::DftContext cF, cR; |
|
|
|
|
if (useHalDft) |
|
|
|
|
{ |
|
|
|
|
int f = CV_HAL_DFT_IS_INPLACE; |
|
|
|
|
int f_inv = f | CV_HAL_DFT_INVERSE | CV_HAL_DFT_SCALE; |
|
|
|
|
hal::dftInit2D(cF, dftsize.width, dftsize.height, maxDepth, 1, 1, f, blocksize.height + templ.rows - 1); |
|
|
|
|
hal::dftInit2D(cR, dftsize.width, dftsize.height, maxDepth, 1, 1, f_inv, blocksize.height); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// calculate correlation by blocks
|
|
|
|
|
for( i = 0; i < tileCount; i++ ) |
|
|
|
|
{ |
|
|
|
@ -777,11 +794,19 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr, |
|
|
|
|
copyMakeBorder(dst1, dst, y1-y0, dst.rows-dst1.rows-(y1-y0), |
|
|
|
|
x1-x0, dst.cols-dst1.cols-(x1-x0), borderType); |
|
|
|
|
|
|
|
|
|
dft( dftImg, dftImg, 0, dsz.height ); |
|
|
|
|
if (useHalDft && bsz.height == blocksize.height) |
|
|
|
|
hal::dftRun2D(cF, dftImg.data, (int)dftImg.step, dftImg.data, (int)dftImg.step); |
|
|
|
|
else |
|
|
|
|
dft( dftImg, dftImg, 0, dsz.height ); |
|
|
|
|
|
|
|
|
|
Mat dftTempl1(dftTempl, Rect(0, tcn > 1 ? k*dftsize.height : 0, |
|
|
|
|
dftsize.width, dftsize.height)); |
|
|
|
|
mulSpectrums(dftImg, dftTempl1, dftImg, 0, true); |
|
|
|
|
dft( dftImg, dftImg, DFT_INVERSE + DFT_SCALE, bsz.height ); |
|
|
|
|
|
|
|
|
|
if (useHalDft && bsz.height == blocksize.height) |
|
|
|
|
hal::dftRun2D(cR, dftImg.data, (int)dftImg.step, dftImg.data, (int)dftImg.step); |
|
|
|
|
else |
|
|
|
|
dft( dftImg, dftImg, DFT_INVERSE + DFT_SCALE, bsz.height ); |
|
|
|
|
|
|
|
|
|
src = dftImg(Rect(0, 0, bsz.width, bsz.height)); |
|
|
|
|
|
|
|
|
@ -813,6 +838,11 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (useHalDft) |
|
|
|
|
{ |
|
|
|
|
hal::dftFree2D(cF); |
|
|
|
|
hal::dftFree2D(cR); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void matchTemplateMask( InputArray _img, InputArray _templ, OutputArray _result, int method, InputArray _mask ) |
|
|
|
|