Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在捕获流中显示视频人脸检测?_C#_Uwp_Mediacapture - Fatal编程技术网

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

C# 是否可以在捕获流中显示视频人脸检测?,c#,uwp,mediacapture,C#,Uwp,Mediacapture,我正在将MediaCapture API用于视频录制应用程序 它的一部分是使用矩形进行人脸检测,但我希望它出现在捕获流中,而不仅仅是预览流中 即使我在添加效果时将VideoRecord指定为MediaStreamType,矩形也不会出现在最终结果视频中,这是我的目标 var definition = new FaceDetectionEffectDefinition { SynchronousDetectionEnabled = false, DetectionMode = F

我正在将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通用示例:

有一个CaptureElement,用于渲染来自摄影机的视频流。要绘制检测到的面的矩形,使用画布

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

<Canvas>
    <Canvas Name="FacesCanvas"
        RenderTransformOrigin="0.5,0.5" />
                </Canvas>
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);
                }               
}

希望有一种更简单的技术,而不必使用媒体合成和覆盖。

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


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

您能给我看一下有关该案例的更详细代码吗?谢谢您的回复,YanGu!我在原来的问题中加入了一些额外的代码,但是,可能没有必要。我的想法是处理每个视频帧以添加矩形效果,但这很难。另一种更简单的方法是在应用程序中使用Windows.Media.AppRecording命名空间录制具有矩形效果的视频,但这会降低视频清晰度。我们将尝试找到其他可用的方法。是的,我熟悉AppRecordingManager API,但它将录制限制在屏幕分辨率范围内。也许最好的解决方案是实时捕获数组中每个矩形的坐标,然后在预览之前在该位置将MediaOverlay添加到MediaComposition中。我同意你的看法。我们也在尝试解决方案,用一个矩形处理每一个视频帧,正如您所描述的。谢谢,用FaceDetector创建视频效果并将其添加到视频流中非常有意义。我做了前面评论中提到的变通方法,即捕获FaceTracker生成的坐标数据,然后使用这些坐标创建覆盖。它看起来不错,但视频效果方法更好。谢谢
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);
                }               
}
MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings { VideoDeviceId = preferredCamera.Id, AudioDeviceId = preferredMicrophone.Id };

await mediaCapture.InitializeAsync(settings);

PreviewControl.Source = mediaCapture;