예제 #1
0
 public ThreadRegionProcessingState(
                    int processing_type,
                    byte[] bmp, int image_width, int image_height,
                    region image_region)
 {
     active = true;
     this.processing_type = processing_type;
     this.bmp = bmp;
     this.image_width = image_width;
     this.image_height = image_height;
     this.image_region = image_region;
 }
예제 #2
0
        public static region upsample(region original, float scale,
                                      byte[] bmp, int bmp_width, int bmp_height,
                                      bool propertiesOnly)
        {
            region upsampled = new region();

            upsampled.classification = original.classification;
            upsampled.geometry_type = original.geometry_type;
            upsampled.description = original.description;
            upsampled.tx = (int)(original.tx * scale);
            upsampled.ty = (int)(original.ty * scale);
            upsampled.width = (int)(original.width * scale);
            upsampled.height = (int)(original.height * scale);
            upsampled.orientation = original.orientation;
            upsampled.centre_x = (int)(original.centre_x * scale);
            upsampled.centre_y = (int)(original.centre_y * scale);
            upsampled.aspect_ratio = original.aspect_ratio;

            upsampled.corners = new ArrayList();
            for (int i = 0; i < original.corners.Count; i += 2)
            {
                float x = (float)original.corners[i] * scale;
                float y = (float)original.corners[i + 1] * scale;
                upsampled.corners.Add(x);
                upsampled.corners.Add(y);
            }

            upsampled.polygon = new polygon2D();
            for (int i = 0; i < original.polygon.x_points.Count; i++)
            {
                float x = (float)original.polygon.x_points[i] * scale;
                float y = (float)original.polygon.y_points[i] * scale;
                upsampled.polygon.Add(x, y);
            }

            if (!propertiesOnly)
            {
                upsampled.shape = new bool[upsampled.width, upsampled.height];
                upsampled.segmented = new byte[upsampled.width, upsampled.height];
                upsampled.mono_image = new byte[upsampled.width * upsampled.height];
                for (int y = 0; y < upsampled.height; y++)
                {
                    int y_original = (int)(y / scale);
                    for (int x = 0; x < upsampled.width; x++)
                    {
                        int x_original = (int)(x / scale);
                        upsampled.shape[x, y] = original.shape[x_original, y_original];
                        upsampled.segmented[x, y] = original.segmented[x_original, y_original];

                        int n1 = (y * upsampled.width) + x;
                        int n2 = (((upsampled.ty + y) * bmp_width) + (upsampled.tx + x)) * 3;
                        upsampled.mono_image[n1] = (byte)((bmp[n2] + bmp[n2 + 1] + bmp[n2 + 2]) / 3);
                    }
                }


                upsampled.corner_features = new ArrayList();
                for (int i = 0; i < original.corner_features.Count; i += 2)
                {
                    int x = (int)((int)original.corner_features[i] * scale);
                    int y = (int)((int)original.corner_features[i + 1] * scale);
                    upsampled.corner_features.Add(x);
                    upsampled.corner_features.Add(y);
                }

                upsampled.outline = new ArrayList();
                for (int i = 0; i < original.outline.Count; i += 2)
                {
                    int x = (int)((int)original.outline[i] * scale);
                    int y = (int)((int)original.outline[i + 1] * scale);
                    upsampled.outline.Add(x);
                    upsampled.outline.Add(y);
                }
            }

            return (upsampled);
        }