001 /*----------------------------------------------------------------------------*/
002 /* Copyright (c) FIRST 2008-2012. All Rights Reserved. */
003 /* Open Source Software - may be modified and shared by FRC teams. The code */
004 /* must be accompanied by the FIRST BSD license file in the root directory of */
005 /* the project. */
006 /*----------------------------------------------------------------------------*/
007 package edu.wpi.first.wpilibj.image;
008
009 import com.sun.cldc.jna.BlockingFunction;
010 import com.sun.cldc.jna.Function;
011 import com.sun.cldc.jna.NativeLibrary;
012 import com.sun.cldc.jna.Pointer;
013 import com.sun.cldc.jna.Structure;
014 import com.sun.cldc.jna.TaskExecutor;
015 import com.sun.cldc.jna.ptr.IntByReference;
016 import com.sun.squawk.microedition.io.FileConnection;
017 import edu.wpi.first.wpilibj.util.BoundaryException;
018 import java.util.Vector;
019
020 /**
021 * Class for interfacing with the NIVision libraries
022 * @author dtjones
023 */
024 public class NIVision {
025
026 private NIVision() {
027 }
028
029 private static final TaskExecutor taskExecutor = new TaskExecutor("nivision task");
030
031 /**
032 * Enumeration representing the possible types of imaq images
033 */
034 public static class ImageType {
035
036 public final int value;
037 /** The image type is 8-bit unsigned integer grayscale. */
038 public static final ImageType imaqImageU8 = new ImageType(0);
039 /** The image type is 16-bit unsigned integer grayscale. */
040 public static final ImageType imaqImageU16 = new ImageType(7);
041 /** The image type is 16-bit signed integer grayscale. */
042 public static final ImageType imaqImageI16 = new ImageType(1);
043 /** The image type is 32-bit floating-point grayscale. */
044 public static final ImageType imaqImageSGL = new ImageType(2);
045 /** The image type is complex. */
046 public static final ImageType imaqImageComplex = new ImageType(3);
047 /** The image type is RGB color. */
048 public static final ImageType imaqImageRGB = new ImageType(4);
049 /** The image type is HSL color. */
050 public static final ImageType imaqImageHSL = new ImageType(5);
051 /** The image type is 64-bit unsigned RGB color. */
052 public static final ImageType imaqImageRGBU64 = new ImageType(6);
053 /** Reserved */
054 public static final ImageType imaqImageTypeSizeGuard = new ImageType(0xFFFFFFFF);
055
056 private ImageType(int value) {
057 this.value = value;
058 }
059 }
060
061 /**
062 * Enumerations representing the possible color spaces to operate in
063 */
064 public static class ColorMode {
065
066 public final int value;
067 /** The function operates in the RGB (Red, Blue, Green) color space. */
068 public static final ColorMode IMAQ_RGB = new ColorMode(0);
069 /** The function operates in the HSL (Hue, Saturation, Luminance) color space. */
070 public static final ColorMode IMAQ_HSL = new ColorMode(1);
071 /** The function operates in the HSV (Hue, Saturation, Value) color space. */
072 public static final ColorMode IMAQ_HSV = new ColorMode(2);
073 /** The function operates in the HSI (Hue, Saturation, Intensity) color space. */
074 public static final ColorMode IMAQ_HSI = new ColorMode(3);
075 /** The function operates in the CIE L*a*b* color space. */
076 public static final ColorMode IMAQ_CIE = new ColorMode(4);
077 /** The function operates in the CIE XYZ color space. */
078 public static final ColorMode IMAQ_CIEXYZ = new ColorMode(5);
079 public static final ColorMode IMAQ_COLOR_MODE_SIZE_GUARD = new ColorMode(0xFFFFFFFF);
080
081 private ColorMode(int value) {
082 this.value = value;
083 }
084 }
085
086 public static class MeasurementType {
087
088 public final int value;
089 /** X-coordinate of the point representing the average position of the total particle mass, assuming every point in the particle has a constant density. */
090 public static final MeasurementType IMAQ_MT_CENTER_OF_MASS_X = new MeasurementType(0);
091 /** Y-coordinate of the point representing the average position of the total particle mass, assuming every point in the particle has a constant density. */
092 public static final MeasurementType IMAQ_MT_CENTER_OF_MASS_Y = new MeasurementType(1);
093 /** X-coordinate of the highest, leftmost particle pixel. */
094 public static final MeasurementType IMAQ_MT_FIRST_PIXEL_X = new MeasurementType(2);
095 /** Y-coordinate of the highest, leftmost particle pixel. */
096 public static final MeasurementType IMAQ_MT_FIRST_PIXEL_Y = new MeasurementType(3);
097 /** X-coordinate of the leftmost particle point. */
098 public static final MeasurementType IMAQ_MT_BOUNDING_RECT_LEFT = new MeasurementType(4);
099 /** Y-coordinate of highest particle point. */
100 public static final MeasurementType IMAQ_MT_BOUNDING_RECT_TOP = new MeasurementType(5);
101 /** X-coordinate of the rightmost particle point. */
102 public static final MeasurementType IMAQ_MT_BOUNDING_RECT_RIGHT = new MeasurementType(6);
103 /** Y-coordinate of the lowest particle point. */
104 public static final MeasurementType IMAQ_MT_BOUNDING_RECT_BOTTOM = new MeasurementType(7);
105 /** X-coordinate of the start of the line segment connecting the two perimeter points that are the furthest apart. */
106 public static final MeasurementType IMAQ_MT_MAX_FERET_DIAMETER_START_X = new MeasurementType(8);
107 /** Y-coordinate of the start of the line segment connecting the two perimeter points that are the furthest apart. */
108 public static final MeasurementType IMAQ_MT_MAX_FERET_DIAMETER_START_Y = new MeasurementType(9);
109 /** X-coordinate of the end of the line segment connecting the two perimeter points that are the furthest apart. */
110 public static final MeasurementType IMAQ_MT_MAX_FERET_DIAMETER_END_X = new MeasurementType(10);
111 /** Y-coordinate of the end of the line segment connecting the two perimeter points that are the furthest apart. */
112 public static final MeasurementType IMAQ_MT_MAX_FERET_DIAMETER_END_Y = new MeasurementType(11);
113 /** X-coordinate of the leftmost pixel in the longest row of contiguous pixels in the particle. */
114 public static final MeasurementType IMAQ_MT_MAX_HORIZ_SEGMENT_LENGTH_LEFT = new MeasurementType(12);
115 /** X-coordinate of the rightmost pixel in the longest row of contiguous pixels in the particle. */
116 public static final MeasurementType IMAQ_MT_MAX_HORIZ_SEGMENT_LENGTH_RIGHT = new MeasurementType(13);
117 /** Y-coordinate of all of the pixels in the longest row of contiguous pixels in the particle. */
118 public static final MeasurementType IMAQ_MT_MAX_HORIZ_SEGMENT_LENGTH_ROW = new MeasurementType(14);
119 /** Distance between the x-coordinate of the leftmost particle point and the x-coordinate of the rightmost particle point. */
120 public static final MeasurementType IMAQ_MT_BOUNDING_RECT_WIDTH = new MeasurementType(16);
121 /** Distance between the y-coordinate of highest particle point and the y-coordinate of the lowest particle point. */
122 public static final MeasurementType IMAQ_MT_BOUNDING_RECT_HEIGHT = new MeasurementType(17);
123 /** Distance between opposite corners of the bounding rectangle. */
124 public static final MeasurementType IMAQ_MT_BOUNDING_RECT_DIAGONAL = new MeasurementType(18);
125 /** Length of the outer boundary of the particle. */
126 public static final MeasurementType IMAQ_MT_PERIMETER = new MeasurementType(19);
127 /** Perimeter of the smallest convex polygon containing all points in the particle. */
128 public static final MeasurementType IMAQ_MT_CONVEX_HULL_PERIMETER = new MeasurementType(20);
129 /** Sum of the perimeters of each hole in the particle. */
130 public static final MeasurementType IMAQ_MT_HOLES_PERIMETER = new MeasurementType(21);
131 /** Distance between the start and end of the line segment connecting the two perimeter points that are the furthest apart. */
132 public static final MeasurementType IMAQ_MT_MAX_FERET_DIAMETER = new MeasurementType(22);
133 /** Length of the major axis of the ellipse with the same perimeter and area as the particle. */
134 public static final MeasurementType IMAQ_MT_EQUIVALENT_ELLIPSE_MAJOR_AXIS = new MeasurementType(23);
135 /** Length of the minor axis of the ellipse with the same perimeter and area as the particle. */
136 public static final MeasurementType IMAQ_MT_EQUIVALENT_ELLIPSE_MINOR_AXIS = new MeasurementType(24);
137 /** Length of the minor axis of the ellipse with the same area as the particle, and Major Axis equal in length to the Max Feret Diameter. */
138 public static final MeasurementType IMAQ_MT_EQUIVALENT_ELLIPSE_MINOR_AXIS_FERET = new MeasurementType(25);
139 /** Longest side of the rectangle with the same perimeter and area as the particle. */
140 public static final MeasurementType IMAQ_MT_EQUIVALENT_RECT_LONG_SIDE = new MeasurementType(26);
141 /** Shortest side of the rectangle with the same perimeter and area as the particle. */
142 public static final MeasurementType IMAQ_MT_EQUIVALENT_RECT_SHORT_SIDE = new MeasurementType(27);
143 /** Distance between opposite corners of the rectangle with the same perimeter and area as the particle. */
144 public static final MeasurementType IMAQ_MT_EQUIVALENT_RECT_DIAGONAL = new MeasurementType(28);
145 /** Shortest side of the rectangle with the same area as the particle, and longest side equal in length to the Max Feret Diameter. */
146 public static final MeasurementType IMAQ_MT_EQUIVALENT_RECT_SHORT_SIDE_FERET = new MeasurementType(29);
147 /** Average length of a horizontal segment in the particle. */
148 public static final MeasurementType IMAQ_MT_AVERAGE_HORIZ_SEGMENT_LENGTH = new MeasurementType(30);
149 /** Average length of a vertical segment in the particle. */
150 public static final MeasurementType IMAQ_MT_AVERAGE_VERT_SEGMENT_LENGTH = new MeasurementType(31);
151 /** The particle area divided by the particle perimeter. */
152 public static final MeasurementType IMAQ_MT_HYDRAULIC_RADIUS = new MeasurementType(32);
153 /** Diameter of a disk with the same area as the particle. */
154 public static final MeasurementType IMAQ_MT_WADDEL_DISK_DIAMETER = new MeasurementType(33);
155 /** Area of the particle. */
156 public static final MeasurementType IMAQ_MT_AREA = new MeasurementType(35);
157 /** Sum of the areas of each hole in the particle. */
158 public static final MeasurementType IMAQ_MT_HOLES_AREA = new MeasurementType(36);
159 /** Area of a particle that completely covers the image. */
160 public static final MeasurementType IMAQ_MT_PARTICLE_AND_HOLES_AREA = new MeasurementType(37);
161 /** Area of the smallest convex polygon containing all points in the particle. */
162 public static final MeasurementType IMAQ_MT_CONVEX_HULL_AREA = new MeasurementType(38);
163 /** Area of the image. */
164 public static final MeasurementType IMAQ_MT_IMAGE_AREA = new MeasurementType(39);
165 /** Number of holes in the particle. */
166 public static final MeasurementType IMAQ_MT_NUMBER_OF_HOLES = new MeasurementType(41);
167 /** Number of horizontal segments in the particle. */
168 public static final MeasurementType IMAQ_MT_NUMBER_OF_HORIZ_SEGMENTS = new MeasurementType(42);
169 /** Number of vertical segments in the particle. */
170 public static final MeasurementType IMAQ_MT_NUMBER_OF_VERT_SEGMENTS = new MeasurementType(43);
171 /** The angle of the line that passes through the particle Center of Mass about which the particle has the lowest moment of inertia. */
172 public static final MeasurementType IMAQ_MT_ORIENTATION = new MeasurementType(45);
173 /** The angle of the line segment connecting the two perimeter points that are the furthest apart. */
174 public static final MeasurementType IMAQ_MT_MAX_FERET_DIAMETER_ORIENTATION = new MeasurementType(46);
175 /** Percentage of the particle Area covering the Image Area. */
176 public static final MeasurementType IMAQ_MT_AREA_BY_IMAGE_AREA = new MeasurementType(48);
177 /** Percentage of the particle Area in relation to its Particle and Holes Area. */
178 public static final MeasurementType IMAQ_MT_AREA_BY_PARTICLE_AND_HOLES_AREA = new MeasurementType(49);
179 /** Equivalent Ellipse Major Axis divided by Equivalent Ellipse Minor Axis. */
180 public static final MeasurementType IMAQ_MT_RATIO_OF_EQUIVALENT_ELLIPSE_AXES = new MeasurementType(50);
181 /** Equivalent Rect Long Side divided by Equivalent Rect Short Side. */
182 public static final MeasurementType IMAQ_MT_RATIO_OF_EQUIVALENT_RECT_SIDES = new MeasurementType(51);
183 /** Max Feret Diameter divided by Equivalent Rect Short Side (Feret). */
184 public static final MeasurementType IMAQ_MT_ELONGATION_FACTOR = new MeasurementType(53);
185 /** Area divided by the product of Bounding Rect Width and Bounding Rect Height. */
186 public static final MeasurementType IMAQ_MT_COMPACTNESS_FACTOR = new MeasurementType(54);
187 /** Perimeter divided by the circumference of a circle with the same area. */
188 public static final MeasurementType IMAQ_MT_HEYWOOD_CIRCULARITY_FACTOR = new MeasurementType(55);
189 /** Factor relating area to moment of inertia. */
190 public static final MeasurementType IMAQ_MT_TYPE_FACTOR = new MeasurementType(56);
191 /** The sum of all x-coordinates in the particle. */
192 public static final MeasurementType IMAQ_MT_SUM_X = new MeasurementType(58);
193 /** The sum of all y-coordinates in the particle. */
194 public static final MeasurementType IMAQ_MT_SUM_Y = new MeasurementType(59);
195 /** The sum of all x-coordinates squared in the particle. */
196 public static final MeasurementType IMAQ_MT_SUM_XX = new MeasurementType(60);
197 /** The sum of all x-coordinates times y-coordinates in the particle. */
198 public static final MeasurementType IMAQ_MT_SUM_XY = new MeasurementType(61);
199 /** The sum of all y-coordinates squared in the particle. */
200 public static final MeasurementType IMAQ_MT_SUM_YY = new MeasurementType(62);
201 /** The sum of all x-coordinates cubed in the particle. */
202 public static final MeasurementType IMAQ_MT_SUM_XXX = new MeasurementType(63);
203 /** The sum of all x-coordinates squared times y-coordinates in the particle. */
204 public static final MeasurementType IMAQ_MT_SUM_XXY = new MeasurementType(64);
205 /** The sum of all x-coordinates times y-coordinates squared in the particle. */
206 public static final MeasurementType IMAQ_MT_SUM_XYY = new MeasurementType(65);
207 /** The sum of all y-coordinates cubed in the particle. */
208 public static final MeasurementType IMAQ_MT_SUM_YYY = new MeasurementType(66);
209 /** The moment of inertia in the x-direction twice. */
210 public static final MeasurementType IMAQ_MT_MOMENT_OF_INERTIA_XX = new MeasurementType(68);
211 /** The moment of inertia in the x and y directions. */
212 public static final MeasurementType IMAQ_MT_MOMENT_OF_INERTIA_XY = new MeasurementType(69);
213 /** The moment of inertia in the y-direction twice. */
214 public static final MeasurementType IMAQ_MT_MOMENT_OF_INERTIA_YY = new MeasurementType(70);
215 /** The moment of inertia in the x-direction three times. */
216 public static final MeasurementType IMAQ_MT_MOMENT_OF_INERTIA_XXX = new MeasurementType(71);
217 /** The moment of inertia in the x-direction twice and the y-direction once. */
218 public static final MeasurementType IMAQ_MT_MOMENT_OF_INERTIA_XXY = new MeasurementType(72);
219 /** The moment of inertia in the x-direction once and the y-direction twice. */
220 public static final MeasurementType IMAQ_MT_MOMENT_OF_INERTIA_XYY = new MeasurementType(73);
221 /** The moment of inertia in the y-direction three times. */
222 public static final MeasurementType IMAQ_MT_MOMENT_OF_INERTIA_YYY = new MeasurementType(74);
223 /** The normalized moment of inertia in the x-direction twice. */
224 public static final MeasurementType IMAQ_MT_NORM_MOMENT_OF_INERTIA_XX = new MeasurementType(75);
225 /** The normalized moment of inertia in the x- and y-directions. */
226 public static final MeasurementType IMAQ_MT_NORM_MOMENT_OF_INERTIA_XY = new MeasurementType(76);
227 /** The normalized moment of inertia in the y-direction twice. */
228 public static final MeasurementType IMAQ_MT_NORM_MOMENT_OF_INERTIA_YY = new MeasurementType(77);
229 /** The normalized moment of inertia in the x-direction three times. */
230 public static final MeasurementType IMAQ_MT_NORM_MOMENT_OF_INERTIA_XXX = new MeasurementType(78);
231 /** The normalized moment of inertia in the x-direction twice and the y-direction once. */
232 public static final MeasurementType IMAQ_MT_NORM_MOMENT_OF_INERTIA_XXY = new MeasurementType(79);
233 /** The normalized moment of inertia in the x-direction once and the y-direction twice. */
234 public static final MeasurementType IMAQ_MT_NORM_MOMENT_OF_INERTIA_XYY = new MeasurementType(80);
235 /** The normalized moment of inertia in the y-direction three times. */
236 public static final MeasurementType IMAQ_MT_NORM_MOMENT_OF_INERTIA_YYY = new MeasurementType(81);
237 /** The first Hu moment. */
238 public static final MeasurementType IMAQ_MT_HU_MOMENT_1 = new MeasurementType(82);
239 /** The second Hu moment. */
240 public static final MeasurementType IMAQ_MT_HU_MOMENT_2 = new MeasurementType(83);
241 /** The third Hu moment. */
242 public static final MeasurementType IMAQ_MT_HU_MOMENT_3 = new MeasurementType(84);
243 /** The fourth Hu moment. */
244 public static final MeasurementType IMAQ_MT_HU_MOMENT_4 = new MeasurementType(85);
245 /** The fifth Hu moment. */
246 public static final MeasurementType IMAQ_MT_HU_MOMENT_5 = new MeasurementType(86);
247 /** The sixth Hu moment. */
248 public static final MeasurementType IMAQ_MT_HU_MOMENT_6 = new MeasurementType(87);
249 /** The seventh Hu moment. */
250 public static final MeasurementType IMAQ_MT_HU_MOMENT_7 = new MeasurementType(88);
251
252 public static final MeasurementType IMAQ_MEASUREMENT_TYPE_SIZE_GUARD = new MeasurementType(0xFFFFFFFF);
253
254 private MeasurementType(int value) {
255 this.value = value;
256 }
257 }
258
259 public static class Range extends Structure {
260
261 int lower;
262 int upper;
263
264 public void read() {
265 lower = backingNativeMemory.getInt(0);
266 upper = backingNativeMemory.getInt(4);
267 }
268
269 public void write() {
270 backingNativeMemory.setInt(0, lower);
271 backingNativeMemory.setInt(4, upper);
272 }
273
274 public int size() {
275 return 8;
276 }
277
278 /**
279 * Free the memory used by this range
280 */
281 public void free() {
282 release();
283 }
284
285 /**
286 * Create a new range with the specified upper and lower boundaries
287 * @param lower The lower limit
288 * @param upper The upper limit
289 */
290 public Range(final int lower, final int upper) {
291 allocateMemory();
292 set(lower, upper);
293 }
294
295 /**
296 * Set the upper and lower boundaries
297 * @param lower The lower limit
298 * @param upper The upper limit
299 */
300 public void set(final int lower, final int upper) {
301 if (lower > upper) {
302 throw new BoundaryException("Lower boundary is greater than upper");
303 }
304 this.lower = lower;
305 this.upper = upper;
306 write();
307 }
308
309 /**
310 * Get the lower boundary
311 * @return The lower boundary.
312 */
313 public int getLower() {
314 read();
315 return lower;
316 }
317
318 /**
319 * Get the upper boundary
320 * @return The upper boundary.
321 */
322 public int getUpper() {
323 read();
324 return upper;
325 }
326 }
327
328 public static class Rect extends Structure {
329
330 int top;
331 int left;
332 int height;
333 int width;
334
335 public void read() {
336 top = backingNativeMemory.getInt(0);
337 left = backingNativeMemory.getInt(4);
338 height = backingNativeMemory.getInt(8);
339 width = backingNativeMemory.getInt(12);
340 }
341
342 public void write() {
343 backingNativeMemory.setInt(0, top);
344 backingNativeMemory.setInt(4, left);
345 backingNativeMemory.setInt(8, height);
346 backingNativeMemory.setInt(12, width);
347 }
348
349 public int size() {
350 return 16;
351 }
352
353 /**
354 * Free the memory used by this range
355 */
356 public void free() {
357 release();
358 }
359
360 /**
361 * Create a new Rect with the specified dimensions
362 * @param top The top of the rectangle
363 * @param left The left edge of the rectangle
364 * @param height The height of the rectangle
365 * @param width The width of the rectangle
366 */
367 public Rect(final int top, final int left, final int height, final int width) {
368 allocateMemory();
369 set(top, left, height, width);
370 }
371
372 /**
373 * Set the Rect dimensions
374 * @param top The top of the rectangle
375 * @param left The left edge of the rectangle
376 * @param height The height of the rectangle
377 * @param width The width of the rectangle
378 */
379 public void set(final int top, final int left, final int height, final int width) {
380 this.top = top;
381 this.left = left;
382 this.height = height;
383 this.width = width;
384 write();
385 }
386
387 /**
388 * Get the top of the rectangle
389 * @return The top edge of the rectangle in pixels, measured from the top of the image
390 */
391 public int getTop() {
392 read();
393 return top;
394 }
395
396 /**
397 * Get the left edge of the rectangle
398 * @return The left edge of the rectangle in pixels measured from the left of the image
399 */
400 public int getLeft() {
401 read();
402 return left;
403 }
404
405 /**
406 * Get the width of the rectangle
407 * @return The width of the rectangle in pixels
408 */
409 public int getWidth() {
410 read();
411 return width;
412 }
413
414 /**
415 * Get the height of the rectangle
416 * @return The height edge of the rectangle in pixels
417 */
418 public int getHeight() {
419 read();
420 return height;
421 }
422
423 }
424
425 //============================================================================
426 // Value Type handling
427 // Parameters of "type" PixelValue, RGBValue, HSLValue, etc, are passed as an encoded int from Java code.
428 //============================================================================
429 public int encodeRGBValue(int r, int g, int b, int a) {
430 return (a & 0xff << 24) | (r & 0xff << 16) | (g & 0xff << 8) | (b & 0xff);
431 }
432
433 public int rgbGetR(int rgbvalue) {
434 return (rgbvalue >>> 16) & 0xFF;
435 }
436
437 public int rgbGetG(int rgbvalue) {
438 return (rgbvalue >>> 8) & 0xFF;
439 }
440
441 public int rgbGetB(int rgbvalue) {
442 return (rgbvalue >>> 0) & 0xFF;
443 }
444
445 public int rgbGetA(int rgbvalue) {
446 return (rgbvalue >>> 24) & 0xFF;
447 }
448
449 public int encodeHSLValue(int h, int s, int l, int a) {
450 return (a & 0xff << 24) | (h & 0xff << 16) | (s & 0xff << 8) | (l & 0xff);
451 }
452
453 public int hslGetH(int hslvalue) {
454 return (hslvalue >>> 16) & 0xFF;
455 }
456
457 public int hslGetS(int hslvalue) {
458 return (hslvalue >>> 8) & 0xFF;
459 }
460
461 public int hslGetL(int hslvalue) {
462 return (hslvalue >>> 0) & 0xFF;
463 }
464
465 public int hslGetA(int hslvalue) {
466 return (hslvalue >>> 24) & 0xFF;
467 }
468
469 public int encodeHSVValue(int h, int s, int v, int a) {
470 return (a & 0xff << 24) | (h & 0xff << 16) | (s & 0xff << 8) | (v & 0xff);
471 }
472
473 public int hsvGetH(int hsvvalue) {
474 return (hsvvalue >>> 16) & 0xFF;
475 }
476
477 public int hsvGetS(int hsvvalue) {
478 return (hsvvalue >>> 8) & 0xFF;
479 }
480
481 public int hsvGetV(int hsvvalue) {
482 return (hsvvalue >>> 0) & 0xFF;
483 }
484
485 public int hsvGetA(int hsvvalue) {
486 return (hsvvalue >>> 24) & 0xFF;
487 }
488
489 public int encodeGreyscaleValue(float greyscale) {
490 return Float.floatToIntBits(greyscale);
491 }
492
493 public float decodeGreyscaleValue(int pixelValue) {
494 return Float.intBitsToFloat(pixelValue);
495 }
496
497 //============================================================================
498 // Acquisition functions
499 //============================================================================
500 //IMAQ_FUNC Image* IMAQ_STDCALL imaqCopyFromRing(SESSION_ID sessionID, Image* image, int imageToCopy, int* imageNumber, Rect rect);
501 //IMAQ_FUNC Image* IMAQ_STDCALL imaqEasyAcquire(const char* interfaceName);
502 //IMAQ_FUNC Image* IMAQ_STDCALL imaqExtractFromRing(SESSION_ID sessionID, int imageToExtract, int* imageNumber);
503 //IMAQ_FUNC Image* IMAQ_STDCALL imaqGrab(SESSION_ID sessionID, Image* image, int immediate);
504 //IMAQ_FUNC int IMAQ_STDCALL imaqReleaseImage(SESSION_ID sessionID);
505 //IMAQ_FUNC int IMAQ_STDCALL imaqSetupGrab(SESSION_ID sessionID, Rect rect);
506 //IMAQ_FUNC int IMAQ_STDCALL imaqSetupRing(SESSION_ID sessionID, Image** images, int numImages, int skipCount, Rect rect);
507 //IMAQ_FUNC int IMAQ_STDCALL imaqSetupSequence(SESSION_ID sessionID, Image** images, int numImages, int skipCount, Rect rect);
508 //IMAQ_FUNC Image* IMAQ_STDCALL imaqSnap(SESSION_ID sessionID, Image* image, Rect rect);
509 //IMAQ_FUNC int IMAQ_STDCALL imaqStartAcquisition(SESSION_ID sessionID);
510 //IMAQ_FUNC int IMAQ_STDCALL imaqStopAcquisition(SESSION_ID sessionID);
511
512 //============================================================================
513 // Arithmetic functions
514 //============================================================================
515 //IMAQ_FUNC int IMAQ_STDCALL imaqAbsoluteDifference(Image* dest, const Image* sourceA, const Image* sourceB);
516 //IMAQ_FUNC int IMAQ_STDCALL imaqAbsoluteDifferenceConstant(Image* dest, const Image* source, PixelValue value);
517 //IMAQ_FUNC int IMAQ_STDCALL imaqAdd(Image* dest, const Image* sourceA, const Image* sourceB);
518 //IMAQ_FUNC int IMAQ_STDCALL imaqAddConstant(Image* dest, const Image* source, PixelValue value);
519 //IMAQ_FUNC int IMAQ_STDCALL imaqAverage(Image* dest, const Image* sourceA, const Image* sourceB);
520 //IMAQ_FUNC int IMAQ_STDCALL imaqAverageConstant(Image* dest, const Image* source, PixelValue value);
521 //IMAQ_FUNC int IMAQ_STDCALL imaqDivide2(Image* dest, const Image* sourceA, const Image* sourceB, RoundingMode roundingMode);
522 //IMAQ_FUNC int IMAQ_STDCALL imaqDivideConstant2(Image* dest, const Image* source, PixelValue value, RoundingMode roundingMode);
523 //IMAQ_FUNC int IMAQ_STDCALL imaqMax(Image* dest, const Image* sourceA, const Image* sourceB);
524 //IMAQ_FUNC int IMAQ_STDCALL imaqMaxConstant(Image* dest, const Image* source, PixelValue value);
525 //IMAQ_FUNC int IMAQ_STDCALL imaqMin(Image* dest, const Image* sourceA, const Image* sourceB);
526 //IMAQ_FUNC int IMAQ_STDCALL imaqMinConstant(Image* dest, const Image* source, PixelValue value);
527 //IMAQ_FUNC int IMAQ_STDCALL imaqModulo(Image* dest, const Image* sourceA, const Image* sourceB);
528 //IMAQ_FUNC int IMAQ_STDCALL imaqModuloConstant(Image* dest, const Image* source, PixelValue value);
529 //IMAQ_FUNC int IMAQ_STDCALL imaqMulDiv(Image* dest, const Image* sourceA, const Image* sourceB, float value);
530 //IMAQ_FUNC int IMAQ_STDCALL imaqMultiply(Image* dest, const Image* sourceA, const Image* sourceB);
531 //IMAQ_FUNC int IMAQ_STDCALL imaqMultiplyConstant(Image* dest, const Image* source, PixelValue value);
532 //IMAQ_FUNC int IMAQ_STDCALL imaqSubtract(Image* dest, const Image* sourceA, const Image* sourceB);
533 //IMAQ_FUNC int IMAQ_STDCALL imaqSubtractConstant(Image* dest, const Image* source, PixelValue value);
534
535 //============================================================================
536 // Spatial Filters functions
537 //============================================================================
538 //IMAQ_FUNC int IMAQ_STDCALL imaqCannyEdgeFilter(Image* dest, const Image* source, const CannyOptions* options);
539 //IMAQ_FUNC int IMAQ_STDCALL imaqConvolve2(Image* dest, Image* source, float* kernel, int matrixRows, int matrixCols, float normalize, Image* mask, RoundingMode roundingMode);
540 //IMAQ_FUNC int IMAQ_STDCALL imaqCorrelate(Image* dest, Image* source, const Image* templateImage, Rect rect);
541 //IMAQ_FUNC int IMAQ_STDCALL imaqEdgeFilter(Image* dest, Image* source, OutlineMethod method, const Image* mask);
542 //IMAQ_FUNC int IMAQ_STDCALL imaqLowPass(Image* dest, Image* source, int width, int height, float tolerance, const Image* mask);
543 //IMAQ_FUNC int IMAQ_STDCALL imaqMedianFilter(Image* dest, Image* source, int width, int height, const Image* mask);
544 //IMAQ_FUNC int IMAQ_STDCALL imaqNthOrderFilter(Image* dest, Image* source, int width, int height, int n, const Image* mask);
545
546 //============================================================================
547 // Drawing functions
548 //============================================================================
549 //IMAQ_FUNC int IMAQ_STDCALL imaqDrawLineOnImage(Image* dest, const Image* source, DrawMode mode, Point start, Point end, float newPixelValue);
550 //IMAQ_FUNC int IMAQ_STDCALL imaqDrawShapeOnImage(Image* dest, const Image* source, Rect rect, DrawMode mode, ShapeMode shape, float newPixelValue);
551 //IMAQ_FUNC int IMAQ_STDCALL imaqDrawTextOnImage(Image* dest, const Image* source, Point coord, const char* text, const DrawTextOptions* options, int* fontNameUsed);
552
553 //============================================================================
554 // Interlacing functions
555 //============================================================================
556 //IMAQ_FUNC int IMAQ_STDCALL imaqInterlaceCombine(Image* frame, const Image* odd, const Image* even);
557 //IMAQ_FUNC int IMAQ_STDCALL imaqInterlaceSeparate(const Image* frame, Image* odd, Image* even);
558
559 //============================================================================
560 // Image Information functions
561 //============================================================================
562 //IMAQ_FUNC char** IMAQ_STDCALL imaqEnumerateCustomKeys(const Image* image, unsigned int* size);
563 //IMAQ_FUNC int IMAQ_STDCALL imaqGetBitDepth(const Image* image, unsigned int* bitDepth);
564 //IMAQ_FUNC int IMAQ_STDCALL imaqGetBytesPerPixel(const Image* image, int* byteCount);
565 //IMAQ_FUNC int IMAQ_STDCALL imaqGetImageInfo(const Image* image, ImageInfo* info);
566 //IMAQ_FUNC int IMAQ_STDCALL imaqGetImageType(const Image* image, ImageType* type);
567 //IMAQ_FUNC int IMAQ_STDCALL imaqGetMaskOffset(const Image* image, Point* offset);
568 //IMAQ_FUNC void* IMAQ_STDCALL imaqGetPixelAddress(const Image* image, Point pixel);
569 //IMAQ_FUNC int IMAQ_STDCALL imaqGetVisionInfoTypes(const Image* image, unsigned int* present);
570 //IMAQ_FUNC int IMAQ_STDCALL imaqIsImageEmpty(const Image* image, int* empty);
571 //IMAQ_FUNC void* IMAQ_STDCALL imaqReadCustomData(const Image* image, const char* key, unsigned int* size);
572 //IMAQ_FUNC int IMAQ_STDCALL imaqRemoveCustomData(Image* image, const char* key);
573 //IMAQ_FUNC int IMAQ_STDCALL imaqRemoveVisionInfo2(const Image* image, unsigned int info);
574 //IMAQ_FUNC int IMAQ_STDCALL imaqSetBitDepth(Image* image, unsigned int bitDepth);
575 //IMAQ_FUNC int IMAQ_STDCALL imaqSetImageSize(Image* image, int width, int height);
576 //IMAQ_FUNC int IMAQ_STDCALL imaqSetMaskOffset(Image* image, Point offset);
577 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteCustomData(Image* image, const char* key, const void* data, unsigned int size);
578
579 // TODO: Make non-blocking...
580 private static final BlockingFunction imaqGetImageSizeFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqGetImageSize");
581 static { imaqGetImageSizeFn.setTaskExecutor(taskExecutor); }
582
583 /**
584 * Get the height of an image.
585 * @param image The image to get the height of.
586 * @return The height of the image.
587 */
588 public static int getHeight(Pointer image) throws NIVisionException{
589 Pointer i = new Pointer(4);
590 int val;
591 try {
592 assertCleanStatus(imaqGetImageSizeFn.call3(image, 0, i));
593 } finally {
594 val = i.getInt(0);
595 i.free();
596 }
597 return val;
598 }
599
600 /**
601 * Get the width of an image.
602 * @param image The image to get the width of.
603 * @return The width of the image.
604 */
605 public static int getWidth(Pointer image) throws NIVisionException{
606 Pointer i = new Pointer(4);
607 int val;
608 try {
609 assertCleanStatus(imaqGetImageSizeFn.call3(image, i, 0));
610 } finally {
611 val = i.getInt(0);
612 i.free();
613 }
614 return val;
615 }
616
617 //============================================================================
618 // Morphology functions
619 //============================================================================
620 //IMAQ_FUNC int IMAQ_STDCALL imaqConvexHull(Image* dest, Image* source, int connectivity8);
621 //IMAQ_FUNC int IMAQ_STDCALL imaqDanielssonDistance(Image* dest, Image* source);
622 //IMAQ_FUNC int IMAQ_STDCALL imaqFillHoles(Image* dest, const Image* source, int connectivity8);
623 //IMAQ_FUNC CircleReport* IMAQ_STDCALL imaqFindCircles(Image* dest, Image* source, float minRadius, float maxRadius, int* numCircles);
624 //IMAQ_FUNC int IMAQ_STDCALL imaqLabel2(Image* dest, Image* source, int connectivity8, int* particleCount);
625 //IMAQ_FUNC int IMAQ_STDCALL imaqMorphology(Image* dest, Image* source, MorphologyMethod method, const StructuringElement* structuringElement);
626 //IMAQ_FUNC int IMAQ_STDCALL imaqRejectBorder(Image* dest, Image* source, int connectivity8);
627 //IMAQ_FUNC int IMAQ_STDCALL imaqSegmentation(Image* dest, Image* source);
628 //IMAQ_FUNC int IMAQ_STDCALL imaqSeparation(Image* dest, Image* source, int erosions, const StructuringElement* structuringElement);
629 //IMAQ_FUNC int IMAQ_STDCALL imaqSimpleDistance(Image* dest, Image* source, const StructuringElement* structuringElement);
630 //IMAQ_FUNC int IMAQ_STDCALL imaqSizeFilter(Image* dest, Image* source, int connectivity8, int erosions, SizeType keepSize, const StructuringElement* structuringElement);
631 //IMAQ_FUNC int IMAQ_STDCALL imaqSkeleton(Image* dest, Image* source, SkeletonMethod method);
632
633
634 /**
635 * Convex hull operation
636 */
637 private static final BlockingFunction imaqConvexHullFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqConvexHull");
638 static { imaqConvexHullFn.setTaskExecutor(taskExecutor); }
639
640 public static void convexHull(Pointer dest, Pointer source, int connectivity8) throws NIVisionException {
641 assertCleanStatus(imaqConvexHullFn.call3(dest.address().toUWord().toPrimitive(),
642 source.address().toUWord().toPrimitive(),
643 connectivity8));
644 }
645
646 /**
647 * size filter function
648 */
649 private static final BlockingFunction imaqSizeFilterFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqSizeFilter");
650 static { imaqSizeFilterFn.setTaskExecutor(taskExecutor); }
651
652 public static void sizeFilter(Pointer dest, Pointer source, boolean connectivity8, int erosions, boolean keepLarger) throws NIVisionException {
653 assertCleanStatus(imaqSizeFilterFn.call6(dest.address().toUWord().toPrimitive(),
654 source.address().toUWord().toPrimitive(),
655 connectivity8 ? 1 : 0, erosions, keepLarger ? 0 : 1, 0));
656 }
657
658 //============================================================================
659 // Logical functions
660 //============================================================================
661 //IMAQ_FUNC int IMAQ_STDCALL imaqAnd(Image* dest, const Image* sourceA, const Image* sourceB);
662 //IMAQ_FUNC int IMAQ_STDCALL imaqAndConstant(Image* dest, const Image* source, PixelValue value);
663 //IMAQ_FUNC int IMAQ_STDCALL imaqCompare(Image* dest, const Image* source, const Image* compareImage, ComparisonFunction compare);
664 //IMAQ_FUNC int IMAQ_STDCALL imaqCompareConstant(Image* dest, const Image* source, PixelValue value, ComparisonFunction compare);
665 //IMAQ_FUNC int IMAQ_STDCALL imaqLogicalDifference(Image* dest, const Image* sourceA, const Image* sourceB);
666 //IMAQ_FUNC int IMAQ_STDCALL imaqLogicalDifferenceConstant(Image* dest, const Image* source, PixelValue value);
667 //IMAQ_FUNC int IMAQ_STDCALL imaqNand(Image* dest, const Image* sourceA, const Image* sourceB);
668 //IMAQ_FUNC int IMAQ_STDCALL imaqNandConstant(Image* dest, const Image* source, PixelValue value);
669 //IMAQ_FUNC int IMAQ_STDCALL imaqNor(Image* dest, const Image* sourceA, const Image* sourceB);
670 //IMAQ_FUNC int IMAQ_STDCALL imaqNorConstant(Image* dest, const Image* source, PixelValue value);
671 //IMAQ_FUNC int IMAQ_STDCALL imaqOr(Image* dest, const Image* sourceA, const Image* sourceB);
672 //IMAQ_FUNC int IMAQ_STDCALL imaqOrConstant(Image* dest, const Image* source, PixelValue value);
673 //IMAQ_FUNC int IMAQ_STDCALL imaqXnor(Image* dest, const Image* sourceA, const Image* sourceB);
674 //IMAQ_FUNC int IMAQ_STDCALL imaqXnorConstant(Image* dest, const Image* source, PixelValue value);
675 //IMAQ_FUNC int IMAQ_STDCALL imaqXor(Image* dest, const Image* sourceA, const Image* sourceB);
676 //IMAQ_FUNC int IMAQ_STDCALL imaqXorConstant(Image* dest, const Image* source, PixelValue value);
677
678 //============================================================================
679 // Particle Analysis functions
680 //============================================================================
681
682 private static final BlockingFunction imaqCountParticlesFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqCountParticles");
683 static { imaqCountParticlesFn.setTaskExecutor(taskExecutor); }
684
685 /**
686 * Counts the number of particles in a binary image.
687 * @param image The image to count the particles in
688 * @return The number of particles
689 */
690 public static int countParticles(Pointer image) throws NIVisionException{
691 IntByReference i = new IntByReference(0);
692 int val;
693 try {
694 assertCleanStatus(imaqCountParticlesFn.call3(image, 1, i.getPointer()));
695 } finally {
696 val = i.getValue();
697 i.free();
698 }
699 return val;
700 }
701
702 private static final BlockingFunction imaqMeasureParticleFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqMeasureParticle");
703 static { imaqMeasureParticleFn.setTaskExecutor(taskExecutor); }
704
705 /**
706 * Returns a measurement associated with a particle
707 * @param image The image containing the particle to get information about.
708 * @param particleNum The number of the particle to get information about.
709 * @param calibrated Specifies whether to return the measurement as a real-world value.
710 * @param type The measurement to make on the particle.
711 * @return The value of the requested measurement.
712 */
713 public static double MeasureParticle (Pointer image, int particleNum, boolean calibrated, MeasurementType type) throws NIVisionException{
714 Pointer l = new Pointer(8);
715 double val;
716 try {
717 assertCleanStatus(imaqMeasureParticleFn.call5(image, particleNum, calibrated?1:0, type.value, l));
718 } finally {
719 val = l.getDouble(0);
720 l.free();
721 }
722 return val;
723 }
724
725 //IMAQ_FUNC int IMAQ_STDCALL imaqParticleFilter4(Image* dest, Image* source, const ParticleFilterCriteria2* criteria, int criteriaCount, const ParticleFilterOptions2* options, const ROI* roi, int* numParticles);
726
727 private static final BlockingFunction imaqParticleFilter4Fn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqParticleFilter4");
728
729 public static int particleFilter(Pointer dest, Pointer source, CriteriaCollection collection) throws NIVisionException {
730 Pointer particleFilterOptions = new Pointer(16);
731 particleFilterOptions.setInt(0, 0);
732 particleFilterOptions.setInt(4, 0);
733 particleFilterOptions.setInt(8, 0);
734 particleFilterOptions.setInt(12, 1);
735 IntByReference i = new IntByReference(0);
736 Pointer criteriaArray = collection.getCriteriaArray();
737 assertCleanStatus(imaqParticleFilter4Fn.call7(dest.address().toUWord().toPrimitive(), // dest image
738 source.address().toUWord().toPrimitive(), // source image
739 criteriaArray.address().toUWord().toPrimitive(), // array of criteria
740 collection.getNumberOfCriteria(), // number of criteria in the array
741 particleFilterOptions.address().toUWord().toPrimitive(), // particle filter options
742 0, // Region of interest
743 i.getPointer().address().toUWord().toPrimitive())); // returned number of particles
744 int numberOfParticles = i.getValue();
745 i.free();
746 criteriaArray.free();
747 particleFilterOptions.free();
748 return numberOfParticles;
749 }
750
751 //============================================================================
752 // Analytic Geometry functions
753 //============================================================================
754 //IMAQ_FUNC int IMAQ_STDCALL imaqBuildCoordinateSystem(const Point* points, ReferenceMode mode, AxisOrientation orientation, CoordinateSystem* system);
755 //IMAQ_FUNC BestCircle2* IMAQ_STDCALL imaqFitCircle2(const PointFloat* points, int numPoints, const FitCircleOptions* options);
756 //IMAQ_FUNC BestEllipse2* IMAQ_STDCALL imaqFitEllipse2(const PointFloat* points, int numPoints, const FitEllipseOptions* options);
757 //IMAQ_FUNC BestLine* IMAQ_STDCALL imaqFitLine(const PointFloat* points, int numPoints, const FitLineOptions* options);
758 //IMAQ_FUNC int IMAQ_STDCALL imaqGetAngle(PointFloat start1, PointFloat end1, PointFloat start2, PointFloat end2, float* angle);
759 //IMAQ_FUNC int IMAQ_STDCALL imaqGetBisectingLine(PointFloat start1, PointFloat end1, PointFloat start2, PointFloat end2, PointFloat* bisectStart, PointFloat* bisectEnd);
760 //IMAQ_FUNC int IMAQ_STDCALL imaqGetDistance(PointFloat point1, PointFloat point2, float* distance);
761 //IMAQ_FUNC int IMAQ_STDCALL imaqGetIntersection(PointFloat start1, PointFloat end1, PointFloat start2, PointFloat end2, PointFloat* intersection);
762 //IMAQ_FUNC int IMAQ_STDCALL imaqGetMidLine(PointFloat refLineStart, PointFloat refLineEnd, PointFloat point, PointFloat* midLineStart, PointFloat* midLineEnd);
763 //IMAQ_FUNC int IMAQ_STDCALL imaqGetPerpendicularLine(PointFloat refLineStart, PointFloat refLineEnd, PointFloat point, PointFloat* perpLineStart, PointFloat* perpLineEnd, double* distance);
764 //IMAQ_FUNC SegmentInfo* IMAQ_STDCALL imaqGetPointsOnContour(const Image* image, int* numSegments);
765 //IMAQ_FUNC Point* IMAQ_STDCALL imaqGetPointsOnLine(Point start, Point end, int* numPoints);
766 //IMAQ_FUNC int IMAQ_STDCALL imaqGetPolygonArea(const PointFloat* points, int numPoints, float* area);
767 //IMAQ_FUNC float* IMAQ_STDCALL imaqInterpolatePoints(const Image* image, const Point* points, int numPoints, InterpolationMethod method, int subpixel, int* interpCount);
768
769 //============================================================================
770 // Border functions
771 //============================================================================
772 //IMAQ_FUNC int IMAQ_STDCALL imaqFillBorder(Image* image, BorderMethod method);
773 //IMAQ_FUNC int IMAQ_STDCALL imaqGetBorderSize(const Image* image, int* borderSize);
774 //IMAQ_FUNC int IMAQ_STDCALL imaqSetBorderSize(Image* image, int size);
775
776 //============================================================================
777 // Image Management functions
778 //============================================================================
779 protected static final BlockingFunction imaqCreateImageFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqCreateImage");
780 static { imaqCreateImageFn.setTaskExecutor(taskExecutor); }
781
782 /**
783 * Allocates space for and creates a new imaq image
784 * @param type the imaq encoding to use for the image
785 * @param borderSize the size of border to use for the image
786 * @return a newly allocated pointer to an imaqImage
787 */
788 public static Pointer imaqCreateImage(ImageType type, int borderSize) throws NIVisionException{
789 int toReturn = imaqCreateImageFn.call2(type.value, borderSize);
790 assertCleanStatus(toReturn);
791 return new Pointer(toReturn, 0);
792 }
793 //IMAQ_FUNC int IMAQ_STDCALL imaqArrayToImage(Image* image, const void* array, int numCols, int numRows);
794 //IMAQ_FUNC void* IMAQ_STDCALL imaqImageToArray(const Image* image, Rect rect, int* columns, int* rows);
795
796 //============================================================================
797 // Color Processing functions
798 //============================================================================
799
800 private static final BlockingFunction imaqColorThresholdFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqColorThreshold");
801 static { imaqColorThresholdFn.setTaskExecutor(taskExecutor); }
802
803 /**
804 * Convert the given image into a binary image true where the colors match the given thresholds
805 * @param dest the 8 bit monocolor image to store the result in
806 * @param source the color image source
807 * @param mode The mode of color to use
808 * @param plane1Range First color range
809 * @param plane2Range Second color range
810 * @param plane3Range Third color range
811 */
812 public static void colorThreshold(Pointer dest, Pointer source, ColorMode mode,
813 Pointer plane1Range, Pointer plane2Range, Pointer plane3Range) throws NIVisionException{
814 int replaceValue = 1;
815 assertCleanStatus(imaqColorThresholdFn.call7(dest.address().toUWord().toPrimitive(),
816 source.address().toUWord().toPrimitive(),
817 replaceValue, mode.value,
818 plane1Range.address().toUWord().toPrimitive(),
819 plane2Range.address().toUWord().toPrimitive(),
820 plane3Range.address().toUWord().toPrimitive()));
821 }
822
823 private static final BlockingFunction imaqColorEqualizeFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqColorEqualize");
824 static { imaqColorEqualizeFn.setTaskExecutor(taskExecutor); }
825
826 /**
827 * Calculates the histogram of each plane of a color image and redistributes
828 * pixel values across the desired range while maintaining pixel value
829 * groupings.
830 * @param destination The destination image.
831 * @param source The image to equalize.
832 * @param all Set this parameter to TRUE to equalize all three planes of the
833 * image. Set this parameter to FALSE to equalize only the luminance plane.
834 */
835 public static void colorEqualize(Pointer destination, Pointer source, boolean all) throws NIVisionException{
836 assertCleanStatus(imaqColorEqualizeFn.call3(destination, source,all?1:0));
837 }
838
839 //IMAQ_FUNC Color2 IMAQ_STDCALL imaqChangeColorSpace2(const Color2* sourceColor, ColorMode sourceSpace, ColorMode destSpace, double offset, const CIEXYZValue* whiteReference);
840 //IMAQ_FUNC int IMAQ_STDCALL imaqColorBCGTransform(Image* dest, const Image* source, const BCGOptions* redOptions, const BCGOptions* greenOptions, const BCGOptions* blueOptions, const Image* mask);
841 //IMAQ_FUNC ColorHistogramReport* IMAQ_STDCALL imaqColorHistogram2(Image* image, int numClasses, ColorMode mode, const CIEXYZValue* whiteReference, Image* mask);
842 //IMAQ_FUNC int IMAQ_STDCALL imaqColorLookup(Image* dest, const Image* source, ColorMode mode, const Image* mask, const short* plane1, const short* plane2, const short* plane3);
843
844 //============================================================================
845 // Transform functions
846 //============================================================================
847 //IMAQ_FUNC int IMAQ_STDCALL imaqBCGTransform(Image* dest, const Image* source, const BCGOptions* options, const Image* mask);
848 //IMAQ_FUNC int IMAQ_STDCALL imaqEqualize(Image* dest, const Image* source, float min, float max, const Image* mask);
849 //IMAQ_FUNC int IMAQ_STDCALL imaqInverse(Image* dest, const Image* source, const Image* mask);
850 //IMAQ_FUNC int IMAQ_STDCALL imaqLookup(Image* dest, const Image* source, const short* table, const Image* mask);
851 //IMAQ_FUNC int IMAQ_STDCALL imaqMathTransform(Image* dest, const Image* source, MathTransformMethod method, float rangeMin, float rangeMax, float power, const Image* mask);
852 //IMAQ_FUNC int IMAQ_STDCALL imaqWatershedTransform(Image* dest, const Image* source, int connectivity8, int* zoneCount);
853
854
855 //============================================================================
856 // Utilities functions
857 //============================================================================
858 //IMAQ_FUNC const float* IMAQ_STDCALL imaqGetKernel(KernelFamily family, int size, int number);
859 //IMAQ_FUNC Annulus IMAQ_STDCALL imaqMakeAnnulus(Point center, int innerRadius, int outerRadius, double startAngle, double endAngle);
860 //IMAQ_FUNC Point IMAQ_STDCALL imaqMakePoint(int xCoordinate, int yCoordinate);
861 //IMAQ_FUNC PointFloat IMAQ_STDCALL imaqMakePointFloat(float xCoordinate, float yCoordinate);
862 //IMAQ_FUNC Rect IMAQ_STDCALL imaqMakeRect(int top, int left, int height, int width);
863 //IMAQ_FUNC Rect IMAQ_STDCALL imaqMakeRectFromRotatedRect(RotatedRect rotatedRect);
864 //IMAQ_FUNC RotatedRect IMAQ_STDCALL imaqMakeRotatedRect(int top, int left, int height, int width, double angle);
865 //IMAQ_FUNC RotatedRect IMAQ_STDCALL imaqMakeRotatedRectFromRect(Rect rect);
866 //IMAQ_FUNC int IMAQ_STDCALL imaqMulticoreOptions(MulticoreOperation operation, unsigned int* customNumCores);
867
868 //============================================================================
869 // Image Manipulation functions
870 //============================================================================
871 //IMAQ_FUNC int IMAQ_STDCALL imaqCast(Image* dest, const Image* source, ImageType type, const float* lookup, int shift);
872 //IMAQ_FUNC int IMAQ_STDCALL imaqCopyRect(Image* dest, const Image* source, Rect rect, Point destLoc);
873 //IMAQ_FUNC int IMAQ_STDCALL imaqDuplicate(Image* dest, const Image* source);
874 //IMAQ_FUNC void* IMAQ_STDCALL imaqFlatten(const Image* image, FlattenType type, CompressionType compression, int quality, unsigned int* size);
875 //IMAQ_FUNC int IMAQ_STDCALL imaqFlip(Image* dest, const Image* source, FlipAxis axis);
876 //IMAQ_FUNC int IMAQ_STDCALL imaqMask(Image* dest, const Image* source, const Image* mask);
877 //IMAQ_FUNC int IMAQ_STDCALL imaqResample(Image* dest, const Image* source, int newWidth, int newHeight, InterpolationMethod method, Rect rect);
878 //IMAQ_FUNC int IMAQ_STDCALL imaqRotate2(Image* dest, const Image* source, float angle, PixelValue fill, InterpolationMethod method, int maintainSize);
879 //IMAQ_FUNC int IMAQ_STDCALL imaqScale(Image* dest, const Image* source, int xScale, int yScale, ScalingMode scaleMode, Rect rect);
880 //IMAQ_FUNC int IMAQ_STDCALL imaqShift(Image* dest, const Image* source, int shiftX, int shiftY, PixelValue fill);
881 //IMAQ_FUNC int IMAQ_STDCALL imaqTranspose(Image* dest, const Image* source);
882 //IMAQ_FUNC int IMAQ_STDCALL imaqUnflatten(Image* image, const void* data, unsigned int size);
883 //IMAQ_FUNC int IMAQ_STDCALL imaqUnwrapImage(Image* dest, const Image* source, Annulus annulus, RectOrientation orientation, InterpolationMethod method);
884 //IMAQ_FUNC int IMAQ_STDCALL imaqView3D(Image* dest, Image* source, const View3DOptions* options);
885
886 //============================================================================
887 // Pattern Matching functions
888 //============================================================================
889
890 private static final BlockingFunction imaqDetectEllipsesFn =
891 NativeLibrary.getDefaultInstance().getBlockingFunction("imaqDetectEllipses");
892 static { imaqDetectEllipsesFn.setTaskExecutor(NIVision.taskExecutor); }
893 private static Pointer numberOfEllipsesDetected = new Pointer(4);
894
895
896 public static EllipseMatch[] detectEllipses(MonoImage image, EllipseDescriptor ellipseDescriptor,
897 CurveOptions curveOptions, ShapeDetectionOptions shapeDetectionOptions,
898 RegionOfInterest roi) throws NIVisionException {
899
900 int curveOptionsPointer = 0;
901 if (curveOptions != null)
902 curveOptionsPointer = curveOptions.getPointer().address().toUWord().toPrimitive();
903 int shapeDetectionOptionsPointer = 0;
904 if (shapeDetectionOptions != null)
905 shapeDetectionOptionsPointer = shapeDetectionOptions.getPointer().address().toUWord().toPrimitive();
906 int roiPointer = 0;
907 if (roi != null)
908 roiPointer = roi.getPointer().address().toUWord().toPrimitive();
909
910 int returnedAddress =
911 imaqDetectEllipsesFn.call6(
912 image.image.address().toUWord().toPrimitive(),
913 ellipseDescriptor.getPointer().address().toUWord().toPrimitive(),
914 curveOptionsPointer, shapeDetectionOptionsPointer,
915 roiPointer,
916 numberOfEllipsesDetected.address().toUWord().toPrimitive());
917
918 try {
919 NIVision.assertCleanStatus(returnedAddress);
920 } catch (NIVisionException ex) {
921 if (!ex.getMessage().equals("No error."))
922 throw ex;
923 }
924
925 EllipseMatch[] matches = EllipseMatch.getMatchesFromMemory(returnedAddress, numberOfEllipsesDetected.getInt(0));
926 NIVision.dispose(new Pointer(returnedAddress,0));
927 return matches;
928 }
929 //IMAQ_FUNC CircleMatch* IMAQ_STDCALL imaqDetectCircles(const Image* image, const CircleDescriptor* circleDescriptor, const CurveOptions* curveOptions, const ShapeDetectionOptions* shapeDetectionOptions, const ROI* roi, int* numMatchesReturned);
930 //IMAQ_FUNC LineMatch* IMAQ_STDCALL imaqDetectLines(const Image* image, const LineDescriptor* lineDescriptor, const CurveOptions* curveOptions, const ShapeDetectionOptions* shapeDetectionOptions, const ROI* roi, int* numMatchesReturned);
931 //IMAQ_FUNC RectangleMatch* IMAQ_STDCALL imaqDetectRectangles(const Image* image, const RectangleDescriptor* rectangleDescriptor, const CurveOptions* curveOptions, const ShapeDetectionOptions* shapeDetectionOptions, const ROI* roi, int* numMatchesReturned);
932 //IMAQ_FUNC FeatureData* IMAQ_STDCALL imaqGetGeometricFeaturesFromCurves(const Curve* curves, unsigned int numCurves, const FeatureType* featureTypes, unsigned int numFeatureTypes, unsigned int* numFeatures);
933 //IMAQ_FUNC FeatureData* IMAQ_STDCALL imaqGetGeometricTemplateFeatureInfo(const Image* pattern, unsigned int* numFeatures);
934 //IMAQ_FUNC int IMAQ_STDCALL imaqLearnColorPattern(Image* image, const LearnColorPatternOptions* options);
935 //IMAQ_FUNC int IMAQ_STDCALL imaqLearnGeometricPattern(Image* image, PointFloat originOffset, const CurveOptions* curveOptions, const LearnGeometricPatternAdvancedOptions* advancedLearnOptions, const Image* mask);
936 //IMAQ_FUNC MultipleGeometricPattern* IMAQ_STDCALL imaqLearnMultipleGeometricPatterns(const Image** patterns, unsigned int numberOfPatterns, const String255* labels);
937 //IMAQ_FUNC int IMAQ_STDCALL imaqLearnPattern3(Image* image, LearningMode learningMode, LearnPatternAdvancedOptions* advancedOptions, const Image* mask);
938 //IMAQ_FUNC PatternMatch* IMAQ_STDCALL imaqMatchColorPattern(const Image* image, Image* pattern, const MatchColorPatternOptions* options, Rect searchRect, int* numMatches);
939 //IMAQ_FUNC GeometricPatternMatch2* IMAQ_STDCALL imaqMatchGeometricPattern2(const Image* image, const Image* pattern, const CurveOptions* curveOptions, const MatchGeometricPatternOptions* matchOptions, const MatchGeometricPatternAdvancedOptions2* advancedMatchOptions, const ROI* roi, int* numMatches);
940 //IMAQ_FUNC GeometricPatternMatch2* IMAQ_STDCALL imaqMatchMultipleGeometricPatterns(const Image* image, const MultipleGeometricPattern* multiplePattern, const ROI* roi, int* numMatches);
941 //IMAQ_FUNC PatternMatch* IMAQ_STDCALL imaqMatchPattern2(const Image* image, const Image* pattern, const MatchPatternOptions* options, const MatchPatternOptions* advancedOptions, Rect searchRect, int* numMatches);
942 //IMAQ_FUNC MultipleGeometricPattern* IMAQ_STDCALL imaqReadMultipleGeometricPatternFile(const char* fileName, String255 description);
943 //IMAQ_FUNC PatternMatch* IMAQ_STDCALL imaqRefineMatches(const Image* image, const Image* pattern, const PatternMatch* candidatesIn, int numCandidatesIn, MatchPatternOptions* options, MatchPatternAdvancedOptions* advancedOptions, int* numCandidatesOut);
944 //IMAQ_FUNC int IMAQ_STDCALL imaqSetMultipleGeometricPatternsOptions(MultipleGeometricPattern* multiplePattern, const char* label, const CurveOptions* curveOptions, const MatchGeometricPatternOptions* matchOptions, const MatchGeometricPatternAdvancedOptions2* advancedMatchOptions);
945 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteMultipleGeometricPatternFile(const MultipleGeometricPattern* multiplePattern, const char* fileName, const char* description);
946
947 //============================================================================
948 // Calibration functions
949 //============================================================================
950 //IMAQ_FUNC int IMAQ_STDCALL imaqCopyCalibrationInfo2(Image* dest, Image* source, Point offset);
951 //IMAQ_FUNC int IMAQ_STDCALL imaqCorrectCalibratedImage(Image* dest, const Image* source, PixelValue fill, InterpolationMethod method, const ROI* roi);
952 //IMAQ_FUNC CalibrationInfo* IMAQ_STDCALL imaqGetCalibrationInfo2(const Image* image);
953 //IMAQ_FUNC int IMAQ_STDCALL imaqLearnCalibrationGrid(Image* image, const ROI* roi, const LearnCalibrationOptions* options, const GridDescriptor* grid, const CoordinateSystem* system, const RangeFloat* range, float* quality);
954 //IMAQ_FUNC int IMAQ_STDCALL imaqLearnCalibrationPoints(Image* image, const CalibrationPoints* points, const ROI* roi, const LearnCalibrationOptions* options, const GridDescriptor* grid, const CoordinateSystem* system, float* quality);
955 //IMAQ_FUNC int IMAQ_STDCALL imaqSetCoordinateSystem(Image* image, const CoordinateSystem* system);
956 //IMAQ_FUNC int IMAQ_STDCALL imaqSetSimpleCalibration(Image* image, ScalingMethod method, int learnTable, const GridDescriptor* grid, const CoordinateSystem* system);
957 //IMAQ_FUNC TransformReport* IMAQ_STDCALL imaqTransformPixelToRealWorld(const Image* image, const PointFloat* pixelCoordinates, int numCoordinates);
958 //IMAQ_FUNC TransformReport* IMAQ_STDCALL imaqTransformRealWorldToPixel(const Image* image, const PointFloat* realWorldCoordinates, int numCoordinates);
959
960 //============================================================================
961 // Overlay functions
962 //============================================================================
963 //IMAQ_FUNC int IMAQ_STDCALL imaqClearOverlay(Image* image, const char* group);
964 //IMAQ_FUNC int IMAQ_STDCALL imaqCopyOverlay(Image* dest, const Image* source, const char* group);
965 //IMAQ_FUNC int IMAQ_STDCALL imaqGetOverlayProperties(Image* image, const char* group, TransformBehaviors* transformBehaviors);
966 //IMAQ_FUNC int IMAQ_STDCALL imaqMergeOverlay(Image* dest, const Image* source, const RGBValue* palette, unsigned int numColors, const char* group);
967 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayArc(Image* image, const ArcInfo* arc, const RGBValue* color, DrawMode drawMode, const char* group);
968 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayBitmap(Image* image, Point destLoc, const RGBValue* bitmap, unsigned int numCols, unsigned int numRows, const char* group);
969 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayClosedContour(Image* image, const Point* points, int numPoints, const RGBValue* color, DrawMode drawMode, const char* group);
970 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayLine(Image* image, Point start, Point end, const RGBValue* color, const char* group);
971 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayMetafile(Image* image, const void* metafile, Rect rect, const char* group);
972 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayOpenContour(Image* image, const Point* points, int numPoints, const RGBValue* color, const char* group);
973 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayOval(Image* image, Rect boundingBox, const RGBValue* color, DrawMode drawMode, char* group);
974 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayPoints(Image* image, const Point* points, int numPoints, const RGBValue* colors, int numColors, PointSymbol symbol, const UserPointSymbol* userSymbol, const char* group);
975 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayRect(Image* image, Rect rect, const RGBValue* color, DrawMode drawMode, const char* group);
976 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayROI(Image* image, const ROI* roi, PointSymbol symbol, const UserPointSymbol* userSymbol, const char* group);
977 //IMAQ_FUNC int IMAQ_STDCALL imaqOverlayText(Image* image, Point origin, const char* text, const RGBValue* color, const OverlayTextOptions* options, const char* group);
978 //IMAQ_FUNC int IMAQ_STDCALL imaqSetOverlayProperties(Image* image, const char* group, TransformBehaviors* transformBehaviors);
979
980 //============================================================================
981 // Color Matching functions
982 //============================================================================
983 //IMAQ_FUNC ColorInformation* IMAQ_STDCALL imaqLearnColor(const Image* image, const ROI* roi, ColorSensitivity sensitivity, int saturation);
984 //IMAQ_FUNC int* IMAQ_STDCALL imaqMatchColor(const Image* image, const ColorInformation* info, const ROI* roi, int* numScores);
985
986 //============================================================================
987 // Meter functions
988 //============================================================================
989 //IMAQ_FUNC MeterArc* IMAQ_STDCALL imaqGetMeterArc(int lightNeedle, MeterArcMode mode, const ROI* roi, PointFloat base, PointFloat start, PointFloat end);
990 //IMAQ_FUNC int IMAQ_STDCALL imaqReadMeter(const Image* image, const MeterArc* arcInfo, double* percentage, PointFloat* endOfNeedle);
991
992 //============================================================================
993 // Barcode I/O functions
994 //============================================================================
995 //IMAQ_FUNC int IMAQ_STDCALL imaqGradeDataMatrixBarcodeAIM(const Image* image, AIMGradeReport* report);
996 //IMAQ_FUNC BarcodeInfo* IMAQ_STDCALL imaqReadBarcode(const Image* image, BarcodeType type, const ROI* roi, int validate);
997 //IMAQ_FUNC DataMatrixReport* IMAQ_STDCALL imaqReadDataMatrixBarcode2(Image* image, const ROI* roi, DataMatrixGradingMode prepareForGrading, const DataMatrixDescriptionOptions* descriptionOptions, const DataMatrixSizeOptions* sizeOptions, const DataMatrixSearchOptions* searchOptions);
998 //IMAQ_FUNC Barcode2DInfo* IMAQ_STDCALL imaqReadPDF417Barcode(const Image* image, const ROI* roi, Barcode2DSearchMode searchMode, unsigned int* numBarcodes);
999 //IMAQ_FUNC QRCodeReport* IMAQ_STDCALL imaqReadQRCode(Image* image, const ROI* roi, QRGradingMode reserved, const QRCodeDescriptionOptions* descriptionOptions, const QRCodeSizeOptions* sizeOptions, const QRCodeSearchOptions* searchOptions);
1000
1001 //============================================================================
1002 // Shape Matching functions
1003 //============================================================================
1004 //IMAQ_FUNC ShapeReport* IMAQ_STDCALL imaqMatchShape(Image* dest, Image* source, const Image* templateImage, int scaleInvariant, int connectivity8, double tolerance, int* numMatches);
1005
1006 //============================================================================
1007 // Contours functions
1008 //============================================================================
1009 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqAddAnnulusContour(ROI* roi, Annulus annulus);
1010 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqAddClosedContour(ROI* roi, const Point* points, int numPoints);
1011 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqAddLineContour(ROI* roi, Point start, Point end);
1012 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqAddOpenContour(ROI* roi, const Point* points, int numPoints);
1013 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqAddOvalContour(ROI* roi, Rect boundingBox);
1014 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqAddPointContour(ROI* roi, Point point);
1015 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqAddRectContour(ROI* roi, Rect rect);
1016 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqAddRotatedRectContour2(ROI* roi, RotatedRect rect);
1017 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqCopyContour(ROI* destRoi, const ROI* sourceRoi, ContourID id);
1018 //IMAQ_FUNC ContourID IMAQ_STDCALL imaqGetContour(const ROI* roi, unsigned int index);
1019 //IMAQ_FUNC int IMAQ_STDCALL imaqGetContourColor(const ROI* roi, ContourID id, RGBValue* contourColor);
1020 //IMAQ_FUNC int IMAQ_STDCALL imaqGetContourCount(const ROI* roi);
1021 //IMAQ_FUNC ContourInfo2* IMAQ_STDCALL imaqGetContourInfo2(const ROI* roi, ContourID id);
1022 //IMAQ_FUNC int IMAQ_STDCALL imaqMoveContour(ROI* roi, ContourID id, int deltaX, int deltaY);
1023 //IMAQ_FUNC int IMAQ_STDCALL imaqRemoveContour(ROI* roi, ContourID id);
1024 //IMAQ_FUNC int IMAQ_STDCALL imaqSetContourColor(ROI* roi, ContourID id, const RGBValue* color);
1025
1026 //============================================================================
1027 // Regions of Interest functions
1028 //============================================================================
1029 //IMAQ_FUNC int IMAQ_STDCALL imaqConstructROI2(const Image* image, ROI* roi, Tool initialTool, const ToolWindowOptions* tools, const ConstructROIOptions2* options, int* okay);
1030 //IMAQ_FUNC ROI* IMAQ_STDCALL imaqCreateROI();
1031 //IMAQ_FUNC int IMAQ_STDCALL imaqGetROIBoundingBox(const ROI* roi, Rect* boundingBox);
1032 //IMAQ_FUNC int IMAQ_STDCALL imaqGetROIColor(const ROI* roi, RGBValue* roiColor);
1033 //IMAQ_FUNC ROI* IMAQ_STDCALL imaqGetWindowROI(int windowNumber);
1034 //IMAQ_FUNC int IMAQ_STDCALL imaqSetROIColor(ROI* roi, const RGBValue* color);
1035 //IMAQ_FUNC int IMAQ_STDCALL imaqSetWindowROI(int windowNumber, const ROI* roi);
1036
1037 //============================================================================
1038 // Image Analysis functions
1039 //============================================================================
1040 //IMAQ_FUNC int IMAQ_STDCALL imaqCentroid(const Image* image, PointFloat* centroid, const Image* mask);
1041 //IMAQ_FUNC Curve* IMAQ_STDCALL imaqExtractCurves(const Image* image, const ROI* roi, const CurveOptions* curveOptions, unsigned int* numCurves);
1042 //IMAQ_FUNC HistogramReport* IMAQ_STDCALL imaqHistogram(const Image* image, int numClasses, float min, float max, const Image* mask);
1043
1044 private static final BlockingFunction imaqLinearAverages2Fn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqLinearAverages2");
1045
1046 public static LinearAverages getLinearAverages(Pointer image, LinearAverages.LinearAveragesMode mode, Rect rect) throws NIVisionException
1047 {
1048 int returnedAddress = imaqLinearAverages2Fn.call3(image, mode.value, rect.getPointer());
1049
1050 try {
1051 NIVision.assertCleanStatus(returnedAddress);
1052 } catch (NIVisionException ex) {
1053 if (!ex.getMessage().equals("No error."))
1054 throw ex;
1055 }
1056
1057 LinearAverages averages = new LinearAverages(returnedAddress);
1058 NIVision.dispose(new Pointer(returnedAddress,0));
1059 return averages;
1060 }
1061
1062 //IMAQ_FUNC LineProfile* IMAQ_STDCALL imaqLineProfile(const Image* image, Point start, Point end);
1063 //IMAQ_FUNC QuantifyReport* IMAQ_STDCALL imaqQuantify(const Image* image, const Image* mask);
1064
1065 //============================================================================
1066 // Error Management functions
1067 //============================================================================
1068 private static final BlockingFunction imaqGetLastErrorFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqGetLastError");
1069 static { imaqGetLastErrorFn.setTaskExecutor(taskExecutor); }
1070
1071 public static int getLastError(){
1072 return imaqGetLastErrorFn.call0();
1073 }
1074 protected static void assertCleanStatus (int code) throws NIVisionException {
1075 if (code == 0) {
1076 throw new NIVisionException(imaqGetLastErrorFn.call0());
1077 }
1078 }
1079
1080 //IMAQ_FUNC int IMAQ_STDCALL imaqClearError();
1081 //IMAQ_FUNC char* IMAQ_STDCALL imaqGetErrorText(int errorCode);
1082 //IMAQ_FUNC const char* IMAQ_STDCALL imaqGetLastErrorFunc();
1083 //IMAQ_FUNC int IMAQ_STDCALL imaqSetError(int errorCode, const char* function);
1084
1085 //============================================================================
1086 // Threshold functions
1087 //============================================================================
1088 //IMAQ_FUNC ThresholdData* IMAQ_STDCALL imaqAutoThreshold2(Image* dest, const Image* source, int numClasses, ThresholdMethod method, const Image* mask);
1089 //IMAQ_FUNC int IMAQ_STDCALL imaqLocalThreshold(Image* dest, const Image* source, unsigned int windowWidth, unsigned int windowHeight, LocalThresholdMethod method, double deviationWeight, ObjectType type, float replaceValue);
1090 //IMAQ_FUNC int IMAQ_STDCALL imaqMagicWand(Image* dest, const Image* source, Point coord, float tolerance, int connectivity8, float replaceValue);
1091 //IMAQ_FUNC int IMAQ_STDCALL imaqMultithreshold(Image* dest, const Image* source, const ThresholdData* ranges, int numRanges);
1092 //IMAQ_FUNC int IMAQ_STDCALL imaqThreshold(Image* dest, const Image* source, float rangeMin, float rangeMax, int useNewValue, float newValue);
1093
1094 //============================================================================
1095 // Memory Management functions
1096 //============================================================================
1097
1098 private static final BlockingFunction imaqDisposeFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqDispose");
1099 static { imaqDisposeFn.setTaskExecutor(taskExecutor); }
1100
1101 /**
1102 * Cleans up resources associated with images, regions of interest (ROIs),
1103 * arrays, and reports that you no longer need.
1104 * After you dispose of something, you can no longer use it.
1105 * @param item The image, ROI, array, or report whose memory you want to free.
1106 */
1107 public static void dispose (Pointer item) throws NIVisionException{
1108 assertCleanStatus(imaqDisposeFn.call1(item));
1109 }
1110
1111 //============================================================================
1112 // File I/O functions
1113 //============================================================================
1114
1115 private static final BlockingFunction Priv_ReadJPEGString_CFn = NativeLibrary.getDefaultInstance().getBlockingFunction("Priv_ReadJPEGString_C");
1116 static { Priv_ReadJPEGString_CFn.setTaskExecutor(taskExecutor); }
1117
1118 /**
1119 * Read a pointer to a byte array into the given image
1120 * @param image pointer to an imaq image object
1121 * @param p pointer to a byte array holding image data
1122 */
1123 public static void readJpegString(Pointer image, Pointer p) {
1124 Priv_ReadJPEGString_CFn.call3(image, p, p.getSize());
1125 }
1126
1127 private static final BlockingFunction Priv_SetWriteFileAllowedFn = NativeLibrary.getDefaultInstance().getBlockingFunction("Priv_SetWriteFileAllowed");
1128 static { Priv_SetWriteFileAllowedFn.setTaskExecutor(taskExecutor); }
1129
1130 /**
1131 * Set true to be able to create files on cRio
1132 * @param val true allows files to be created
1133 */
1134 public static void setWriteFileAllowed(boolean val) {
1135 Priv_SetWriteFileAllowedFn.call1(val ? 1 : 0);
1136 }
1137
1138 private static final Function imaqWriteFileFn = NativeLibrary.getDefaultInstance().getFunction("imaqWriteFile");
1139 // static { imaqWriteFileFn.setTaskExecutor(taskExecutor); }
1140
1141 /**
1142 * Write an image to the given file.
1143 *
1144 * Supported extensions:
1145 * .aipd or .apd AIPD
1146 * .bmp BMP
1147 * .jpg or .jpeg JPEG
1148 * .jp2 JPEG2000
1149 * .png PNG
1150 * .tif or .tiff TIFF
1151 *
1152 * @param image The image to write to a file.
1153 * @param fileName The name of the destination file.
1154 */
1155 public static void writeFile(Pointer image, String fileName) throws NIVisionException {
1156 Pointer p = new Pointer(fileName.length() + 1);
1157 p.setString(0, fileName);
1158 setWriteFileAllowed(true);
1159 try {
1160 assertCleanStatus(imaqWriteFileFn.call3(image, p, 0)); //zero is unused color table
1161 } finally {
1162 p.free();
1163 }
1164 }
1165
1166 /**
1167 * Write an image to the given file.
1168 *
1169 * Supported extensions:
1170 * .aipd or .apd AIPD
1171 * .bmp BMP
1172 * .jpg or .jpeg JPEG
1173 * .jp2 JPEG2000
1174 * .png PNG
1175 * .tif or .tiff TIFF
1176 *
1177 * @param image The image to write to a file.
1178 * @param fileName The name of the destination file.
1179 * @param colorTable The color table to use for 8-bit images
1180 */
1181 public static void writeFile(Pointer image, String fileName, Pointer colorTable) throws NIVisionException{
1182 Pointer p = new Pointer(fileName.length() + 1);
1183 p.setString(0, fileName);
1184 setWriteFileAllowed(true);
1185 try {
1186 assertCleanStatus(imaqWriteFileFn.call3(image, p, colorTable)); //zero is unused color table
1187 } finally {
1188 p.free();
1189 }
1190 }
1191
1192 private static final BlockingFunction imaqReadFileFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqReadFile");
1193 static { imaqReadFileFn.setTaskExecutor(taskExecutor); }
1194
1195 /**
1196 * Read an image from to the given image from the given filename
1197 * @param image The image to store the data in.
1198 * @param fileName The name of the file to load.
1199 */
1200 public static void readFile(Pointer image, String fileName) throws NIVisionException{
1201 Pointer p = new Pointer(fileName.length() + 1);
1202 p.setString(0, fileName);
1203 try {
1204 assertCleanStatus(imaqReadFileFn.call4(image, p, 0, 0)); //zeros are unused color table and num colors
1205 } finally {
1206 p.free();
1207 }
1208 }
1209
1210 //IMAQ_FUNC int IMAQ_STDCALL imaqCloseAVI(AVISession session);
1211 //IMAQ_FUNC AVISession IMAQ_STDCALL imaqCreateAVI(const char* fileName, const char* compressionFilter, int quality, unsigned int framesPerSecond, unsigned int maxDataSize);
1212 //IMAQ_FUNC int IMAQ_STDCALL imaqGetAVIInfo(AVISession session, AVIInfo* info);
1213 //IMAQ_FUNC int IMAQ_STDCALL imaqGetFileInfo(const char* fileName, CalibrationUnit* calibrationUnit, float* calibrationX, float* calibrationY, int* width, int* height, ImageType* imageType);
1214 //IMAQ_FUNC FilterName* IMAQ_STDCALL imaqGetFilterNames(int* numFilters);
1215 //IMAQ_FUNC char** IMAQ_STDCALL imaqLoadImagePopup(const char* defaultDirectory, const char* defaultFileSpec, const char* fileTypeList, const char* title, int allowMultiplePaths, ButtonLabel buttonLabel, int restrictDirectory, int restrictExtension, int allowCancel, int allowMakeDirectory, int* cancelled, int* numPaths);
1216 //IMAQ_FUNC AVISession IMAQ_STDCALL imaqOpenAVI(const char* fileName);
1217 //IMAQ_FUNC int IMAQ_STDCALL imaqReadAVIFrame(Image* image, AVISession session, unsigned int frameNum, void* data, unsigned int* dataSize);
1218 //IMAQ_FUNC int IMAQ_STDCALL imaqReadVisionFile(Image* image, const char* fileName, RGBValue* colorTable, int* numColors);
1219 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteAVIFrame(Image* image, AVISession session, const void* data, unsigned int dataLength);
1220 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteBMPFile(const Image* image, const char* fileName, int compress, const RGBValue* colorTable);
1221 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteJPEGFile(const Image* image, const char* fileName, unsigned int quality, void* colorTable);
1222 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteJPEG2000File(const Image* image, const char* fileName, int lossless, float compressionRatio, const JPEG2000FileAdvancedOptions* advancedOptions, const RGBValue* colorTable);
1223 //IMAQ_FUNC int IMAQ_STDCALL imaqWritePNGFile2(const Image* image, const char* fileName, unsigned int compressionSpeed, const RGBValue* colorTable, int useBitDepth);
1224 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteTIFFFile(const Image* image, const char* fileName, const TIFFFileOptions* options, const RGBValue* colorTable);
1225 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteVisionFile(const Image* image, const char* fileName, const RGBValue* colorTable);
1226
1227
1228 //============================================================================
1229 // Frequency Domain Analysis functions
1230 //============================================================================
1231 //IMAQ_FUNC int IMAQ_STDCALL imaqAttenuate(Image* dest, const Image* source, AttenuateMode highlow);
1232 //IMAQ_FUNC int IMAQ_STDCALL imaqConjugate(Image* dest, const Image* source);
1233 //IMAQ_FUNC int IMAQ_STDCALL imaqFFT(Image* dest, const Image* source);
1234 //IMAQ_FUNC int IMAQ_STDCALL imaqFlipFrequencies(Image* dest, const Image* source);
1235 //IMAQ_FUNC int IMAQ_STDCALL imaqInverseFFT(Image* dest, const Image* source);
1236 //IMAQ_FUNC int IMAQ_STDCALL imaqTruncate(Image* dest, const Image* source, TruncateMode highlow, float ratioToKeep);
1237
1238 //============================================================================
1239 // Pixel Manipulation functions
1240 //============================================================================
1241
1242 private static final BlockingFunction imaqExtractColorPlanesFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqExtractColorPlanes");
1243 static { imaqExtractColorPlanesFn.setTaskExecutor(taskExecutor); }
1244
1245 /**
1246 * Extract the color planes from the given source image into the given planes
1247 * @param source The color source image.
1248 * @param mode The color space to extract the planes of.
1249 * @param plane1 MonoImage destination for the first plane.
1250 * @param plane2 MonoImage destination for the first plane.
1251 * @param plane3 MonoImage destination for the first plane.
1252 */
1253 public static void extractColorPlanes(Pointer source, ColorMode mode, Pointer plane1, Pointer plane2, Pointer plane3) throws NIVisionException{
1254 int plane_1 = 0;
1255 int plane_2 = 0;
1256 int plane_3 = 0;
1257 if (plane1 != null)
1258 plane_1 = plane1.address().toUWord().toPrimitive();
1259 if (plane2 != null)
1260 plane_2 = plane2.address().toUWord().toPrimitive();
1261 if (plane3 != null)
1262 plane_3 = plane3.address().toUWord().toPrimitive();
1263 assertCleanStatus(imaqExtractColorPlanesFn.call5(source, mode.value, plane_1, plane_2, plane_3));
1264 }
1265
1266 private static final BlockingFunction imaqReplaceColorPlanesFn = NativeLibrary.getDefaultInstance().getBlockingFunction("imaqReplaceColorPlanes");
1267 static { imaqReplaceColorPlanesFn.setTaskExecutor(taskExecutor); }
1268
1269 /**
1270 * Replaces one or more of the color planes of a color image. The plane you
1271 * replace may be independent of the image type. For example, you can
1272 * replace the green plane of an RGB image or the hue plane of an HSL image.
1273 * @param dest The destination image.
1274 * @param source The source image.
1275 * @param mode The color space in which the function replaces planes.
1276 * @param plane1 The first plane of replacement data. Set this parameter to null if you do not want to change the first plane of the source image.
1277 * @param plane2 The second plane of replacement data. Set this parameter to null if you do not want to change the second plane of the source image.
1278 * @param plane3 The third plane of replacement data. Set this parameter to null if you do not want to change the third plane of the source image.
1279 */
1280 public static void replaceColorPlanes(Pointer dest, Pointer source,
1281 ColorMode mode, Pointer plane1, Pointer plane2, Pointer plane3) throws NIVisionException{
1282 int plane_1 = 0;
1283 int plane_2 = 0;
1284 int plane_3 = 0;
1285 if (plane1 != null)
1286 plane_1 = plane1.address().toUWord().toPrimitive();
1287 if (plane2 != null)
1288 plane_2 = plane2.address().toUWord().toPrimitive();
1289 if (plane3 != null)
1290 plane_3 = plane3.address().toUWord().toPrimitive();
1291 assertCleanStatus(imaqReplaceColorPlanesFn.call6(
1292 dest.address().toUWord().toPrimitive(),
1293 source.address().toUWord().toPrimitive(),
1294 mode.value,
1295 plane_1,
1296 plane_2,
1297 plane_3));
1298 }
1299
1300 //IMAQ_FUNC int IMAQ_STDCALL imaqArrayToComplexPlane(Image* dest, const Image* source, const float* newPixels, ComplexPlane plane);
1301 //IMAQ_FUNC float* IMAQ_STDCALL imaqComplexPlaneToArray(const Image* image, ComplexPlane plane, Rect rect, int* columns, int* rows);
1302 //IMAQ_FUNC int IMAQ_STDCALL imaqExtractComplexPlane(Image* dest, const Image* source, ComplexPlane plane);
1303 //IMAQ_FUNC int IMAQ_STDCALL imaqFillImage(Image* image, PixelValue value, const Image* mask);
1304 //IMAQ_FUNC void* IMAQ_STDCALL imaqGetLine(const Image* image, Point start, Point end, int* numPoints);
1305 //IMAQ_FUNC int IMAQ_STDCALL imaqGetPixel(const Image* image, Point pixel, PixelValue* value);
1306 //IMAQ_FUNC int IMAQ_STDCALL imaqReplaceComplexPlane(Image* dest, const Image* source, const Image* newValues, ComplexPlane plane);
1307 //IMAQ_FUNC int IMAQ_STDCALL imaqSetLine(Image* image, const void* array, int arraySize, Point start, Point end);
1308 //IMAQ_FUNC int IMAQ_STDCALL imaqSetPixel(Image* image, Point coord, PixelValue value);
1309
1310 //============================================================================
1311 // LCD functions
1312 //============================================================================
1313 //IMAQ_FUNC int IMAQ_STDCALL imaqFindLCDSegments(ROI* roi, const Image* image, const LCDOptions* options);
1314 //IMAQ_FUNC LCDReport* IMAQ_STDCALL imaqReadLCD(const Image* image, const ROI* roi, const LCDOptions* options);
1315
1316 //============================================================================
1317 // Regions of Interest Manipulation functions
1318 //============================================================================
1319 //IMAQ_FUNC ROI* IMAQ_STDCALL imaqMaskToROI(const Image* mask, int* withinLimit);
1320 //IMAQ_FUNC ROIProfile* IMAQ_STDCALL imaqROIProfile(const Image* image, const ROI* roi);
1321 //IMAQ_FUNC int IMAQ_STDCALL imaqROIToMask(Image* mask, const ROI* roi, int fillValue, const Image* imageModel, int* inSpace);
1322 //IMAQ_FUNC int IMAQ_STDCALL imaqTransformROI2(ROI* roi, const CoordinateSystem* baseSystem, const CoordinateSystem* newSystem);
1323
1324 //============================================================================
1325 // OCR functions
1326 //============================================================================
1327 //IMAQ_FUNC CharSet* IMAQ_STDCALL imaqCreateCharSet();
1328 //IMAQ_FUNC int IMAQ_STDCALL imaqDeleteChar(CharSet* set, int index);
1329 //IMAQ_FUNC int IMAQ_STDCALL imaqGetCharCount(const CharSet* set);
1330 //IMAQ_FUNC CharInfo2* IMAQ_STDCALL imaqGetCharInfo2(const CharSet* set, int index);
1331 //IMAQ_FUNC int IMAQ_STDCALL imaqReadOCRFile(const char* fileName, CharSet* set, String255 setDescription, ReadTextOptions* readOptions, OCRProcessingOptions* processingOptions, OCRSpacingOptions* spacingOptions);
1332 //IMAQ_FUNC ReadTextReport3* IMAQ_STDCALL imaqReadText3(const Image* image, const CharSet* set, const ROI* roi, const ReadTextOptions* readOptions, const OCRProcessingOptions* processingOptions, const OCRSpacingOptions* spacingOptions);
1333 //IMAQ_FUNC int IMAQ_STDCALL imaqRenameChar(CharSet* set, int index, const char* newCharValue);
1334 //IMAQ_FUNC int IMAQ_STDCALL imaqSetReferenceChar(const CharSet* set, int index, int isReferenceChar);
1335 //IMAQ_FUNC int IMAQ_STDCALL imaqTrainChars(const Image* image, CharSet* set, int index, const char* charValue, const ROI* roi, const OCRProcessingOptions* processingOptions, const OCRSpacingOptions* spacingOptions);
1336 //IMAQ_FUNC int* IMAQ_STDCALL imaqVerifyPatterns(const Image* image, const CharSet* set, const String255* expectedPatterns, int patternCount, const ROI* roi, int* numScores);
1337 //IMAQ_FUNC int* IMAQ_STDCALL imaqVerifyText(const Image* image, const CharSet* set, const char* expectedString, const ROI* roi, int* numScores);
1338 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteOCRFile(const char* fileName, const CharSet* set, const char* setDescription, const ReadTextOptions* readOptions, const OCRProcessingOptions* processingOptions, const OCRSpacingOptions* spacingOptions);
1339
1340 //============================================================================
1341 // Classification functions
1342 //============================================================================
1343 //IMAQ_FUNC int IMAQ_STDCALL imaqAddClassifierSample(Image* image, ClassifierSession* session, const ROI* roi, const char* sampleClass, double* featureVector, unsigned int vectorSize);
1344 //IMAQ_FUNC ClassifierReport* IMAQ_STDCALL imaqClassify(Image* image, const ClassifierSession* session, const ROI* roi, double* featureVector, unsigned int vectorSize);
1345 //IMAQ_FUNC ClassifierSession* IMAQ_STDCALL imaqCreateClassifier(ClassifierType type);
1346 //IMAQ_FUNC int IMAQ_STDCALL imaqDeleteClassifierSample(ClassifierSession* session, int index);
1347 //IMAQ_FUNC ClassifierAccuracyReport* IMAQ_STDCALL imaqGetClassifierAccuracy(const ClassifierSession* session);
1348 //IMAQ_FUNC ClassifierSampleInfo* IMAQ_STDCALL imaqGetClassifierSampleInfo(const ClassifierSession* session, int index, int* numSamples);
1349 //IMAQ_FUNC int IMAQ_STDCALL imaqGetNearestNeighborOptions(const ClassifierSession* session, NearestNeighborOptions* options);
1350 //IMAQ_FUNC int IMAQ_STDCALL imaqGetParticleClassifierOptions(const ClassifierSession* session, ParticleClassifierPreprocessingOptions* preprocessingOptions, ParticleClassifierOptions* options);
1351 //IMAQ_FUNC ClassifierSession* IMAQ_STDCALL imaqReadClassifierFile(ClassifierSession* session, const char* fileName, ReadClassifierFileMode mode, ClassifierType* type, ClassifierEngineType* engine, String255 description);
1352 //IMAQ_FUNC int IMAQ_STDCALL imaqRelabelClassifierSample(ClassifierSession* session, int index, const char* newClass);
1353 //IMAQ_FUNC int IMAQ_STDCALL imaqSetParticleClassifierOptions(ClassifierSession* session, const ParticleClassifierPreprocessingOptions* preprocessingOptions, const ParticleClassifierOptions* options);
1354 //IMAQ_FUNC NearestNeighborTrainingReport* IMAQ_STDCALL imaqTrainNearestNeighborClassifier(ClassifierSession* session, const NearestNeighborOptions* options);
1355 //IMAQ_FUNC int IMAQ_STDCALL imaqWriteClassifierFile(const ClassifierSession* session, const char* fileName, WriteClassifierFileMode mode, const String255 description);
1356
1357 //============================================================================
1358 // Inspection functions
1359 //============================================================================
1360 //IMAQ_FUNC int IMAQ_STDCALL imaqCompareGoldenTemplate(const Image* image, Image* goldenTemplate, Image* brightDefects, Image* darkDefects, const InspectionAlignment* alignment, const InspectionOptions* options);
1361 //IMAQ_FUNC int IMAQ_STDCALL imaqLearnGoldenTemplate(Image* goldenTemplate, PointFloat originOffset, const Image* mask);
1362
1363 //============================================================================
1364 // Morphology functions
1365 //============================================================================
1366 //IMAQ_FUNC int IMAQ_STDCALL imaqGrayMorphology(Image* dest, Image* source, MorphologyMethod method, const StructuringElement* structuringElement);
1367
1368 }