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