Developer Reference for Intel® Integrated Performance Primitives
Computes a normalized cross-correlation between an image and a template.
Case 1: Operating on data with integer output
IppStatus ippiCrossCorrNorm_8u_C1RSfs(const Ipp8u* pSrc, int srcStep, IppiSize srcRoiSize, const Ipp8u* pTpl, int tplStep, IppiSize tplRoiSize, Ipp8u* pDst, int dstStep, int scaleFactor, IppEnum algType, Ipp8u* pBuffer);
Case 2: Operating on data with floating-point output
IppStatus ippiCrossCorrNorm_<mod>(const Ipp<srcDatatype>* pSrc, int srcStep, IppiSize srcRoiSize, const Ipp<srcDatatype>* pTpl, int tplStep, IppiSize tplRoiSize, Ipp32f* pDst, int dstStep, IppEnum algType, Ipp8u* pBuffer);
Supported values for mod:
32f_C1R |
8u32f_C1R |
16u32f_C1R |
Case 3: Operating on data with integer output with TL functions
IppStatus ippsCrossCorrNorm_ 8u_C1RSfs_T (const Ipp8u* pSrc, int srcStep, IppiSizesrcRoiSize, const Ipp8u* pTpl, int tplStep, IppiSize tplRoiSize, Ipp8u* pDst, int dstStep, int scaleFactor, IppEnum algType, Ipp8u* pBuffer);
Case 4: Operating on data with floating-point output with TL functions
IppStatus ippsCrossCorrNorm_ <mod>_T (const Ipp<srcDatatype>* pSrc, int srcStep, IppiSizesrcRoiSize, const Ipp<srcDatatype>* pTpl, int tplStep, IppiSize tplRoiSize, Ipp32f* pDst, int dstStep, IppEnum algType, Ipp8u* pBuffer);
Supported values for mod:
32f_C1R |
8u32f_C1R |
16u32f_C1R |
ippi.h
Headers: ippcore.h, ippvm.h, ipps.h
Libraries: ippcore.lib, ippvm.lib, ipps.lib
pSrc |
Pointer to the source image ROI. |
srcStep |
Distance, in bytes, between the starting points of consecutive lines in the source image. |
srcRoiSize |
Size of the source ROI in pixels. |
pTpl |
Pointer to the template image. |
tplStep |
Distance, in bytes, between the starting points of consecutive lines in the template image. |
tplRoiSize |
Size of the template ROI in pixels. |
pDst |
Pointer to the destination image ROI. |
dstStep |
Distance, in bytes, between the starting points of consecutive lines in the destination image. |
scaleFactor |
Scale factor. |
algType |
Bit-field mask for the algorithm type definition. Possible values are the results of composition of the IppAlgType, IppiROIShape, and IppiNormOp values. |
pBuffer |
Pointer to the work buffer. |
This function operates with ROI.
Depending on the IppiNormOp value set to the algType parameter, the function calculates the following results:
IppiNormOp Value |
Result |
---|---|
ippiNormNone | Cross-correlation values Rtx(r,c) |
ippiNorm | Normalized cross-correlation values ρtx(r,c) |
ippiNormCoefficient | Normalized correlation coefficients γtx(r,c) |
For more information about how each value is calculated, see Image Proximity Measures.
The size of the resulting matrix depends on the IppiROIShape value:
IppiROIShape Value |
Matrix Size |
---|---|
ippiROIFull | (Ws + Wt - 1) * (Hs + Ht - 1) |
ippiROISame | Ws*Hs |
ippiROIValid | (Ws -Wt + 1) * (Hs -Ht +1) |
where
Before using this function, you need to compute the size of the work buffer using the ippiCrossCorrNormGetBufferSize function.
ippStsNoErr |
Indicates no error. |
ippStsNullPtrErr |
Indicates an error when any of the specified pointers is NULL. |
ippStsStepErr |
Indicates an error when the value of srcStep, tplStep, or dstStep is negative, or equal to zero. |
ippStsSizeErr |
Indicates an error when:
|
ippStsAlgTypeErr |
Indicates an error when:
|
The code example below demonstrates how to use the ippiCrossCorrNormGetBufferSize and ippiCrossCorrNorm functions.
IppStatus CrossCorrNormExample() { IppStatus status; IppiSize srcRoiSize = {5,4}; IppiSize tplRoiSize = {3,3}; IppiSize dstRoiSize = {5,4};// same as src Ipp32f pSrc[5*4] = { 1.0f, 2.0f, 1.5f, 4.1f, 3.6f, 0.2f, 3.2f, 2.5f, 1.5f, 10.0f, 5.0f, 6.8f, 0.5f, 4.1f, 1.1f, 7.1f, 4.2f, 2.2f, 8.7f, 10.0f}; Ipp32f pTpl[3*3] = {2.1f, 3.5f, 7.7f, 0.4f, 2.3f, 5.5f, 1.4f, 2.8f, 3.1f}; Ipp32f pDst[5*4]; int srcStep = 5*sizeof(Ipp32f); int tplStep = 3*sizeof(Ipp32f); int dstStep = 5*sizeof(Ipp32f); IppEnum funCfg = (IppEnum)(ippAlgAuto|ippiROISame|ippiNorm); Ipp8u *pBuffer; int bufSize; status = ippiCrossCorrNormGetBufferSize(srcRoiSize, tplRoiSize, ipp32f, funCfg, &bufSize); if ( status != ippStsNoErr ) return status; pBuffer = ippsMalloc_8u( bufSize ); status = ippiCrossCorrNorm_32f_C1R(pSrc, srcStep, srcRoiSize, pTpl, tplStep, tplRoiSize, pDst, dstStep, funCfg, pBuffer); printf_2D_32f("pDst", pDst, dstRoiSize); ippsFree( pBuffer ); return status; }
The result is as follows:
pDst -> 0.53 0.54 0.58 0.50 0.30 0.68 0.62 0.68 0.83 0.38 0.77 0.55 0.60 0.81 0.42 0.81 0.46 0.70 0.62 0.24