C # FaceAPI Detect запрос работает только при втором нажатии кнопки - PullRequest
0 голосов
/ 07 мая 2019

Я хочу использовать Face API для обнаружения человека по фотографии с помощью octet-stream, и мне нужно вернуть идентификатор человека и записать его на этикетке, когда я нажму на кнопку. Функция MakeAnalysisRequest должна сохранить строку идентификатора лица в глобальной переменной, а затем записать ее в метку.

Я использую приложение WPF в Visual Studio.

Единственная проблема с этим кодом состоит в том, что при первом нажатии кнопки метка остается пустой. Но когда я нажимаю второй раз, идентификатор лица отображается на этикетке.

Я не знаю, почему это работает только при втором щелчке, наверное, потому, что эта функция асинхронная, но я не уверен.

Я пытался добавить задержку, вызвать функцию два раза с задержкой, но ничего из этого не помогло.

Глобальная переменная для faceID:

static string faceIDjson = null;

Мой запрос:

static async void MakeAnalysisRequest(string imageFilePath)
        {
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "SubKey...");
            string requestParameters = "returnFaceId=true";

            // Assemble the URI for the REST API Call.
            string uri = https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect?" + requestParameters;

            HttpResponseMessage response;

            // Request body. Posts a locally stored JPEG image.
            byte[] byteData = GetImageAsByteArray(imageFilePath);

            using (ByteArrayContent content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

                // Execute the REST API call.
                response = await client.PostAsync(uri, content);

                // Get the JSON response.
                var contentString = await response.Content.ReadAsStringAsync();
                dynamic jsonresponse = JsonConvert.DeserializeObject(contentString);
                faceIDjson = jsonresponse[0].faceId;

            }
        }

Функция загрузки фотографии с ПК в байтовый массив:

static byte[] GetImageAsByteArray(string imageFilePath)
        {
            using (FileStream fileStream =
                new FileStream(imageFilePath, FileMode.Open, FileAccess.Read))
            {
                BinaryReader binaryReader = new BinaryReader(fileStream);
                return binaryReader.ReadBytes((int)fileStream.Length);
            }
        }
 private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (File.Exists(path2))
            {
                try
                {
                    MakeAnalysisRequest(path2);
                    //System.Threading.Thread.Sleep(1000);
                    label1.Content = faceIDjson;
                }
                catch (Exception ex)
                {
                    label1.Content = ex.Message;
                }
            }
            else
            {
                label1.Content = "Invalid file path.";
            }
        }
...