18 #include "AxisCamera.h"
21 #include "VisionAPI.h"
23 int TrackAPI_debugFlag = 0;
24 #define DPRINTF if(TrackAPI_debugFlag)dprintf
32 bool InArea(Image* binaryImage,
int particleIndex,
Rect rect)
36 imaqMeasureParticle(binaryImage, particleIndex, 0,
37 IMAQ_MT_BOUNDING_RECT_LEFT, &position);
38 if ( position < (rect.left ) )
return false;
40 imaqMeasureParticle(binaryImage, particleIndex, 0,
41 IMAQ_MT_BOUNDING_RECT_TOP, &position);
42 if ( position < (rect.top ) )
return false;
44 imaqMeasureParticle(binaryImage, particleIndex, 0,
45 IMAQ_MT_BOUNDING_RECT_RIGHT, &position);
46 if (position > (rect.left + rect.width) )
return false;
48 imaqMeasureParticle(binaryImage, particleIndex, 0,
49 IMAQ_MT_BOUNDING_RECT_BOTTOM, &position);
50 if (position > (rect.top + rect.height) )
return false;
52 DPRINTF(LOG_INFO,
"particle %i is in (%i %i) height %i width %i\n",
53 particleIndex, rect.left, rect.top, rect.height, rect.width);
64 int GetLargestParticle(Image* binaryImage,
int* largestParticleIndex)
65 {
return GetLargestParticle(binaryImage, largestParticleIndex, IMAQ_NO_RECT); }
67 int GetLargestParticle(Image* binaryImage,
int* largestParticleIndex,
Rect rect)
69 *largestParticleIndex = 0;
73 int success = frcCountParticles(binaryImage, &numParticles);
74 if ( !success ) {
return success; }
77 if (numParticles == 0) {
return 0; }
80 double largestParticleArea = 0;
82 for (
int i = 0; i < numParticles; ++i) {
83 success = imaqMeasureParticle(binaryImage, i, 0, IMAQ_MT_AREA, &particleArea);
84 if ( !success ) {
return success; }
85 if (particleArea > largestParticleArea) {
87 if ( InArea(binaryImage, i, rect) ) {
88 largestParticleArea = particleArea;
89 *largestParticleIndex = i;
111 success = FindColor(IMAQ_HSL, &td.hue, &td.saturation, &td.luminance, trackReport);
113 DPRINTF (LOG_INFO,
"did not find color - errorCode= %i",GetLastVisionError());
120 if (trackReport->particleToImagePercent < PARTICLE_TO_IMAGE_PERCENT) {
121 imaqSetError(ERR_PARTICLE_TOO_SMALL, __FUNCTION__);
134 {
return FindColor(hueRange, DEFAULT_SATURATION_THRESHOLD, trackReport); }
146 satRange.minValue = minSaturation;
147 satRange.maxValue = 255;
149 lumRange.minValue = 0;
150 lumRange.maxValue = 255;
151 ColorMode cmode = IMAQ_HSL;
152 return FindColor(cmode, hueRange, &satRange, &lumRange, trackReport);
164 int FindColor(ColorMode mode,
const Range* plane1Range,
const Range* plane2Range,
167 return FindColor(mode, plane1Range, plane2Range, plane3Range, trackReport, NULL);
180 int FindColor(ColorMode mode,
const Range* plane1Range,
const Range* plane2Range,
184 return FindColor(mode, plane1Range, plane2Range, plane3Range, trackReport,
199 int FindColor(ColorMode mode,
const Range* plane1Range,
const Range* plane2Range,
207 Image* cameraImage = frcCreateImage(IMAQ_IMAGE_HSL);
208 if (!cameraImage) {
return success; }
214 success = GetImage(cameraImage, &imageTime);
216 DPRINTF(LOG_INFO,
"No camera Image available Error = %i %s",
217 errorCode, GetVisionErrorText(errorCode));
218 frcDispose(cameraImage);
219 imaqSetError(errorCode, __FUNCTION__);
224 Image* histImage = frcCreateImage(IMAQ_IMAGE_HSL);
225 if (!histImage) { frcDispose(cameraImage);
return success; }
226 success = frcCopyImage(histImage,cameraImage);
228 errorCode = GetLastVisionError();
229 frcDispose(__FUNCTION__,cameraImage,histImage,NULL);
234 success = frcColorThreshold(cameraImage, cameraImage, mode, plane1Range, plane2Range, plane3Range);
236 errorCode = GetLastVisionError();
237 DPRINTF (LOG_DEBUG,
"Error = %i %s ", errorCode, GetVisionErrorText(errorCode));
238 frcDispose(__FUNCTION__,cameraImage,histImage,NULL);
242 int largestParticleIndex = 0;
243 success = GetLargestParticle(cameraImage, &largestParticleIndex, rect );
245 errorCode = GetLastVisionError();
246 DPRINTF (LOG_DEBUG,
"Error after GetLargestParticle = %i %s ", errorCode, GetVisionErrorText(errorCode));
247 frcDispose(__FUNCTION__,cameraImage,histImage,NULL);
248 imaqSetError(ERR_COLOR_NOT_FOUND, __FUNCTION__);
251 DPRINTF(LOG_INFO,
"largestParticleIndex = %i\n", largestParticleIndex);
257 success = frcParticleAnalysis(cameraImage, largestParticleIndex, trackReport);
258 trackReport->imageTimestamp = imageTime;
261 if (!success) {frcDispose(__FUNCTION__,cameraImage,histImage,NULL);
return success;}
265 if (colorReport != NULL)
272 success = frcParticleFilter(cameraImage, cameraImage, &criteria, 1, options,
273 rect, &numParticles);
275 DPRINTF(LOG_INFO,
"frcParticleFilter errorCode %i", GetLastVisionError());
283 DPRINTF(LOG_INFO,
"NULL Color Histogram");
284 errorCode = GetLastVisionError();
286 colorReport->particleHueMax = chrep->plane1.max;
287 colorReport->particleHueMin = chrep->plane1.min;
288 colorReport->particleHueMean = chrep->plane1.mean;
289 colorReport->particleSatMax = chrep->plane2.max;
290 colorReport->particleSatMin = chrep->plane2.min;
291 colorReport->particleSatMean = chrep->plane2.mean;
292 colorReport->particleLumMax = chrep->plane3.max;
293 colorReport->particleLumMin = chrep->plane3.min;
294 colorReport->particleLumMean = chrep->plane3.mean;
295 colorReport->numberParticlesFound = numParticles;
301 frcDispose(__FUNCTION__,cameraImage,histImage,NULL);
327 trackingData.saturation.minValue = 100;
328 trackingData.saturation.maxValue = 255;
329 trackingData.luminance.minValue = 40;
330 trackingData.luminance.maxValue = 255;
331 if (hue == GREEN) trackingData.luminance.minValue = 100;
332 if (hue == PINK) trackingData.saturation.minValue = 80;
333 if (hue == PINK) trackingData.luminance.minValue = 60;
334 if (hue == PINK) trackingData.luminance.maxValue = 155;
337 trackingData.saturation.minValue = 50;
338 trackingData.saturation.maxValue = 255;
339 trackingData.luminance.minValue = 20;
340 trackingData.luminance.maxValue = 255;
343 trackingData.saturation.minValue = 0;
344 trackingData.saturation.maxValue = 100;
345 trackingData.luminance.minValue = 100;
346 trackingData.luminance.maxValue = 255;
349 trackingData.saturation.minValue = 0;
350 trackingData.saturation.maxValue = 50;
351 trackingData.luminance.minValue = 150;
352 trackingData.luminance.maxValue = 255;
355 trackingData.saturation.minValue = 0;
356 trackingData.saturation.maxValue = 20;
357 trackingData.luminance.minValue = 200;
358 trackingData.luminance.maxValue = 255;
366 strcpy (trackingData.name,
"WHITE");
367 trackingData.hue.minValue = 0;
368 trackingData.hue.maxValue = 255;
371 strcpy (trackingData.name,
"ORANGE");
372 trackingData.hue.minValue = 5;
373 trackingData.hue.maxValue = 25;
376 strcpy (trackingData.name,
"YELLOW");
377 trackingData.hue.minValue = 30;
378 trackingData.hue.maxValue = 50;
381 strcpy (trackingData.name,
"GREEN");
382 if (light == FLUORESCENT) {
383 trackingData.hue.minValue = 60;
384 trackingData.hue.maxValue = 110;
386 trackingData.hue.minValue = 90;
387 trackingData.hue.maxValue = 125;
391 strcpy (trackingData.name,
"BLUE");
392 trackingData.hue.minValue = 140;
393 trackingData.hue.maxValue = 170;
396 strcpy (trackingData.name,
"PURPLE");
397 trackingData.hue.minValue = 180;
398 trackingData.hue.maxValue = 200;
401 strcpy (trackingData.name,
"PINK");
402 trackingData.hue.minValue = 210;
403 trackingData.hue.maxValue = 250;
406 strcpy (trackingData.name,
"RED");
407 trackingData.hue.minValue = 240;
408 trackingData.hue.maxValue = 255;
411 return(trackingData);
421 dprintf(LOG_INFO,
"particle analysis:\n %s%i %s%i\n %s%lf\n %s%i %s%i\n %s%g %s%g\n %s%g\n %s%i %s%i\n %s%i %s%i\n",
422 "imageHeight = ", myReport->imageHeight,
423 "imageWidth = ", myReport->imageWidth,
424 "imageTimestamp = ", myReport->imageTimestamp,
425 "center_mass_x = ", myReport->center_mass_x,
426 "center_mass_y = ", myReport->center_mass_y,
427 "center_mass_x_normalized = ", myReport->center_mass_x_normalized,
428 "center_mass_y_normalized = ", myReport->center_mass_y_normalized,
429 "particleArea = ", myReport->particleArea,
430 "boundingRectangleTop = ", myReport->boundingRect.top,
431 "boundingRectangleLeft = ", myReport->boundingRect.left,
432 "boundingRectangleHeight = ", myReport->boundingRect.height,
433 "boundingRectangleWidth = ", myReport->boundingRect.width);
435 dprintf(LOG_INFO,
"quality statistics: \n %s%g %s%g \n",
436 "particleToImagePercent = ", myReport->particleToImagePercent,
437 "particleQuality = ", myReport->particleQuality);
446 dprintf(LOG_INFO,
"particle ranges for %i particles: ",
447 "numberParticlesFound = ", myReport->numberParticlesFound);
449 dprintf(LOG_INFO,
"\n %s%f %s%f %s%f\n %s%f %s%f %s%f\n %s%f %s%f %s%f\n -------",
450 "particleHueMax = ", myReport->particleHueMax,
451 "particleHueMin = ", myReport->particleHueMin,
452 "particleHueMean = ", myReport->particleHueMean,
453 "particleSatMax = ", myReport->particleSatMax,
454 "particleSatMin = ", myReport->particleSatMin,
455 "particleSatMean = ", myReport->particleSatMean,
456 "particleLumMax = ", myReport->particleLumMax,
457 "particleLumMin = ", myReport->particleLumMin,
458 "particleLumMean = ", myReport->particleLumMean);
468 dprintf(LOG_INFO,
"name of color: %s", myReport->name);
470 dprintf(LOG_INFO,
"\n %s%i %s%i\n %s%i %s%i\n %s%i %s%i\n -------",
471 "hueMin = ", myReport->hue.minValue,
472 "hueMax = ", myReport->hue.maxValue,
473 "satMin = ", myReport->saturation.minValue,
474 "satMax = ", myReport->saturation.maxValue,
475 "lumMin = ", myReport->luminance.minValue,
476 "lumMax = ", myReport->luminance.maxValue );