7 #include "BinaryImage.h"
12 IMAQ_FUNC
int Priv_SetWriteFileAllowed(uint32_t enable);
18 BinaryImage::~BinaryImage()
29 int success = imaqCountParticles(m_imaqImage, 1, &numParticles);
30 wpi_setImaqErrorWithContext(success,
"Error counting particles");
59 success = imaqGetImageSize(m_imaqImage, &par->imageWidth, &par->imageHeight);
60 wpi_setImaqErrorWithContext(success,
"Error getting image size");
64 success = imaqCountParticles(m_imaqImage, 1, &numParticles);
65 wpi_setImaqErrorWithContext(success,
"Error counting particles");
69 if (particleNumber >= numParticles)
71 wpi_setWPIErrorWithContext(ParameterOutOfRange,
"particleNumber");
75 par->particleIndex = particleNumber;
77 bool good = ParticleMeasurement(particleNumber, IMAQ_MT_CENTER_OF_MASS_X, &par->center_mass_x);
78 good = good && ParticleMeasurement(particleNumber, IMAQ_MT_CENTER_OF_MASS_Y, &par->center_mass_y);
79 good = good && ParticleMeasurement(particleNumber, IMAQ_MT_AREA, &par->particleArea);
80 good = good && ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_TOP, &par->boundingRect.top);
81 good = good && ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_LEFT, &par->boundingRect.left);
82 good = good && ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_HEIGHT, &par->boundingRect.height);
83 good = good && ParticleMeasurement(particleNumber, IMAQ_MT_BOUNDING_RECT_WIDTH, &par->boundingRect.width);
84 good = good && ParticleMeasurement(particleNumber, IMAQ_MT_AREA_BY_IMAGE_AREA, &par->particleToImagePercent);
85 good = good && ParticleMeasurement(particleNumber, IMAQ_MT_AREA_BY_PARTICLE_AND_HOLES_AREA, &par->particleQuality);
90 par->center_mass_x_normalized = NormalizeFromRange(par->center_mass_x, par->imageWidth);
91 par->center_mass_y_normalized = NormalizeFromRange(par->center_mass_y, par->imageHeight);
105 vector<ParticleAnalysisReport>* particles =
new vector<ParticleAnalysisReport>;
107 for(
int particleIndex = 0; particleIndex < particleCount; particleIndex++)
115 sort(particles->begin(), particles->end(), CompareParticleSizes);
127 Priv_SetWriteFileAllowed(1);
128 memset(colorTable, 0,
sizeof(colorTable));
130 colorTable[1].R = 255;
131 colorTable[0].G = colorTable[1].G = 0;
132 colorTable[0].B = colorTable[1].B = 0;
133 colorTable[0].alpha = colorTable[1].alpha = 0;
134 imaqWriteFile(m_imaqImage, fileName, colorTable);
146 bool BinaryImage::ParticleMeasurement(
int particleNumber, MeasurementType whatToMeasure,
int *result)
149 bool success = ParticleMeasurement(particleNumber, whatToMeasure, &resultDouble);
150 *result = (int)resultDouble;
163 bool BinaryImage::ParticleMeasurement(
int particleNumber, MeasurementType whatToMeasure,
double *result)
166 success = imaqMeasureParticle(m_imaqImage, particleNumber, 0, whatToMeasure, result);
167 wpi_setImaqErrorWithContext(success,
"Error measuring particle");
172 double BinaryImage::NormalizeFromRange(
double position,
int range)
174 return (position * 2.0 / (
double)range) - 1.0;
187 return particle1.particleToImagePercent > particle2.particleToImagePercent;
190 BinaryImage *BinaryImage::RemoveSmallObjects(
bool connectivity8,
int erosions)
193 int success = imaqSizeFilter(result->
GetImaqImage(), m_imaqImage, connectivity8, erosions, IMAQ_KEEP_LARGE, NULL);
194 wpi_setImaqErrorWithContext(success,
"Error in RemoveSmallObjects");
198 BinaryImage *BinaryImage::RemoveLargeObjects(
bool connectivity8,
int erosions)
201 int success = imaqSizeFilter(result->
GetImaqImage(), m_imaqImage, connectivity8, erosions, IMAQ_KEEP_SMALL, NULL);
202 wpi_setImaqErrorWithContext(success,
"Error in RemoveLargeObjects");
206 BinaryImage *BinaryImage::ConvexHull(
bool connectivity8)
209 int success = imaqConvexHull(result->
GetImaqImage(), m_imaqImage, connectivity8);
210 wpi_setImaqErrorWithContext(success,
"Error in convex hull operation");
219 int success = imaqParticleFilter4(result->
GetImaqImage(), m_imaqImage, criteria, criteriaCount, &filterOptions, NULL, &numParticles);
220 wpi_setImaqErrorWithContext(success,
"Error in particle filter operation");
ParticleAnalysisReport GetParticleAnalysisReport(int particleNumber)
vector< ParticleAnalysisReport > * GetOrderedParticleAnalysisReports()
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
virtual void Write(const char *fileName)