ในการถ่ายภาพด้วย Picamera 0.025s คุณจะต้องมีอัตราเฟรมมากกว่าหรือเท่ากับ 80fps เหตุผลที่ต้องใช้ 80 ค่อนข้าง 40fps (ระบุว่า 1 / 0.025 = 40) คือในปัจจุบันมีปัญหาบางอย่างที่ทำให้เฟรมอื่น ๆ ข้ามไปในตัวเข้ารหัสหลายภาพเพื่อให้อัตราการจับภาพมีประสิทธิภาพขึ้นครึ่งเฟรมของกล้อง
โมดูลกล้องของ Pi มีความสามารถ 80fps ในเฟิร์มแวร์ในภายหลัง (ดูโหมดกล้องใน picamera docs) แต่เฉพาะที่ความละเอียด VGA (การร้องขอความละเอียดสูงกว่าด้วย framerates> 30fps จะทำให้การลดอัตราการสุ่มจาก VGA เป็นความละเอียดที่ร้องขอ ข้อ จำกัด ที่คุณต้องเผชิญคือ 40fps) ปัญหาอื่น ๆ ที่คุณอาจพบคือข้อ จำกัด ความเร็วของการ์ด SD กล่าวอีกนัยหนึ่งคุณอาจต้องจับภาพไปยังสิ่งที่เร็วกว่าเช่นพอร์ตเครือข่ายหรือสตรีมในหน่วยความจำ (สมมติว่าภาพทั้งหมดที่คุณต้องการถ่ายจะพอดีใน RAM)
สคริปต์ต่อไปนี้ทำให้ฉันมีอัตราการจับ ~ 38fps (เช่นสูงกว่า 0.025s ต่อรูป) บน Pi ที่มีการโอเวอร์คล็อกตั้งค่าเป็น 900Mhz:
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) แม้ว่าคุณจะสามารถจับภาพที่ 40fps ได้ แต่ก็ไม่มีทางที่คุณจะสามารถทำการประมวลผลที่จริงจังของเฟรมเหล่านั้นที่ 40fps ได้แม้จะมีเทคนิคทั้งหมดที่กล่าวมาข้างต้น วิธีเดียวที่เป็นจริงในการประมวลผลเฟรมในอัตรานั้นคือจัดส่งเฟรมผ่านเครือข่ายไปยังเครื่องที่เร็วขึ้นหรือทำการประมวลผลบน GPU