This function returns a reference to a bounding box set. Bounding boxes are used to label features of interest in object detection. The purpose of ENVIBoundingBoxSet is to programmatically add and manage bounding box information in object detection rasters, instead of drawing rectangle annotations on a training raster. Bounding boxes are stored as GeoJSON metadata in object detection rasters. See Bounding Boxes Background for details.
            Use the ENVIBoundingBoxSet function to:
             
                - 
                    Import existing bounding boxes, using the INPUT_GEOJSON keyword. Then, add or remove bounding boxes as needed; or: 
- 
                    Create a new bounding box set 
Another scenario is to import existing labeled data in the form of shapefiles or regions of interest (ROIs). Then convert them to bounding boxes using the ENVIBoundingBoxSet function.
            This routine is part of ENVI Deep Learning, which requires a separate license and installation.
            Example
            This example creates a bounding box set and populates it with three classes, with three bounding boxes each. The example displays, manipulates, and redisplays the bounding box properties, showing the changes that were made. Finally, it displays a GeoJSON hash that contains four features for classes 1 and 2. The bounding boxes for all three classes are in pixel coordinates, so the SPATIALREF keyword does not need to be explicitly set.
            Follow these steps:
             
                - 
                    Copy and paste the code below into the IDL Editor. 
- 
                    Save the program as ENVIBoundingBox_Example.pro. 
- 
                    Compile and run the program. 
