8.0 KiB
Tangkap Imej - Raspberry Pi
Dalam bahagian pelajaran ini, anda akan menambah sensor kamera pada Raspberry Pi anda, dan membaca imej daripadanya.
Perkakasan
Raspberry Pi memerlukan kamera.
Kamera yang akan anda gunakan ialah Raspberry Pi Camera Module. Kamera ini direka untuk berfungsi dengan Raspberry Pi dan disambungkan melalui penyambung khusus pada Pi.
💁 Kamera ini menggunakan Camera Serial Interface, protokol daripada Mobile Industry Processor Interface Alliance, dikenali sebagai MIPI-CSI. Ini adalah protokol khusus untuk menghantar imej.
Sambungkan kamera
Kamera boleh disambungkan ke Raspberry Pi menggunakan kabel reben.
Tugas - sambungkan kamera
-
Matikan kuasa Pi.
-
Sambungkan kabel reben yang disertakan dengan kamera ke kamera. Untuk melakukannya, tarik perlahan klip plastik hitam pada pemegang supaya ia keluar sedikit, kemudian gelongsorkan kabel ke dalam soket, dengan bahagian biru menghadap jauh dari lensa, dan jalur pin logam menghadap ke arah lensa. Setelah kabel dimasukkan sepenuhnya, tolak klip plastik hitam kembali ke tempatnya.
Anda boleh melihat animasi yang menunjukkan cara membuka klip dan memasukkan kabel pada dokumentasi Raspberry Pi Getting Started with the Camera module.
-
Tanggalkan Grove Base Hat dari Pi.
-
Lalukan kabel reben melalui slot kamera di Grove Base Hat. Pastikan bahagian biru kabel menghadap ke arah port analog yang dilabelkan A0, A1 dan sebagainya.
-
Masukkan kabel reben ke dalam port kamera pada Pi. Sekali lagi, tarik klip plastik hitam ke atas, masukkan kabel, kemudian tolak klip kembali ke tempatnya. Bahagian biru kabel harus menghadap ke port USB dan ethernet.
-
Pasang semula Grove Base Hat.
Programkan kamera
Raspberry Pi kini boleh diprogramkan untuk menggunakan kamera dengan menggunakan pustaka Python PiCamera.
Tugas - aktifkan mod kamera legasi
Malangnya, dengan keluaran Raspberry Pi OS Bullseye, perisian kamera yang disertakan dengan OS telah berubah, menyebabkan PiCamera tidak berfungsi secara lalai. Terdapat pengganti yang sedang dibangunkan, dipanggil PiCamera2, tetapi ia belum sedia untuk digunakan.
Buat masa ini, anda boleh menetapkan Pi anda ke mod kamera legasi untuk membolehkan PiCamera berfungsi. Soket kamera juga dilumpuhkan secara lalai, tetapi menghidupkan perisian kamera legasi secara automatik akan mengaktifkan soket tersebut.
-
Hidupkan Pi dan tunggu sehingga ia selesai boot.
-
Lancarkan VS Code, sama ada terus pada Pi, atau sambung melalui sambungan Remote SSH.
-
Jalankan arahan berikut dari terminal anda:
sudo raspi-config nonint do_legacy 0 sudo reboot
Ini akan menukar tetapan untuk mengaktifkan perisian kamera legasi, kemudian reboot Pi untuk membuat tetapan itu berkuat kuasa.
-
Tunggu Pi untuk reboot, kemudian lancarkan semula VS Code.
Tugas - programkan kamera
Programkan peranti.
-
Dari terminal, buat folder baru dalam direktori rumah pengguna
pi
yang dipanggilfruit-quality-detector
. Buat fail dalam folder ini yang dipanggilapp.py
. -
Buka folder ini dalam VS Code.
-
Untuk berinteraksi dengan kamera, anda boleh menggunakan pustaka Python PiCamera. Pasang pakej Pip untuk ini dengan arahan berikut:
pip3 install picamera
-
Tambahkan kod berikut ke fail
app.py
anda:import io import time from picamera import PiCamera
Kod ini mengimport beberapa pustaka yang diperlukan, termasuk pustaka
PiCamera
. -
Tambahkan kod berikut di bawah ini untuk memulakan kamera:
camera = PiCamera() camera.resolution = (640, 480) camera.rotation = 0 time.sleep(2)
Kod ini mencipta objek PiCamera, menetapkan resolusi kepada 640x480. Walaupun resolusi yang lebih tinggi disokong (sehingga 3280x2464), pengelas imej berfungsi pada imej yang jauh lebih kecil (227x227) jadi tidak perlu menangkap dan menghantar imej yang lebih besar.
Baris
camera.rotation = 0
menetapkan putaran imej. Kabel reben masuk ke bahagian bawah kamera, tetapi jika kamera anda diputar untuk memudahkannya mengarah ke item yang ingin anda klasifikasikan, maka anda boleh menukar baris ini kepada bilangan darjah putaran.Sebagai contoh, jika anda menggantung kabel reben di atas sesuatu supaya ia berada di bahagian atas kamera, maka tetapkan putaran kepada 180:
camera.rotation = 180
Kamera mengambil masa beberapa saat untuk memulakan, oleh itu baris
time.sleep(2)
. -
Tambahkan kod berikut di bawah ini untuk menangkap imej sebagai data binari:
image = io.BytesIO() camera.capture(image, 'jpeg') image.seek(0)
Kod ini mencipta objek
BytesIO
untuk menyimpan data binari. Imej dibaca dari kamera sebagai fail JPEG dan disimpan dalam objek ini. Objek ini mempunyai penunjuk kedudukan untuk mengetahui di mana ia berada dalam data supaya lebih banyak data boleh ditulis ke hujung jika diperlukan, jadi barisimage.seek(0)
menggerakkan kedudukan ini kembali ke permulaan supaya semua data boleh dibaca kemudian. -
Di bawah ini, tambahkan kod berikut untuk menyimpan imej ke fail:
with open('image.jpg', 'wb') as image_file: image_file.write(image.read())
Kod ini membuka fail yang dipanggil
image.jpg
untuk penulisan, kemudian membaca semua data dari objekBytesIO
dan menulisnya ke fail.💁 Anda boleh menangkap imej terus ke fail dan bukannya objek
BytesIO
dengan memberikan nama fail kepada panggilancamera.capture
. Sebab menggunakan objekBytesIO
adalah supaya kemudian dalam pelajaran ini anda boleh menghantar imej ke pengelas imej anda. -
Arahkan kamera ke sesuatu dan jalankan kod ini.
-
Imej akan ditangkap dan disimpan sebagai
image.jpg
dalam folder semasa. Anda akan melihat fail ini dalam penjelajah VS Code. Pilih fail untuk melihat imej. Jika ia memerlukan putaran, kemas kini bariscamera.rotation = 0
seperti yang diperlukan dan ambil gambar lain.
💁 Anda boleh menemui kod ini dalam folder code-camera/pi.
😀 Program kamera anda berjaya!
Penafian:
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI Co-op Translator. Walaupun kami berusaha untuk memastikan ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.