/** * Get a single particle analysis report. * Get one (of possibly many) particle analysis reports for an image. * @param particleNumber Which particle analysis report to return. * @returns the selected particle analysis report */ ParticleAnalysisReport BinaryImage::GetParticleAnalysisReport(int particleNumber) { ParticleAnalysisReport par; int success = 0; success = imaqGetImageSize(m_imaqImage, &par.imageWidth, &par.imageHeight); wpi_imaqAssert(success, "Error getting image size"); par.particleIndex = particleNumber; success = imaqCountParticles(m_imaqImage, TRUE, NULL); wpi_imaqAssert(success, "Error counting particles"); par.center_mass_x = (int) ParticleMeasurement(particleNumber, IMAQ_MT_CENTER_OF_MASS_X); par.center_mass_y = (int) ParticleMeasurement(particleNumber, IMAQ_MT_CENTER_OF_MASS_Y); par.particleArea = (int) ParticleMeasurement(particleNumber, IMAQ_MT_AREA); par.boundingRect.top = (int) ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_TOP); par.boundingRect.left = (int) ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_LEFT); par.boundingRect.height = (int) ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_HEIGHT); par.boundingRect.width = (int) ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_WIDTH); par.particleToImagePercent = ParticleMeasurement(particleNumber, IMAQ_MT_AREA_BY_IMAGE_AREA); par.particleQuality = ParticleMeasurement(particleNumber, IMAQ_MT_AREA_BY_PARTICLE_AND_HOLES_AREA); /* normalized position (-1 to 1) */ par.center_mass_x_normalized = NormalizeFromRange(par.center_mass_x, par.imageWidth); par.center_mass_y_normalized = NormalizeFromRange(par.center_mass_y, par.imageHeight); return par; }
/** * Measure a single parameter for an image. * Get the measurement for a single parameter about an image by calling the imaqMeasureParticle * function for the selected parameter. * @param particleNumber which particle in the set of particles * @param whatToMeasure the imaq MeasurementType (what to measure) * @param result the value of the measurement * @returns false on failure, true on success */ bool BinaryImage::ParticleMeasurement(int particleNumber, MeasurementType whatToMeasure, int *result) { double resultDouble; bool success = ParticleMeasurement(particleNumber, whatToMeasure, &resultDouble); *result = (int)resultDouble; return success; }
/** * Get a single particle analysis report. * Get one (of possibly many) particle analysis reports for an image. * This version could be more efficient when copying many reports. * @param particleNumber Which particle analysis report to return. * @param par the selected particle analysis report */ void BinaryImage::GetParticleAnalysisReport(int particleNumber, ParticleAnalysisReport *par) { int success; int numParticles = 0; success = imaqGetImageSize(m_imaqImage, &par->imageWidth, &par->imageHeight); wpi_setImaqErrorWithContext(success, "Error getting image size"); if (StatusIsFatal()) return; success = imaqCountParticles(m_imaqImage, 1, &numParticles); wpi_setImaqErrorWithContext(success, "Error counting particles"); if (StatusIsFatal()) return; if (particleNumber >= numParticles) { wpi_setWPIErrorWithContext(ParameterOutOfRange, "particleNumber"); return; } par->particleIndex = particleNumber; // Don't bother measuring the rest of the particle if one fails bool good = ParticleMeasurement(particleNumber, IMAQ_MT_CENTER_OF_MASS_X, &par->center_mass_x); good = good && ParticleMeasurement(particleNumber, IMAQ_MT_CENTER_OF_MASS_Y, &par->center_mass_y); good = good && ParticleMeasurement(particleNumber, IMAQ_MT_AREA, &par->particleArea); good = good && ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_TOP, &par->boundingRect.top); good = good && ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_LEFT, &par->boundingRect.left); good = good && ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_HEIGHT, &par->boundingRect.height); good = good && ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_WIDTH, &par->boundingRect.width); good = good && ParticleMeasurement(particleNumber, IMAQ_MT_AREA_BY_IMAGE_AREA, &par->particleToImagePercent); good = good && ParticleMeasurement(particleNumber, IMAQ_MT_AREA_BY_PARTICLE_AND_HOLES_AREA, &par->particleQuality); if (good) { /* normalized position (-1 to 1) */ par->center_mass_x_normalized = NormalizeFromRange(par->center_mass_x, par->imageWidth); par->center_mass_y_normalized = NormalizeFromRange(par->center_mass_y, par->imageHeight); } }