04 - Przetwarzanie obrazów z wykorzystaniem Raspberry Pi
Systemy Wbudowane i Przetwarzanie Brzegowe
Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej
Ćwiczenie laboratoryjne 4: Przetwarzanie obrazów z wykorzystaniem Raspberry Pi
Powrót do spisu treści ćwiczeń laboratoryjnych
Wstęp
W systemach opartych o jądro Linuxa (ang. Linux kernel) większość kamer (w szczególności kamery USB) jest obsługiwana przez sterownik V4L2 (Video for Linux 2). Podczas zajęć laboratoryjnych zrealizujemy przykładowe zadanie przetwarzania obrazów przy użyciu kamery Raspberry Pi. W tym celu wykorzystamy Raspberry Pi Camera Module 2, oraz złącze CSI (Camera Serial Interface) dostępne w urządzeniach Raspberry Pi.
Źródło grafiki: Getting started with the Camera Module
W celu poprawnego podłączenia kamery należy:
- Sprawdzić czy moduł Raspberry Pi jest wyłączony. Jeśli nie, należy go wyłączyć.
- Delikatnie podnieść plastikowy zacisk złącza CSI.
- Umieścić przewód taśmowy w złączu urządzenia, weryfikując czy złącza na dole przewodu taśmowego są skierowane w stronę styków portu.
- Docisnąć plastikowy zacisk złącza CSI upewniając się że jest on dociśnięty, a przewód taśmowy nie wysuwa się ze złącza.
- Zasilić Raspberry Pi.
Aby zweryfikować poprawne podłączenie kamery należy sprawdzić czy w katalogu /dev
znajduje się video0
:
ls /dev/video*
Obsługa kamery
Narzędzia linii poleceń
- libcamera-still - polecenie rejestrujące i zapisujące pojedynczą klatkę obrazu z kamery.
libcamera-still --nopreview -o img.jpg
- libcamera-vid - polecenie rejestrujące i zapisujące film wideo z kamery o zadanej długości w milisekundach.
libcamera-vid --nopreview --codec mjpeg -o video.mjpeg -t 10000
Uwaga: W przypadku wystąpienia błędu związanego z brakiem dekodera H.264 należy doinstalować niezbedne pakiety poleceniem: sudo apt install libavcodec-extra gstreamer1.0-plugins-ugly gstreamer1.0-libav
Uwaga: Pomiędzy Raspberry Pi, a komputerem wykorzystywanym w czasie laboratorium pliki można przesyłać korzystając z polecenia scp: scp pi@<ADRES IP>:/home/pi/img.jpg /home/lab/Downloads/img.jpg
. Alternatywną opcją jest wykorzystanie przeglądarki plików zgodnie z poniższym rysunkiem. W miejscu adres serwera należy wpisać: sftp://pi@<ADRES IP>/
.
Zadanie 1. Wykorzystując pojedynczego polecenie libcamera-still
zarejestruj serię 20 zdjęć w odstępie 1 sekundy tak aby z ich pomocą można było wykonać film poklatkowy (ang. timelapse). Zarejestrowane obrazy zapisuj pod nazwą %04d_img.jpg
. Przykładowy film poklatkowy wykonany z wykorzystaniem kamery Raspberry Pi - YouTube.
Komenda libcamera-still
umożliwia jedynie rejestrację zdjęć. W celu zapisania filmu poklatkowego należy wykorzystać pakiet ffmpeg
. W tym celu zainstaluj go poleceniem:
sudo apt update && sudo apt install ffmpeg
A następnie wywołaj komendę:
ffmpeg -r 10 -i %4d_img.jpg -r 10 -vcodec libx264 -vf scale=1280:720 timelapse.mp4
Gdzie flaga -r
oznacza liczbę klatek na sekundę pliku wejściowego i wyjściowego (mogą być różne), flaga -i
określa plik (pliki) wejściowy, flaga -vcodec
oznacza kodowanie wideo, a flaga -vf
oznacza filtr wideo. Natomiast wartości 1280:720
określają rozdzielczość wyjściowego filmu poklatkowego.
Biblioteka OpenCV
OpenCV jest open-source'ową biblioteką do przetwarzania obrazów oraz wideo. Udostępnia wiele funkcji do przetwarzania obrazów, służących do detekcji cech, twarzy, a także wykrywania i śledzenia obiektów. Biblioteka jest dostępna dla wielu języków programowania, w tym również dla języka Python, a także dla wielu platform np. urządzeń brzegowych opartych o system operacyjny Linux.
W celu wykorzystania biblioteki OpenCV należy zainstalować ją wraz z zależnościami zgodnie z poniższymi instrukcjami:
sudo apt install libatlas3-base libgstreamer1.0-0
Następnie poleceniem pip3 install opencv-python
(wewnątrz uruchomionego środowiska wirtualnego stworzonego podczas wczęśniejszych zajęć) należy zainstalować najnowszą wersję bibliotekę OpenCV.
Zadanie 2. Wykorzystując bibliotekę Picamera2 do odczytu obrazu z kamery oraz klasyfikatory kaskadowe oparte na cechach Haar z biblioteki OpenCV, przygotuj program, który będzie wykrywał twarze na obrazie z kamery. Program powinien na całym obrazie zaznaczać wykryte twarze prostokątną ramką dopasowania, a następnie wskazane obszary zainteresowania wycinać i zapisywać w ustandaryzowanym rozmiarze np. 100x100 pikseli. Do tego zadania należy wykorzystać klasyfikator kaskadowy oparty na cechach Haara, który można znaleźć w repozytorium OpenCV.
Uwaga: Ze względu na ograniczone możliwości wykorzystania środowiska graficznego na urządzeniu Raspberry Pi, zadanie to można zrealizować, we wstępnej wersji, na komputerze PC.