Raspberry Pi Camera-次のフレームの準備はいつですか


8

C ++raspicam apiなどのAPI を使用する場合は、grab()などのメソッドを使用してカメラをポーリングします。フレームの準備ができると、メソッドは戻ります。フレームをつかむことなくカメラの準備ができているかどうかを確認する方法はありますか?

これは、コマンドラインツール、C ++呼び出し、Pythonライブラリ、文字通り任意のメソッドにすることができます。

私は、4つのカメラを備えた4つのラズベリーピスを持っていて、各フレームを正確に同時にフレームごとにフレームビデオで撮りたいので、質問します。カメラは私のアプリケーションが他の方法でそれを行うのに十分な速度ではありません。

回答:


2

私はこの質問に答えることが最善であると思います。ただし、最初に注意しなければならないことがあります。私は想像力を伸ばしても、ファームウェアのエキスパートではありません。Piカメラモジュールがどのように機能するかについての私の大まかな理解は、picameraライブラリを作成し、Piフォーラムではるかに知識のあるファームウェア開発者と対話した経験に基づいています。ファームウェア開発者から矛盾する情報を聞いた場合、それは私ではなく、これに関する権限です。それが邪魔にならないように...

Piのカメラモジュールが初期化されるとすぐに、フレームがキャプチャされます。これらのフレームは(エンドユーザーに関する限り)ダンプされますが、カメラのファームウェア内にはさらに多くの処理が行われます。フレームを測定して、センサー(AGC)に適用するゲイン、AWB補正アルゴリズムに供給するホワイトバランスなどを決定します。たとえば、カメラを起動してすぐに記録を開始すると、通常は記録の最初の数フレームでホワイトバランスを修正します。

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    camera.start_recording('video1.h264')
    time.sleep(5)
    camera.stop_recording()

ただし、録音を開始する前に遅延を設定すると、録音が​​開始されるまでにホワイトバランスが安定していることがわかります。

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    time.sleep(5)
    camera.start_recording('video2.h264')
    time.sleep(5)
    camera.stop_recording()

それで、画像をキャプチャしていない、またはビデオを記録していないときでも、カメラは常にフレームをキャプチャしているとすると、画像をキャプチャすることを選択した場合、実際にはどうなりますか?私たちは、アクティベートキャプチャにファームウェアを伝え、次のフレームのファームウェアのを待つかわりにビデオポートの静止ポートから画像をキャプチャしている場合があります、実際には(私たちに戻ってそれを渡す前に完了するために、多く含むに行くよりは、モードは切り替わりますが、ビデオポートに関心があるので無視してください)。

これが同期にとって何を意味するかを検討してください(特定の使用例)。カメラは、特定のポイントでフレームをキャプチャする準備ができていません。それはすでにフレームをキャプチャしており、フレームを要求すると、利用可能になる次の完全なフレームを渡します。カメラのフレームを同期させるには、すべてのカメラをまったく同時に初期化する必要があり、その後、内部クロックを正確に同期させて実行する必要があります(カメラには独自の内部クロックがあります。パイの時計)。

悲しいことに、これは本当に現実的な見通しではないと思います。正しく思い出せば、Piコンピュートモジュール(オンボードに2つのカメラポートがあり、同時に2つのカメラモジュールをサポートします)は、ファームウェアでいくつかの特別な呼び出しを使用して、2つのモジュールが単一のクロック信号を使用するようにします(これはハードウェアレベルで動作しますが、計算モジュールに固有の何かを使用していると思います); 4つのPiで同じようなことをするとは想像できません。

更新:

ある程度の合理的なネットワークの知識(UDPブロードキャストパケットなど)で大まかな同期をとることが可能であることを付け加えておきます。言い換えると、ネットワーク上のすべてのPiを1ミリ秒以内にキャプチャをトリガーすることが可能です(イーサネットのような適切な低遅延ネットワークを想定)。ただし、前述のように、すべてのカメラが実際に動作することは保証されません。同時にフレームをキャプチャします。結果のキャプチャの開始時間の間には、最大でフレーム分のラグ(およびネットワーク遅延)があります。

そのレベルの同期で十分な場合は、picameraの上に私がこのプロジェクトのために書いた別のプロジェクトであるcompoundpiプロジェクトをチェックしたいと思うかもしれません。


(ビデオではなく)静止モードでのマルチカメラの「フレーム同期」について教えてください。フル解像度でFPSが低い(おそらく15 FPSの場合、30 FPSビデオよりもフレームラグが長くなる)ため、センサーは静止画でも「フリーランニング」モードで再度実行される可能性があります。この仮定を確認できますか?Pythonはその上に時間の不確実性のレベルを追加するだけなので、C ++ソリューションに興味があります...
Kozuch

それから数年で、私はかなり多くを学びました、そしておそらくいつかこの答えを更新するべきです。初心者にとって、計算モジュールのデュアルカメラに同期があるという主張は間違っています:同期されていないだけで、同期的に開始され、最終的に(数時間にわたって)ずれます。静止画では、カメラはキャプチャまでフレームをストリーミングしますが、キャプチャ中にセンサーモード2または3(フレームレートに依存)へのモード切り替えを行います。
Dave Jones

カメラファームウェアの開発者からのフィードバックに基づいて、次のpicameraリリースに向けてカメラハードウェアの章の拡張バージョンを書いています-この詳細の一部をカバーしているため、一読する価値はあります(まだ完全ではありません)。
デイブジョーンズ

あなたのドキュメントはかなり広範囲に渡る読み物ですが、私はそれらを深く掘り下げるためのリソースを持っていません-私は簡単な読み物をしました。ビデオモードと静止モード(まだ移植)の両方があるようです。ビデオポート(フリーランニングセンサー)については知っていますが、それでもポートの意味と機能を説明できますか?ビデオポートより正確なトリガー(シャッターラグが少ない)のためにそれをどうにかして使用できますか?raspicam C ++開発者に同じトピックを尋ねましたが、まだ回答がありません。
Kozuch

いいえ:静止ポートはMMALアーティファクトであり、GPU上の別のイメージングパイプラインが「より良い」静止出力を生成します。したがって、静止ポートを使用してキャプチャする場合、センサーモードが一時的に切り替えられたり、強力なノイズ除去アルゴリズムが使用されたりします。これにより、シャッターラグに違いが生じることはありません(モードスイッチはおそらく複雑になります)。
デイブジョーンズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.