Kurs Raspberry Pi – #10 – kamera, zdjęcia, transmisja obrazu

Kurs Raspberry Pi – #10 – kamera, zdjęcia, transmisja obrazu

Do tej pory omówiliśmy najważniejsze tematy związane z instalacją i konfiguracją Raspberry Pi. Pora wykorzystać zdobyte umiejętności i przejść do wykorzystywania peryferiów.

Zaczynamy od kamery! Dzięki niej możliwe jest między innymi robienie zdjęć, transmitowanie obrazu przez sieć i wykrywanie ruchu.

Wielu początkujących zastanawia się jak robić zdjęcia kamerą na Raspberry Pi, jak wykrywać ruch oraz jak transmitować obraz przez sieć. Właśnie te 3 scenariusze sprawdzimy w tej części kursu.

Do RPi można podłączyć wiele różnych kamer. My skupiamy się na wykorzystaniu kamery dedykowanej malince, czyli na Raspberry Pi Camera HD v2 (najnowszy model w momencie publikacji artykułu).

Parametry kamery

Na początek kilka słów o parametrach technicznych kamery:

  • Rozdzielczość maksymalna: 8 Mpx (3280x2464),
  • Tryby wideo: 1080p30 (Full-HD), 720p60, 640x480p90 (VGA),
  • Interfejs: CSI,
  • Masa: 3g,
  • Wymiary: 25x24x9 mm.

Kamera niewątpliwie charakteryzuje się niewielkimi wymiarami oraz masą, dzięki czemu łatwo może być wykorzystana we własnych konstrukcjach. Oferuje przy tym wysoką rozdzielczość (8 Mpx) oraz sprzętową akcelerację kodowania obrazu (JPEG i H.264).

Kamera używana w kursie.

Interfejs CSI

Większość kamerek używa interfejsu USB, który jest stosunkowo powolny, więc może powodować pewne problemy. Co więcej, kamera korzystająca z USB powoduje bardzo duże wykorzystanie pasma tego interfejsu, co może utrudniać pracę innych urządzeń podłączonych do tej magistrali.

Zestaw elementów do kursu

Gwarancja pomocy na forum Błyskawiczna wysyłka

Elementy niezbędne do wykonania wszystkich ćwiczeń z kursu podstaw Rasberry Pi dostępne są w formie gotowych zestawów!

Kup w Botland.com.pl

Moduł Raspberry Pi Camera HD korzysta z interfejsu CSI (ang. Camera Serial Interface), który jest dedykowany właśnie do kamer. Dzięki temu całość nie obciąża magistrali USB. Co więcej interfejs ten jest wspierany przez akcelerator graficzny (GPU) wbudowany w Raspberry Pi.

Podłączenie kamery do Raspberry Pi

Zaczynamy od podłączenia kamery, co ogranicza się jedynie do wpięcia taśmy:

  • Na Raspberry Pi taśmę wpinamy w złącze opisane jako CAMERA. Taśma powinna być skierowana srebrnymi stykami w stronę złącza HDMI.
  • Na kamerze taśmę wpinamy w taki sposób, aby srebrne styki były skierowane w stronę obiektywu.

Podczas podłączania taśmy należy: podnieść blokadę złącza, wsunąć taśmę i docisnąć blokadę złącza. Wciskanie lub wyciąganie przewodu bez podniesionej blokady może doprowadzić do uszkodzeń mechanicznych!

Sposób montażu kamery w obudowie aktualnie nie jest najważniejszy. Można ją przykładowo przykręcić z przodu obudowy lub na górnej klapce. Nie trzeba się przejmować ułożeniem kamery, obraz można obrócić programowo. My do testów korzystaliśmy z takich dwóch ustawień:

Uruchomienie kamery na Raspberry Pi

Gdy wszystko będzie już podłączone, uruchamiamy Raspberry Pi i łączymy się z nią zdalnie przez SSH. Po starcie systemu konieczne jest włączenie obsługi nowego peryferium. W tym celu wykorzystujemy znany już nam program raspi-config:

W głównym menu wybieramy opcję Interfacing Options, a następnie Camera. Program zapyta czy chcemy uruchomić kamerę na co oczywiście się zgadzamy. Na końcu potwierdzamy również chęć zrestartowania malinki.

