分享方式:


使用 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 應用程式。