Как обнаружить потерю кадра камеры с помощью Windows медиа API, таких как Media Foundation или DirectShow? - PullRequest
2 голосов
/ 23 января 2020

Я пишу приложение для Windows, которое запускает ускоренный алгоритм CUDA HDR. Я настроил внешнее устройство обработки сигналов изображения, которое представляет собой устройство UV C и передает 60 кадров в секунду на машину Windows через USB 3.0.

Каждый «четный» кадр является больше недоэкспонированный кадр, и каждый «нечетный» кадр является более переэкспонированным кадром, что позволяет моему коду CUDA выполнять модифицированный Mertens алгоритм слияния экспозиции для генерации высокого качество изображения с высоким динамическим диапазоном c.

Очень абстрактный пример алгоритма слияния экспозиции Мертенса здесь

Моя единственная проблема в том, что я не знаю как узнать, когда я пропускаю кадры , поскольку единственный API камеры, с которым я взаимодействовал на Windows (Media Foundation), не дает понять, что кадр, который я беру с IMFSourceReader::ReadSample, не является кадром, который был получен после последнего, который я захватил.

Можно ли как-нибудь гарантировать, что я не пропущу кадры, или, по крайней мере, легко и надежно определить, когда у меня есть, используя Windows доступный API, такой как Media Foundation или DirectShow ?

Было бы не так сложно пропустить кадр, а затем целенаправленно «пропустить» следующий кадр, чтобы захватить следующий кадр с избыточной или недостаточной выборкой для сопряжения с ним. последний кадр, который мы захватили, но мне нужно знать, сколько кадров было фактически пропущено с момента последнего захвата кадра.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 24 января 2020

В DirectShow есть IAMDroppedFrames::GetNumDropped method, и есть вероятность, что его также можно получить через Media Foundation (никогда не пытались - их можно получить с помощью метода, аналогичного this ) .

Метод GetNumDropped возвращает общее количество кадров, которые фильтр отбросил с момента начала потоковой передачи.

Однако я бы поставил под сомнение его надежность. Причина в том, что с этими обоими API более или менее надежным атрибутом является отметка времени кадра. Устройства захвата могут гибко снижать частоту кадров по нескольким причинам, включая как внешнюю, например, в условиях низкой освещенности, так и внутреннюю, например, обработку медленной блокировки вниз по потоку в конвейере. Это затрудняет различие guish между нечетными и четными кадрами, но отметка времени остается точной, и вы можете применить математическую частоту кадров для преобразования в индексы кадров.

В вашем сценарии я, однако, скорее обнаружу большие промежутки во временах кадра, чтобы идентифицировать возможный разрыв и потерю непрерывности, и оттуда запустить алгоритм, который сравнивает экспозицию в следующих нескольких последовательных кадрах, чтобы вернуться к syn c с недостаточным / переэкспонированием. Звучит как более надежный выход.

После всего этого, вероятно, проблема экспозиции будет в значительной степени указывать c на используемое вами оборудование.

0 голосов
/ 24 января 2020

Обычно MFSampleExtension_Discontinuity здесь для этого. Когда вы используете IMFSourceReader :: ReadSample, отметьте это.

...