예제 #1
0
        // GET: api/Sensors/name
        public HttpResponseMessage Get(string sensorName, bool outputJSON)
        {
            var io                   = new ImageOperations();
            var sensorPath           = HttpContext.Current.Server.MapPath($"~/Sensors/{sensorName}");
            var sensorFileContent    = File.ReadAllText($"{sensorPath}/sensor.json");
            var js                   = new JavaScriptSerializer();
            var sensorDto            = js.Deserialize <SensorDto>(sensorFileContent);
            var parkingSpacesOutputs = new List <ParkingSpaceOutputDto>(sensorDto.ParkingSpaces.Length);


            var inputImage = sensorInputs.ContainsKey(sensorName)? sensorInputs[sensorName] : (Bitmap)Bitmap.FromFile($"{sensorPath}/{sensorDto.inputSample}");
            var emptyImage = (Bitmap)Bitmap.FromFile($"{sensorPath}/{sensorDto.EmptyImg}");

            var outputImage = (Bitmap)inputImage.Clone();

            using (Graphics outputGraphics = Graphics.FromImage(outputImage))
            {
                foreach (var parkingSpaceDto in sensorDto.ParkingSpaces)
                {
                    var inputCrop = (Bitmap)inputImage.Clone();
                    var emptyCrop = (Bitmap)emptyImage.Clone();

                    var sensorMask   = (Bitmap)Bitmap.FromFile($"{sensorPath}/{parkingSpaceDto.SensorMask}");
                    var locationMask = (Bitmap)Bitmap.FromFile($"{sensorPath}/{parkingSpaceDto.LocationMask}");

                    var sensorPixelCount = io.CountNonEmptyPixels(sensorMask);

                    io.CropImageWithMask(inputCrop, sensorMask);
                    io.CropImageWithMask(emptyCrop, sensorMask);
                    io.DiffImage(inputCrop, emptyCrop);
                    var  diffRGBSum = io.SumAllRGB(inputCrop);
                    bool vacant     = (diffRGBSum / sensorPixelCount) < parkingSpaceDto.Threshold;

                    if (vacant)
                    {
                        io.SetMaskColor(locationMask, 0, 255, 0);
                    }
                    else
                    {
                        io.SetMaskColor(locationMask, 255, 0, 0);
                    }
                    outputGraphics.DrawImage(locationMask, 0, 0, outputImage.Width, outputImage.Height);

                    parkingSpacesOutputs.Add(new ParkingSpaceOutputDto {
                        Name = parkingSpaceDto.Name, IsAvailable = vacant, ConfidenceLevel = ((float)diffRGBSum / sensorPixelCount / 255)
                    });
                }
            }
            if (outputJSON)
            {
                var outputDto = new SensorOutputDto {
                    ImageUrl = HttpContext.Current.Request.Url.OriginalString.Replace("outputJson=true", "outputJson=false"), ParkingSpaces = parkingSpacesOutputs.ToArray()
                };
                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                result.Content = new StringContent(js.Serialize(outputDto).Replace(@"\u0026", "&")); // JavaScriptSerializer messes up &
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                return(result);
            }
            else
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    outputImage.Save(ms, ImageFormat.Png);
                    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                    result.Content = new ByteArrayContent(ms.ToArray());
                    result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
                    return(result);
                }
            }
        }