Модуль камери - відмінний аксесуар для Raspberry Pi, який дозволяє користувачам робити фотознімки і записувати відео в форматі Full HD. В попередньому курсі ми запускали відеокамеру з командного рядка, але Python розширює можливості для роботи.
Відкрийте засіб налаштування Raspberry Pi (RPi) з головного меню:
Переконайтеся, що програмне забезпечення камери дозволене:
Якщо воно не включене, то увімкніть його і перезавантажте RPi, щоб продовжити.
Попередній перегляд камери
Тепер камера підключена, програмне забезпечення дозволене, тому можете приступити до роботи, спробувавши попередній перегляд камери.
Відкрити Python 3 з головного меню:
Бібліотека python-picamera
доступна в архівах Raspbian. Її можна інсталювати за допомого apt
:
sudo apt-get update
sudo apt-get install python-picamera
Альтернативно, для пакету Python3 інсталяція виконується за допомогою команди:
sudo apt-get install python3-picamera
Офлайнова версія документаці доступна з:
sudo apt-get install python-picamera-docs
.
Тепер, відкрийте новий файл і збережіть його як camera.py. Дуже важливо, щоб ви не зберегли його як picamera.py.
Введіть наступний код:
import picamera
from picamera import PiCamera
from time import sleep
camera = PiCamera()
camera.start_preview()
sleep(10)
camera.stop_preview()
Збережіть за допомогою Ctrl+S і запустіть за допомогою F5. Попередній перегляд камери повинен бути показаний протягом 10 секунд, а потім закриється. Поверніть камеру навколо, щоб переглянути, що бачить камера.
Якщо зображення було перевернуте, то можете розвернути його за допомогою наступного коду:
camera.rotation = 180
camera.start_preview()
sleep(10)
camera.stop_preview()
Можете повернути зображення на 90, 180 або 270 градусів, або можете встановити його в 0, щоб скинути.
Можете змінити прозорість попереднього перегляду камери, встановивши альфа-рівень:
from picamera import PiCamera
from time import sleep
camera = PiCamera()
camera.start_preview(alpha=200)
sleep(10)
camera.stop_preview()
alpha може приймати будь-яке значення від 0 до 255.
Фотозйомка
Найчастіше модуль камери використовується для фотозйомки.
Змініть свій код, зменшивши sleep і додавши рядок camera.capture():
camera.start_preview()
sleep(5)
camera.capture('/home/pi/Desktop/image.jpg')
camera.stop_preview()
Дуже важливо, щоб sleep мало значення не менше 2 секунд перед зйомкою, щоб дати час сенсору встановити свій рівень освітленості.
Виконайте код і побачите попередній перегляд камери, відкритий протягом 5 секунд перед зйомкою нерухомого зображення. Ви побачите попередній перегляд миттєво пристосований до різної роздільної здатності, як тільки знімок був зроблений.
Фото зберігається на робочому столі. Двічі клацніть файл, щоб відкрити його:
Тепер спробуйте додати цикл, щоб зробити п'ять знімків поспіль:
camera.start_preview()
for i in range(5):
sleep(5)
camera.capture('/home/pi/Desktop/image%s.jpg' % i)
camera.stop_preview()
Змінна i містить номер поточної ітерації, від 0 до 4, тому зображення будуть збережені як image0.jpg, image1.jpg і так далі.
Виконати код ще раз, тримаючи камеру в потрібному положенні. Вона буде робити один знімок кожні п'ять секунд.
Після того, як п'ятий знімок зроблений, попередній перегляд закриється. Тепер подивіться на зображення на робочому столі, де побачите п'ять нових знімків.
Запис відео
Ви використовували камеру для зйомки фотографій, а тепер можете перейти до запису відео.
Змініть свій код, щоб замінити capture() на start_recording() і stop_recording():
camera.start_preview()
camera.start_recording('/home/pi/video.h264')
sleep(10)
camera.stop_recording()
camera.stop_preview()
Виконайте код; який запише 10 секунд відео, а потім закриється вікно попереднього перегляду.
Для відтворення відео, вам необхідно відкрити вікно терміналу, натиснувши на значок чорного монітору на панелі завдань:
Введіть таку команду та натисніть Enter для відтворення відео:
omxplayer video.h264
Відтворення відео. Насправді, воно може програватися трохи швидше, ніж було зафіксовано, у зв'язку з іншою швидкістю частоти кадрів в omxplayer.
Ефекти
Доступні також інші налаштування. Ось список з їх значеннями за замовчуванням:
camera.sharpness = 0
camera.contrast = 0
camera.brightness = 50
camera.saturation = 0
camera.ISO = 0
camera.video_stabilization = False
camera.exposure_compensation = 0
camera.exposure_mode = 'auto'
camera.meter_mode = 'average'
camera.awb_mode = 'auto'
camera.image_effect = 'none'
camera.color_effects = None
camera.rotation = 0
camera.hflip = False
camera.vflip = False
camera.crop = (0.0, 0.0, 1.0, 1.0)
Спочатку, створюємо об'єкт camera з класом PiCamera() таким чином: camera = PiCamera(). Тепер можете управляти цим об'єктом camera для того, щоб налаштувати його параметри. Деякі з цих ефектів застосовуються тільки для попереднього перегляду, а не захоплення, а інші встановлюються тільки для захоплення, але багато впливають на обидва режими.
Дозвільна здатність захоплення налаштовується. За замовчуванням вона встановлена на роздільну здатність вашого монітора, але максимальна роздільна здатність становить 2592 x 1944 для нерухомих фотографій і 1920 x 1080 для запису відео. Спробуйте наступний приклад, щоб встановити максимальну роздільну здатність. Зверніть увагу, що вам також необхідно встановити частоту кадрів в 15, щоб включити цю максимальну роздільну здатність:
camera.resolution = (2592, 1944)
camera.framerate = 15
camera.start_preview()
sleep(5)
camera.capture('/home/pi/Desktop/max.jpg')
camera.stop_preview()
Мінімальний розмір зображення допускається 64 х 64. Спробуйте деякі з різних значень роздільної здатності.
До зображення можна легко додавати текст з annotate_text. Спробуйте:
camera.start_preview()
camera.annotate_text = "Hello world!"
sleep(5)
camera.capture('/home/pi/Desktop/text.jpg')
camera.stop_preview()
Можете змінити налаштування яскравості, яке може бути встановлене від 0 до 100. Значення за замовчуванням 50. Спробуйте інше його значення:
camera.start_preview()
camera.brightness = 70
sleep(5)
camera.capture('/home/pi/Desktop/bright.jpg')
camera.stop_preview()
Спробуйте налаштувати яскравість в циклі, і зробити анотацію на зображенні поточним рівнем яскравості:
camera.start_preview()
for i in range(100):
camera.annotate_text = "Brightness: %s" % i
camera.brightness = i
sleep(0.1)
camera.stop_preview()
Подібним чином, спробуйте те ж саме для контрасту:
camera.start_preview()
for i in range(100):
camera.annotate_text = "Contrast: %s" % i
camera.contrast = i
sleep(0.1)
camera.stop_preview()
Розмір тексту анотації можете встановити з наступним кодом:
camera.annotate_text_size = 50
Допустимі розміри від 6 до 160. Значення за замовчуванням 32.
Також можете змінити колір анотацій. Перш за все, переконайтеся, що Color імпортований шляхом внесення змін до вашого рядка import у верхній частині коду:
from picamera import PiCamera, Color
Потім змініть решту частину коду таким чином:
camera.start_preview()
camera.annotate_background = Color('blue')
camera.annotate_foreground = Color('yellow')
camera.annotate_text = " Hello world "
sleep(5)
camera.stop_preview()
Можете використовувати camera.image_effect для застосування певного ефекту для зображення. Існують варіанти: none, negative, solarize, sketch, denoise, emboss, oilpaint, hatch, gpen, pastel, watercolor, film, blur, saturation, colorswap, washedout, posterise, colorpoint, colorbalance, cartoon, deinterlace1 і deinterlace2. За замовчуванням none. Виберіть один з ефектів і спробуйте його, наприклад:
camera.start_preview()
camera.image_effect = 'colorswap'
sleep(5)
camera.capture('/home/pi/Desktop/colorswap.jpg')
camera.stop_preview()
Спробуйте зробити цикл зміни різні ефектів для зображення в попередньому перегляді, щоб перевірити їх:
camera.start_preview()
for effect in camera.IMAGE_EFFECTS:
camera.image_effect = effect
camera.annotate_text = "Effect: %s" % effect
sleep(5)
camera.stop_preview()
Можете використати camera.awb_mode, щоб встановити автоматичний баланс білого для заданого режиму роботи, щоб застосувати певний ефект. Передбачені наступні опції: off, auto, sunlight, cloudy, shade, tungsten, fluorescent, incandescent, flash і horizon. За замовчуванням auto. Виберіть одну з опцій і спробуйте її:
camera.start_preview()
camera.awb_mode = 'sunlight'
sleep(5)
camera.capture('/home/pi/Desktop/sunlight.jpg')
camera.stop_preview()
Можете створити цикл для доступних авто-режимів балансу білого з camera.AWB_MODES.
Можете використати camera.exposure_mode для установки експозиції для заданого режиму роботи, щоб застосувати певний ефект. Передбачені наступні опції: off, auto, night, nightpreview, backlight, spotlight, sports, snow, beach, verylong, fixedfps, antishake і fireworks. За замовчуванням auto. Виберіть одну з опцій і спробуйте її:
camera.start_preview()
camera.exposure_mode = 'beach'
sleep(5)
camera.capture('/home/pi/Desktop/beach.jpg')
camera.stop_preview()
Ви можете циклічно перебрати доступні режими експозиції з camera.EXPOSURE_MODES.
Сповільнена кінозйомка
Популярність сповільненої кінозйомки зросла в останні кілька років з «вибухом» камер смартфонів, дозволяючи робити майже всім те, що було колись доступне лише для спеціалізованих фотографів.
Недолік використання смартфона для такого роду фотографії очевидна; це займає багато часу, і забирає ресурс, який вам може знадобитися для іншого, ну, і набір та прийом телефонних дзвінків. Raspberry Pi з підключеною до нього камерою є хорошою альтернативою, а з акумулятором може виявитися таким самим портативним і універсальний як додатки Android або iPhone, і це має більше сенсу, ніж просто використовувати RPi як цифрову дзеркальну фотокамеру для покадрових фото.
Перед тим, як почати роботу, встановіть ffmpeg:
sudo apt-get install ffmpeg
Потім використайте наведений нижче сценарій на Python, щоб захопити зображення через проміжки часу:
import time
import picamera
VIDEO_DAYS = 1
FRAMES_PER_HOUR = 60
FRAMES = FRAMES_PER_HOUR * 24 * VIDEO_DAYS
def capture_frame(frame):
with picamera.PiCamera() as cam:
time.sleep(2)
cam.capture('/home/pi/Desktop/frame%03d.jpg' % frame)
# Capture the images
for frame in range(FRAMES):
# Note the time before the capture
start = time.time()
capture_frame(frame)
# Wait for the next capture. Note that we take into
# account the length of time it took to capture the
# image when calculating the delay
time.sleep(
int(60 * 60 / FRAMES_PER_HOUR) - (time.time() - start)
)
Можете створити колекцію зображень, записаних через проміжки часу 60 хв., за допомогою наведеного сценарію. Для перегляду зображень у вигляді фільму формату mp4, компілюйте зображення за допомоги команди:
ffmpeg -y -f image2 -i /home/pi/Desktop/frame%03d.jpg -r 24 -vcodec libx264 -profile high -preset slow /home/pi/Desktop/timelapse.mp4
Тепер зможете переглянути створене відео на своєму RPi через команду в терміналі:
omxplayer timelapse.mp4
Відео буде програватися на весь екран. Воно може виглядати подібно до цього…
(За матеріалами: raspberrypi.org)