当我通过'cvQueryFrame'使用openCV捕获投影模式的相机图像时,我经常会得到一个意想不到的伪影:投影仪的扫描线。也就是说,由于我无法精确计时“cvQueryFrame”捕获图像的时间,因此拍摄的图像不尊重投影仪的恒定 30Hz 刷新。结果是那些将摄像机转向电视屏幕的人所熟悉的典型水平带。
除了求助于硬件同步之外,有没有人在 openCV 中通过近似(例如,“足够好”)非正式的投影仪 - 相机同步取得了一些成功?
以下是我正在考虑的两个解决方案,但希望这是一个足够普遍的问题,可能存在一个优雅的解决方案。我不太优雅的想法是:
在显示视频的 cvWindow 中添加一个滑块控件,供用户控制从 0 到 1/30 秒的时间偏移,然后在此间隔设置一个队列计时器。每当需要一个帧时,而不是直接调用“cvQueryFrame”,我会请求回调以在下次触发计时器时执行“cvQueryFrame”。这样,理论上用户可以使用滑块来减少扫描线伪影,前提是定时器分辨率足够。
通过“cvQueryFrame”接收帧后,通过查找垂直像素列的 HSV 值中的增量来检查帧的水平带。当然,这仅在被拍摄对象在平滑变化的照明下包含均匀颜色的基准条时才有效。
我使用了几台带有 OpenCV 的相机,最近的是佳能 SLR (7D)。