12 KiB
Захоплення зображення - Raspberry Pi
У цій частині уроку ви додасте сенсор камери до вашого Raspberry Pi і зчитуватимете зображення з нього.
Обладнання
Raspberry Pi потребує камери.
Камера, яку ви будете використовувати, — це Raspberry Pi Camera Module. Ця камера розроблена для роботи з Raspberry Pi і підключається через спеціальний роз'єм на платі.
💁 Ця камера використовує Camera Serial Interface, протокол від Mobile Industry Processor Interface Alliance, відомий як MIPI-CSI. Це спеціалізований протокол для передачі зображень.
Підключення камери
Камера може бути підключена до Raspberry Pi за допомогою стрічкового кабелю.
Завдання - підключити камеру
-
Вимкніть живлення Raspberry Pi.
-
Підключіть стрічковий кабель, який постачається з камерою, до камери. Для цього обережно потягніть чорний пластиковий затискач у тримачі, щоб він трохи висунувся, потім вставте кабель у роз'єм так, щоб синя сторона була повернута від об'єктива, а металеві контакти — до об'єктива. Коли кабель буде вставлений до кінця, поверніть чорний затискач назад на місце.
Ви можете знайти анімацію, яка показує, як відкрити затискач і вставити кабель, у документації Raspberry Pi "Початок роботи з модулем камери".
-
Зніміть Grove Base Hat з Raspberry Pi.
-
Пропустіть стрічковий кабель через слот для камери в Grove Base Hat. Переконайтеся, що синя сторона кабелю спрямована до аналогових портів, позначених A0, A1 тощо.
-
Вставте стрічковий кабель у роз'єм камери на Raspberry Pi. Знову потягніть чорний пластиковий затискач вгору, вставте кабель, а потім поверніть затискач назад. Синя сторона кабелю повинна бути спрямована до USB і Ethernet портів.
-
Встановіть Grove Base Hat назад.
Програмування камери
Тепер Raspberry Pi можна запрограмувати для використання камери за допомогою бібліотеки Python PiCamera.
Завдання - увімкнути режим камери за спадщиною
На жаль, з виходом Raspberry Pi OS Bullseye програмне забезпечення для камери, яке постачалося з ОС, змінилося, і за замовчуванням PiCamera більше не працює. Зараз розробляється заміна, яка називається PiCamera2, але вона ще не готова до використання.
Поки що ви можете перевести ваш Raspberry Pi у режим камери за спадщиною, щоб PiCamera могла працювати. Роз'єм камери також вимкнений за замовчуванням, але увімкнення програмного забезпечення камери за спадщиною автоматично активує роз'єм.
-
Увімкніть Raspberry Pi і дочекайтеся його завантаження.
-
Запустіть VS Code, або безпосередньо на Raspberry Pi, або через розширення Remote SSH.
-
Виконайте наступні команди у вашому терміналі:
sudo raspi-config nonint do_legacy 0 sudo reboot
Це змінить налаштування для увімкнення програмного забезпечення камери за спадщиною, а потім перезавантажить Raspberry Pi, щоб ці налаштування набули чинності.
-
Дочекайтеся перезавантаження Raspberry Pi, а потім знову запустіть VS Code.
Завдання - програмування камери
Програмуйте пристрій.
-
У терміналі створіть нову папку в домашньому каталозі користувача
pi
під назвоюfruit-quality-detector
. Створіть файл у цій папці під назвоюapp.py
. -
Відкрийте цю папку у VS Code.
-
Для взаємодії з камерою ви можете використовувати бібліотеку Python PiCamera. Встановіть пакет Pip для цього за допомогою наступної команди:
pip3 install picamera
-
Додайте наступний код у ваш файл
app.py
:import io import time from picamera import PiCamera
Цей код імпортує необхідні бібліотеки, включаючи бібліотеку
PiCamera
. -
Додайте наступний код нижче, щоб ініціалізувати камеру:
camera = PiCamera() camera.resolution = (640, 480) camera.rotation = 0 time.sleep(2)
Цей код створює об'єкт PiCamera, встановлює роздільну здатність 640x480. Хоча підтримуються вищі роздільні здатності (до 3280x2464), класифікатор зображень працює з набагато меншими зображеннями (227x227), тому немає потреби захоплювати та передавати більші зображення.
Рядок
camera.rotation = 0
встановлює обертання зображення. Стрічковий кабель входить у нижню частину камери, але якщо ваша камера була повернута для зручнішого спрямування на об'єкт, який ви хочете класифікувати, то ви можете змінити цей рядок на кількість градусів обертання.Наприклад, якщо ви підвісите стрічковий кабель над чимось так, щоб він був у верхній частині камери, то встановіть обертання на 180:
camera.rotation = 180
Камера потребує кілька секунд для запуску, тому використовується
time.sleep(2)
. -
Додайте наступний код нижче, щоб захопити зображення у вигляді двійкових даних:
image = io.BytesIO() camera.capture(image, 'jpeg') image.seek(0)
Цей код створює об'єкт
BytesIO
для зберігання двійкових даних. Зображення зчитується з камери як файл JPEG і зберігається в цьому об'єкті. Цей об'єкт має індикатор позиції, щоб знати, де він знаходиться в даних, тому рядокimage.seek(0)
переміщує цю позицію назад на початок, щоб усі дані могли бути прочитані пізніше. -
Нижче цього додайте наступний код для збереження зображення у файл:
with open('image.jpg', 'wb') as image_file: image_file.write(image.read())
Цей код відкриває файл під назвою
image.jpg
для запису, потім зчитує всі дані з об'єктаBytesIO
і записує їх у файл.💁 Ви можете захопити зображення безпосередньо у файл, а не в об'єкт
BytesIO
, передавши ім'я файлу у викликcamera.capture
. Причина використання об'єктаBytesIO
полягає в тому, що пізніше у цьому уроці ви зможете надіслати зображення до вашого класифікатора зображень. -
Наведіть камеру на щось і запустіть цей код.
-
Зображення буде захоплено і збережено як
image.jpg
у поточній папці. Ви побачите цей файл у провіднику VS Code. Виберіть файл, щоб переглянути зображення. Якщо потрібно обертання, оновіть рядокcamera.rotation = 0
відповідно і зробіть новий знімок.
💁 Ви можете знайти цей код у папці code-camera/pi.
😀 Ваша програма для камери успішно працює!
Відмова від відповідальності:
Цей документ був перекладений за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу.