picamera로 0.025 초 안에 사진을 찍으려면 80fps 이상의 프레임 속도가 필요합니다. 80fps가 아닌 40fps (1 / 0.025 = 40)가 필요한 이유는 현재 여러 이미지 인코더에서 다른 모든 프레임을 건너 뛰게하여 유효 캡처 속도가 카메라 프레임 속도의 절반으로 줄어드는 문제가 있기 때문입니다.
Pi의 카메라 모듈은 이후 펌웨어에서 80fps가 가능 하지만 (picamera 문서의 카메라 모드 참조 ) VGA 해상도에서만 (프레임 속도가 30fps보다 높은 해상도를 요청하면 VGA에서 요청 된 해상도로 업 스케일링 됨) 40fps에서도 직면하는 한계). 발생할 수있는 다른 문제는 SD 카드 속도 제한입니다. 다시 말해, 네트워크 포트 나 메모리 스트림과 같은 빠른 속도로 캡처해야 할 수도 있습니다 (캡쳐해야하는 모든 이미지가 RAM에 적합하다고 가정).
다음 스크립트는 오버 클럭킹이 900Mhz로 설정된 Pi에서 ~ 38fps (그림 당 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에서 처리를 수행하는 것입니다.