Robienie zdjęć na Raspberry Pi z raspistill

Zaczynamy od podstawowej funkcji, czyli robienia zdjęć. W tym celu wykorzystamy program raspistill. Podstawowe wykorzystanie programu do zrobienia zdjęcia jest proste. Wystarczy wpisać polecenie:

Zamiast test.jpg możemy podać dowolną nazwę pliku. Zdjęcie zostanie zrobione dokładnie 5 sekund po wydaniu powyższego polecenia. Plik test.jpg zostanie zapisany w katalogu, z którego uruchomiliśmy program raspistill.

Korzystając z poznanego wcześniej polecenia ls możemy sprawdzić czy plik faktycznie powstał i ile miejsca zajmuje w pamięci. Zdjęcie jest "dość ciężkie", dokładna wielkość zależy od fotografowanego obrazu, jednak przeważnie należy się spodziewać kilku megabajtów.

Sprawdzamy czy zdjęcie faktycznie powstało.

Jeśli do malinki mielibyśmy podłączony monitor przez HDMI, to podczas robienia zdjęcia na ekranie zobaczylibyśmy podgląd obrazu z kamery. Podgląd widoku z kamery obsługiwany jest sprzętowo przez GPU, nie zużywa więc czasu procesora, ale nie jest widoczny jeśli łączymy się za pomocą VNC*.

*Aktualizacja: podgląd przez VNC nie jest domyślnie dostępny, ale można go włączyć korzystając z eksperymentalnej opcji, która znajduje się w ustawieniach serwera. W tym celu klikamy w ikonkę serwera VNC na RPi, a następnie rozwijamy menu (3 poziome kreski w prawym górnym rogu okna). Później klikamy w  Options > Troubleshooting i zaznaczamy Enable experimental direct capture mode.

Dzięki tej opcji możliwy będzie podgląd obrazu widzianego przez kamerę.

Warto zobaczyć jak wyszło nam pierwsze zdjęcie. Jeśli mamy podłączony monitor lub używamy VNC do podglądu obrazu to wystarczy odszukać zdjęcie i kliknąć na nie dwa razy w celu wyświetlenia zdjęcia. Można również zainstalować inne programy pozwalające na podglądanie zdjęć (np. eog lub fbi).

Jeśli łączymy się z malinką zdalnie to najwygodniej będzie podejrzeć zdjęcie przez omówiony wcześniej WinSCP. Łączymy się z Raspberry Pi, ściągamy zdjęcie i oglądamy na naszym PC:

O to jest - nasze pierwsze zdjęcie wykonane za pomocą Raspberry Pi! Tym razem niestety zdjęcie wyszło obrócone, ale do tego jeszcze wrócimy.

Regulacja ostrości

Jeśli zdjęcia są rozmyte to kręcąc obiektywem kamery możemy zmienić ustawioną ostrość. Operację należy przeprowadzić bardzo delikatnie ręcznie lub jakimś małym narzędziem. Podczas regulacji warto zachować ostrożność, ponieważ łatwo zarysować soczewkę!

Element, którym kręcimy w celu regulacji ostrości.

Jak wyłączyć podgląd?

Pierwszym parametrem, który warto poznać jest ten, który wyłączy nam podgląd - działa on tylko przy podpiętym monitorze, więc użyteczność tej funkcji jest ograniczona. Niechciany podgląd wyłączamy dodając opcję -n:

Jak zmienić opóźnienie robienia zdjęcia?

Pewnym zaskoczeniem może być czas robienia zdjęcia. Nie ma już podglądu, ale nadal trzeba czekać 5 sekund. Na szczęście czas "robienia zdjęcia" można zmienić za pomocą opcji -t. Jej parametrem jest opóźnienie wykonania zdjęcia wyrażone w milisekundach.

Przetestujmy jak to działa:

Nie bez powodu użyliśmy opóźnienia 100 ms. Przy bardzo małych wartościach pojawiają się pewne problemy, np. użycie 1 ms daje czarny obraz, a niewielkie wartości powodują przekłamania kolorów. Prawdopodobnie automatyka balansu bieli potrzebuje kilku klatek dla dobrania ustawień. Stąd dla bezpieczeństwa ustawiamy 100 ms. Jest to czas, w którym kamera zdąży się uruchomić i ustawi odpowiednie opcje.

