UWP中的人脸检测



我正在尝试使用Microsoft在官方文档页面上提供的示例代码(人脸检测(。

我正在尝试开发一个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();
}
}
}

问题

我是否错过了添加文档页面上提供的方法?

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

GetLatestFrame()SetupVisualization()是自定义方法,GetLatestFrame()用于获取视频帧。你可以引用这个来从媒体捕捉预览流中获取帧。

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进行人脸检测,这是官方样本,你可以尝试一下

相关内容

  • 没有找到相关文章

最新更新