【问题标题】:Face Detection in UWPUWP 中的人脸检测
【发布时间】:2021-07-25 17:31:22
【问题描述】:

我正在尝试使用 Microsoft 在official documentation page 上提供的示例代码(人脸检测)。

我正在尝试开发一个识别视频格式人脸的 UWP 应用程序。


问题

源代码中似乎不存在某些方法,IDE 将它们标记为

Cannot resolve symbol 'GetLatestFrame'

Cannot resolve symbol 'ProcessNextFrameAsync'

Cannot resolve symbol 'SetupVisualization'


源代码

using System;
using System.Collections.Generic;
using System.Threading;
using Windows.Foundation;
using Windows.Graphics.Imaging;
using Windows.Media;
using Windows.Media.FaceAnalysis;
using Windows.System.Threading;
using Windows.UI.Xaml.Controls;

// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409

namespace Network
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class Network : Page
    {

        private IAsyncOperation<FaceTracker> faceTracker;
        private ThreadPoolTimer frameProcessingTimer;
        private SemaphoreSlim frameProcessingSemaphore = new SemaphoreSlim(1);

        public Network()
        {
            this.InitializeComponent();

            this.faceTracker = FaceTracker.CreateAsync();
            TimeSpan timerInterval = TimeSpan.FromMilliseconds(66); // 15 fps
            this.frameProcessingTimer = Windows.System.Threading.ThreadPoolTimer.CreatePeriodicTimer(new Windows.System.Threading.TimerElapsedHandler(ProcessCurrentVideoFrame), timerInterval);


        }

        public async void ProcessCurrentVideoFrame(ThreadPoolTimer timer)
        {
            if (!frameProcessingSemaphore.Wait(0))
            {
                return;
            }

            VideoFrame currentFrame = await GetLatestFrame();

            // Use FaceDetector.GetSupportedBitmapPixelFormats and IsBitmapPixelFormatSupported to dynamically
            // determine supported formats
            const BitmapPixelFormat faceDetectionPixelFormat = BitmapPixelFormat.Nv12;

            if (currentFrame.SoftwareBitmap.BitmapPixelFormat != faceDetectionPixelFormat)
            {
                return;
            }

            try
            {
                IList<DetectedFace> detectedFaces = await faceTracker.ProcessNextFrameAsync(currentFrame);

                var previewFrameSize = new Windows.Foundation.Size(currentFrame.SoftwareBitmap.PixelWidth, currentFrame.SoftwareBitmap.PixelHeight);
                var ignored = this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    this.SetupVisualization(previewFrameSize, detectedFaces);
                });
            }
            catch (Exception e)
            {
                // Face tracking failed
            }
            finally
            {
                frameProcessingSemaphore.Release();
            }

            currentFrame.Dispose();
        }

    }
}

问题

我是否错过了添加documentation page 上提供的方法?

我需要手动添加方法吗?我需要创建另一个类吗?

【问题讨论】:

    标签: c# xaml uwp-xaml face-detection face


    【解决方案1】:

    GetLatestFrame()和SetupVisualization()是自定义方法,GetLatestFrame()用于获取视频帧。您可以参考this从媒体捕获预览流中获取帧。

    SetupVisualization() 使用框架尺寸和面部结果创建可视化。

      private void SetupVisualization(Windows.Foundation.Size framePixelSize, IList<DetectedFace> foundFaces)
        {
            this.VisualizationCanvas.Children.Clear();
    
            if (this.currentState == ScenarioState.Streaming && framePixelSize.Width != 0.0 && framePixelSize.Height != 0.0)
            {
                double widthScale = this.VisualizationCanvas.ActualWidth / framePixelSize.Width;
                double heightScale = this.VisualizationCanvas.ActualHeight / framePixelSize.Height;
    
                foreach (DetectedFace face in foundFaces)
                {
                    // Create a rectangle element for displaying the face box but since we're using a Canvas
                    // we must scale the rectangles according to the frames's actual size.
                    Rectangle box = new Rectangle()
                    {
                        Width = face.FaceBox.Width * widthScale,
                        Height = face.FaceBox.Height * heightScale,
                        Margin = new Thickness(face.FaceBox.X * widthScale, face.FaceBox.Y * heightScale, 0, 0),
                        Style = HighlightedFaceBoxStyle
                    };
                    this.VisualizationCanvas.Children.Add(box);
                }
            }
        }
    

    ProcessNextFrameAsync()是Windows.Media.FaceAnalysis命名空间下的方法,它异步处理一个视频帧进行人脸检测。

    推荐使用BasicFaceDetection做人脸检测,官方样例,大家可以试试。

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 2019-11-18
      • 2013-09-24
      • 1970-01-01
      • 2019-12-01
      • 2013-07-16
      • 1970-01-01
      • 2012-03-08
      • 2012-10-25
      相关资源
      最近更新 更多