コード例 #1
0
        /// <summary>
        /// Pick image and call find similar with both two modes for each faces detected
        /// </summary>
        /// <param name="sender">Event sender</param>
        /// <param name="e">Event arguments</param>
        private async void FindSimilar_Click(object sender, RoutedEventArgs e)
        {
            // Show file picker
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.DefaultExt = ".jpg";
            dlg.Filter     = "Image files (*.jpg, *.png, *.bmp, *.gif) | *.jpg; *.png; *.bmp; *.gif";
            var filePicker = dlg.ShowDialog();

            if (filePicker.HasValue && filePicker.Value)
            {
                // User picked image
                // Clear previous detection and find similar results
                TargetFaces.Clear();
                FindSimilarMatchPersonCollection.Clear();
                FindSimilarMatchFaceCollection.Clear();
                var sw = Stopwatch.StartNew();

                var pickedImagePath = dlg.FileName;
                var renderingImage  = UIHelper.LoadImageAppliedOrientation(pickedImagePath);
                var imageInfo       = UIHelper.GetImageInfoForRendering(renderingImage);
                SelectedFile = renderingImage;

                // Detect all faces in the picked image
                using (var fStream = File.OpenRead(pickedImagePath))
                {
                    MainWindow.Log("Request: Detecting faces in {0}", SelectedFile);
                    var faceServiceClient      = FaceServiceClientHelper.GetInstance(this);
                    IList <DetectedFace> faces = await faceServiceClient.Face.DetectWithStreamAsync(fStream);

                    // Update detected faces on UI
                    foreach (var face in UIHelper.CalculateFaceRectangleForRendering(faces, MaxImageSize, imageInfo))
                    {
                        TargetFaces.Add(face);
                    }

                    MainWindow.Log("Response: Success. Detected {0} face(s) in {1}", faces.Count, SelectedFile);

                    // Find two modes similar faces for each face
                    foreach (var f in faces)
                    {
                        if (f.FaceId == null)
                        {
                            continue;
                        }

                        var faceId = f.FaceId.Value;

                        MainWindow.Log("Request: Finding similar faces in Personal Match Mode for face {0}", faceId);

                        try
                        {
                            // Default mode, call find matchPerson similar REST API, the result contains all the face ids which is personal similar to the query face
                            const int           requestCandidatesCount = 4;
                            IList <SimilarFace> result = await faceServiceClient.Face.FindSimilarAsync(
                                faceId,
                                null,
                                _largeFaceListName,
                                maxNumOfCandidatesReturned : requestCandidatesCount);

                            // Update find matchPerson similar results collection for rendering
                            var personSimilarResult = new FindSimilarResult();
                            personSimilarResult.Faces     = new ObservableCollection <Face>();
                            personSimilarResult.QueryFace = new Face()
                            {
                                ImageFile = SelectedFile,
                                Top       = f.FaceRectangle.Top,
                                Left      = f.FaceRectangle.Left,
                                Width     = f.FaceRectangle.Width,
                                Height    = f.FaceRectangle.Height,
                                FaceId    = faceId.ToString(),
                            };
                            foreach (var fr in result)
                            {
                                var  candidateFace = FacesCollection.First(ff => ff.FaceId == fr.PersistedFaceId.ToString());
                                Face newFace       = new Face();
                                newFace.ImageFile  = candidateFace.ImageFile;
                                newFace.Confidence = fr.Confidence;
                                newFace.FaceId     = candidateFace.FaceId;
                                personSimilarResult.Faces.Add(newFace);
                            }

                            MainWindow.Log("Response: Found {0} similar faces for face {1}", personSimilarResult.Faces.Count, faceId);

                            FindSimilarMatchPersonCollection.Add(personSimilarResult);
                        }
                        catch (APIErrorException ex)
                        {
                            MainWindow.Log("Response: {0}. {1}", ex.Body.Error.Code, ex.Body.Error.Message);
                        }

                        try
                        {
                            // Call find facial match similar REST API, the result faces the top N with the highest similar confidence
                            const int requestCandidatesCount = 4;
                            var       result = await faceServiceClient.Face.FindSimilarAsync(
                                faceId,
                                null,
                                _largeFaceListName,
                                maxNumOfCandidatesReturned : requestCandidatesCount,
                                mode : FindSimilarMatchMode.MatchFace);

                            // Update "matchFace" similar results collection for rendering
                            var faceSimilarResults = new FindSimilarResult();
                            faceSimilarResults.Faces     = new ObservableCollection <Face>();
                            faceSimilarResults.QueryFace = new Face()
                            {
                                ImageFile = SelectedFile,
                                Top       = f.FaceRectangle.Top,
                                Left      = f.FaceRectangle.Left,
                                Width     = f.FaceRectangle.Width,
                                Height    = f.FaceRectangle.Height,
                                FaceId    = faceId.ToString(),
                            };
                            foreach (var fr in result)
                            {
                                var  candidateFace = FacesCollection.First(ff => ff.FaceId == fr.PersistedFaceId.ToString());
                                Face newFace       = new Face();
                                newFace.ImageFile  = candidateFace.ImageFile;
                                newFace.Confidence = fr.Confidence;
                                newFace.FaceId     = candidateFace.FaceId;
                                faceSimilarResults.Faces.Add(newFace);
                            }

                            MainWindow.Log("Response: Found {0} similar faces for face {1}", faceSimilarResults.Faces.Count, faceId);

                            FindSimilarMatchFaceCollection.Add(faceSimilarResults);
                        }
                        catch (APIErrorException ex)
                        {
                            MainWindow.Log("Response: {0}. {1}", ex.Body.Error.Code, ex.Body.Error.Message);
                        }
                    }
                }
            }
            GC.Collect();
        }
        /// <summary>
        /// open camera dialog
        /// </summary>
        /// <param name="sender">Event sender</param>
        /// <param name="e">Event arguments</param>
        private async void OpenCamera_Click(object sender, RoutedEventArgs e)
        {
            //OpenFaceButton.IsEnabled = false;
            CameraOpen camera = new CameraOpen();

            camera.ShowDialog();
            //Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            //dlg.DefaultExt = ".jpg";
            //dlg.Filter = "Image files (*.jpg, *.png, *.bmp, *.gif) | *.jpg; *.png; *.bmp; *.gif";
            //var filePicker = dlg.ShowDialog();

            //if (filePicker.HasValue && filePicker.Value)
            //{
            // User picked image
            // Clear previous detection and find similar results
            TargetFaces.Clear();
            FindSimilarMatchPersonCollection.Clear();
            FindSimilarMatchFaceCollection.Clear();
            var sw = Stopwatch.StartNew();

            var pickedImagePath = @"D:\3.jpg";    //dlg.FileName;
            var renderingImage  = UIHelper.LoadImageAppliedOrientation(pickedImagePath);
            var imageInfo       = UIHelper.GetImageInfoForRendering(renderingImage);

            SelectedFile = renderingImage;

            // Detect all faces in the picked image
            using (var fStream = File.OpenRead(pickedImagePath))
            {
                MainWindow.Log("Request: Detecting faces in {0}", SelectedFile);

                MainWindow mainWindow        = Window.GetWindow(this) as MainWindow;
                string     subscriptionKey   = mainWindow._scenariosControl.SubscriptionKey;
                string     endpoint          = mainWindow._scenariosControl.SubscriptionEndpoint;
                var        faceServiceClient = new FaceServiceClient(subscriptionKey, endpoint);
                var        faces             = await faceServiceClient.DetectAsync(fStream);

                // Update detected faces on UI
                foreach (var face in UIHelper.CalculateFaceRectangleForRendering(faces, MaxImageSize, imageInfo))
                {
                    TargetFaces.Add(face);
                }

                MainWindow.Log("Response: Success. Detected {0} face(s) in {1}", faces.Length, SelectedFile);

                // Find two modes similar faces for each face
                foreach (var f in faces)
                {
                    var faceId = f.FaceId;
                    MainWindow.Log("Request: Finding similar faces in Personal Match Mode for face {0}", faceId);

                    try
                    {
                        // Default mode, call find matchPerson similar REST API, the result contains all the face ids which is personal similar to the query face
                        const int requestCandidatesCount = 4;
                        var       result = await faceServiceClient.FindSimilarAsync(faceId, faceid_list, requestCandidatesCount);

                        //faceServiceClient.F
                        // Update find matchPerson similar results collection for rendering
                        var personSimilarResult = new FindSimilarResult();
                        personSimilarResult.Faces     = new ObservableCollection <Face>();
                        personSimilarResult.QueryFace = new Face()
                        {
                            ImageFile = SelectedFile,
                            Top       = f.FaceRectangle.Top,
                            Left      = f.FaceRectangle.Left,
                            Width     = f.FaceRectangle.Width,
                            Height    = f.FaceRectangle.Height,
                            FaceId    = faceId.ToString(),
                        };
                        foreach (var fr in result)
                        {
                            var  candidateFace = FacesCollection.First(ff => ff.FaceId == fr.FaceId.ToString());
                            Face newFace       = new Face();
                            newFace.ImageFile  = candidateFace.ImageFile;
                            newFace.Confidence = fr.Confidence;
                            newFace.FaceId     = candidateFace.FaceId;
                            personSimilarResult.Faces.Add(newFace);
                        }

                        MainWindow.Log("Response: Found {0} similar faces for face {1}", personSimilarResult.Faces.Count, faceId);

                        FindSimilarMatchPersonCollection.Add(personSimilarResult);
                    }
                    catch (FaceAPIException ex)
                    {
                        MainWindow.Log("Response: {0}. {1}", ex.ErrorCode, ex.ErrorMessage);
                    }

                    try
                    {
                        // Call find facial match similar REST API, the result faces the top N with the highest similar confidence
                        const int requestCandidatesCount = 4;
                        var       result = await faceServiceClient.FindSimilarAsync(faceId, faceid_list, FindSimilarMatchMode.matchFace, requestCandidatesCount);

                        // Update "matchFace" similar results collection for rendering
                        var faceSimilarResults = new FindSimilarResult();
                        faceSimilarResults.Faces     = new ObservableCollection <Face>();
                        faceSimilarResults.QueryFace = new Face()
                        {
                            ImageFile = SelectedFile,
                            Top       = f.FaceRectangle.Top,
                            Left      = f.FaceRectangle.Left,
                            Width     = f.FaceRectangle.Width,
                            Height    = f.FaceRectangle.Height,
                            FaceId    = faceId.ToString(),
                        };
                        foreach (var fr in result)
                        {
                            var  candidateFace = FacesCollection.First(ff => ff.FaceId == fr.FaceId.ToString());
                            Face newFace       = new Face();
                            newFace.ImageFile = candidateFace.ImageFile;
                            //Bitmap imag = new Bitmap();
                            //(candidateFace.ImageFile);
                            //g2.
                            // MainWindow.Log("Response: Found {0} similar faces for face {1}", , faceId);
                            newFace.Confidence = fr.Confidence;
                            newFace.Top        = candidateFace.Top;
                            newFace.Left       = candidateFace.Left;
                            newFace.Width      = candidateFace.Width;
                            newFace.Height     = candidateFace.Height;
                            newFace.FaceId     = fr.FaceId.ToString();//candidateFace.FaceId;
                            faceSimilarResults.Faces.Add(newFace);
                        }
                        var      candidate1 = FacesCollection.First(ff => ff.FaceId == result[0].FaceId.ToString());
                        Bitmap   graph      = new Bitmap(UIHelper.ImageSourceToBitmap(candidate1.ImageFile).Width, UIHelper.ImageSourceToBitmap(candidate1.ImageFile).Height);
                        Graphics g2         = Graphics.FromImage(graph);

                        g2.DrawImage(UIHelper.ImageSourceToBitmap(candidate1.ImageFile), 0, 0);
                        // Rectangle zuibiao = new Rectangle(f.FaceRectangle.Left, f.FaceRectangle.Top, f.FaceRectangle.Width, f.FaceRectangle.Height);
                        Rectangle zuibiao = new Rectangle(candidate1.Left, candidate1.Top, candidate1.Width, candidate1.Height);
                        //g2.DrawImageUnscaled(UIHelper.ImageSourceToBitmap(candidateFace.ImageFile),0,0);
                        g2.DrawImage(UIHelper.ImageSourceToBitmap(SelectedFile), zuibiao, f.FaceRectangle.Left, f.FaceRectangle.Top, f.FaceRectangle.Width, f.FaceRectangle.Height, GraphicsUnit.Pixel);
                        System.Drawing.Image saveImage = System.Drawing.Image.FromHbitmap(graph.GetHbitmap());
                        saveImage.Save(@"E:\hackathon\ls\cognitive-Face-Windows\data1\image1.jpg", ImageFormat.Jpeg);

                        Bitmap   graph1 = new Bitmap(UIHelper.ImageSourceToBitmap(candidate1.ImageFile).Width, UIHelper.ImageSourceToBitmap(candidate1.ImageFile).Height);
                        Graphics g3     = Graphics.FromImage(graph1);

                        g3.DrawImage(UIHelper.ImageSourceToBitmap(candidate1.ImageFile), 0, 0);
                        System.Drawing.Image saveImage1 = System.Drawing.Image.FromHbitmap(graph1.GetHbitmap());
                        saveImage1.Save(@"E:\hackathon\ls\cognitive-Face-Windows\image1.jpg", ImageFormat.Jpeg);
                        MainWindow.Log("Response: Found {0} similar faces for face {1}", faceSimilarResults.Faces.Count, faceId);
                        MergeImage1 = getMergedPicture(@"D:\3.jpg", @"E:\hackathon\ls\cognitive-Face-Windows\image1.jpg");
                        //MergeImage1 = getMergedPicture("D:\\3.jpg", "D:\\1.jpg");
                        FindSimilarMatchFaceCollection.Add(faceSimilarResults);

                        /* MediaPlayer player = new MediaPlayer();
                         * player.Open(new Uri(media_name[candidate1.FaceId].Substring(0, media_name[candidate1.FaceId].Length - 4) + ".WAV", UriKind.Relative));
                         * player.Play();*/
                        Thread.Sleep(4000);
                    }
                    catch (FaceAPIException ex)
                    {
                        MainWindow.Log("Response: {0}. {1}", ex.ErrorCode, ex.ErrorMessage);
                    }
                }
            }
            //}
            //GC.Collect();
            // OpenFaceButton.IsEnabled = false;
            GC.Collect();
        }