OGIEŃ NA JACHCIE. POŻAR ŚW. KATARZYNY W GDAŃSKU. Problemy monitoringu pożarowego obiektów zabytkowych. Planowanie potrzeb ochrony przeciwpożarowej z zastosowaniem standardów pierwszej pomocy ratowniczej[1]. Część 1

Zrób to sam. Kamera termowizyjna Część II

Autor: Jakub Sobek

W pierwszej części tego artykułu postawiliśmy sobie za cel zbudować swoją własną kamerę termowizyjną. Udało mi się opisać, jakie elementy będę potrzebne, aby fizycznie taką kamerę zbudować oraz w jakie dodatkowe narzędzia software’owe trzeba się wyposażyć. Na koniec obiecałem, że wkrótce opiszę, jak wszystkie te elementy ze sobą poskładać oraz jak taką kamerę zaprogramować. Zatem nadszedł czas, żeby zabrać się do pracy.

Oczekiwania i założenia
Zawsze kiedy rozpoczynamy jakiś projekt, warto zdefiniować jasno cel: Do czego tę kamerę możemy wykorzystać? Co może nam zaoferować? Ostateczny rezultat będzie zależał przede wszystkim od dwóch rzeczy: przetwornika obrazu oraz tego, w jaki sposób go zaprogramujemy.

Przetwornik obrazu, jaki użyłem do zbudowania kamery, ma rozdzielczość 80x60 pikseli i jest wyposażony w funkcję automatycznego wzmocnienia – AGC (ang. Automatic Gain Control). Proces AGC zmienia szeroki zakres dynamiki przetwornika termowizyjnego na zakres, który jest bardziej odpowiedni do wyświetlania obrazu. W przypadku tego przetwornika jest to konwersja obrazu 14-bitowego na obraz 8-bitowy. Niestety liniowe wzmocnienie obrazu nie zawsze daje zadowalającą jakość obrazu przy różnych rodzajach obserwowanej sceny. Przykładowo, kiedy w scenie jest zarówno obiekt bardzo gorący, jak i bardzo zimy, wówczas liniowe wzmocnienie może spowodować, że większość pikseli zostanie zmapowana do koloru czarnego lub białego. Na takim obrazie będzie bardzo mało pikseli pośrednich, odpowiadających pełnej skali szarości. Ze względu na te ograniczenia taki liniowy algorytm wzmocnienia AGC nie daje zadowalających rezultatów.

W wykorzystywanym przetworniku zastosowana została jednak bardziej optymalna metoda, która polega na analizie histogramu i jego wyrównaniu. W rezultacie szeroka skala szarości znajduje się w dominującej części obrazu. Obraz w skali szarości, który jest obrazem 8-bitowym, może zostać także poddany procesowi koloryzacji. W rezultacie otrzymujemy wówczas obraz 24-bitowy w różnych paletach barwnych. Dobór właściwej palety barwnej zależy wprost od aplikacji, gdzie kamera jest wykorzystywana. Wszędzie tam, gdzie jest wykorzystywana np. jako detektor, wówczas najczęściej stosowane są palety white-hot lub black-hot, które odpowiednio przypisują najcieplejszym obiektom kolor biały lub czarny. Możliwe jest także selektywne kolorowanie obrazu, gdzie obiekty najcieplejsze w danej scenie reprezentowane są np. przez kolor czerwony, a pozostała część obrazu jest w skali szarości. Wszędzie tam, gdzie analizowane są rozkłady temperatur, obraz wyświetlany jest najczęściej za pomocą różnych wariantów pełnej palety barwnej lub palet barwnych ograniczonych do wybranych kolorów. Oczywiście nie musimy się na konkretną paletę barwną decydować na etapie konfiguracji samego przetwornika obrazu. Obraz może być przez oprogramowanie pobierany w skali szarości, a dopiero później poddawany wybranej koloryzacji.

