#raspberry-pi #picamera #raspistill
Вопрос:
Я хотел бы записать несколько изображений (например, 50) с помощью модуля камеры Raspberry Pi HQ. Эти изображения записываются с помощью простой командной строки raspistill -ss 125 -ISO 400 -fli auto -o test.png -e png
. Поскольку мне нужно записать файлы .png, размеры изображения составляют 3040×4056. Если я запускаю простой скрипт bash, который содержит 50 таких командных строк, кажется, что между изображениями проходит очень долгое «время обработки».
Итак, есть ли способ записать 50 из этих изображений одно за другим без какой-либо задержки (или, по крайней мере, с очень короткой задержкой)?
Комментарии:
1. Вы пробовали настроить оперативную память и сохранить файлы на нее? Затем вы можете скопировать их в энергонезависимое хранилище позже.
2. Нет, я еще не пробовал, так как у меня не слишком большой опыт. Я попробую это как можно скорее и посмотрю, решит ли это мою проблему, спасибо!
Ответ №1:
Я сомневаюсь, что вы сможете сделать это с raspistill
помощью командной строки — особенно при попытке быстро написать изображения PNG. Я думаю, что вам нужно будет перейти на Python следующим образом — адаптировано отсюда. Обратите внимание, что изображения собираются в оперативной памяти, поэтому на этапе сбора данных нет дискового ввода-вывода.
Сохраните следующее как acquire.py
:
#!/usr/bin/env python3
import time
import picamera
import picamera.array
import numpy as np
# Number of images to acquire
N = 50
# Resolution
w, h = 1024, 768
# List of images (in-memory)
images = []
with picamera.PiCamera() as camera:
with picamera.array.PiRGBArray(camera) as output:
camera.resolution = (w, h)
for frame in range(N):
camera.capture(output, 'rgb')
print(f'Captured image {frame 1}/{N}, with size {output.array.shape[1]}x{output.array.shape[0]}')
images.append(output.array)
output.truncate(0)
Затем сделайте его исполняемым с помощью:
chmod x acquire.py
И беги с:
./acquire.py
Если вы хотите записать список изображений на диск в формате PNG, вы можете использовать что-то вроде этого (непроверенное) с PIL, добавленным в конец приведенного выше кода:
from PIL import Image
for i, image in enumerate(images):
PILimage = Image.fromarray(image)
PILImage.save(f'frame-{i}.png')
Комментарии:
1. Большое спасибо! Твой ответ сработал для меня. Я мог бы добавить нижеприведенную часть вашего ответа, чтобы сохранить изображения. В то время как старый метод записи занимал около 6 минут и 5 секунд, ваше решение заняло около 2 минут и 15 секунд от записи до сохранения.
2. Круто — я рад, что это сработало для тебя. Удачи вам в вашем проекте.