HeadPose özniteliğini kullanma

Bu kılavuzda, bazı önemli senaryoları etkinleştirmek için algılanan bir yüzün HeadPose özniteliğini nasıl kullanabileceğinizi göreceksiniz.

Önemli

Yüz tanıma öznitelikleri, istatistiksel algoritmaların kullanımıyla tahmin edilir. Her zaman doğru olmayabilirler. Öznitelik verilerine dayalı kararlar alırken dikkatli olun. Kimlik sahtekarlığına karşı bu öznitelikleri kullanmaktan lütfen kaçının. Bunun yerine Yüz Canlılığı algılamayı kullanmanızı öneririz. Daha fazla bilgi için lütfen Öğretici: Yüzlerdeki canlılığı algılama bölümüne bakın.

Yüz dikdörtgenini döndürme

Algılanan her yüzle döndürülen yüz dikdörtgeni, görüntüdeki yüzün konumunu ve boyutunu işaretler. Varsayılan olarak, dikdörtgen her zaman görüntüyle hizalanır (kenarları dikey ve yataydır); bu, açılı yüzleri çerçeveleme açısından verimsiz olabilir. Bir görüntüdeki yüzleri program aracılığıyla kırpmak istediğiniz durumlarda, kırpmak için dikdörtgeni döndürmek daha iyidir.

Azure AI Yüz Tanıma WPF (Windows Presentation Foundation) örnek uygulaması algılanan yüz dikdörtgenlerini döndürmek için HeadPose özniteliğini kullanır.

Örnek kodu keşfetme

HeadPose özniteliğini kullanarak yüz dikdörtgenini program aracılığıyla döndürebilirsiniz. Yüzleri algılarken bu özniteliği belirtirseniz (bkz . Algılama API'sini çağırma), daha sonra sorgulayabilirsiniz. Azure AI Yüz Tanıma WPF uygulamasından aşağıdaki yöntem DetectedFace nesnelerinin listesini alır ve Yüz Tanıma nesnelerinin listesini döndürür. Burada yüz tanıma , güncelleştirilmiş dikdörtgen koordinatları da dahil olmak üzere yüz verilerini depolayan özel bir sınıftır. Üst, sol, genişlik ve yükseklik için yeni değerler hesaplanır ve FaceAngle yeni bir alan döndürmeyi belirtir.

/// <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<DetectedFace> 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,
        };
    }
}

Güncelleştirilmiş dikdörtgeni görüntüleme

Buradan, ekranınızda döndürülen Yüz Tanıma nesnelerini kullanabilirsiniz. FaceDetectionPage.xaml dosyasındaki aşağıdaki satırlar, yeni dikdörtgenin bu verilerden nasıl işlendiğini gösterir:

 <DataTemplate>
    <Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="#FF26B8F4" StrokeThickness="1">
        <Rectangle.LayoutTransform>
            <RotateTransform Angle="{Binding FaceAngle}"/>
        </Rectangle.LayoutTransform>
    </Rectangle>
</DataTemplate>

Sonraki adımlar