Я хочу использовать 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.";
}
}