VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 Introduction VIP (Visual Information Processing) is an image processing software library that has been developed by the Robotics and Vision Research Group in The Department of Computer Science at The University of Western Australia. The system consists of two parts: - a library of C functions for manipulating and transforming images that can be incorporated in your own programs. - a set of stand-alone programs for performing many of the more commonly used operations on images. The VIP library of image processing functions has been designed to enable users to create their own image processing programs very quickly and simply using a toolkit of standardized library functions. The library includes functions in the following categories - image input/output and memory management - image type and data format conversion - image enhancement and spatial transformations - mask operations - arithmetic operations - image statistics - frequency domain transformations - camera calibration and 3D data reconstruction - vector and matrix manipulation - one dimensional edge detection - miscellaneous functions The VIP image data structure supports a wide variety of image types ranging from a basic 8 bit grey level representation through to complex valued and colour images. New image types can be easily added without `breaking' the existing software. An additional feature of the VIP image data structure that distinguishes it from other image structures is its provision for comprehensive camera calibration data and lens distortion parameters. The VIP system provides support for reconstruction of 3D information from images via structured light and stereo. The VIP System is designed to run under Unix on DEC Alpha, Sun Sparc Machines and PC's running LINUX, a subset of VIP is also available to run under DOS on a PC. History The origins of the system go back 1986 when The Computer Science Department at The University of Western Australia started to develop its library of image processing routines, coining the name `VIP'. At - 1 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 about the same time the Automated Sheep Shearing Group in The Department of Mechanical Engineering started to develop a vision system for the automated measurement of sheep. Each group devised their own, different image data structures, which required conversion when they were exchanged between groups. In 1991, with increasing collaboration between the two groups, and with each wishing to change and enhance the image data structures they were using, a new common structure was devised. The two software libraries were merged and considerably enhanced. However, shortly after this, vision research within the Automated Sheep Shearing Group ceased due to changes in research directions. Almost all of the subsequent development has been done within The Department of Computer Science. Authors A number of people have contributed to the system. The initial work on VIP in the Computer Science Department was done by Chris Avis. The Automated Sheep Shearing Group's vision system was developed by Peter Kovesi. Much of the subsequent development in the Department of Computer Science has been done by Du Huynh and Peter Kovesi. Recently Carl Fisher standardized the code to ANSI C, placed the system under SCCS, cleaned up much of the code and fixed numerous bugs. He also wrote the Motif version of the image displaying program, splash. Contributions have also been made to the system by Graham Walker, James Trevelyan, James Cooper, Ian Reid, Svetha Venkatesh, Ben Robbins and Mike Robins. Bugs Please report any bugs to: or post them to the newsgroup Getting Started With VIP This section describes how to set up your environment variables to give you access to the VIP programs, libraries and on-line manuals. Some examples are also provided to help you avoid having to read this manual in too much detail at first! Setting environment variables To gain access to the executable VIP programs add the following to your path specification in your .cshrc file setenv PATH "... your existing path... :/proj/robvis/vip/bin/sunbin" Note: If you are working on the DEC alpha you should specify `decbin' rather than `sunbin'. - 2 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 To gain access to the manual entries you need to modify your MANPATH setting setenv MANPATH "... your existing path...:/proj/robvis/vip/man" in your .cshrc or .login file. Image formats VIP has its own image format, what distinguishes this format from others is that it has provision for storing camera calibration and lens distortion parameters in the image header. If you obtain images using the programs SNAP using the Videopix on the Sub or PKSNAP on the PC on the RobVis lab they will be stored in the VIP format. VIP image files generally have a .im ending. Other common image formats that you may have to deal with are GIF, TIFF, PPM and PGM. Conversion utilities exist to convert images between most of these formats. Image Format Conversion To convert an image from VIP to PPM (Portable PixMap) use: % vip2ppm [vip_image_file] [-o ppm_image_file] To convert a PPM, PGM or PBM image to VIP format use: % pm2vip [pm image_file] [-o vip_image_file] To convert from PPM to PGM (Portable Grey Map) use: % ppmtopgm PPM_image_name > PGM_image_name To convert from TIFF to VIP use: %tifftopnm TIFF_image_name > dump %pm2vip dump -o VIP_image_name To convert a VIP image to or from the Sun raster format use: % vip2raster [vip_image_file] [-o raster_image_file] % raster2vip [raster_image_file] [-o vip_image_file] To work with other image formats the general rule is to convert to PPM or PGM and then convert from there to your destination format. Do a `man -k ppm' to find all the conversion utilities that work with PPM. How to Display Images - 3 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 There are a number of image displaying programs: splash, xdisplay, xv and surface. xdisplay and xv are the ones that you will find most useful on the monochrome X terminals as they are capable of providing a dithered display. You can find some sample images to display in /proj/robvis/vip/images. % xdisplay <vipimage_name> The xdisplay program converts your VIP image into ppm format and uses the xv utility to display your image. Click on the right mouse button with the cursor in the image to get a control panel. The `4x3' button will give you a more natural display as camera pixels have an aspect ratio of about 4x3 but the display screen has square pixels. Clicking on the `coledit' button will bring up another control panel. Most of the controls relate to manipulation of the colour map. For grey scale images the intensity control is of most interest. This panel allows you to graphically manipulate the mapping from input grey levels to the displayed grey levels. By manipulating the mapping you can negate the image, threshold it, suppress detail in some sections of the grey scale and enhance it in others. % xv <image_name> xv is an X11 program that displays images in the GIF, PBM, PGM, PPM, TIFF, X11 bitmap, JPEG, Sun Rasterfile, and PM formats on 1-, 4-, 6-, 8-, 16-, 24-, and 32-bit X displays. xv will also read compressed versions of these files. See the manual entry for more information. % splash <vipimage_name> Splash only displays VIP images and only runs on colour displays. Image display is quite fast, 1D slices through the image can be digitised, the lookup table can be interactively adjusted, plus a number of other goodies are available. % surface <image_name> Surface displays VIP images as a 3D surface with interactive control over viewing direction. It can be rather slow when dealing with large images. See manual entries for more details. Some VIP programs to try To negate an image use: % negim image_name -o output_image - 4 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 To threshold an image (make it binary black or white) use: % thresh image_name -t threshold_value -o output_image To obtain a histogram of the occurrence of each intensity value in an image use: % histogram image_name -o outputfile This produces a data file of values. You can display this using gnuplot. % gnuplot gnuplot> plot "datafile" with lines gnuplot is a very handy plotting utility, it is suggested that you become familiar with it. The histogram plot can be useful in selecting a suitable threshold when generating a binary image. To histogram equalize (make the histogram of intensity values more even, aiding interpretation) an image use: % histe image_name -o output_image Obtaining hard copy of images To obtain a hard copy of your image, use the program, laser. This program converts an image in vip format to postscript. The output may be piped directly to a laser printer or saved in a file for subsequent inclusion in a document. For example, to obtain a hard copy of an image, sized 16cm x 12cm (providing a 4 x 3 aspect ratio of a `square' image), placed in the centre of the page, and sending the output to the printer `sp', use: % laser image_name -w 16 12 -p ce | lpr -Psp See the section on the laser program for more information. Writing Programs and Functions that call Writing programs and functions that use VIP library functions is easy. Three example files are provided on the following pages: - A program that reads an image of BYTETYPE and thresholds it. Values in the input image that are below the threshold are set to zero (black), values greater than the threshold are set to 255 (white). The resulting image is then written to a file. - 5 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 - A sample makefile for programs that use VIP. - A function that performs a homomorphic image enhancing filtering operation on an image. This example illustrates the use of a number of different image types. To gain access to the VIP functions one simply uses #include "vip.h" in your source files. A Sample Program /** threshold.c ------------------------------------------------ Sample program that illustrates use of the VIP library. This program thresholds an image. Values in the input image that are below the threshold are set to zero (black), values greater than the threshold are set to 255 (white). -------------------------------------------------------------------*/ #include <stdio.h> #include "vip.h" /* the VIP include file */ void main(int argc, char *argv[]) { IMAGE *inimage = NULL, *outimage = NULL; /* pointers to the images we will use */ int rows, cols, row, col; int threshold; if (argc != 4) { printf("usage: vipexample in_image threshold out_image 0); return; } /* Read the image into memory. */ inimage = Read_Image(argv[1]); /* Check that we read the data from the file. Note that if Read_Image was unable to read the image it would have produced an error message via the function VIP_Error_Msg so the following message is really not needed. */ if (!inimage) { printf("Could not open %s0, argv[1]); return; - 6 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 } /* Check that it is a BYTETYPE image */ if(inimage->type != BYTETYPE) { printf("Threshold can only operate on BYTETYPE images0); return; } threshold = atoi(argv[2]); if(threshold < 0 || threshold > 255) { printf("threshold value must be in range 0 - 2550); return; } rows = inimage->rows; cols = inimage->cols; /* Allocate space for the output image */ outimage = Allocate_Image(0, 0, rows, cols, BYTETYPE); if (!outimage) { printf("Could not allocate space for output image0); Free_Image(inimage); return; } /* Now do the thresholding Note that there is a VIP library function to do this and the code below could simply be replaced with: outimage = Thresh_Image(inimage, threshold); */ for (row = 0; row < rows; row++) { for (col = 0; col < cols; col++) { if (inimage->i.c[row][col] > threshold) outimage->i.c[row][col] = 255; else outimage->i.c[row][col] = 0; } } /* Write the image to the file name specified by argv[3] */ Write_Image(outimage, argv[3]); /* Free the memory allocated for images */ Free_Image(inimage); Free_Image(outimage); - 7 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 return; } Note that in this program individual pixels in the input image, inimage, which is of BYTETYPE, are referenced using .nf inimage- >i.c[row][col].fi The pointer, i, is a union structure and can be treated as a pointer to any of the currently supported image data types. For other types of images one has to specify how the union structure, i, should be used. For example to access the element in the eleventh row and ninth column in a LONGTYPE image one would use: value = image->i.l[10][8]; In a FLOATTYPE image one would address pixels using value = image->i.f[10][8]; If the image is of RGBTYPE one would access the colour components using: redvalue = image->i.rgb[10][8][0]; greenvalue = image->i.rgb[10][8][1]; bluevalue = image->i.rgb[10][8][2]; If the image is of COMPLEXTYPE one would use: realvalue = image->i.cx[10][8].r; imaginaryvalue = image->i.cx[10][8].i; See the section, ``The VIP IMAGE Structure'' for more details. A Sample Makefile Compiling and linking a program using VIP is illustrated by the example makefile listed below. Note that you should use the gcc compiler as the VIP system is written in ANSI C. (use `setenv CC gcc' in your .cshrc file). # Example makefile using VIP # First set up directories and pathways. VIP_DIR = /proj/robvis/vip LIB_PATH = -L$(VIP_DIR)/lib/sunlib # use declib on the Alpha INCLUDE_PATH = -I$(VIP_DIR)/include - 8 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 # Compiling flags fla = -DSUN # use -DDEC_ALPHA on the Alpha CFLAGS = $(INCLUDEPATH) $(fla) # Specify the libraries - we want the VIP and maths libraries LIBS = $(LIBPATH) -lvip -lm # Now make the program yourprog: yourprog.o $(LINK.c) -o yourprog yourprog.o $(LIBS) yourprog.o: yourprog.c $(COMPILE.c) yourprog.c A Sample Function The following function performs a homomorphic filtering operation on an image. This is an image enhancing process that attempts to reduce the effects of low frequency lighting variations across an image, yet at the same time accentuating high frequency intensity variations to highlight the detail (see Gonzalez and Woods {\m ``Digital Image Processing''} p. 213 for more detail). The steps involved in this process are: - The log of the image is taken. - The Fast Fourier Transform is taken. - A filter function is constructed that reduces low frequency components in the image and magnifies the high frequency ones. - The Fourier Transform of the image and the filter are multiplied together. - The inverse Fourier Transform is taken. - The exponential of the image is taken. - A percentage of the extremes of the image histogram are truncated. - Finally the image values are rescaled to the range 0-255. You should note the following: - Different image types are accepted and, on some occasions, mixed by the VIP functions that are called. Log_Image is passed a BYTETYPE image and returns a FLOATTYPE. FFT_Image is passed a FLOATTYPE image and returns a COMPLEXTYPE. Multiply_Image is passed a COMPLEXTYPE and a FLOATTYPE image and returns a COMPLEXTYPE. This ability to cope with different image types simplifies the construction of programs. - 9 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 - There is no checking between calls to see if the previous function call failed. In general VIP functions check to see if an input image is valid (non-NULL pointer and correct ID code). If an input image is not valid the function will report the error and exit returning a NULL image pointer. Thus if an error occurs early in the sequence one will simply cascade harmlessly (hopefully) through the other function calls before terminating. Not having to embed large numbers of error trapping calls in one's code makes it much clearer to read. - All image pointers are initialised to NULL. This is important defensive programming. If any image pointer is passed to a function, and that pointer has never had any image data assigned to it, the receiving function can detect this as its value will be NULL. Also, the function Free_Image does not attempt to free memory if it is passed a NULL pointer. This is important if one is to cascade safely through a sequence of function calls if an error occurs as described above. /*- Homomorphic ------------------------------------------------ Function to perform homomorphic filtering on an image. An image enhancing process that attempts to reduce the effects of low frequency lighting variations across an image, yet at the same time accentuating high frequency intensity variations to highlight the detail. Reference: Gonzalez and Woods "Digital Image Processing" page 213. Peter Kovesi January 1994 input: image - input image. LowGain - gain factor for low frequencies (suggest 0.5). HighGain - gain factor for high frequencies (suggest 2.0). CutOff - frequency at which transition from LowGain to HighGain occurs (suggest 0.4). order - order of Butterworth type filter (suggest 1) lHistogramCut - percentage of low end of histogram to truncate (suggest 1). uHistogramCut - percentage of high end of histogram to truncate (suggest 5). Function returns filtered image. ------------------------------------------------------------------*/ - 10 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 IMAGE *Homomorphic(IMAGE * image, double LowGain, double HighGain, double CutOff, int order, int lHistogramCut, int uHistogramCut) { IMAGE *t1 = NULL, *t2 = NULL, *t3 = NULL, *t4 = NULL, *t5 = NULL, *t6 = NULL, *t7 = NULL; IMAGE *outimage = NULL, *filter = NULL; int r, c; t1 = Log_Image(image); t2 = FFT_Image(t1, 0); Free_Image(t1); filter = Make_Homomorphic_Filter(t2->rows, t2->cols, CutOff, LowGain, HighGain, order); t3 = Multiply_Image(t2, filter); Free_Image(t2); Free_Image(filter); t4 = IFFT_Image(t3, 0); Free_Image(t3); if(!t4) { VIP_Error_Msg("Homomorphic: An error occurred during a function call"); return(NULL); } /* Extract real part of image */ t5 = Allocate_Image(0, 0, t4->rows, t4->cols, FLOATTYPE); for (r = 0; r < t4->rows; r++) for (c = 0; c < t4->cols; c++) t5->i.f[r][c] = t4->i.cx[r][c].r; Free_Image(t4); t6 = Exp_Image(t5); Free_Image(t5); /* Remove outlying values of image by truncating top and lower ends of the image histogram by HistogramCut percent */ t7 = Truncate_Image_Histogram(t6, lHistogramCut, uHistogramCut); Free_Image(t6); outimage = Float2Byte_Image_X(t7); Free_Image(t7); - 11 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 if(!outimage) VIP_Error_Msg(``Homomorphic: An error occurred during a function call''); return (outimage); } The VIP System in More Detail The VIP IMAGE Structure Central to any image processing system is the image data structure used. The VIP IMAGE structure supports a wide variety of image types ranging from the basic 8 bit grey level representation through to complex valued and colour images. This is achieved by using a union structure to point to the actual image data. This union structure consists of pointers to all the different types of image data elements that are supported. As pointers to all data types are the same size any number of new pointers to new data types can be added to the image pointer union without affecting the existing system. Thus new image types can be added easily without `breaking' the existing code. When accessing image data, simply choosing the appropriate element from the image pointer union will result in the correct pointer arithmetic occurring. An additional feature of the VIP image data structure that distinguishes it from other image structures is its provision for comprehensive camera calibration data and lens distortion parameters. The VIP system provides support for reconstruction of 3D information from images via structured light and stereo. To aid portability the data structures have been designed to have all elements aligned with word boundaries so that the different packing characteristics of different machines would not be an issue. It is assumed that binary files are stored in big-endian format (byte reversed order), this is the natural format produced by Sun SPARC machines. VIP libraries compiled for little-endian machines (DEC Alpha and PC's) will perform byte-reversal of image data when reading so that it can be interpreted correctly, and then when writing data out, will also perform byte-reversal to ensure consistency of binary data files. Unfortunately this does, of course, involve some loss of efficiency. The image types currently available under VIP are: BYTETYPE An unsigned 8 bit grey level image with values ranging from 0 to 255. - 12 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 SHORTTYPE Signed 16 bit grey level image. LONGTYPE Signed 32 bit grey level image. FLOATTYPE 32 bit floating point valued image. DOUBLETYPE 64 bit floating point valued image. COMPLEXTYPE Complex valued image, real and imaginary components each represented by a 32 bit floating point value. RGBTYPE Colour image represented by red, green and blue components, each component represented by an 8 bit unsigned values. HSITYPE Colour image represented by hue, saturation and intensity components, each component represented by an 8 bit unsigned values. Where appropriate (and where it makes sense) the VIP image processing libraries will in most cases allow different image types to be used and/or mixed in a seamless manner. This discussed in some more detail later. The VIP image data structure is listed below. For full details refer to the listing vip.h in the vip/include directory. /*- Image types ------------------------------------------------------*/ #define BYTETYPE 1 #define SHORTTYPE 2 #define LONGTYPE 3 #define FLOATTYPE 4 #define DOUBLETYPE 5 #define COMPLEXTYPE 6 #define RGBTYPE 7 #define HSITYPE 8 /*- Data types used to build IMAGE structure ---------------------*/ typedef struct { /* complex number */ float r; float i; } COMPLEX; typedef unsigned char RGB[4]; /* RGB colour image, red green and blue * stored in an array of 4 bytes for - 13 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 * convenience and efficiency */ typedef unsigned char HSI[4]; /* Hue, saturation and intensity colour * image */ typedef unsigned char *c_array; typedef short *s_array; typedef long *l_array; typedef float *f_array; typedef double *d_array; typedef COMPLEX *cx_array; typedef RGB *rgb_array; typedef HSI *hsi_array; typedef union imagedata { c_array *c; s_array *s; l_array *l; f_array *f; d_array *d; cx_array *cx; rgb_array *rgb; hsi_array *hsi; } imagedata; /*- CAMERA structure --------------------------------------------*/ typedef struct { int idcode; char version[8]; int channel; /* Channel on PIP board */ int gain, offset; /* Gain and offset for the channel */ int uvoffset; /* UV offset in using calibration matrix * and lens compensation data */ int calibstatus; /* Flag indicating type of calibration data * present */ double gamma[5]; /* For grey scale correction if needed */ double calib_matrix[3][4];/* Calibration matrix */ double Ucomp[18]; /* Coeffs of lens compensation polynomial*/ double Vcomp[18]; /* Coeffs of lens compensation polynomial*/ } CAMERA; /*- IMAGE Data Structure --------------------------------------------*/ typedef struct { - 14 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 int idcode; /* Code to allow automatic identification*/ char version[8]; /* software version No */ int type; /* Data type - char, rgb colour etc */ int umin; /* Image origin coords */ int vmin; int rows; int cols; double resolution; char info[80]; /* Space for comments */ CAMERA camera; long reserved[3]; void *pntr[2]; /* two pointers for attaching other * structures to the image, or for linking * sequences of images together */ union imagedata i; } IMAGE; The following table lists how pixel elements in different image types are accessed. value = image->i.c[row][col]; /* BYTETYPE */ value = image->i.s[row][col]; /* SHORTTYPE */ value = image->i.l[row][col]; /* LONGTYPE */ value = image->i.f[row][col]; /* FLOATTYPE */ value = image->i.d[row][col]; /* DOUBLETYPE */ RedValue = image->i.rgb[row][col][0]; /* RGBTYPE */ GreenValue = image->i.rgb[row][col][1]; BlueValue = image->i.rgb[row][col][2]; HueValue = image->i.rgb[row][col][0]; /* HSITYPE */ SaturationValue = image->i.rgb[row][col][1]; IntensityValue = image->i.rgb[row][col][2]; RealValue = image->i.cx[10][8].r; /* COMPLEXTYPE */ ImaginaryValue = image->i.cx[10][8].i; Global Variables in VIP There are a number of global variables used in the VIP system. They are declared in vipglobals.c which is listed below. - 15 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 FILE *VIP_LOG_FILE = NULL; /* Pointer to log file for data recording*/ FILE *VIP_STD_ERR = stderr; /* Error output */ int VIP_VERBOSE = 0; /* flag to turn on or off extra printing of * data */ int VIP_DISPLAY = 0; /* flag for when one wants to turn * displaying of images on or off */ char VIP_MESSAGE[VIP_MESSAGE_LENGTH]; /* global message variable * for passing to X view * alert boxes etc */ double PLANE[USERPLANEMAX][3][3]; /* Fifty constraint planes, each * defined by 3 points. These are * used for 3D light stripe * reconstruction */ Conventions VIP function names start with capitals, multiple words within a function name are separated by underscores and each word starts with a capital, eg. Allocate_Image. VIP data types and VIP global variables are in capitals. All error messages are reported via VIP_Error_Msg (in vipio.c). The success or otherwise of the execution of a function is indicated by the return of either `OK' (1) or `ERROR' (0). Functions that return addresses return NULL on failure. In general VIP functions should check to see if an input image is valid (non-NULL pointer and correct ID code). If an input image is not valid the function will report the error and exit returning a NULL image pointer. Thus if an error occurs early in a sequence of function calls in a program one will simply cascade harmlessly through the other function calls before terminating. The idea here being to avoid having to embed large numbers of error trapping calls in one's code, thus making it much easier to read. Accordingly it is good practice to initialise all image pointers to NULL. If any image pointer is passed to a function, and that pointer has never had any image data assigned to it, the receiving function can detect this as its value will be NULL. Also, the function Free_Image does not attempt to free memory if it is passed a NULL pointer. This is important if one is to cascade safely through a sequence of function calls if an error occurs as described above. Any image processing function should not destroy or overwrite its input image(s). The result should be placed in a new image, with the - 16 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 address of the new image usually being returned by the function. Generally, each image processing function contains a series of CASE statements, indexed by the image type, containing code to process the different types of images available under VIP. For example a thresholding function could operate on BYTETYPE, SHORTTYPE, FLOATTYPE and other images using this mechanism. There is no requirement that functions cater for all image types, and in many cases they will only support BYTETYPE images. Each function will test for validity of the image type and return an error message if it does not support the particular image input type. It is assumed that as people find functions that do not support an image type that they need they will add the appropriate code to these functions (and update the documentation!). Error Reporting A flexible system exists for the reporting of errors. Different types of programs have different needs for error reporting. Command line programs simply want messages printed on the screen but windows based programs want messages to be displayed in alert boxes. Both of these needs can be accommodated in the VIP system. As mentioned above the success or otherwise of the execution of a function is indicated by the return of either `OK' (1) or `ERROR' (0). Functions that return addresses return NULL on failure. All error messages are reported via the function VIP_Error_Msg (in vipio.c). This function allows error messages to be directed to up to three different locations depending on the needs of the user. The three different (globally accessible) locations are: VIP_STD_ERR The default value of this is stderr, but it can be assigned to any file pointer. VIP_LOG_FILE A file pointer, default value is NULL. VIP_MESSAGE A character array. Error messages are always copied into this array (space permitting). For standard command line based programs the default configuration simply results in error messages being sent to stderr (your screen). For an X View or other windows based program it is not appropriate to be sending text messages to consoles. In these situations VIP_STD_ERR is set to NULL to suppress the printing of messages. The array VIP_MESSAGE is used instead. When an error is detected through a zero or NULL value returned from a function the current contents of VIP_MESSAGE can be passed to an alert box for display. Multiple error messages are concatenated together so that one can trace the source of - 17 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 any errors. Once the message has been displayed in an alert box it is up to the programmer to ensure that the VIP_MESSAGE array is cleared to allow new errors to be reported to it. The VIP_LOG_FILE pointer is intended for programs that run continuously for an extended period of time, say, on a long sequence of images. In these situations one may wish errors to be recorded silently in a log file for later analysis if needed. Location of the VIP System Components VIP Library : DEC Alpha UNIX compatible VIP library : /proj/robvis/vip/lib/declib/libvip.a SUN Sparc UNIX compatible VIP library : /proj/robvis/vip/lib/sunlib/libvip.a PC DOS compatible VIP library : /proj/robvis/vip/lib/pclib/libvip.a VIP Utilities : DEC Alpha UNIX compatible VIP utilities : /proj/robvis/vip/bin/decbin (unimplemented) SUN Sparc UNIX compatible VIP library : /proj/robvis/vip/bin/sunbin VIP Source Code : The source code for the various hardware and software platforms on which the VIP System is implemented, is represented by a single set of code. VIP Library Code : /proj/robvis/vip/src/lib VIP Utilities Code : /proj/robvis/vip/src/vip VIP Include Files : /proj/robvis/vip/include There are additional subsets of VIP related code, designed for particular VIP related tasks; these are discussed in the appendix. VIP Manuals : VIP Utilities : /proj/robvis/vip/man/man1 VIP Library : /proj/robvis/vip/man/man2 Files vip.h The VIP include file. - 18 - Formatted: November 14, 2024 VIP(2) VIP Version 4.0 VIP(2) VIP SYSTEM VIP SYSTEM February 1994 vipglobalsfn.h vipglobals.c File declaring all global variables used in the VIP system. vipiofn.h vipio.c General input/output functions, image allocation and freeing, conversion between different formats. vipspatfn.h vipspat.c Collection of basic spatial image processing functions. vip1Dfn.h vip1D.c Collection of functions for processing one dimensional slices through images. vipfreqfn.h vipfreq.c Collection of frequency based image processing functions. vipcomplexfn.h vipcomplex.c Functions for manipulating complex numbers. vipcalibfn.h vipcalib.c Functions supporting 2D/3D image transformations, reconstruction of 3D data via structured light and stereo. vector.h vectorfn.h vector.c An extensive library of vector and matrix manipulation routines. SEE ALSO vip(2), vipio(2), vipconv(2), viparith(2), vipspat(2), vipstat(2), vipfreq(2), vipcalib(2), vipvector(2), vipcomplex(2), vipmisc(2) - 19 - Formatted: November 14, 2024