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