Захват видеокадра без сохранения изображения для использования Microsoft Face API - PullRequest
0 голосов
/ 11 апреля 2019

Я делаю проект CW UWP, который использует веб-камеру и делает снимок каждый раз, когда видит лицо.Это изображение сохраняется в папке «Изображение», перезаписывая предыдущее, а затем используется в Microsoft Face API.Сейчас я пытаюсь вместо того, чтобы сохранить изображение в папке «Изображение», я хотел получить фрейм и использовать его при вызове API.

Уже искал кучу вещей, но не нашел ничего особенного, нашел какой-то сторонний класс FrameGrabber, но не очень хорошо понимал, как с ним работать, и не нашел никакой полезной документации дляпомогите мне с этим.

Интересно, есть ли у кого-нибудь идеи, как это сделать, и если да, можете ли вы предоставить мне какую-либо документацию или что-нибудь, что может помочь мне в этом.

Заранее спасибо.

1 Ответ

0 голосов
/ 12 апреля 2019

Захват видеокадра без сохранения изображения для использования Microsoft Face API

Можно сослаться на CameraGetPreviewFrame официальный пример кода.Используется CaptureElement для отображения рамки предварительного просмотра камеры.Вы можете получить экземпляр SoftwareBitmap из _mediaCapture напрямую.Затем передайте этот SoftwareBitmap в Microsoft Face API.

private async Task GetPreviewFrameAsSoftwareBitmapAsync()
{
    // Get information about the preview
    var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;

    // Create the video frame to request a SoftwareBitmap preview frame
    var videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);

    // Capture the preview frame
    using (var currentFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame))
    {
        // Collect the resulting frame
        SoftwareBitmap previewFrame = currentFrame.SoftwareBitmap;

        // Show the frame information
        FrameInfoTextBlock.Text = String.Format("{0}x{1} {2}", previewFrame.PixelWidth, previewFrame.PixelHeight, previewFrame.BitmapPixelFormat);

        // Add a simple green filter effect to the SoftwareBitmap
        if (GreenEffectCheckBox.IsChecked == true)
        {
            ApplyGreenFilter(previewFrame);
        }

        // Show the frame (as is, no rotation is being applied)
        if (ShowFrameCheckBox.IsChecked == true)
        {
            // Create a SoftwareBitmapSource to display the SoftwareBitmap to the user
            var sbSource = new SoftwareBitmapSource();
            await sbSource.SetBitmapAsync(previewFrame);

            // Display it in the Image control
            PreviewFrameImage.Source = sbSource;
        }

    }
}

Обновление Вы можете использовать следующий код для преобразования SoftwareBitmap в IRandomAccessStream, а затем передать его в API обнаружения лица.

private async Task<InMemoryRandomAccessStream> EncodedStream(SoftwareBitmap soft, Guid encoderId)
{

    using (var ms = new InMemoryRandomAccessStream())
    {
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(encoderId, ms);
        encoder.SetSoftwareBitmap(soft);

        try
        {
            await encoder.FlushAsync();
        }
        catch (Exception ex)
        {

        }

        return ms;
    }
}
...