Щоб робити фотографії за допомогою пікамери в 0,025 секунди, вам знадобиться частота кадрів, що перевищує 80 кадрів в секунду. Причина вимагати 80 швидкісних кадрів в секунду (враховуючи, що 1 / 0,025 = 40) полягає в тому, що в даний час існує певна проблема, через яку кожен інший кадр може пропускатися в кодер з декількома зображеннями, тому ефективна швидкість зйомки виявляється як половина рамки камери.
Модуль камери Pi здатний до 80 кадрів в секунду на більш пізніх прошивках (див. Режими камери в документах Picamera), але лише при роздільній здатності VGA (запити на більш високу роздільну здатність з частотою кадрів> 30 кадрів в секунду призведе до збільшення масштабу від VGA до потрібної роздільної здатності, тому це обмеження, перед яким ви стикаєтесь навіть зі швидкістю 40 кадрів в секунду). Інша проблема, з якою ви, швидше за все, зіткнетеся, - обмеження швидкості SD-карти. Іншими словами, вам, ймовірно, потрібно буде захопити щось швидше, як мережевий порт або потоки пам'яті (якщо припустити, що всі зображення, необхідні для зйомки, вмістяться в оперативній пам'яті).
Наступний сценарій отримує мені швидкість захоплення ~ 38 кадрів в секунду (тобто трохи вище 0,025 секунди на рис.) На Pi з розгоном, встановленим на 900 МГц:
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 є невеликим (особливо порівняно з VideoCore GPU). Незважаючи на те, що ви можете зробити знімок зі швидкістю 40 кадрів в секунду, ви не зможете виконати будь-яку серйозну обробку цих кадрів зі швидкістю 40 кадрів в секунду навіть з усіма вищезазначеними трюками. Єдиний реалістичний спосіб виконати обробку кадру з такою швидкістю - перевезти кадри по мережі на більш швидку машину або виконати обробку на GPU.