基于从两个不同线程获取的时间戳匹配图像

时间:2012-04-13 20:28:53

标签: c++ multithreading opencv

对于我正在研究的项目,我使用两个不同的线程来使用Opencv和C ++从Windows系统上的不同硬件获取图像。出于本文的目的,我们将其称为camera1和camera2。由于帧速率不同,我无法同时捕获同一线程上的camera1和camera2,或者尝试一次捕获一个图像。相反,我为两个摄像头设置了缓冲区。 Camera1的运行速度是camera2的帧速率的两倍。

第三个线程从camera2获取一个帧,并尝试将其与camera1在最近的时间点拍摄的图像进行匹配。我遇到的问题是我无法找到一种方法来将图像从一个源匹配到在另一个源中大致同时获取的图像。

是否有一种为这些图像分配时间戳的方法,这些方法在不高优先级的单独线程中使用时是否准确?如果没有,是否有另一种设计方法更适合这样的系统。

我很难找到任何关于在Windows中跟踪时间的方法的信息,例如clock()和queryperformancecounter在不同CPUS的不同线程中使用时。我已经读过它们在单独的线程中使用时不准确,但是我以大约每秒20帧的速度获取帧,因此即使它们关闭,它也可能足够接近仍然可以正常工作。

提前谢谢!让我知道我是否应该清理或更好地解释。

修改

不幸的是,我认为没有办法从驱动程序或硬件中获取时间戳。我想我已经找到了一种方法,可以非常准确地确定相对于每个线程实际捕获图像的时间。我真的不知道如何处理的部分是如果我在两个在不同内核上执行的线程中使用clock()或类似的东西,时间戳可以有多远。如果我可以指望两个不同核心上的时间戳在彼此相差大约25ms之内,那将是理想的。我真的还没有找到一个很好的方法来衡量两者之间的差异。我已经做了一些更多的研究,看起来Windows API中的timeGetTime不会被单独的cpu核调用太多。我打算尝试一下。

1 个答案:

答案 0 :(得分:0)

要获得满意的答案,您需要先回答以下问题:

  • 图片需要匹配多近?
  • 您可以使用多少时间戳的抖动/错误?
  • 在捕获图像的那一刻和线程接收图像的时刻之间预期会有多长的延迟,并且可以给它加时间戳?
  • 两台相机的延迟预计大致相同吗?

如果你有一个基本上静态的场景,那么你可以使用比你有一个非常动态的场景更高的时间戳抖动和延迟。

clock()的精度不会成为时间戳错误的主要因素 - 毕竟,你应该关心相对错误(两个线程之间的时间戳有多接近),而不是绝对错误(如何关闭时间戳是真正的原子时间。)

另一方面,硬件和线程之间的延迟,尤其是延迟抖动,将导致时间戳中的大部分错误。如果您能找到一种方法来获取硬件或至少在驱动程序中的时间戳,那么它将大大提高时间戳的准确性。