我正在将 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 和覆盖。