Để chụp ảnh trong 0,025 giây với picamera, bạn sẽ cần tốc độ khung hình lớn hơn hoặc bằng 80 khung hình / giây. Lý do yêu cầu 80 chứ không phải 40 khung hình / giây (với tỷ lệ 1 / 0,025 = 40) là hiện tại có một số vấn đề khiến mọi khung hình khác bị bỏ qua trong bộ mã hóa đa hình ảnh để tốc độ chụp hiệu quả tăng lên bằng một nửa tốc độ khung hình của máy ảnh.
Mô-đun máy ảnh của Pi có khả năng 80fps trong các phần cứng sau này (xem các chế độ camera trong tài liệu picamera), nhưng chỉ ở độ phân giải VGA (yêu cầu độ phân giải cao hơn với tốc độ khung hình> 30fps sẽ dẫn đến việc nâng cấp từ VGA sang độ phân giải được yêu cầu, vì vậy đây là một giới hạn mà bạn phải đối mặt ngay cả ở tốc độ 40fps). Vấn đề khác bạn có thể gặp phải là giới hạn tốc độ thẻ SD. Nói cách khác, có lẽ bạn sẽ cần phải chụp đến một cái gì đó nhanh hơn như cổng mạng hoặc luồng trong bộ nhớ (giả sử tất cả hình ảnh bạn cần chụp sẽ phù hợp với RAM).
Kịch bản sau đây cho tôi tốc độ chụp ~ 38 khung hình / giây (tức là chỉ trên 0,025 giây trên mỗi ảnh) trên một Pi với mức ép xung được đặt thành 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)))
Nếu bạn muốn làm một cái gì đó ở giữa mỗi khung, điều này có thể ngay cả với capture_sequence
việc cung cấp chức năng tạo thay vì danh sách đầu ra:
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)))
Hãy nhớ rằng trong ví dụ trên, quá trình xử lý đang diễn ra nghiêm ngặt trước lần chụp tiếp theo (tức là bất kỳ quá trình xử lý nào bạn thực hiện sẽ nhất thiết phải trì hoãn lần chụp tiếp theo). Có thể giảm độ trễ này bằng các thủ thuật xâu chuỗi nhưng làm như vậy liên quan đến một mức độ phức tạp nhất định.
Bạn cũng có thể muốn xem xét các ảnh chụp chưa được mã hóa để xử lý (loại bỏ phần trên của mã hóa và sau đó giải mã JPEG). Tuy nhiên, hãy nhớ rằng CPU của Pi rất nhỏ (đặc biệt là so với GPU VideoCore). Mặc dù bạn có thể chụp ở tốc độ 40 khung hình / giây, nhưng không có cách nào bạn có thể thực hiện bất kỳ xử lý nghiêm trọng nào đối với các khung hình đó ở tốc độ 40 khung hình / giây ngay cả với tất cả các thủ thuật được đề cập ở trên. Cách thực tế duy nhất để thực hiện xử lý khung hình ở tốc độ đó là chuyển các khung qua mạng đến một máy nhanh hơn hoặc thực hiện xử lý trên GPU.