Jak obrócić obraz?

Jeśli chcemy obrócić obraz to nie musimy odkręcać kamery. Wystarczy skorzystać z parametru -rot, który obraca obraz o wybrany kąt będący wielokrotnością 90°.

Obrócone zdjęcie:

Obrócone zdjęcie z Raspberry Pi (nr rejestracyjne zostały zamazane ręcznie).

Jak odbić obraz w pionie/poziomie?

Czasem okazuje się, że uzyskany obraz jest odbity w pionie lub poziomie. Możemy oczywiście przerobić nasze urządzenie, jednak znaczenie łatwiej użyć opcji odbicia lustrzanego. Do dyspozycji mamy odbicie w poziomie (-hf), jak i w pionie (-vf):

Jak zmienić rozdzielczość zdjęcia?

Nie zawsze interesuje nas najwyższa rozdzielczość, możemy zaoszczędzić sporo miejsca zmniejszając wielkość pobieranego obrazu. Szerokość ustawiamy opcją -w, a wysokość za pomocą -h.

Przykładowo możemy wykonać zdjęcie w standardowej rozdzielczości VGA. Jeśli porównamy później wielkość utworzonych plików, szybko zobaczymy dużą różnicę np. 200kB zamiast 4MB.

Porównanie wielkości plików:

Zdjęcie wynikowe w małej rozdzielczości:

Zdjęcie VGA z Raspberry Pi (nr rejestracyjne zostały zamazane ręcznie).

Jak wstawić datę w nazwie pliku?

Program raspistill może być uruchamiany automatycznie, np. co określony czas lub po wykryciu określonego zdarzenia. W takiej sytuacji wygodnie byłoby móc zapisywać wiele plików, a nie za każdym razem nadpisywać ten sam test.jpg. Program raspistill posiada dwie opcje pozwalające na użycie aktualnego czasu w nazwie pliku.

Opcja -dt pozwala na dodanie do nazwy pliku aktualnej daty i godziny. Natomiast parametr -ts dodaje tzw. timestamp, czyli liczbę sekund od 1 stycznia 1970 roku (jest to tradycyjna metoda reprezentacji czasu w systemach Unix). Aby wykorzystać te możliwości w nazwie pliku musimy wstawić znacznik %d, który zostanie zastąpiony datą zrobienia zdjęcia.

Dla testu możemy wydać dwa następujące polecenia:

U nas pierwsze polecenie utworzyło plik o nazwie test_121141040.jpg, a drugie test_1516543897.jpg (przetestowane 21 stycznia o 14:10:40).

Pozostałe ustawienia raspistill

Opcji programu jest jeszcze sporo, warto poświęcić chwilę na ich poznanie. Najważniejsze informacje znajdziemy w opisie, który pojawia się po wywołaniu polecenia raspistill bez żadnego parametru.

Szczegóły znaleźć można w opisie:

Transmisja obrazu przez sieć - pakiet Motion

Drugim równie ciekawym zastosowaniem dla kamery Raspberry Pi jest pakiet Motion, który pozwala między innymi transmitować obraz przez sieć. Co więcej, może on być również wykorzystany do śledzenia ruchu obiektów.

Zaczynamy od instalacji programu:

Domyślnie instalowana wersja pakietu Motion nie ma wbudowanego wsparcia dla naszej kamery, więc musimy teraz zainstalować odpowiedni sterownik: Video4Linux (V4L). W tym celu wydajemy polecenie:

Teraz w katalogu /dev pojawi się nowe urządzenie, które będzie odpowiadało kamerce: /dev/video0.

Zainstalowany pakiet Motion posiada ogromne możliwości i mnóstwo dostępnych opcji. Domyślny plik z ustawieniami to /etc/motion/motion.conf. Dostęp do katalogu /etc wymaga praw administratora, więc plik edytujemy poleceniem:

Po uruchomieniu pliku musimy wprowadzić kilka ważnych zmian. Po pierwsze odszukujemy linię, w której znajduje się opcja stream_localhost. Domyślnie jest ona włączona (on), zmieniamy ją na off.

Zmiana parametru stream_localhost.

Zapisujemy plik i z niego wychodzimy. Następnie uruchamiamy pakiet Motion poleceniem:

