private async Task <IReadOnlyList <EntityAnnotation> > OcrFromGoogle(Stream image, string?inputLanguage = null) { image.Position = 0; var googleImage = await Image.FromStreamAsync(image); var imageContext = new ImageContext(); if (inputLanguage != null) { imageContext.LanguageHints.Add(inputLanguage); } var response = await _ocrClientLazy.Value.DetectTextAsync(googleImage, imageContext); return(response); }
public static async System.Threading.Tasks.Task Run( [BlobTrigger("pending/{name}")] Stream image, [Queue(Constants.QUEUE_NAME)] IAsyncCollector <string> applicationQueue, string name, ILogger log, ExecutionContext executionContext) { var sourceStream = new MemoryStream(); await image.CopyToAsync(sourceStream); var bitmap = new Bitmap(sourceStream); var customVisionPredictionClient = new CustomVisionPredictionClient { ApiKey = Environment.GetEnvironmentVariable("CustomVisionPredictionClient_ApiKey"), Endpoint = Environment.GetEnvironmentVariable("CustomVisionPredictionClient_Endpoint") }; sourceStream.Position = 0; var response = await customVisionPredictionClient.DetectImageAsync(Guid.Parse(Environment.GetEnvironmentVariable("CustomVisionPredictionClient_ProjectId")), "Completed Route", sourceStream); var routes = new List <string>(); foreach (var predictionModel in response.Predictions) { if (predictionModel.TagName == "Completed Route" && predictionModel.Probability > 0.85) { var cropped = CropBitmap(bitmap, predictionModel.BoundingBox.Left, predictionModel.BoundingBox.Top, predictionModel.BoundingBox.Width, predictionModel.BoundingBox.Height); var memoryStream = new MemoryStream(); //ONLY FOR DEBUG //cropped.Save(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),Guid.NewGuid().ToString())); cropped.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); memoryStream.Position = 0; //https://stackoverflow.com/questions/53367132/where-to-store-files-for-azure-function var path = Path.Combine(executionContext.FunctionAppDirectory, "Zwift-5c2367dfe003.json"); Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", path); Image tmpImage = await Image.FromStreamAsync(memoryStream); var client = await ImageAnnotatorClient.CreateAsync(); var tmp = await client.DetectTextAsync(tmpImage); var annotation = tmp.FirstOrDefault(); if (annotation?.Description != null) { routes.Add(annotation.Description.Replace("\n", " ").Trim()); } } } if (routes.Count > 0) { var user = name.Split("_").First(); await applicationQueue.AddAsync(JsonConvert.SerializeObject(new MultipleRoutesCompletedModel { UserId = user, Routes = routes })); await applicationQueue.FlushAsync(); } }