int frcParticleFilter(Image* dest, Image* source, const ParticleFilterCriteria2* criteria, int criteriaCount, const ParticleFilterOptions* options, Rect rect, int* numParticles) { ROI* roi = imaqCreateROI(); imaqAddRectContour(roi, rect); return imaqParticleFilter3(dest, source, criteria, criteriaCount, options, roi, numParticles); }
//////////////////////////////////////////////////////////////////////////////// // // Function Name: IVA_ParticleFilter // // Description : Filters particles based on their morphological measurements. // // Parameters : image - Input image // pParameter - Morphological measurement that the function // uses for filtering. // plower - Lower bound of the criteria range. // pUpper - Upper bound of the criteria range. // pCalibrated - Whether to take a calibrated measurement or not. // pExclude - TRUE indicates that a match occurs when the // value is outside the criteria range. // criteriaCount - number of particle filter criteria. // rejectMatches - Set this parameter to TRUE to transfer only // those particles that do not meet all the criteria. // Set this parameter to FALSE to transfer only those // particles that meet all the criteria to the destination. // connectivity - Set this parameter to 1 to use connectivity-8 // to determine whether particles are touching. // Set this parameter to 0 to use connectivity-4 // to determine whether particles are touching. // // Return Value : success // //////////////////////////////////////////////////////////////////////////////// static int IVA_ParticleFilter(Image* image, int pParameter[], float plower[], float pUpper[], int pCalibrated[], int pExclude[], int criteriaCount, int rejectMatches, int connectivity) { int success = 1; ParticleFilterCriteria2* particleCriteria = NULL; int i; ParticleFilterOptions particleFilterOptions; int numParticles; //-------------------------------------------------------------------// // Particle Filter // //-------------------------------------------------------------------// if (criteriaCount > 0) { // Fill in the ParticleFilterCriteria2 structure. particleCriteria = (ParticleFilterCriteria2*)malloc(criteriaCount * sizeof(ParticleFilterCriteria2)); for (i = 0 ; i < criteriaCount ; i++) { MeasurementType measurementType; int iMeasurementType = pParameter[i]; memcpy(&measurementType, &iMeasurementType, sizeof(iMeasurementType)); particleCriteria[i].parameter = measurementType; particleCriteria[i].lower = plower[i]; particleCriteria[i].upper = pUpper[i]; particleCriteria[i].calibrated = pCalibrated[i]; particleCriteria[i].exclude = pExclude[i]; } particleFilterOptions.rejectMatches = rejectMatches; particleFilterOptions.rejectBorder = 0; particleFilterOptions.connectivity8 = connectivity; // Filters particles based on their morphological measurements. VisionErrChk(imaqParticleFilter3(image, image, particleCriteria, criteriaCount, &particleFilterOptions, NULL, &numParticles)); } Error: free(particleCriteria); return success; }