Choć rozdzielczość wybranego przetwornika nie jest wysoka, zastosowań dla naszej kamery może być naprawdę wiele. Jednym z nich może być wykorzystanie kamery jako prostego systemu alarmowego. W zupełnej ciemności taka kamera pozwala na detekcję osoby na dystansie nawet do 50 m. Dla tych, którzy są zainteresowani algorytmami związanymi z analizą obrazu, może to być świetna okazja, aby spróbować swoich sił w tej materii. Taka mała kamera może stać się także elementem niewielkiego drona. Rzesza użytkowników latających konstrukcji jest coraz większa i coraz częściej właśnie termowizja staje się jednym z podstawowych elementów wyposażenia. Kamera własnej konstrukcji może okazać się tanim i precyzyjnym sensorem do sterowania za pomocą gestu. Dzięki kamerze termowizyjnej łatwo jest zauważyć, w jakiej pozycji znajduje się dłoń użytkownika, jak ułożone są palce i jakie ruchy są wykonywane. To właśnie interfejsy użytkownika, sterowane za pomocą naszych ruchów, będą w przyszłości coraz bardziej popularne. Zastosowanie mogą znaleźć, i już znajdują, w przypadku sterowania gier komputerowych lub tych w urządzeniach mobilnych. Jest to także wygodna metoda do komunikacji z komputerem pokładowym, zainstalowanym w samochodzie. Nie musimy odrywać naszego wzroku, aby np. zmienić stację radiową lub wydać inne polecenia. Prowadzonych jest także wiele projektów, które rozwijają możliwość wprowadzania tekstów lub wręcz całych słów właśnie za pomocą naszych gestów. Przewaga takiego rozwiązania nad interfejsem opartym na zwykłej kamerze jest taka, że nasz sensor działa w każdych warunkach oświetleniowych i nie ma żadnych wytycznych, jakie musi spełniać tło. Istniejące na rynku rozwiązania oparte na systemach 3D wymagają zastosowania urządzeń mocnych obliczeniowo, kilku sensorów wizji oraz strukturalnego rzutowania światła na użytkownika. Przez te wszystkie elementy jest to rozwiązanie znacznie bardziej złożone.

W swoim projekcie spróbuję sprawdzić, na ile skutecznie można za pomocą przetwornika termowizyjnego o niskiej rozdzielczości zauważyć ludzką dłoń i czy szczegółowość obrazu będzie wystarczająca do rozpoznawania gestów.

Łączenie elementów
Komunikacja pomiędzy przetwornikiem termowizyjnym a platformą Raspberry Pi odbywa się przez protokół SPI (ang. Serial Peripheral Interface). Jest to szeregowy interfejs wykorzystywany do wymiany danych między małymi urządzeniami peryferyjnymi, jak np. czytnik kart, zegary czasu, przetworniki analogowo- cyfrowe, rejestry przesuwne czy – tak jak w tym przypadku – przetwornik termowizyjny.

Komunikacja z wykorzystaniem protokołu SPI odbywa się za pomocą szeregowej transmisji synchronicznej. Wyróżniamy w niej urządzenie MASTER (to, które steruje komunikacją) oraz SLAVE (to, które reaguje na polecenia MASTER). Istnieją dwie implementacje tego protokołu: sprzętowa oraz programowa. Implementacja programowa wymagana jest dla mikrokontrolerów, gdzie występuje generyczny port komunikacyjny. Wówczas komunikację typu SPI należy obsłużyć za pomocą własnego kodu, np. z wykorzystaniem metody bit banging. Program bezpośrednio ustawia i pobiera stan pinów mikrokontrolera i odpowiada za wszystkie parametry sygnału: zegar, poziomy i synchronizacja. Sprzętowa implementacja SPI pozwala na komunikację przez szeregowy interfejs, bez konieczności pisania kodu obsługującego proces komunikacji.

Protokół SPI korzysta z czterech sygnałów:

■ SCK (System Clock) – zegar do synchronizacji transmisji,

■ MOSI (Master Output/Slave Input) – przesyłanie danych z MASTER do SLAVE,

■ MISO (Master Input/Slave Output) – przesyłanie danych z SLAVE do MASTER,

■ CS (Chip Select) – wybór aktywnego urządzenia.

Sygnał CS, nazywany także SS (ang. Slave Select), pozwala na aktywację urządzenia lub przesłanie wiadomości, z adresem urządzenia, do którego ma trafić wiadomość. Jak łatwo też zauważyć, komunikacja sprzętowa odbywa się za pomocą 4 fizycznych linii, czyli konieczne będzie użycie 4 pinów. W przetworniku Lepton wykorzystywana jest odmiana tego protokołu, nazwana przez producenta VoSPI, która umożliwia w wydajny sposób przesyłać obraz. Komunikacja oparta jest na pakietach, dlatego nie jest wymagany sygnał zegarowy do sterowania przepływem. Dzięki temu dane z przetwornika mogą być pobierane w elastyczny sposób. W komunikacji z przetwornikiem termowizyjnym sygnał MOSI nie jest wykorzystywany, ponieważ nie odbywa się żadna komunikacja w kierunku przetwornika, wysyła on jedynie dane. W związku z tym, że pin ten nie jest używany, producent zaleca jego uziemienie.