Gdy program wystartuje, na naszym komputerze PC uruchamiamy przeglądarkę internetową. W pasek adresu wpisujemy adres IP malinki z portem 8081 (np. http://192.168.0.25:8081/). Po chwili powinniśmy zobaczyć malutki stream z naszej kamerki (1 FPS):

Pierwszy podgląd obrazu w przeglądarce.

Jak zwiększyć FPS?

Transmisja w obecnej formie jest mocno ograniczona, więc wypadałoby zmienić kolejne opcje w pliku konfiguracyjnym. Zaczynamy od znalezienia miejsca na wpisanie dwóch wartości:

  • framerate (ustawiamy na 20),
  • stream_maxrate (ustawiamy na 20).

Zapisujemy ustawienia i uruchamiamy program ponownie. Tym razem obraz w przeglądarce powinien być już zdecydowanie lepszy:

Zwiększona liczba FPS.

Jak zwiększyć rozdzielczość?

Kolejną zmianą, którą warto wprowadzić jest zwiększenie rozdzielczości obrazu. Zmieniamy dwie opcje:

  • width (ustawiamy na 640),
  • height (ustawiamy na 480).

Zapisujemy plik konfiguracyjny i uruchamiamy podgląd:

Większa rozdzielczość w podglądzie generowanym przez Motion.

Od teraz nasze Raspberry Pi może posłużyć jako prosta kamera do monitoringu!

Wykrywanie ruchu na Raspberry Pi

Jak widzimy zmieniliśmy Raspberry Pi w kamerkę internetową. Warto pamiętać, że pakiet Motion znacznie przewyższa możliwości typowych kamerek. Pozwala na wykrywanie ruchu, generowanie zdarzeń po wykryciu intruza, automatyczne robienie zdjęć lub filmów, powiadamianie o zdarzeniach itd.

Dla testu można uruchomić np. opcję odpowiadającą za śledzenie ruchu. W tym celu wystarczy w pliku konfiguracyjnym włączyć opcję, która nazywa się locate_motion_mode (zmieniamy z off na on). Od teraz na transmitowanym obrazie ruchome elementy będą obrysowane prostokątem. Aby przedmiot był obrysowany czerwony prostokątem należy zmienić jeszcze  locate_motion_style na redbox.

Wykrywanie ruchu przez Raspberry Pi i pakiet Motion.

Uruchamianie transmisji w tle

Powyższy sposób uruchamiana pakietu Motion sprawiał, że podczas działania programu nasz terminal był zablokowany i nie mogliśmy nic w nim zrobić. Raspberry Pi może wykonywać wiele zadań, więc szkoda "blokować" sobie malinkę jednym programem. Bardzo łatwo możemy sprawić, że Motion uruchomi się w tle, czyli jako usługa (programy takie nazywa się jako daemon/demony - więcej na ten temat znaleźć można na Wikipedii).

Aby było to możliwe możemy:

  • Wariant 1: zmienić w pliku konfiguracyjnym opcję daemon z off na on
  • Wariant 2: uruchamiać program z parametrem -b

Do sterowania usługami w Linuksie używa się programu systemctl:

  • Wyświetlenie statusu: sudo systemctl status motion.service
  • Zatrzymanie usługi: sudo systemctl stop motion.service
  • Uruchomienie usługi: sudo systemctl start motion.service

Przykład korzystania z usług w praktyce:

Sterowanie usługą w tle.

Gdy usługa jest uruchomiona w tle można włączyć opisany wcześniej program htop, którym da się podejrzeć aktualne zużycie zasobów Raspberry Pi:

Zużycie zasobów Raspberry Pi przez Motion.

Podsumowanie

Za nami pierwsze eksperymenty z kamerą. W kolejnym odcinku zajmiemy się nagrywaniem filmów: zwykłych, poklatkowych (timelapsów) oraz w zwolnionym tempie (slowmotion). Przed przejściem do kolejnej części kursu warto pobawić się parametrami raspistill, ponieważ program ten będzie nam jeszcze potrzebny.

Autor: Piotr Bugalski
Ilustracje: Piotr Adamczyk
Redakcja: Damian Szymański

Nawigacja kursu

kamera, kurs, kursRaspberryPi, RaspberryPi, stream, zdjęcia

Komentarze

Trwa przerwa techniczna - komentarze do tego wpisu są dostępne na forum: