예제 #1
0
        public static async Task <SignalRMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
            ILogger log, ExecutionContext context)
        {
            log.LogInformation("C# HTTP trigger function processed a request to analyze image.");

            var ms = new MemoryStream();
            await req.Body.CopyToAsync(ms);

            var imageBytes = ms.ToArray();
            var identified = await FaceConnector.AnalyzeImageAsync(imageBytes, GetConfig(log, context));

            identified.ToList().ForEach(_ =>
            {
                log.LogInformation(_.UserData);
            });
            dynamic data    = new ExpandoObject();
            var     message = new SignalRMessage
            {
                Target = "ImageAnalyzed"
            };
            var content = new AnalyzeResult
            {
                NrFound = identified.Count(),
                Users   = identified.Select(_ => _.UserData).ToList()
            };

            data.result       = content;
            message.Arguments = new object[] { data };
            return(message);
        }
 public void Add(FaceConnector element)
 {
     if (last != null)
     {
         last.Next = element;
     }
     element.Previous = last;
     last             = element;
     if (First == null)
     {
         First = element;
     }
 }
 public static bool AreConnectable(FaceConnector a, FaceConnector b, int dim)
 {
     if (a.HashCode != b.HashCode)
     {
         return(false);
     }
     int[] vertices  = a.Vertices;
     int[] vertices2 = b.Vertices;
     for (int i = 0; i < vertices.Length; i++)
     {
         if (vertices[i] != vertices2[i])
         {
             return(false);
         }
     }
     return(true);
 }
예제 #4
0
        /// <summary>
        /// Can two faces be connected.
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="dim"></param>
        /// <returns></returns>
        public static bool AreConnectable(FaceConnector a, FaceConnector b, int dim)
        {
            if (a.HashCode != b.HashCode)
            {
                return(false);
            }

            var av = a.Vertices;
            var bv = b.Vertices;

            for (int i = 0; i < av.Length; i++)
            {
                if (av[i] != bv[i])
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #5
0
        /// <summary>
        /// Connect faces using a connector.
        /// </summary>
        /// <param name="connector"></param>
        void ConnectFace(FaceConnector connector)
        {
            var index = connector.HashCode % ConnectorTableSize;
            var list  = ConnectorTable[index];

            for (var current = list.First; current != null; current = current.Next)
            {
                if (FaceConnector.AreConnectable(connector, current, Dimension))
                {
                    list.Remove(current);
                    FaceConnector.Connect(current, connector);
                    current.Face   = null;
                    connector.Face = null;
                    ObjectManager.DepositConnector(current);
                    ObjectManager.DepositConnector(connector);
                    return;
                }
            }

            list.Add(connector);
        }
 public void Remove(FaceConnector connector)
 {
     if (connector.Previous != null)
     {
         connector.Previous.Next = connector.Next;
     }
     else if (connector.Previous == null)
     {
         First = connector.Next;
     }
     if (connector.Next != null)
     {
         connector.Next.Previous = connector.Previous;
     }
     else if (connector.Next == null)
     {
         last = connector.Previous;
     }
     connector.Next     = null;
     connector.Previous = null;
 }
예제 #7
0
 /// <summary>
 /// Connect two faces.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 public static void Connect(FaceConnector a, FaceConnector b)
 {
     a.Face.AdjacentFaces[a.EdgeIndex] = b.Face.Index;
     b.Face.AdjacentFaces[b.EdgeIndex] = a.Face.Index;
 }
예제 #8
0
 public void DepositConnector(FaceConnector connector)
 {
     ConnectorStack.Push(connector);
 }
예제 #9
0
        /// <summary>
        /// Removes the element from the list.
        /// </summary>
        /// <param name="connector"></param>
        public void Remove(FaceConnector connector)
        {
            if (connector.Previous != null)
            {
                connector.Previous.Next = connector.Next;
            }
            else if (/*first == face*/ connector.Previous == null)
            {
                this.first = connector.Next;
            }

            if (connector.Next != null)
            {
                connector.Next.Previous = connector.Previous;
            }
            else if (/*last == face*/ connector.Next == null)
            {
                this.last = connector.Previous;
            }

            connector.Next = null;
            connector.Previous = null;
        }
예제 #10
0
 /// <summary>
 /// Adds a face to the list.
 /// </summary>
 /// <param name="element"></param>
 public void Add(FaceConnector element)
 {
     if (this.last != null)
     {
         this.last.Next = element;
     }
     element.Previous = this.last;
     this.last = element;
     if (this.first == null)
     {
         this.first = element;
     }
 }
예제 #11
0
 /// <summary>
 /// Adds the element to the beginning.
 /// </summary>
 /// <param name="connector"></param>
 void AddFirst(FaceConnector connector)
 {
     this.first.Previous = connector;
     connector.Next = this.first;
     this.first = connector;
 }
예제 #12
0
        /// <summary>
        /// Connect faces using a connector.
        /// </summary>
        /// <param name="connector"></param>
        void ConnectFace(FaceConnector connector)
        {
            var index = connector.HashCode % ConnectorTableSize;
            var list = ConnectorTable[index];

            for (var current = list.First; current != null; current = current.Next)
            {
                if (FaceConnector.AreConnectable(connector, current, Dimension))
                {
                    list.Remove(current);
                    FaceConnector.Connect(current, connector);
                    current.Face = null;
                    connector.Face = null;
                    ObjectManager.DepositConnector(current);
                    ObjectManager.DepositConnector(connector);
                    return;
                }
            }

            list.Add(connector);
        }
예제 #13
0
        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task <HttpResponseMessage> Post([FromBody] Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                ConnectorClient connector = null;
                try
                {
                    connector = new ConnectorClient(new Uri(activity.ServiceUrl));
                    // calculate something for us to return
                    var faceTraits = new List <Trait>();
                    // return our reply to the user


                    if (activity.Attachments.Count == 1)
                    {
                        FaceConnector faceConnector = new FaceConnector();
                        var           faces         = await faceConnector.UploadAndDetectFaces(activity);

                        if (faces.Length > 0)
                        {
                            faceTraits = FaceAnalizer.GetTraitsFromFace(faces[0]);
                        }
                        else
                        {
                            await connector.Conversations.ReplyToActivityAsync(activity.CreateReply("You're so dumb, you can't even take a selfie"));

                            return(Request.CreateResponse(HttpStatusCode.OK));;
                        }


                        var jokeService = new JokeService();
                        var joke        = jokeService.GetJoke(faceTraits);

                        Activity reply = activity.CreateReply(joke);
                        await connector.Conversations.ReplyToActivityAsync(reply);
                    }
                    else
                    {
                        JObject r = await WatsonService.TalkToWatson(activity.Text, activity.Conversation.Id);

                        Dictionary <string, double> map = new Dictionary <string, double>();
                        foreach (JObject entity in r["entities"])
                        {
                            map[entity["value"].Value <string>()] = entity["confidence"].Value <double>();
                        }
                        if (map.Keys.Count > 0)
                        {
                            var jokeService = new JokeService();
                            var joke        = jokeService.GetJoke(new List <Trait> {
                                new Trait {
                                    Name = map.Keys.First(), Accuracy = 1.0
                                }
                            });

                            Activity reply = activity.CreateReply($"{joke}");
                            await connector.Conversations.ReplyToActivityAsync(reply);
                        }

                        //var entities = ((IEnumerable<object>)r.Result).ToList()[1];
                        // var replyText = ((Newtonsoft.Json.Linq.JProperty )entities);
                    }
                    // faceConnector.UploadAndDetectFaces(activity.Attachments)
                }

                catch (Exception ex)
                {
                    if (connector != null)
                    {
                        Activity reply = activity.CreateReply(ex.Message);
                        await connector.Conversations.ReplyToActivityAsync(reply);
                    }
                }
            }
            else
            {
                HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);

            return(response);
        }
 private void AddFirst(FaceConnector connector)
 {
     First.Previous = connector;
     connector.Next = First;
     First          = connector;
 }