Dodatkowo w przetworniku warto wykorzystać interfejs CCI/TWI (ang. Common Communication Interface). Sensor termowizyjny może bowiem działać w trybie domyślnym lub można go skonfigurować, wykorzystując przesłanie odpowiednich komend przez ten interfejs. Komunikacja za jego pośrednictwem jest podobna do popularnego I2C i odbywa się za pomocą dwóch linii: SDA (ang. Serial Data Line – linia danych) oraz SCL (ang. Serial Clock Line – linia zegara). Jedyną różnicą pomiędzy CCI w stosunku do I2C jest fakt, że wszystkie rejestry w przetworniku są rejestrami 16-bitowymi, zatem dozwolone są tylko transfery 16 bitowe. Wszystkie polecenia wysyłane przez ten interfejs mogą przybierać jedną z trzech postaci:

■ get – dane do odczytu,

■ set – zapis danych,

■ run – wykonanie wybranej funkcji.

Dzięki poleceniom wysyłanym przez CCI można np. włączyć lub wyłączyć AGC, zmienić obszar działania AGC poprzez AGC ROI, zmienić współczynnik tłumienia AGC .

Przetwornik termowizyjny Lepton musimy połączyć teraz z wybraną wcześniej platformą Raspberry Pi. Bardzo przydatną jej cechą jest złącze GPIO (ang. General Purpose Input/Output), czyli zestaw wielu pinów, do których możemy podłączać zewnętrze moduły. W założeniu producentów tej platformy, co można znaleźć w opisie, podano, że wyjście to ma służyć platformie do komunikacji ze światem zewnętrznym. Dzięki niemu mogą być pobierane dane z zewnętrznych czujników lub sygnały z innych komputerów i urządzeń. Wyjścia pozwalają na proste zapalenie diody LED, ale także przesyłanie wiadomości. Raspberry Pi może stać się elementem sterującym dla wielu zewnętrznych urządzeń. Odpowiednie oprogramowanie pozwoli na działanie w sposób autonomiczny, a platforma podłączona do sieci może być zdalnie sterowana z praktycznie dowolnego miejsca na świecie, np. za pomocą telefonu czy tabletu.

W tym projekcie złącze GPIO będzie szczególnie przydatne. Dzięki niemu nie tylko można zasilić bezpośrednio przetwornik termowizyjny, ale także możliwe jest skorzystanie z interfejsów VoSPI oraz CCI. Pozwoli nam to na pobieranie obrazu z przetwornika do Raspberry PI oraz na wysyłanie komend do przetwornika, w celu zmiany jego wybranych funkcji. Schemat połączenia wybranych pinów przetwornika ze złączem GPIO pokazano na rys. 3

Programowanie
Aby skorzystać z interfejsu SPI, będziemy potrzebowali zaprogramować urządzenie Raspberry Pi, tak aby pobierało dane z kamery. Do tego celu służyć może poniższy kod:

intresets = 0;
for(int j=0;j<PACKETS_PER_FRAME;j++)
{
read(spi_cs0_fd, result+sizeof(uint8_t)*PACKET_SIZE*j,
sizeof(uint8_t)*PACKET_SIZE);
intpacketNumber = result[j*PACKET_SIZE+1];
if(packetNumber != j)
{
j = -1;
resets += 1;
usleep(1000);
if(resets == 750)
{
SpiClosePort(0);
usleep(750000);
SpiOpenPort(0);
}
}}

Pętla ta wykonywana jest tyle razy, ile jest pakietów w danej ramce. Liczba ta wynosi 60 i jest zdefiniowana przez zmienną PACKETS_PER_FRAME. Następnie odczytywany jest port spi_cs0, dla którego bufor danych wynosi 9840 bajtów, i trafia on do tablicy result.

W przypadku zgubienia jakiegoś pakietu pętla zatrzymuje wykonywanie algorytmu na 1000 μs i bufor odczytywany jest ponownie. Powtarzane jest to 750 razy, a następnie port jest zamykany na 750 ms i otwierany ponownie. W ten sposób została rozwiązana resynchronizacja całego układu.

Po odczytaniu wartości z spi_cs0 należy wykonać operację zmiany kolejności bitów najbardziej znaczących z najmniej znaczącymi. Dodatkowo w pętli należy zrealizować funkcję wyszukiwania największej oraz najmniejszej wartości, co jest potrzebne, aby odczytane informacje odwzorować za pomocą palety barwnej.

