我正在为 Windows 编写一个运行 CUDA 加速 HDR 算法的应用程序。我设置了一个外部图像信号处理器设备,该设备呈现为 UVC 设备,并通过 USB 3.0 向 Windows 计算机每秒传输 60 帧。
每个“偶数”帧都是曝光不足的帧,每个“奇数”帧都是曝光过度的帧,这允许我的 CUDA 代码执行修改后的 Mertens 曝光融合算法生成高质量、高动态范围图像。
Very abstract example of Mertens exposure fusion algorithm here
我唯一的问题是我不知道如何知道何时丢失帧,因为我在 Windows (Media Foundation) 上与之交互的唯一相机 API 无法做到这一点显然,我使用 IMFSourceReader::ReadSample 抓取的帧不是我上次抓取的帧之后收到的帧。
有什么方法可以保证我不会丢失帧,或者至少使用 Media Foundation 或 DirectShow 等 Windows 可用 API 轻松可靠地检测到丢失帧?
错过一帧然后必须有目的地“跳过”下一帧以便抓取下一个过采样或欠采样帧以与我们抓取的最后一帧配对,这并不是什么大问题,但我需要了解自上次抓取帧以来实际丢失了多少帧。
谢谢!
最佳答案
有IAMDroppedFrames::GetNumDropped method
在 DirectShow 中,很可能也可以通过 Media Foundation 检索它(从未尝试过 - 它们可以通过类似于 this 的方法获得)。
The
GetNumDropped
method retrieves the total number of frames that the filter has dropped since it started streaming.
但是我会质疑它的可靠性。原因是对于这两个 API,或多或少可靠的属性是帧的时间戳。捕获设备可以出于多种原因灵活降低帧速率,包括外部(如低光照条件)和内部(如管道下游的慢速阻塞处理)。这使得很难区分奇数帧和偶数帧,但时间戳仍然准确,并且您可以应用帧速率数学来转换为帧索引。
然而,在您的场景中,我宁愿检测帧时间中的大间隙,以识别可能的间隙和连续性损失,并从那里运行算法来比较接下来几个连续帧的曝光,以恢复与曝光不足/过度同步。听起来是一个更可靠的出路。毕竟,这种曝光问题很可能与您所使用的硬件有关。
关于c++ - 如何使用 Media Foundation 或 DirectShow 等 Windows 媒体 API 检测相机帧丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59886168/