Я использую 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 и оверлеев.