Aby wartości odczytane z przetwornika zamienić na wartości z palety kolorów, należy wykonać przykładowy kod, gdzie wykorzystano bibliotekę OpenCV i obiekty Mat:

opencvmat = Mat::zeros(Size(width,height),CV_8UC3);
opencvmat_base = Mat::zeros(Size(width,height),CV_8UC1);
opencvmat_values = Mat::zeros(Size(width,height),CV_16
UC1);
float diff = maxValue - minValue;
float scale = 255/diff;
for(inti = 0;i < FRAME_SIZE_UINT16 ;i++)
{
if(i % PACKET_SIZE_UINT16 < 2)continue;
value = (frameBuffer[i] - minValue) * scale;
column = (i % PACKET_SIZE_UINT16 ) - 2;
row = i / PACKET_SIZE_UINT16;
Scalar color(colormap[3 * value],colormap[3 * value + 1],colormap[
3 *
value + 2]);
opencvmat.at<Vec3b>(Point(column,row))[0] = color[2];
opencvmat.at<Vec3b>(Point(column,row))[1] = color[1];
opencvmat.at<Vec3b>(Point(column,row))[2] = color[0];
opencvmat_base.at<uchar>(Point(column,row)) = value;
opencvmat_values.at<short>(Point(column,row)) =
(frameBuffer[i] -
inValue);
}

W zależności od wybranego sposobu rzutowania kolorów na różne palety barwne uzyskany efekt może być różny, jak przedstawiono na rys. 4.

Jak wspominałem wcześniej, zbudowana kamera może posłużyć do rozpoznawania gestów. Ze względu na wieloetapowość tego procesu nie opiszę go w tym artykule. Pragnę jedynie zwrócić uwagę, na ile czytelny jest obraz dłoni, którą możemy obserwować za pomocą zbudowanej kamery. Oprócz tego, że możemy skorzystać ze znanych algorytmów morfologicznych, aby oddzielić obraz od tła, to możemy także skorzystać z progowania temperaturowego. Kiedy bowiem patrzymy na ludzką dłoń, to zakładamy, że powinna mieć temperaturę 36,6 stopnia Celsjusza. Jako że jest to temperatura powierzchni, to temperatura ciała może być dodatkowo nieco wyższa lub niższa. Warto więc eksperymentalnie przyjąć pewien przedział temperaturowy do takiego progowania. Jest to niewątpliwe duża zaleta tego rozwiązania, której klasyczny system wizyjny nam nie może zaoferować. Dodatkowo można przyjąć założenie, że dłoń będzie największym obiektem w obrazie. Zatem po sprogowaniu obrazu można wyszukać największy obiekt, a pozostałe obiekty z obrazu mogą zostać odrzucone.

Koniec i początek
Jak widać, kamera termowizyjna daje bardzo dobre rezultaty i olbrzymie perspektywy. Teraz, kiedy mamy już obraz na naszej platformie Raspberry Pi, to możliwości eksperymentowania z nim są nieograniczone. Analiza obrazu w czasie rzeczywistym to dla tego rozwiązania żaden problem. Mam nadzieję, że tym artykułem udało mi się zainspirować do stworzenia swojej własnej kamery termowizyjnej. Złożenie kamery i otrzymanie obrazu dla wielu może być końcem tego projektu. Namawiam jednak gorąco do tego, aby był to jedynie początek dalszej przygody z termowizją, programowaniem i przetwarzaniem obrazów.

Przypisy:
[1] Diagram przedstawiający rozkład pinów (przyłączy) elementu lub urządzenia elektronicznego, lutowanego do PCB albo montowanego za pośrednictwem podstawki, oraz przypisanie sygnałów do poszczególnych pinów.

Źródło: SEC&AS, wydanie 6/2017, s. 64

Powiązane

Jak ustrzec komputer przed złośliwym oprogramowaniem? Oto najlepsze antywirusy na Windows 10

27.06.2017

Czym jest i jakie korzyści płyną z audytu bezpieczeństwa?

30.06.2017

Popularne

Zrób to sam. Kamera termowizyjna Część II
26.02.2018
Kamera termowizyjna. Część I
15.01.2018
Licencja na zakochanie.
02.09.2018

Sec&As

COPYRIGHT © 2017 RIPOSTA. WSZELKIE PRAWA ZASTRZEŻONE. PROJEKT I REALIZACJA: RIPOSTA