Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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));
        }