我想使用Face API从使用八位字节流的照片中检测人,并且我需要返回人的ID并在单击按钮时将其写在标签中。 MakeAnalysisRequest函数应将面部ID的字符串保存到全局变量中,然后将其写入标签中。
我正在Visual Studio中使用WPF应用程序。
此代码的唯一问题是,当我第一次单击按钮时,标签保持空白。但是当我第二次单击时,面部ID显示在标签中。
我不知道为什么它只能在第二次点击时起作用,我想这是因为该函数是异步的,但是我不确定。
我尝试添加延迟,两次都延迟调用函数,但这无济于事。
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;
}
}
将照片从PC加载到字节数组的功能:
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.";
}
}