Finds coordinates of peaks (maximums or minimums) with absolute value exceeding threshold value.
IppStatus ippiFindPeaks3x3_32s_C1R(const Ipp32s* pSrc, int srcStep, IppiSize roiSize, Ipp32s threshold, IppiPoint* pPeak, int maxPeakCount, int* pPeakCount, IppiNorm norm, int border, Ipp8u* pBuffer);
IppStatus ippiFindPeaks3x3_32f_C1R(const Ipp32f* pSrc, int srcStep, IppiSize roiSize, Ipp32f threshold, IppiPoint* pPeak, int maxPeakCount, int* pPeakCount, IppiNorm norm, int border, Ipp8u* pBuffer);
pSrc |
Pointer to the first source image ROI. | ||||
srcStep |
Distance in bytes between starts of consecutive lines in the first source image. | ||||
roiSize |
Size of the image ROI in pixels. | ||||
threshold |
Threshold value. | ||||
pPeak |
Pointer to the coorditanes peaks [maxPeakCount]. | ||||
maxPeakCount |
Maximum number of peaks. | ||||
pPeakCount |
Pointer to the number of the detected peaks. | ||||
border |
Border value, only pixel with distance from the edge of the image greater than border are processed. | ||||
norm |
Specifies type of the
norm to form the mask for extremum search:
|
||||
pBuffer |
Pointer to the working buffer. |
The function ippiFindPeaks3x3 is declared in the ippcv.h file. It operates with ROI (see Regions of Interest in Intel IPP).
This function detects local maximum and minimum pixels in the
source image:
and stores their coordinates in the pPeak array pPeak[m].x = jm, pPeak[m].y = im, m = 0, ... pPeakCount [0], pPeakCount[0] ≤ maxPeakCount
The neighborhood O(i, j) for the extremum search is defined by the parameter norm. The number of detected extremums is returned in pPeakCount[0]. The operation is stopped when the maxPeakCount extremums are found.
The function requires the working buffer pBuffer whose size should be computed by the function ippiFindPeaks3x3GetBufferSize beforehand.
Example "Simplified Peak Search for Calculation of SIFT Features” shows how to use the function ippiFindPeaks3x3_32f_C1R for calculations of the SIFT (Scale Invariant Feature Transform) features [Lowe04].
ippStsNoErr |
Indicates no error. Any other value indicates an error or a warning. |
ippStsNullPtrErr |
Indicates an error condition if one of the specified pointers is NULL. |
ippStsSizeErr |
Indicates an error condition if roiSize has a field with zero or negative value; or if maxPeakCount is less than or equal to 0; or if border is less than 1 or greater than one of 0.5*roiSize.width or of 0.5*roiSize.height. |
ippStsStepErr |
Indicates an error condition if srcStep is less than roiSize.width*<pixelSize>. |
ippStsNotEvenStepErr |
Indicates an error condition if srcStep is not divisible by 4. |
Ipp32s sigma[NIMAGE]; // sigmas of Gauss blur (increasing
Ipp32s kerSize[NIMAGE]; // kernel sizef of Gauss blur (increasing)
Ipp32f *pDst[NIMAGE]; // blurred images
Ipp32f *pSrc; // initial image
Ipp8u *pBuffer; // working buffer
IppiPoint *pPeak; // array of peaks
IppiSize roi; // image size
int step; // row step in bytes
int bufSize; // working buffer size
int maxPeaks=500; // max peaks number for image
int peakCount; // peaks number for image
Ipp32f threshold=0.02f; // peak thresjold
ippiFilterGaussGetBufferSize_32f_C1R(roi,kerSize[NIMAGE-1],&bufSize);
pBuffer = ippsMalloc_8u(bufSize);
for (i=0; i<NIMAGE;i++) { //blur inital image with different Gauss kernels
ippiFilterGaussBorder_32f_C1R(pSrc,step,pDst[i],step,roi,kerSize[i],
sigma[i],ippBorderRepl,0,pBuffer);
}
ippsFree(pBuffer);
for (i=0; i<NIMAGE-1;i++) { // calulate difference of Gaussian (DOG) images
ippiSub_32f_C1IR(pDst[i+1],step,pDst[i],step,roi);
}
ippiFindPeaks3x3GetBufferSize_32f_C1R(roi.width,&bufSize);
pBuffer = ippsMalloc_8u(bufSize);
pPeak = (IppiPoint*)ippsMalloc_8u(maxPeaks*sizeof(IppiPoint));
for (i=1; i<NIMAGE-2;i++) { // find and process peaks in DOG images
ippiFindPeaks3x3_32f_C1R(pDst[i],step,roi,threshold,pPeak,maxPeaks,
&peakCount,ippiNormL1,kerSize[0]/2,pBuffer);
for (j=0;j<peakCount; j++) {
Ipp32fpix = pDst[i][pPeak[j].y*step/sizeof(Ipp32f)+pPeak[j].x];
Ipp32fpup = pDst[i+1][pPeak[j].y*step/sizeof(Ipp32f)+pPeak[j].x];
Ipp32fpdn = pDst[i-1][pPeak[j].y*step/sizeof(Ipp32f)+pPeak[j].x];
if (pix>0)if ((pix<pup)||(pix<pdn)) continue;
if (pix<0)if ((pix>pup)||(pix>pdn)) continue;
// calculateSIFT feature description for a peak pPeak[j] in DOG image pDst[i]
}
}
ippsFree(pBuffer);
ippsFree(pPeak);
Copyright © 2000 - 2011, Intel Corporation. All rights reserved.