// 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); } } }