Raspistillはトリガーに時間がかかりますか?


18

私は「多くの」ラズベリーを一緒にトリガーしようとしていますが、raspistillを使用するのはテストのためだけであり、写真を撮るのがなぜ遅いのか疑問に思っています。

raspistill -o /home/pi/test55.jpg -ex sports --nopreview

カメラの前でiPhoneクロノメーターを起動します。結果?7秒、09(ただし、シャープなので、シャッタースピードなどは問題ありませんでしたが、数値がぼやけていませんでした)。写真を撮る前にX秒を「取らない」ようにするにはどうすればよいですか?私は何百ものRPIを同期しますが、4秒で写真を撮り、10秒で他の写真を撮って欲しくないので、そこで何が起こっているのかを理解したいと思います。

回答:


5

カメラプロセスを常に実行する必要があります。

これが、(平均で)50ミリ秒の結果を達成できる唯一の方法です。私はどこでも解決策を探しました。私のモーションセンサープロジェクトには1秒が遅すぎました。

@Dave Jonesのプロジェクトは、その方法を理解するのに役立ちました。

わずか2ファイル:

デーモン、常に実行されているクライアント。

デーモンは、すべてのカメラ設定を設定する場所です。

picam-daemon.py

picam-client.py

python picam-daemon.py

import threading
import os, io, base64, time, socket, picamera, daemon
import daemon.runner

MAX_LENGTH = 50 # max length of any possible entry from "client"
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # setup socket
PORT = 10000 # port 10000
HOST = '127.0.0.1' # runs on local host
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # this allows us to override port, prevents error
serversocket.bind((HOST, PORT)) # lock server to this port and host
serversocket.listen(10) # max 10 clients


# Waits for commands, such as "snap" and "ack"
# Runs over "sockets"
def handle(clientsocket):
    while 1:
        buf = clientsocket.recv(MAX_LENGTH)

        # Receive the SNAP command. Take a picture with PiCam.
        if buf == 'snap':
            start = time.time()
            camera.capture('/home/pi/ir/picam-latest-snap.jpg')
            finish = start - time.time()
            print finish
            print 'Picture Taken!'

        if buf == 'ack':
            print 'Ping: Hello!'

        if len(buf) == 0: break

# Camera is always loaded here
# The "magic" is in the camThread, this allows a picture to be captured, then it gracefully closed the camera connection and reopens it. This produces very fast captures (54ms vs 1.5s!)
while 1:
    # setup camera
    camera = picamera.PiCamera()
    camera.resolution = (640, 480)
    #camera.zoom = (0.2, 0.2, 1.0, 1.0)
    camera.exposure_mode = 'sports'
    print('Camera server running')

    # accept connections from outside, in order to receive commands
    (clientsocket, address) = serversocket.accept()
    ct = threading.Thread(target=handle, args=(clientsocket,))
    ct.run() # this can be run(), because it can be scaled.

    print 'Camera thread starting.'
    camThread = threading.Thread()
    while camThread.is_alive():
        camThread.join(1)
    camThread.run() # this must be start(), otherwise PiCam will crash. This is because PiCam cannot receive more than 1 connection.
    print 'Camera thread ended'
    camera.close() # Gracefully close PiCam if client disconnects

(2番目の端末)python picam-client.py

import socket
import sys


HOST = '127.0.0.1'
PORT = 10000
s = socket.socket()
s.connect((HOST, PORT))

print s

while 1:
    msg = raw_input("Command To Send: ")
    if msg == "close":
       s.close()
       sys.exit(0)
    s.send(msg)

Googleでこれを見つけて、自分で答えを見つけようとしているので、この答えを投稿しています。見つからなかったので、いくつかのプロジェクトを掘り下げて自分で何かを考え出さなければなりませんでした。


同じ問題に遭遇したとき、私は同じ解決策を思いつきましたが、まだコードを書くことに近づいていませんでした。他の誰かが私にそれを打ち負かしたのを見てうれしい!
ニッククーン

6

0のタイムアウトを指定する必要があります。

raspistillヘルプから

-timeout "Time (in ms) before takes picture and shuts down (if not specified, set to 5s)

コマンドの実行にかかる時間をテストするには、「時間」を使用できます

time raspistill -o /home/pi/test55.jpg -ex sports --nopreview --timeout 0

これは、5秒のデフォルトのタイムアウトを削除しますが、問題は私がフォーラムに理解してどのように遅延の画像を取得しないようにraspistillなどされて使用して本当の方法はありませんから、私は、より多くのそれよりも取得していますです
ローナンThibaudau

