2

私が取り組んでいるプロジェクトでは、2 つの異なるスレッドを使用して、Opencv と C++ を使用して Windows システム上の異なるハードウェアから画像を取得しています。この記事では、カメラ 1 とカメラ 2 と呼びます。フレームレートが異なるため、同じスレッドで camera1 と camera2 の両方からキャプチャしたり、一度に 1 つの画像をキャプチャしようとしたりすることはできません。代わりに、両方のカメラにバッファを設定しました。Camera1 は、camera2 の 2 倍以上のフレーム レートで動作します。

3 番目のスレッドは、カメラ 2 からフレームを取得し、それを最も近い時点でカメラ 1 によって撮影された画像と一致させようとします。私が抱えている問題は、あるソースからの画像を、他のソースでほぼ同時に取得された画像に一致させる良い方法が見つからないことです。

優先度が高くない別のスレッドで使用する場合に正確なタイムスタンプをこれらの画像に割り当てる方法はありますか? そうでない場合、このようなシステムにより適した別の設計方法はありますか。

clock() や queryperformancecounter などの Windows で時間を追跡する方法が、異なる CPU の別々のスレッドで使用された場合にどの程度離れているかについての情報を見つけるのに苦労しました。別々のスレッドで使用すると正確ではないことを読みましたが、毎秒約 20 フレームでフレームを取得しているため、オフであっても十分に近い可能性があります。

前もって感謝します!何かを明確にする必要があるか、より適切に説明する必要があるかどうか教えてください。

編集:

残念ながら、ドライバーやハードウェアからタイムスタンプを取得する方法はないと思います。ただし、各スレッドに対して画像が実際にキャプチャされた時期をかなり正確に判断する方法を見つけたと思います。対処方法がよくわからない部分は、別々のコアで実行されている 2 つのスレッドで clock() または同様のものを使用すると、タイムスタンプがどれだけずれるかということです。2 つの異なるコアのタイム スタンプが互いに約 25 ミリ秒以内であると期待できれば、それが理想的です。2つの違いを測定する良い方法を実際に理解することができませんでした. さらに調査を行ったところ、Windows API の timeGetTime は、別の CPU コアから呼び出されてもあまり影響を受けないようです。私はそれを試してみるつもりです。

4

1 に答える 1

0

満足のいく回答を得るには、まず次の質問に答える必要があります。

  • 画像はどれくらい一致する必要がありますか?
  • タイムスタンプのジッター/エラーはどれくらい許容できますか?
  • 画像がキャプチャされた瞬間から、スレッドがそれを受け取り、タイムスタンプを付けることができる瞬間までに、どれくらいの待ち時間が予想されますか?
  • レイテンシは両方のカメラでほぼ同じであると予想されますか?

ほとんどが静的なシーンの場合、非常に動的なシーンの場合よりも、タイムスタンプのジッタとレイテンシが大きくなる可能性があります。

の精度は、clock()タイムスタンプ エラーの主な要因にはなりません。結局のところ、絶対エラー (タイムスタンプが真のアトミックにどれだけ近いか) ではなく、相対エラー (2 つのスレッド間のタイムスタンプがどれだけ近いか) に注意する必要があります。時間)。

一方、ハードウェアとスレッド間のレイテンシー、特にレイテンシーのジッターは、タイムスタンプのエラーの大部分を引き起こします。ハードウェアまたは少なくともドライバーでタイムスタンプを取得する方法を見つけることができれば、タイムスタンプの精度を向上させるのに大いに役立ちます。

于 2012-04-13T22:18:51.943 に答える