2

当我通过'cvQueryFrame'使用openCV捕获投影模式的相机图像时,我经常会得到一个意想不到的伪影:投影仪的扫描线。也就是说,由于我无法精确计时“cvQueryFrame”捕获图像的时间,因此拍摄的图像不尊重投影仪的恒定 30Hz 刷新。结果是那些将摄像机转向电视屏幕的人所熟悉的典型水平带。

除了求助于硬件同步之外,有没有人在 openCV 中通过近似(例如,“足够好”)非正式的投影仪 - 相机同步取得了一些成功?

以下是我正在考虑的两个解决方案,但希望这是一个足够普遍的问题,可能存在一个优雅的解决方案。我不太优雅的想法是:

  • 在显示视频的 cvWindow 中添加一个滑块控件,供用户控制从 0 到 1/30 秒的时间偏移,然后在此间隔设置一个队列计时器。每当需要一个帧时,而不是直接调用“cvQueryFrame”,我会请求回调以在下次触发计时器时执行“cvQueryFrame”。这样,理论上用户可以使用滑块来减少扫描线伪影,前提是定时器分辨率足够。

  • 通过“cvQueryFrame”接收帧后,通过查找垂直像素列的 HSV 值中的增量来检查帧的水平带。当然,这仅在被拍摄对象在平滑变化的照明下包含均匀颜色的基准条时才有效。

我使用了几台带有 OpenCV 的相机,最近的是佳能 SLR (7D)。

4

2 回答 2

2

我认为您提出的解决方案不会奏效。cvQueryFrame 基本上从相机驱动程序的缓冲区复制下一个可用帧(或根据您的驱动程序实现在内存映射区域中推进一个指针,或者等等)。

在任何情况下,调用 cvQueryFrame 的时间都不会影响捕获图像的时间。

因此,正如您所建议的,硬件同步确实是唯一的途径,除非您有一个特殊的相机,例如点灰色相机,它可以让您对帧集成开始触发器进行明确的软件控制。

于 2011-10-21T22:15:37.223 回答
1

我知道这与同步无关,但是您是否尝试过延长曝光时间?或者通过故意将两个或多个图像“混合”成一个来做到这一点?

于 2011-05-01T06:01:25.100 回答