2

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

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

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

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

先感谢您!让我知道我是否应该澄清任何事情或更好地解释。

编辑:

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

4

1 回答 1

0

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

  • 图像需要匹配多近?
  • 您可以忍受多少时间戳的抖动/错误?
  • 从图像被捕获到你的线程接收到图像并可以时间戳之间,你期望有多少延迟?
  • 两个摄像头的延迟预期是否大致相同?

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

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

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

于 2012-04-13T22:18:51.943 回答