0

我正在将 MediaCapture API 用于视频录制应用程序。

其中一部分是使用矩形进行人脸检测,但我希望它出现在捕获流中,而不仅仅是预览流。

即使我在添加效果时将 VideoRecord 指定为 MediaStreamType,矩形也不会出现在最终结果视频中,这是我的目标。

var definition = new FaceDetectionEffectDefinition
 {
    SynchronousDetectionEnabled = false,
    DetectionMode = FaceDetectionMode.HighPerformance
};

try
{
    faceDetectionEffect = (FaceDetectionEffect)await mediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoRecord);
}
catch (Exception exception)
{
    // Error message
    return;
}
faceDetectionEffect.FaceDetected += FaceDetectionEffect_FaceDetected;
faceDetectionEffect.DesiredDetectionInterval = TimeSpan.FromMilliseconds(33);
faceDetectionEffect.Enabled = true;

关于如何使人脸检测和跟踪出现在捕获流或最终结果视频中的任何建议?

谢谢!

====================================

基本上,我希望人脸检测和跟踪出现在 CaptureElement 中,以便可以在最终视频中完成身份隐藏(使用跟踪用户面部的图像来隐藏用户的面部)。

我的代码借鉴了 Windows 通用示例:https ://github.com/microsoft/Windows-universal-samples

有一个 CaptureElement,用于渲染来自相机的视频流。为了绘制检测到的人脸的矩形,使用了 Canvas。

<CaptureElement Name="PreviewControl"                            
                            Opacity="0.8"
                            Stretch="Fill"
                            IsDoubleTapEnabled="True" />

<Canvas>
    <Canvas Name="FacesCanvas"
        RenderTransformOrigin="0.5,0.5" />
                </Canvas>

这就是将 FaceDetectionEffectDefinition 添加到 MediaCapture 对象的方式,以及添加 FaceDetectionEffect 的方式......

private async Task CreateFaceDetectionEffectAsync()
{
    var definition = new FaceDetectionEffectDefinition
    {
            SynchronousDetectionEnabled = false,
            DetectionMode = FaceDetectionMode.HighPerformance
    };
    try
    {
            faceDetectionEffect = (FaceDetectionEffect)await mediaCapture.AddVideoEffectAsync(definition,       MediaStreamType.VideoRecord);
    }
    catch (Exception exception)
    {
            //exception.Message.ToString()
            return;
    }
    faceDetectionEffect.FaceDetected += FaceDetectionEffect_FaceDetected;
    faceDetectionEffect.DesiredDetectionInterval = TimeSpan.FromMilliseconds(33);
    faceDetectionEffect.Enabled = true;
}

FaceDetectionEffect 事件中发生了什么...

private async void FaceDetectionEffect_FaceDetected(FaceDetectionEffect sender, FaceDetectedEventArgs args)
{
    await MainPage.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => HighlightDetectedFaces(args.ResultFrame.DetectedFaces));
}

private void HighlightDetectedFaces(IReadOnlyList<DetectedFace> faces)
{
    facesCanvas.Children.Clear();
    if (softwareBitmapSource == null)
        return;

                for (int i = 0; i < faces.Count; i++)
                {
                    Rectangle faceBoundingBox = ConvertPreviewToUiRectangle(faces[i].FaceBox);                
                    faceBoundingBox.Fill = new ImageBrush
                    {
                            ImageSource = softwareBitmapSource
                    };                
                    facesCanvas.Children.Add(faceBoundingBox);
                }               
}

MediaCapture 对象被初始化,并在开始时设置为 CaptureElement 的源...

(部分代码,例如为 VideoPreview 和 VideoRecord 指定媒体流类型,如果不相同,已省略。)

MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings { VideoDeviceId = preferredCamera.Id, AudioDeviceId = preferredMicrophone.Id };

await mediaCapture.InitializeAsync(settings);

PreviewControl.Source = mediaCapture;

希望有一种更简单的技术,而不必求助于使用 MediaComposition 和覆盖。

4

1 回答 1

1

您可能需要创建视频效果才能将检测到的面部矩形添加为视频捕获的一部分。这将允许访问每个媒体样本中的原始位图数据,然后您可以在其中绘制您需要的任何内容。

FaceDetector可能比FaceTracker更好,但你会失去后者的预测性。您可以尝试参考可能有帮助的文档。

于 2021-03-16T06:10:36.127 回答