PRO ENVIBoundingBoxSet_Example
            COMPILE_OPT IDL2, hidden
             
              
              e = ENVI(/HEADLESS)
             
              
              
              boxes = [ $
                [[530, 381], [570, 381], [570, 421], [530, 421], [530, 381]], $
                [[438, 859], [478, 859], [478, 899], [438, 899], [438, 859]], $
                [[392, 212], [432, 212], [432, 252], [392, 252], [392, 212]], $
                [[636, 499], [676, 499], [676, 539], [636, 539], [636, 499]], $
                [[266, 519], [306, 519], [306, 559], [266, 559], [266, 519]], $
                [[398, 729], [438, 729], [438, 769], [398, 769], [398, 729]], $
                [[300, 486], [340, 486], [340, 526], [300, 526], [300, 486]], $
                [[400, 545], [440, 545], [440, 585], [400, 585], [400, 545]], $
                [[204, 723], [244, 723], [244, 763], [204, 763], [204, 723]]]
               
              
              labels = List('red_car', 'green_car', 'blue_car')
              colors = List([255,0,0], [0,255,0], [0,0,255])
              classBoxes = (List(boxes[*,*,0:2], boxes[*,*,3:5], boxes[*,*,6:8])).ToArray(/TRANSPOSE)
               
              
              bboxSet = ENVIBoundingBoxSet()
               
              
              FOREACH name, labels, index DO BEGIN
                bboxSet.AddClass, CLASS=index, LABEL=name, COLOR=colors[index]
               
                
                FOR n=0, 2 DO BEGIN
                  bboxSet.AddBoundingBox, CLASS=index, BOUNDING_BOX=classBoxes[*,*,index,n]
                ENDFOR
              ENDFOREACH
               
              Print, 'Classes:'
              Print, bboxSet.Classes
              Print, 'Labels:'
              Print, bboxSet.Labels
              Print, 'Class Colors: '
              Print, bboxSet.Colors
              Print, 'Classes Count: ', bboxSet.nClasses
              Print, 'Bounding Box Count: ', bboxSet.nBounding_Boxes
              Print, 'Class to Bounding Box Map:'
              Print, bboxSet.Bounding_Boxes_Per_Class
              Print, 'Get Bounding Box by Index: '
               
              
              Print, bboxSet.GetBoundingBox(CLASS=0, INDEX=0)
               
              Print, 'Get All Class 1 Bounding Boxes:'
               
              
              Print, bboxSet.GetBoundingBox(CLASS=1, /ALL), /IMPLIED 
               
              
              
              bboxSet.RemoveBoundingBox, CLASS=0, /ALL
               
              
              bboxSet.RemoveBoundingBox, CLASS=1, INDEX=0
               
              
              bboxSet.RemoveBoundingBox, CLASS=2, BOUNDING_BOX=classBoxes[*,*,2,0]
               
              
              bboxSet.RemoveClass, CLASS=0
               
              Print, 'After removing boxes and class 0.
              Print, 'Classes:'
              Print, bboxSet.Classes
              Print, 'Labels:'
              Print, bboxSet.Labels
              Print, 'Class Colors: '
              Print, bboxSet.Colors
              Print, 'Classes Count: ', bboxSet.nClasses
              Print, 'Bounding Box Count: ', bboxSet.nBounding_Boxes
              Print, 'Class to Bounding Box Map:'
              Print, bboxSet.Bounding_Boxes_Per_Class
               
              
              geoJson = bboxSet.GetGeoJSON()
              Print, geoJson, /IMPLIED
               
            END
            Syntax
            Result = ENVIBoundingBoxSet([Properties=value] [, Keywords=value])
            Return Value
            This function returns a reference to an ENVIBoundingBoxSet object.
            Arguments
            None
            Methods
            AddBoundingBox
            
            AddClass
            
            GetBoundingBox
            
            GetENVIGeoJSON
            
            GetGeoJSON
            
            RemoveBoundingBox
            
            RemoveClass
            
            Properties
            BOUNDING_BOXES_PER_CLASS (Get)
            A hash containing a class index, followed by the number of bounding boxes for the class. In the following example, class 0 has 250 bounding boxes:
            {
              0:250,
              1:300,
              etc.
            }
            CLASSES (Get)
            An array of class values; for example:
            [0,1,2]
            COLORS (Get)
            An array of RGB triplets with class colors; for example:
            [[255,0,0],[0,255,0],[0,0,255]]
            LABELS (Get)
            A string array of class labels; for example:
            ['red_car', 'green_car', 'blue car']
            NUM_BOUNDING_BOXES (Get)
            The total number of bounding boxes.
            NUM_CLASSES (Get)
            The total number of classes.
            SPATIALREF (Get)
            The spatial reference used when instantiating the ENVIBoundingBoxSet instance or when the latest bounding box was added. This can be a reference to an ENVIStandardSpatialRef, ENVIRPCRasterSpatialRef, ENVIGLTRasterSpatialRef, or ENVIPseudoRasterSpatialRef object. 
            If the input GeoJSON code (set with the INPUT_GEOJSON keyword) or newly added bounding boxes (set with the AddBoundingBox method) are in pixel coordinates, then this property will be null.
            Keywords
            ERROR (optional)
            Set this keyword to a named variable that will contain any error message issued during execution of this routine. If no error occurs, the ERROR variable will be set to a null string (''). If an error occurs and the routine is a function, then the function result will be undefined.
            When this keyword is not set and an error occurs, ENVI returns to the caller and execution halts. In this case, the error message is contained within !ERROR_STATE and can be caught using IDL's CATCH routine. See IDL Help for more information on !ERROR_STATE and CATCH.
            See the Manage Errors topic in ENVI Help for more information on error handling.
            SPATIALREF (optional)
            Set this keyword to an ENVIStandardSpatialRef, ENVIRPCRasterSpatialRef, ENVIGLTRasterSpatialRef, or ENVIPseudoRasterSpatialRef object if the bounding box was derived from a source raster that has a spatial reference.  Set this keyword to that spatial reference. ENVI will internally convert the bounding box coordinates to pixel coordinates. If you do not specify this keyword, no projection conversion will happen, and pixel coordinates will be assumed for the bounding boxes.
            INPUT_GEOJSON (optional)
            Specify one of the following:
             
                - 
                    A hash containing bounding box properties. The hash must be in a specific format. See an example in the Bounding Boxes Background topic. 
- 
                    A fully qualified URI to a JSON file that contains a hash of bounding box properties. The hash must be in the expected format. 
- 
                    An ENVIGeoJSON object that contains a hash of bounding box properties. The hash must be in the expected format. 
The purpose of this keyword is to import existing bounding box information so that you can add or remove bounding boxes. You can also add and remove classes as needed.
            If you do not specify this keyword, an empty hash will be created so that you can add your own bounding box information.
            Version History
            
            See Also
            BuildObjectDetectionRasterFromAnnotation Task