使用 HeadPose 屬性
在本指南中,您將了解如何使用偵測到的臉部 HeadPose 屬性來啟用一些主要案例。
重要
臉部屬性是透過使用統計演算法進行預測。 結果可能不一定正確。 當您根據屬性資料進行決策時,請特別小心。 請避免使用這些屬性進行反詐騙。 相反地,我們建議使用臉部活動偵測。 如需詳細資訊,請參閱教學課程:偵測臉部的活動。
旋轉臉部矩形
臉部矩形會連同每個偵測到的臉部一起傳回,並標示影像中臉部的位置和大小。 根據預設,矩形一律會與影像對齊 (其側邊會以垂直和水平呈現);這時,非正臉可能會難以框出。 如果您想要以程式設計方式裁切影像中的臉部,最好能夠旋轉矩形以進行裁剪。
Azure AI 臉部 WPF (Windows Presentation Foundation) 範例應用程式會使用 HeadPose 屬性來旋轉其偵測到的臉部矩形。
探討範例程式碼
您可以使用 HeadPose 屬性,以程式設計方式旋轉臉部矩形。 如果您在偵測臉部時指定此屬性 (請參閱呼叫偵測 API),稍後您將能夠進行查詢。 Azure AI 臉部 WPF 應用程式的下列方法會取得 FaceDetectionResult 物件的清單,並傳回臉部物件清單。 此處的臉部是一個用來儲存臉部資料的自訂類別,包括更新的矩形座標。 系統會計算上、左、寬和高的新值,且新的欄位 FaceAngle 會指定旋轉值。
/// <summary>
/// Calculate the rendering face rectangle
/// </summary>
/// <param name="faces">Detected face from service</param>
/// <param name="maxSize">Image rendering size</param>
/// <param name="imageInfo">Image width and height</param>
/// <returns>Face structure for rendering</returns>
public static IEnumerable<Face> CalculateFaceRectangleForRendering(IList<FaceDetectionResult> faces, int maxSize, Tuple<int, int> imageInfo)
{
var imageWidth = imageInfo.Item1;
var imageHeight = imageInfo.Item2;
var ratio = (float)imageWidth / imageHeight;
int uiWidth = 0;
int uiHeight = 0;
if (ratio > 1.0)
{
uiWidth = maxSize;
uiHeight = (int)(maxSize / ratio);
}
else
{
uiHeight = maxSize;
uiWidth = (int)(ratio * uiHeight);
}
var uiXOffset = (maxSize - uiWidth) / 2;
var uiYOffset = (maxSize - uiHeight) / 2;
var scale = (float)uiWidth / imageWidth;
foreach (var face in faces)
{
var left = (int)(face.FaceRectangle.Left * scale + uiXOffset);
var top = (int)(face.FaceRectangle.Top * scale + uiYOffset);
// Angle of face rectangles, default value is 0 (not rotated).
double faceAngle = 0;
// If head pose attributes have been obtained, re-calculate the left & top (X & Y) positions.
if (face.FaceAttributes?.HeadPose != null)
{
// Head pose's roll value acts directly as the face angle.
faceAngle = face.FaceAttributes.HeadPose.Roll;
var angleToPi = Math.Abs((faceAngle / 180) * Math.PI);
// _____ | / \ |
// |____| => |/ /|
// | \ / |
// Re-calculate the face rectangle's left & top (X & Y) positions.
var newLeft = face.FaceRectangle.Left +
face.FaceRectangle.Width / 2 -
(face.FaceRectangle.Width * Math.Sin(angleToPi) + face.FaceRectangle.Height * Math.Cos(angleToPi)) / 2;
var newTop = face.FaceRectangle.Top +
face.FaceRectangle.Height / 2 -
(face.FaceRectangle.Height * Math.Sin(angleToPi) + face.FaceRectangle.Width * Math.Cos(angleToPi)) / 2;
left = (int)(newLeft * scale + uiXOffset);
top = (int)(newTop * scale + uiYOffset);
}
yield return new Face()
{
FaceId = face.FaceId?.ToString(),
Left = left,
Top = top,
OriginalLeft = (int)(face.FaceRectangle.Left * scale + uiXOffset),
OriginalTop = (int)(face.FaceRectangle.Top * scale + uiYOffset),
Height = (int)(face.FaceRectangle.Height * scale),
Width = (int)(face.FaceRectangle.Width * scale),
FaceAngle = faceAngle,
};
}
}
顯示更新的矩形
在此,您可以在顯示中使用傳回的臉部物件。 FaceDetectionPage.xaml 中的以下幾行說明如何從這項資料轉譯新的矩形:
<DataTemplate>
<Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="#FF26B8F4" StrokeThickness="1">
<Rectangle.LayoutTransform>
<RotateTransform Angle="{Binding FaceAngle}"/>
</Rectangle.LayoutTransform>
</Rectangle>
</DataTemplate>
下一步
- 如需旋轉臉部矩形的實用範例,請參閱 GitHub 上的 Azure AI 臉部 WPF 應用程式。