问题描述
我将 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 和叠加层。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)