public async Task <bool> IdentifyCustomer(byte[] image) { if (IsBusy) { return(false); } IsBusy = true; ImageData = image; bool result = false; IdentifyCustomerResponse response = await AzureService.IdentifyCustomer(imageData); if (!response.HasError) { customerData = response.Customer; FirstName = string.IsNullOrEmpty(customerData.FirstName) ? "" : customerData.FirstName; LastName = string.IsNullOrEmpty(customerData.LastName) ? "" : customerData.LastName; Age = customerData.Age; Gender = customerData.Gender; if (response.PreviousOrder != null) { PreviousOrderDate = (response.PreviousOrder.Date == default(DateTime)) ? null : string.Format("{0:MMMM dd, yyyy}", response.PreviousOrder.Date); PreviousOrderDescription = response.PreviousOrder.Description; } ImageUri = new Uri(response.ImageUrl); Emotion = response.Emotion; result = true; } IsBusy = false; return(result); }
public static async Task <HttpResponseMessage> IdentifyCustomer([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req, TraceWriter log) { // Get request body var body = await req.Content.ReadAsStringAsync(); var imageCapture = JsonConvert.DeserializeObject <IdentifyCustomerRequest>(body, new JsonConverter[] { new GuidJsonConverter() }); if (imageCapture == null) { return(req.CreateResponse(HttpStatusCode.BadRequest, "No Valid Data submitted.")); } // Decode data from Base64 byte[] imageBytes = Convert.FromBase64String(imageCapture.Image); // Detect the faces Face detectedFace; using (var stream = new MemoryStream(imageBytes)) { detectedFace = await FaceClient.Instance.DetectPrimaryFace(stream, true); if (detectedFace == null || detectedFace.FaceId == null) { req.CreateResponse(HttpStatusCode.ExpectationFailed, "Error: No face was detected"); } } // Crop the face var rect = new Rectangle( detectedFace.FaceRectangle.Left, detectedFace.FaceRectangle.Top, detectedFace.FaceRectangle.Width, detectedFace.FaceRectangle.Height ); rect.Inflate(50, 50); using (var stream = new MemoryStream(imageBytes)) { Bitmap bmp = Image.FromStream(stream) as Bitmap; var cropped = ImageUtils.CropBitmap(bmp, rect); imageBytes = cropped.ToByteArray(ImageFormat.Png); } // Store the image string storedUrl = StorageClient.Instance.StoreImage(imageBytes, ImagesContainerID)?.ToString(); log.Trace(new TraceEvent(System.Diagnostics.TraceLevel.Verbose, "heres the url!: " + storedUrl)); var response = new IdentifyCustomerResponse() { ImageUrl = storedUrl, Emotion = FaceClient.Instance.ParseEmotions(detectedFace.FaceAttributes.Emotion) }; // Check for existing Customers response.Customer = await FaceClient.Instance.IdentifyCustomerFace(detectedFace.FaceId); // Update the customers history with the recent photo if (response.Customer != null) { await FaceClient.Instance.AddCustomerFace(response.Customer, storedUrl); // Get their previous order var orders = CosmosClient.Instance.GetCustomerOrders(response.Customer.id, 1); // Could show more if we wanted response.PreviousOrder = orders.FirstOrDefault(); } // If there are no matched customers return a new Customer with the FaceID else { response.Customer = new Customer() { FaceId = detectedFace.FaceId, Age = detectedFace.FaceAttributes.Age, Gender = detectedFace.FaceAttributes.Gender }; } return(req.CreateResponse(HttpStatusCode.OK, response)); }