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

Posted

技术标签:

【中文标题】基于从两个不同线程获取的时间戳匹配图像【英文标题】:Matching images based on timestamps acquired from two different threads 【发布时间】:2012-04-13 20:28:53 【问题描述】:

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

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

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

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

提前感谢您!让我知道我是否应该澄清或解释得更好。

编辑:

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

【问题讨论】:

【参考方案1】:

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

图像需要匹配多近? 您可以忍受多少时间戳/错误? 您预计从捕获图像到您的线程接收到图像并为其添加时间戳之间的延迟是多少? 预计两个摄像头的延迟是否大致相同?

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

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

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

【讨论】:

以上是关于基于从两个不同线程获取的时间戳匹配图像的主要内容,如果未能解决你的问题,请参考以下文章

Spark时间戳问题,时间戳相同但不匹配

如何从 DB2 中的两个时间戳中获取差异?

借助二分法匹配时间戳实现快速查找日志内容

基于最近时间戳连接两个表的 SQL 查询

在 Prometheus 中获取两个自定义时间戳之间的增量

BigQuery 根据最接近的时间戳和匹配值组合表