fixed
This commit is contained in:
parent
6119ae0ea9
commit
43c29a6751
@ -341,14 +341,13 @@ static bool ocl_matchTemplate( InputArray _img, InputArray _templ, OutputArray _
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (HAVE_IPP)
|
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)
|
||||||
|
|
||||||
typedef IppStatus (CV_STDCALL * ippiGetBufferSize)(IppiSize, IppiSize, IppEnum, int*);
|
|
||||||
typedef IppStatus (CV_STDCALL * ippimatchTemplate)(const void*, int, IppiSize, const void*, int, IppiSize, Ipp32f* , int , IppEnum , Ipp8u*);
|
typedef IppStatus (CV_STDCALL * ippimatchTemplate)(const void*, int, IppiSize, const void*, int, IppiSize, Ipp32f* , int , IppEnum , Ipp8u*);
|
||||||
|
|
||||||
static bool ipp_matchTemplate(const Mat& src, const Mat& tpl, Mat& dst, int method)
|
static bool ipp_crossCorr(const Mat& src, const Mat& tpl, Mat& dst)
|
||||||
{
|
{
|
||||||
if (src.channels() != 1 || (method!=CV_TM_SQDIFF && method!=CV_TM_CCORR))
|
if (src.channels()!= 1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
IppStatus status;
|
IppStatus status;
|
||||||
@ -356,36 +355,57 @@ static bool ipp_matchTemplate(const Mat& src, const Mat& tpl, Mat& dst, int meth
|
|||||||
IppiSize srcRoiSize = {src.cols,src.rows};
|
IppiSize srcRoiSize = {src.cols,src.rows};
|
||||||
IppiSize tplRoiSize = {tpl.cols,tpl.rows};
|
IppiSize tplRoiSize = {tpl.cols,tpl.rows};
|
||||||
|
|
||||||
IppEnum funCfg;
|
|
||||||
ippimatchTemplate ippFunc;
|
|
||||||
ippiGetBufferSize ippGetBufSize;
|
|
||||||
Ipp8u *pBuffer;
|
Ipp8u *pBuffer;
|
||||||
int bufSize=0;
|
int bufSize=0;
|
||||||
|
|
||||||
int depth = src.depth();
|
int depth = src.depth();
|
||||||
|
|
||||||
if (method==CV_TM_SQDIFF)
|
ippimatchTemplate ippFunc =
|
||||||
{
|
|
||||||
ippFunc =
|
|
||||||
depth==CV_8U ? (ippimatchTemplate)ippiSqrDistanceNorm_8u32f_C1R:
|
|
||||||
depth==CV_32F? (ippimatchTemplate)ippiSqrDistanceNorm_32f_C1R: 0;
|
|
||||||
|
|
||||||
ippGetBufSize = (ippiGetBufferSize)ippiSqrDistanceNormGetBufferSize;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ippFunc =
|
|
||||||
depth==CV_8U ? (ippimatchTemplate)ippiCrossCorrNorm_8u32f_C1R:
|
depth==CV_8U ? (ippimatchTemplate)ippiCrossCorrNorm_8u32f_C1R:
|
||||||
depth==CV_32F? (ippimatchTemplate)ippiCrossCorrNorm_32f_C1R: 0;
|
depth==CV_32F? (ippimatchTemplate)ippiCrossCorrNorm_32f_C1R: 0;
|
||||||
|
|
||||||
ippGetBufSize = (ippiGetBufferSize)ippiCrossCorrNormGetBufferSize;
|
|
||||||
}
|
|
||||||
if (ippFunc==0)
|
if (ippFunc==0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
funCfg = (IppEnum)(ippAlgAuto | ippiNormNone | ippiROIValid);
|
IppEnum funCfg = (IppEnum)(ippAlgAuto | ippiNormNone | ippiROIValid);
|
||||||
|
|
||||||
status = ippGetBufSize(srcRoiSize, tplRoiSize, funCfg, &bufSize);
|
status = ippiCrossCorrNormGetBufferSize(srcRoiSize, tplRoiSize, funCfg, &bufSize);
|
||||||
|
if ( status < 0 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
pBuffer = ippsMalloc_8u( bufSize );
|
||||||
|
|
||||||
|
status = ippFunc(src.data, (int)src.step, srcRoiSize, tpl.data, (int)tpl.step, tplRoiSize, (Ipp32f*)dst.data, (int)dst.step, funCfg, pBuffer);
|
||||||
|
|
||||||
|
ippsFree( pBuffer );
|
||||||
|
return status >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ipp_sqrDistance(const Mat& src, const Mat& tpl, Mat& dst)
|
||||||
|
{
|
||||||
|
if (src.channels()!= 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
IppStatus status;
|
||||||
|
|
||||||
|
IppiSize srcRoiSize = {src.cols,src.rows};
|
||||||
|
IppiSize tplRoiSize = {tpl.cols,tpl.rows};
|
||||||
|
|
||||||
|
Ipp8u *pBuffer;
|
||||||
|
int bufSize=0;
|
||||||
|
|
||||||
|
int depth = src.depth();
|
||||||
|
|
||||||
|
ippimatchTemplate ippFunc =
|
||||||
|
depth==CV_8U ? (ippimatchTemplate)ippiSqrDistanceNorm_8u32f_C1R:
|
||||||
|
depth==CV_32F? (ippimatchTemplate)ippiSqrDistanceNorm_32f_C1R: 0;
|
||||||
|
|
||||||
|
if (ippFunc==0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
IppEnum funCfg = (IppEnum)(ippAlgAuto | ippiNormNone | ippiROIValid);
|
||||||
|
|
||||||
|
status = ippiSqrDistanceNormGetBufferSize(srcRoiSize, tplRoiSize, funCfg, &bufSize);
|
||||||
if ( status < 0 )
|
if ( status < 0 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -403,6 +423,11 @@ void crossCorr( const Mat& img, const Mat& _templ, Mat& corr,
|
|||||||
Size corrsize, int ctype,
|
Size corrsize, int ctype,
|
||||||
Point anchor, double delta, int borderType )
|
Point anchor, double delta, int borderType )
|
||||||
{
|
{
|
||||||
|
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)
|
||||||
|
if (ipp_crossCorr(img, _templ, corr))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
const double blockScale = 4.5;
|
const double blockScale = 4.5;
|
||||||
const int minBlockSize = 256;
|
const int minBlockSize = 256;
|
||||||
std::vector<uchar> buf;
|
std::vector<uchar> buf;
|
||||||
@ -613,13 +638,13 @@ void cv::matchTemplate( InputArray _img, InputArray _templ, OutputArray _result,
|
|||||||
_result.create(corrSize, CV_32F);
|
_result.create(corrSize, CV_32F);
|
||||||
Mat result = _result.getMat();
|
Mat result = _result.getMat();
|
||||||
|
|
||||||
#if defined (HAVE_IPP)
|
#ifdef HAVE_TEGRA_OPTIMIZATION
|
||||||
if (ipp_matchTemplate(img, templ, result, method))
|
if (tegra::matchTemplate(img, templ, result, method))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_TEGRA_OPTIMIZATION
|
#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7)
|
||||||
if (tegra::matchTemplate(img, templ, result, method))
|
if (method == CV_TM_SQDIFF && ipp_sqrDistance(img, templ, result))
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user