是否可以在捕获流中显示视频人脸检测?

时间:2021-02-20 04:50:20

标签: c# uwp mediacapture

我将 MediaCapture API 用于视频录制应用。

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

即使我在添加效果时将 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 和叠加层。

1 个答案:

答案 0 :(得分:1)

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

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