Logo FORBOT.pl - darmowe kursy elektroniki, Arduino, Raspberry Pi
Prowadniki kablowe dla robotów zaprojektowane do ruchów w trzech osiach

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. Niestety podgląd nie działa przez VNC.

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

Administrator
16:12, 13.02.2018 #1

Dodatkowe dwie dobre wiadomości ;) Po pierwsze, kolejny odcinek kursu Raspberry Pi pojawi się jeszcze w tym tygodniu, a po drugie właśnie dodałem informację o tematach kilku kolejnych artykułów z tej serii - są one dostępne w pierwszej części: Kurs Raspberry Pi od podstaw – #1 – wstęp, spis treści

16:44, 13.02.2018 #2

Tak z ciekawości... Będzie Python 2 czy 3?

Odpowiedź uzasadnij :)

19:49, 13.02.2018 #3

Mam pytanie, czy w drugiej części będzie jak stremować obraz na serwer ftp, po wykryciu ruchu, oraz informacja jak przesłać powiadomienie o wykryciu ruchu ze zdjęciem na e-mail?

Administrator
20:48, 13.02.2018 #4

ethanak, pozwól, że wstrzymamy się teraz z tą informacją - obiecuję jednak, że zrobimy krótki wstęp informacyjny "o co chodzi" z tymi wersjami Pythona ;)

Tbomek, w kolejnej części (tak jak napisałem w artykule) skupimy się na filmach. Projekt, który opisujesz będzie dobrym przykładem, gdy zajmiemy się Pythonem - dopisuję do listy pomysłów. Dzięki za sugestie!

22:58, 13.02.2018 #5

fajny ten artykuł! dowiedziałem się paru nowych rzeczy :)

jednak

"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."

proszę o wyjaśnienie, dlaczego tak jest.

ciesze się, że tym razem kolejny artykuł pojawi się szybciej oraz dopisane tematy kolejnych też trafiają w to czego chce się dowiedzieć :)

mogłaby też pojawić się jakaś instrukcja jak skonfigurować podgląd z kamery ip lub chociaż usb, a najlepiej z obu.

ethanak napisał/a:

Tak z ciekawości... Będzie Python 2 czy 3?

Odpowiedź uzasadnij :)

3 najlepiej, nowszy.

23:47, 13.02.2018 #6

Pierwsze części kursu mnie troszeczkę załamały... :/

Ale ta część i dalsza perspektywa - super sprawa :)

Dziękuję twórcom i całej załodze.

23:49, 13.02.2018 #7

Kibzik napisał/a:

Pierwsze części kursu mnie troszeczkę załamały... :/

Ale ta część i dalsza perspektywa - super sprawa :)

Dziękuję twórcom i całej załodze.

też się przyznam, że wcześniejsze mnie trochę zawiodły..

oby teraz było co najmniej tyle ciekawej wiedzy w każdym artykule co w tym

8:01, 14.02.2018 #8

Jak ta kamera radzi sobie w nocy przy oświetleniu?

11:51, 14.02.2018 #9

Rozwiązanie kamera + Raspberry jest bardzo ciekawe, jednak... do zastosowania nad którym pracuję jedna kamera nie wystarczy. Czy jest możliwość podłączenia większej liczby kamer (wystarczą dwie)? Najlepiej by było, gdyby mogły wykonywać zdjęcia praktycznie równocześnie, choć synchronizacja z dokładnością do 50ms jest wystarczająca..

12:06, 14.02.2018 #10

r_bot, do zdjęć nocnych może Cię zainteresować kamera bez filtru podczerwieni: https://botland.com.pl/kamery-do-raspberry-pi/6128-raspberry-pi-noir-camera-hd-v2-8mpx-kamera-nocna-dla-raspberry-pi.html

dusia, są przejściówki do podłączenia 4 kamer. Nie testowałem, a cena raczej zaporowa. Możesz podłączyć dodatkową kamerę po usb, albo użyć dwóch raspberry - to wbrew pozorom ciekawa opcja i pozwala na faktycznie jednoczesne wykonanie zdjęć. Testowałem 250 rpi, każde z własną kamerą i działało bez zarzutu.

15:16, 14.02.2018 #11

Ja mam pytanie odnośnie programu "Motion". Wiem, że bez problemu można wyświetlić współrzędne (X, Y) obiektu, który jest w ruchu na ekranie, natomiast czy te dane można wysłać np. do pliku tekstowego ?

Ostatecznie, zawsze można edytować pliku źródłowe i dostosować je do swoich potrzeb.

15:58, 14.02.2018 #12

Elvis napisał/a:

r_bot, do zdjęć nocnych może Cię zainteresować kamera bez filtru podczerwieni: https://botland.com.pl/kamery-do-raspberry-pi/6128-raspberry-pi-noir-camera-hd-v2-8mpx-kamera-nocna-dla-raspberry-pi.html

tutaj film udowadniający, że ta kamera rzeczywiście daje rade:

MacGyver napisał/a:

Ja mam pytanie odnośnie programu "Motion". Wiem, że bez problemu można wyświetlić współrzędne (X, Y) obiektu, który jest w ruchu na ekranie, natomiast czy te dane można wysłać np. do pliku tekstowego ?

Ostatecznie, zawsze można edytować pliku źródłowe i dostosować je do swoich potrzeb.

chodzi Ci o to, że jak wyświetlisz te współrzędne w konsoli to by wysłało to do pliku ?

jeśli tak to:

*komenda na wyświetlenie współrzednych* > nazwaPliku.txt

16:06, 14.02.2018 #13

Po każdym zdarzeniu można uruchomić skrypt. Nie mogę teraz sprawdzić czy na pewno współrzędne obszaru ruchu są przekazywane do skryptu, ale jest na to metoda. Motion podobnie jak wiēkszość programöw dla linuka jest dostępny wraz z kodem źródłowym. Można więc dodać zapis do pliku bardzo łatwo - to zwykły program w C.

18:32, 14.02.2018 #14

Inari: Gdyby koordynaty wyświetlały się w konsoli, nie byłoby problemu ;). Chodzi o to, że te dane zostają dodane do streamu online tak jak ma to miejsce w FPV. Pytanie czy z poziomu programu Motion można te dane w jakiś sposób poddać obróbce, czy to wysyłając po UDP, MySQL, czy może po prostu eksportując je bezpośrednio do pliku.

Elvis:

Właśnie w tym problem, że średnio mi to chciało działać, jak to testowałem. Z edycją plików źródłowych nie ma problemu. Wystarczy zmienne location.x, location.y poddać obróbce, ale zastanawia mnie czy da się to ugryźć prościej bez kompilacji plików.

Administrator
19:12, 14.02.2018 #15

Odnosząc się do pierwszy komentarzy: miło słyszeć, że kurs się podoba ;) Przy okazji zwróćcie uwagę, że w tym artykule wykorzystaliśmy informacje ze wszystkich poprzednich częśći: instalacja systemu, łączność z siecią, SSH, podstawy Linuksa, edytor nano... Wszystko było potrzebne, aby teraz swobodnie działać z malinką, czyli m.in. właśnie kamerą ;)

22:04, 15.02.2018 #16

MacGyver, wydaje mi się, że to czego szukasz to opcja track_generic_move w pliku konfiguracyjnym programu motion. Nie testowałem tej opcji i prawdę mówiąc znalazłem ją czytając kod źródłowy programu, ale wydaje mi się, że można ją wykorzystać.

Zobacz wszystkie komentarze (20) na forum »

Dodaj komentarz