Не удается заставить класс FaceTracker работать на HoloLens 2 - PullRequest
0 голосов
/ 09 июля 2020

Мне не удается настроить FaceTracker Class на HoloLens 2. Как только я пытаюсь определить лица с помощью ProcessNextFrameAsync Method, я получаю исключение следующего вида:

System.Runtime.InteropServices.COMException (0x80004005): Unspecified error

Это только первая часть сообщения об ошибке, если требуется дополнительная информация, я могу добавить это.

См. Здесь минимальный пример.

public async void Start()
{
    var selectedGroup = await FindCameraAsync();
    await StartMediaCaptureAsync(selectedGroup);
}
private async Task StartMediaCaptureAsync(MediaFrameSourceGroup sourceGroup)
{
    faceTracker = await FaceTracker.CreateAsync();
    this.mediaCapture = new MediaCapture();
    await this.mediaCapture.InitializeAsync(settings);
    this.frameProcessingTimer = ThreadPoolTimer.CreatePeriodicTimer(ProcessCurrentVideoFrameAsync, timerInterval);
}
private async Task ProcessCurrentVideoFrameAsync()
{
    const BitmapPixelFormat InputPixelFormat = BitmapPixelFormat.Nv12;
    var deviceController = this.mediaCapture.VideoDeviceController;
    this.videoProperties = deviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;
    VideoFrame videoFrame = new VideoFrame(InputPixelFormat, (int)this.videoProperties.Width (int)this.videoProperties.Height);

    IList<DetectedFace> detectedFaces;
    try
    {
        detectedFaces = await faceTracker.ProcessNextFrameAsync(videoFrame);
    }
    catch (Exception e)
    {
        System.Diagnostics.Debug.WriteLine($"Failed with Exception: {e.ToString()}");
        return;
    }

    videoFrame.Dispose();
}
  1. Я получаю подходящую камеру с MediaFrameSourceKind.Color и MediaStreamType.VideoPreview с FindCameraAsync(). Что, на мой взгляд, отлично работает.
  2. start MediaCapture и FaceTracker в пределах StartMediaCaptureAsync()
  3. пытается обнаружить лица в ProcessCurrentVideoFrameAsync()

Здесь это то, что я проверил, и полученная информация:

  • У меня есть изображение в формате Nv12, PixelWidth 1504 и PixelHeigt 846
  • разрешения в Unity предоставляются веб-камера, библиотека изображений и микрофон
  • приложение скомпилировано с Il2 CPP
  • сообщение No capture devices are available. появляется после запуска приложения. В других статьях упоминалось, что разрешение (веб-камера или микрофон) отсутствует, но это не так. Но, тем не менее, может быть подключен.
  • Я использовал Отслеживать лица в последовательности кадров и Бази c Образец отслеживания лиц в качестве ссылки

Я очень благодарен за каждый стимул и мысль.

ОБНОВЛЕНИЕ 14. Июль 2020 г.

Я только что попробовал FaceDetector на нескольких отдельных изображениях, которые хранились локально на HoloLens 2. Это прекрасно работает.

Хотя FaceDetector и FaceTracker не идентичны, они очень похожи. Итак, я предполагаю, что проблема как-то связана с MediaCapture.

Затем я попытаюсь захватить изображение с помощью MediaCapture и обработать его с помощью FaceDetector.

Если у кого-то есть А пока еще идей, я был бы благодарен их выслушать.

1 Ответ

1 голос
/ 14 июля 2020

Это официальный образец, демонстрирующий, как использовать класс FaceTracker для поиска человеческих лиц в видеопотоке: Basi c образец отслеживания лица . И в строке 256 это основной момент для получения кадра предварительного просмотра с устройства захвата.

Однако на основе вашего кода вы создали объект VideoFrame и указали свойства и формат, но вам не хватает вызова GetPreviewFrameAsync для преобразования встроенного кадра веб-камеры в объект VideoFrame.

Вы можете попробовать следующий код, чтобы исправить это:

private async Task ProcessCurrentVideoFrameAsync()
{
    const BitmapPixelFormat InputPixelFormat = BitmapPixelFormat.Nv12;
    var deviceController = this.mediaCapture.VideoDeviceController;
    this.videoProperties = deviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;
    VideoFrame videoFrame = new VideoFrame(InputPixelFormat, (int)this.videoProperties.Width (int)this.videoProperties.Height);

//add this line code.
    await this.mediaCapture.GetPreviewFrameAsync(videoFrame);
...