picameraで0.025秒で写真を撮るには、80fps以上のフレームレートが必要です。40fpsではなく80fps(1 / 0.025 = 40と仮定)が必要な理由は、現在、マルチイメージエンコーダーで1つおきのフレームがスキップされ、有効なキャプチャレートがカメラのフレームレートの半分になるという問題があるためです。
Piのカメラモジュールは、後のファームウェアで80fpsが可能です(picameraのドキュメントのカメラモードを参照)。ただし、VGA解像度でのみ(フレームレート> 30fpsでより高い解像度を要求すると、VGAから要求された解像度にアップスケーリングされます) 40fpsでも直面する制限)。発生する可能性のある他の問題は、SDカードの速度制限です。つまり、おそらくネットワークポートやメモリ内ストリームなど、より高速なものにキャプチャする必要があります(キャプチャする必要があるすべての画像がRAMに収まると仮定します)。
次のスクリプトは、オーバークロックが900Mhzに設定されているPiで〜38fps(つまり、1枚あたり0.025秒を少し上回る)のキャプチャレートを取得します。
import io
import time
import picamera
with picamera.PiCamera() as camera:
# Set the camera's resolution to VGA @40fps and give it a couple
# of seconds to measure exposure etc.
camera.resolution = (640, 480)
camera.framerate = 80
time.sleep(2)
# Set up 40 in-memory streams
outputs = [io.BytesIO() for i in range(40)]
start = time.time()
camera.capture_sequence(outputs, 'jpeg', use_video_port=True)
finish = time.time()
# How fast were we?
print('Captured 40 images at %.2ffps' % (40 / (finish - start)))
各フレームの間に何かをしたい場合はcapture_sequence
、出力のリストの代わりにジェネレーター関数を提供することでも可能です。
import io
import time
import picamera
#from PIL import Image
def outputs():
stream = io.BytesIO()
for i in range(40):
# This returns the stream for the camera to capture to
yield stream
# Once the capture is complete, the loop continues here
# (read up on generator functions in Python to understand
# the yield statement). Here you could do some processing
# on the image...
#stream.seek(0)
#img = Image.open(stream)
# Finally, reset the stream for the next capture
stream.seek(0)
stream.truncate()
with picamera.PiCamera() as camera:
camera.resolution = (640, 480)
camera.framerate = 80
time.sleep(2)
start = time.time()
camera.capture_sequence(outputs(), 'jpeg', use_video_port=True)
finish = time.time()
print('Captured 40 images at %.2ffps' % (40 / (finish - start)))
上記の例では、処理は次のキャプチャの前に連続して行われていることに注意してください(つまり、処理を行うと必ず次のキャプチャが遅延します)。スレッドトリックを使用してこのレイテンシを短縮することは可能ですが、そのためにはある程度の複雑さが伴います。
また、処理のためにエンコードされていないキャプチャを確認することもできます(これにより、JPEGのエンコードとデコードのオーバーヘッドが除去されます)。ただし、PiのCPUは小さいことに注意してください(特にVideoCore GPUと比較して)。40fpsでキャプチャできる場合もありますが、上記のすべてのトリックを使用しても、40fpsでこれらのフレームの深刻な処理を実行できる方法はありません。そのレートでフレーム処理を実行する唯一の現実的な方法は、ネットワークを介してより高速なマシンにフレームを送信するか、GPUで処理を実行することです。