8
私のRaspberryでは、タイムアウトを0に指定すると「無限」を意味するように見えますが、タイムアウトに「1」を指定するとうまくいくようです
-MondKin

4
また、このような低いタイムアウトを使用しても、カメラがコレクターを公開するのに十分な時間を与えないため、画像が暗くなります。画像が暗くなりぼやける前に、約300より低くなることはありません。
セリン

2
あまり必要ない場合は、-tオプションを省略します。@Cerinが述べているように、これは設定が低すぎると何らかの形で画像を破壊します。正直に言うと、Raspberry Piのドキュメントにはこのオプションに関する情報が少なすぎて、タイムアウトは単純な「遅延」/「タイムトリガー」であるという誤った仮定につながっていますが、明らかにそうではありません。
フラットロン

4

.bash_profileで次のエイリアスを指定して、簡単で高速なカメラショットを可能にしました。

alias shot='SHOTTIME=$(date +"%Y-%m-%d_%H%M") && raspistill -o shot-$SHOTTIME.jpg --nopreview --exposure sports --timeout 1

shotコマンドラインに入力するたびに、タイムスタンプ付きの画像が保存されます(例:)shot-2016-02-27_0934.jpg


1
Raspberry Pi Stack Exchangeコミュニティへようこそ!でもで--timeout 1(?)だった場合、私は驚かれると思い引数その迅速な-しかし、私は(まだ)ない持っているとして、それが今まで私のフロントのロックを解除しようとする人のスナップショットを取るような状態に私のシステムを持ってドアは本当に選ぶことができません!8-)ただし、コマンドラインの適切な使用(クロックが設定されていると仮定)-英数字の並べ替え順序が日付の並べ替え順序と同じになるように、最も重要な値を持つ日時スタンプを最初に置くことを含みます!
SlySven

1
〜$タイムショットリアル0m0.040sユーザー0m0.010s sys 0m0.020s qed;)
NDB

1
残念ながら、0.040秒は速くなるにはあまりにも速くなります。上記のtimeコマンドの使用法には欠陥があり、実際にはSHOTTIME変数を割り当てるのにかかる時間を測定するだけで、画像をキャプチャしません。リアルタイムは〜1秒です。
slackhacker

コメントありがとうございます、あなたは正しいです。元のテキストからかかる時間を削除しました。
NDB

2

compoundpiプロジェクトをご覧になることをお勧めします(完全開示:私は著者です)。これは、カメラモジュールを使用して多数のPiからキャプチャをトリガーすることを目的としており、UDPブロードキャストパケットを使用して、すべてのトリガーをできるだけ近くにトリガーします。各Piでデーモンが実行され、カメラを起動し、CAPTUREコマンドを含むUDPパケットを受信するとキャプチャをトリガーします(他のコマンドを使用してカメラを構成できます。プロトコルについては十分に文書化されてます)。イーサネットを使用したセットアップが理想的ですが、Wi-Fiも機能しますが、その場合は適切な同期を得るために時間遅延機能を使用する必要があります(パケット損失/可変遅延のため)。

100のPiでテストされたとは言えません-現在のところ、それを使用する最大のセットアップには20が含まれますが、より大きなスケールに関連する問題を聞いてみたいと思います。

このプロジェクトには、コマンドラインクライアント、GUIクライアント(Linux / Mac / Windowsで動作するようにQtで記述されていますが、現時点ではUbuntuでのみテストされており、まだ文書化されていません)、およびPythonベースのクライアントライブラリが含まれていますバッチジョブの作成。


私はudp部分もクライアントもあまり心配していません(手で制御したくない、はるかに大きなプロジェクトで制御されています)が、compoundpiはインスタントキャプチャに近いものを使用していますか? raspistillのような遅延?
ローナンティボー14年

デイブ、あなたは私が必要とするものを中心に展開するプロジェクトの作者だと思われますが、SkypeやEメールで議論できる可能性はありますか?
ローナンティボー14年

確かに-私に直接メールを送ってください(私の電子メールアドレスはGitHubプロファイルに表示されます
デイブジョーンズ14年

1
ああ、そしてあなたの他の質問について:それはほぼ瞬時です。compoundpiデーモンが開始されると、カメラが初期化および構成され(raspistillで多くの遅延が発生する場所)、キャプチャコマンドを待機します。キャプチャコマンドは、キャプチャを即座に引き起こすか、指定されたタイムスタンプまでキャプチャする前に待機することができます。この場合、コマンドの受信とキャプチャの間の遅延はミリ秒である必要があります。
デイブジョーンズ14年

Dave Jones、キャプチャを取得する前にカメラを初期化するというこのアイデアについて、詳細を教えてください。コマンドラインからこれを実行できますか?
Ollie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.