Visible to Intel only — GUID: GUID-73B4F30F-E79C-4D04-BF82-9AEEB5EB5E25
Visible to Intel only — GUID: GUID-73B4F30F-E79C-4D04-BF82-9AEEB5EB5E25
CrossCorrNorm
Computes a normalized cross-correlation between an image and a template.
Syntax
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 |
Include Files
ippi.h
Domain Dependencies
Headers: ippcore.h, ippvm.h, ipps.h
Libraries: ippcore.lib, ippvm.lib, ipps.lib
Parameters
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. |
Description
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
- Ws , Hs is the width and height of the source image
- Wt , Ht is the width and height of the template image
Before using this function, you need to compute the size of the work buffer using the ippiCrossCorrNormGetBufferSize function.
Return Values
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:
|
Example
The code example below demonstrates how to use the ippiCrossCorrNormGetBufferSize and ippiCrossCorrNorm functions.
#include "ipps.h" #include "ippi.h" #include <iostream> #include <iomanip> void print_dst_2D_32f(Ipp32f* pDst, int dstStep, IppiSize roiSize) { std::cout << "pDst ->\n"; std::cout.precision(2); for (int h = 0; h < roiSize.height; h++) { for (int w = 0; w < roiSize.width; w++) { std::cout << std::setw(6) << std::fixed << pDst[w]; } pDst = (Ipp32f*)((Ipp8u*)pDst + dstStep); std::cout << std::endl; } } IppStatus main() { 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, 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); print_dst_2D_32f(pDst, dstStep, 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