2012-04-13 71 views
2

对于我正在开发的项目,我使用两个不同的线程来使用Opencv和C++从Windows系统上的不同硬件获取图像。为了本文的目的,我们将它们称为camera1和camera2。由于帧速率不同,我无法在同一个线程上同时从camera1和camera2中捕获这两个帧,也无法一次捕获一个图像。相反,我为两台摄像机都设置了缓冲区。 Camera1的运行速度是camera2的两倍以上。基于从两个不同线程获取的时间戳匹配图像

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

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

我很难找到任何有关在不同的CPUS上使用不同线程的时间(如clock()和queryperformancecounter)跟踪时间的方法有多远的信息。我已经读过,它们在单独的线程中使用时不准确,但我以大约每秒20帧的速度获取帧,所以即使它们关闭,它也可能足够接近以保持良好工作。

预先感谢您!让我知道,如果我应该清除任何事情或更好地解释。

编辑:

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

回答

0

为了得到一个满意的答案,你需要先回答以下问题:

  • 如何做密切的图像需要匹配?
  • 您可以忍受多少时间戳中的抖动/错误?
  • 在图像被捕获的那一刻到你的线程接收到它的时间并且可以给它加上时间标记的时候,你预期会有多少延迟?
  • 两台摄像机的延迟预计会大致相同吗?

如果你有一个大多是静态的场景,那么你可以忍受更高的时间戳抖动和延迟,如果你有一个非常动态的场景。

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

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