21 #include "BaeUtilities.h"
23 #include "VisionAPI.h"
25 int VisionAPI_debugFlag = 1;
26 #define DPRINTF if(VisionAPI_debugFlag)dprintf
40 Image* frcCreateImage(ImageType type) {
return imaqCreateImage(type, DEFAULT_BORDER_SIZE); }
48 int frcDispose(
void*
object) {
return imaqDispose(
object); }
58 int frcDispose(
const char* functionName, ... )
60 va_list disposalPtrList;
62 int success, returnValue = 1;
64 va_start( disposalPtrList, functionName );
65 disposalPtr = va_arg( disposalPtrList,
void* );
66 while( disposalPtr != NULL ) {
67 success = imaqDispose(disposalPtr);
68 if (!success) {returnValue = 0;}
69 disposalPtr = va_arg( disposalPtrList,
void* );
84 int frcCopyImage(Image* dest,
const Image* source) {
return imaqDuplicate(dest, source); }
96 int frcCrop(Image* dest,
const Image* source,
Rect rect)
98 return imaqScale(dest, source, 1, 1, IMAQ_SCALE_LARGER, rect);
114 int frcScale(Image* dest,
const Image* source,
int xScale,
int yScale, ScalingMode scaleMode)
116 Rect rect = IMAQ_NO_RECT;
117 return imaqScale(dest, source, xScale, yScale, scaleMode, rect);
130 int frcReadImage(Image* image,
const char* fileName)
132 return imaqReadFile(image, fileName, NULL, NULL);
163 int frcWriteImage(
const Image* image,
const char* fileName)
166 return imaqWriteFile(image, fileName, colorTable);
200 HistogramReport* frcHistogram(
const Image* image,
int numClasses,
float min,
float max)
202 Rect rect = IMAQ_NO_RECT;
203 return frcHistogram(image, numClasses, min, max, rect);
205 HistogramReport* frcHistogram(
const Image* image,
int numClasses,
float min,
float max,
Rect rect)
211 ROI* pRoi = imaqCreateROI();
212 success = imaqAddRectContour(pRoi, rect);
213 if ( !success ) { GetLastVisionError();
return NULL; }
216 Image* pMask = frcCreateImage(IMAQ_IMAGE_U8);
217 success = imaqROIToMask(pMask, pRoi, fillValue, NULL, NULL);
219 GetLastVisionError();
220 frcDispose(__FUNCTION__, pRoi, NULL);
226 pHr = imaqHistogram(image, numClasses, min, max, pMask);
229 frcDispose(__FUNCTION__, pRoi, pMask, NULL);
255 return frcColorHistogram(image, numClasses, mode, NULL);
258 ColorHistogramReport* frcColorHistogram(
const Image* image,
int numClasses, ColorMode mode, Image* mask)
260 return imaqColorHistogram2((Image*)image, numClasses, mode, NULL, mask);
275 int frcGetPixelValue(
const Image* image,
Point pixel,
PixelValue* value)
277 return imaqGetPixel(image, pixel, value);
300 Rect rect = IMAQ_NO_RECT;
301 return frcParticleFilter(dest, source, criteria, criteriaCount, options, rect, numParticles);
307 ROI* roi = imaqCreateROI();
308 imaqAddRectContour(roi, rect);
309 return imaqParticleFilter3(dest, source, criteria, criteriaCount, options, roi, numParticles);
327 int frcMorphology(Image* dest, Image* source, MorphologyMethod method)
329 return imaqMorphology(dest, source, method, NULL);
332 int frcMorphology(Image* dest, Image* source, MorphologyMethod method,
const StructuringElement* structuringElement)
334 return imaqMorphology(dest, source, method, structuringElement);
350 int frcRejectBorder(Image* dest, Image* source)
351 {
return imaqRejectBorder(dest, source, TRUE); }
353 int frcRejectBorder(Image* dest, Image* source,
int connectivity8)
355 return imaqRejectBorder(dest, source, connectivity8);
366 int frcCountParticles(Image* image,
int* numParticles)
368 return imaqCountParticles(image, 1, numParticles);
388 if ( ! imaqGetImageSize(image, &width, &height) ) {
return success; }
389 par->imageWidth = width;
390 par->imageHeight = height;
391 par->particleIndex = particleNumber;
395 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_CENTER_OF_MASS_X, &returnDouble);
396 if ( !success ) {
return success; }
397 par->center_mass_x = (int)returnDouble;
399 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_CENTER_OF_MASS_Y, &returnDouble);
400 if ( !success ) {
return success; }
401 par->center_mass_y = (int)returnDouble;
404 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_AREA, &returnDouble);
405 if ( !success ) {
return success; }
406 par->particleArea = returnDouble;
408 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_BOUNDING_RECT_TOP, &returnDouble);
409 if ( !success ) {
return success; }
410 par->boundingRect.top = (int)returnDouble;
412 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_BOUNDING_RECT_LEFT, &returnDouble);
413 if ( !success ) {
return success; }
414 par->boundingRect.left = (int)returnDouble;
416 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_BOUNDING_RECT_HEIGHT, &returnDouble);
417 if ( !success ) {
return success; }
418 par->boundingRect.height = (int)returnDouble;
420 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_BOUNDING_RECT_WIDTH, &returnDouble);
421 if ( !success ) {
return success; }
422 par->boundingRect.width = (int)returnDouble;
425 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_AREA_BY_IMAGE_AREA, &returnDouble);
426 if ( !success ) {
return success; }
427 par->particleToImagePercent = returnDouble;
429 success = imaqMeasureParticle(image, particleNumber, 0, IMAQ_MT_AREA_BY_PARTICLE_AND_HOLES_AREA, &returnDouble);
430 if ( !success ) {
return success; }
431 par->particleQuality = returnDouble;
434 par->center_mass_x_normalized = RangeToNormalized(par->center_mass_x, width);
435 par->center_mass_y_normalized = RangeToNormalized(par->center_mass_y, height);
457 int frcEqualize(Image* dest,
const Image* source,
float min,
float max)
458 {
return frcEqualize(dest, source, min, max, NULL); }
460 int frcEqualize(Image* dest,
const Image* source,
float min,
float max,
const Image* mask)
462 return imaqEqualize(dest, source, min, max, mask);
475 int frcColorEqualize(Image* dest,
const Image* source)
477 return imaqColorEqualize(dest, source, TRUE);
480 int frcColorEqualize(Image* dest,
const Image* source,
int colorEqualization)
482 return imaqColorEqualize(dest, source, TRUE);
510 int frcSmartThreshold(Image* dest,
const Image* source,
511 unsigned int windowWidth,
unsigned int windowHeight, LocalThresholdMethod method,
512 double deviationWeight, ObjectType type)
514 float replaceValue = 1.0;
515 return imaqLocalThreshold(dest, source, windowWidth, windowHeight, method,
516 deviationWeight, type, replaceValue);
519 int frcSmartThreshold(Image* dest,
const Image* source,
520 unsigned int windowWidth,
unsigned int windowHeight, LocalThresholdMethod method,
521 double deviationWeight, ObjectType type,
float replaceValue)
523 return imaqLocalThreshold(dest, source, windowWidth, windowHeight, method,
524 deviationWeight, type, replaceValue);
541 int frcSimpleThreshold(Image* dest,
const Image* source,
float rangeMin,
float rangeMax)
544 return frcSimpleThreshold(dest, source, rangeMin, rangeMax, newValue);
561 int frcSimpleThreshold(Image* dest,
const Image* source,
float rangeMin,
float rangeMax,
float newValue)
563 int useNewValue = TRUE;
564 return imaqThreshold(dest, source, rangeMin, rangeMax, useNewValue, newValue);
582 int frcColorThreshold(Image* dest,
const Image* source, ColorMode mode,
583 const Range* plane1Range,
const Range* plane2Range,
const Range* plane3Range)
585 int replaceValue = 1;
586 return imaqColorThreshold(dest, source, replaceValue, mode, plane1Range, plane2Range, plane3Range);
605 int frcColorThreshold(Image* dest,
const Image* source,
int replaceValue, ColorMode mode,
606 const Range* plane1Range,
const Range* plane2Range,
const Range* plane3Range)
607 {
return imaqColorThreshold(dest, source, replaceValue, mode, plane1Range, plane2Range, plane3Range);}
619 int frcHueThreshold(Image* dest,
const Image* source,
const Range* hueRange)
620 {
return frcHueThreshold(dest, source, hueRange, DEFAULT_SATURATION_THRESHOLD); }
622 int frcHueThreshold(Image* dest,
const Image* source,
const Range* hueRange,
int minSaturation)
625 ColorMode mode = IMAQ_HSL;
627 Range satRange; satRange.minValue = minSaturation; satRange.maxValue = 255;
629 Range lumRange; lumRange.minValue = 100; lumRange.maxValue = 255;
631 int replaceValue = 1;
632 return imaqColorThreshold(dest, source, replaceValue, mode, hueRange, &satRange, &lumRange);
647 int frcExtractColorPlanes(
const Image* image, ColorMode mode,
648 Image* plane1, Image* plane2, Image* plane3)
649 {
return imaqExtractColorPlanes(image, mode, plane1, plane2, plane3); }
660 int frcExtractHuePlane(
const Image* image, Image* huePlane)
662 return frcExtractHuePlane(image, huePlane, DEFAULT_SATURATION_THRESHOLD);
665 int frcExtractHuePlane(
const Image* image, Image* huePlane,
int minSaturation)
667 return frcExtractColorPlanes(image, IMAQ_HSL, huePlane, NULL, NULL);