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ğini göreceğiz.

Yüz dikdörtgenini döndürme

Algılanan her yüzle birlikte döndürülen yüz dikdörtgeni, görüntüde 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 için verimsiz olabilir. Bir görüntüde yüzleri program aracılığıyla kırpmak istediğiniz durumlarda, kırpmak için dikdörtgeni döndürmek daha iyi olur.

Bilişsel Hizmetler Yüz Yüze 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 program aracılığıyla yüz dikdörtgenini döndürebilir. Yüzleri algılarken bu özniteliği belirtirsiniz (bkz. Algılama API'siniçağırma), daha sonra sorgularsınız. Bilişsel Hizmetler Yüz Dönüştürme WPF uygulamasından aşağıdaki yöntem DetectedFace nesnelerinin bir listesini alır ve Yüz nesnelerinin listesini döndürür. Burada yüz, güncelleştirilmiş dikdörtgen koordinatları dahil olmak üzere yüz verilerini depolar özel bir sınıftır. Üst, sol , genişlik ve yükseklik için yeni değerler hesaplanır ve FaceAngle döndürmeyi yeni bir alan 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, döndürülen Yüz Nesnelerini görüntüde kullanabilirsiniz. FaceDetectionPage.xaml'den aşağıdaki satırlar, yeni dikdörtgenin bu verilerden nasıl iş olduğunu gösterir:

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

Baş hareketlerini algılama

HeadPose değişikliklerini gerçek zamanlı olarak takip edersiniz. Bu özelliği özel bir canlılık algılayıcısı olarak kullanabilirsiniz.

Canlılık algılama, bir öznenin görüntü veya video gösterimi değil gerçek bir kişi olduğunu belirleme görevidir. Baş hareket algılayıcısı, canlılığı doğrulamanın bir yolu olarak, özellikle de bir kişinin görüntü temsili yerine hizmet edebilir.

Dikkat

Baş hareketlerini gerçek zamanlı olarak algılamak için Yüksek oranda (saniye başına birden fazla) Yüz Tanıma API'sini çağırmalısınız. Ücretsiz katman (f0) aboneliğiniz varsa bu mümkün olmayacaktır. Ücretli katman aboneliğiniz varsa, baş hareketi algılama için hızlı API çağrıları yapma maliyetlerini hesaplanmış olduğundan emin olun.

Baş hareketi algılamanın çalışma örneği için GitHub Yüz Baş Üste Örneği'ne bakın.

Sonraki adımlar

Döndürülmüş yüz dikdörtgenlerinin çalışma örneği için GitHub Bilişsel Hizmetler Yüz WpF uygulamasına bakın. Veya baş hareketlerini algılamak için HeadPose özniteliğini gerçek zamanlı olarak takip etmek için Yüz Baş Üste Örneği uygulamasına bakın.