Analiza i przetwarzanie obrazów Pomiar pulsu za pomocą kamery Autor: Krzysztof Skowronek
Zawartość I. Założenia... 3 II. Realizacja... 3 III. Szczegóły implementacji... 4 IV. Interfejs... 5 V. Wyniki... 6 VI. Wnioski... 6
I. Założenia Celem projektu było stworzenie aplikacji umożliwiającej pomiar pulsu za pomocą kamery, na przykład wbudowanej w laptopa, wykorzystując delikatne zmiany koloru skóry twarzy ze względu na zmianę ukrwienia w trakcie cyklu bicia serca. Aby było to możliwe, na obrazie należy odnaleźć twarz. Dalszej obróbce podlega tylko ten obszar, nieco pomniejszony, tak by przedstawiał tylko skórę twarzy i jak najmniej otoczenia. Następnie z tego obszaru należy wyciągnąć średnią wartość pikseli kanału czerwonego. Przebieg tej średniej w czasie to nasz sygnał, z którego będziemy próbować wyliczyć tętno. Następnie taki sygnał poddawany jest transformacie Fouriera w celu rozłożeniu go na składowe o różnych częstotliwościach. Zakładamy, że mierzymy puls z zakresu 50 bpm 150 bpm, co przekłada się na częstotliwości 0.8 Hz i 2.5 Hz. Do transformaty stosujemy filtr pasmowo-przepustowy, oczyszczając sygnał głównie z wysokich częstotliwości, a pasmo odpowiadające pulsowi wyraźnie wzmacniamy. Kolejnym krokiem jest transformata odwrotna, z powrotem do dziedziny częstotliwości. Jej wynikiem jest sygnał dużo mniej poszarpany, przypominający sinusoidę o częstotliwości dominującej w pobranym sygnale. Ostatnim krokiem jest zastosowanie algorytmu opisanego w tej pracy do tak uzyskanego sygnału. Wyniki wyświetlany jest na ekranie. II. Realizacja Aplikacja została napisana w języku C#. Do stworzenia graficznego interfejsu użytkownika użyto WPF (Windows Presentation Foundation). Do analizy kolejnych klatek wykorzystano potęgę biblioteki OpenCV, z której przede wszystkim przydał się gotowy moduł do wykrywania twarzy. Dodatkowo pozwala ona na wygodne manipulowanie pikselami obrazu oraz obsługę zarówno strumienia klatek z kamery, jak i wczytanie klipu wideo z dysku. Funkcję realizującą transformatę Fouriera zawiera z kolei bardzo potężna biblioteka matematyczna dla platformy.net o nazwie AForge. Wyniki przedstawiono na ekranie na wykresach stworzonych za pomocą bardzo wygodnej i poręcznej biblioteki OxyPlot.
III. Szczegóły implementacji Cała praca aplikacji została podzielona na dwa wątki: jeden przetwarzający każdą kolejną klatkę i zapisujący sygnał do odpowiedniej zmiennej. Zastosowano tu technikę ruchomego okna czasowego, przez co zawsze analizowane jest tylko ostatnie 10 sekund sygnału. Rysunek 1. Przykład kodu wykorzystującego bibliotekę OpenCV. Jak widać, wykrycie twarzy na obrazie to jedna linijka. Na każdej klatce lokalizowana jest twarz, następnie wyliczana jest średnia wartość czerwonego obszaru ze znalezionego obszaru. Aby aplikacja mogła działać płynnie, klatka skalowana jest do bardzo małego rozmiaru w celu wykrycia twarzy, a następnie znaleziony obszar przenoszony jest na klatkę w większej rozdzielczości. Rysunek 2. Wyliczenie średniej wartości kanału czerwonego. Jak widać, aby zapewnić odpowiednią wydajność aplikacji, wywołanie jest asynchroniczne. Drugi wątek wykonuje swoje zadanie raz na sekundę i to on odpowiada za całość obliczeń. Wylicza on transformatę Fouriera z sygnału w przechowywanym oknie czasowym, filtruje ją, wzmacnia stukrotnie częstotliwości z zakresu ludzkiego pulsu i wylicza transformatę odwrotną. Na koniec, znów asynchronicznie, wywołuje funkcję wyliczającą puls.
IV. Interfejs Rysunek 3. Zrzut ekranu przedstawiający interfejs programu Jak widać na Rys. 3., główne okno programu podzielone jest na dwie części. Po lewej wyświetlane są kolejne klatki wraz z zaznaczoną wykrytą twarzą. Obecnie program obsługuje tylko jedną osobę naraz, ale w przyszłości jest szansa na równoczesny pomiar kilku osób. Po kliknięciu w obraz pojawia się opcja wyboru źródła: listowane wszystkie dostępne kamery oraz możliwy jest wybór klipu wideo do analizy. W lewym górnym rogu klatki znajdują się dwa liczniki: aktualna ilość przetwarzanych klatek na sekundę oraz średnia za ostatnie 5 sekund. W prawym górnym rogu klatki są również dwa liczniki (od lewej): średni puls z ostatnich kilku obliczeń oraz puls obliczony w ostatniej sekundzie. Oba te liczniki odświeżane są raz na sekundę. Z prawej strony umieszczono 4 wykresy (od góry): rejestrowany sygnał, pochodna odfiltrowanego sygnału (bo tak naprawdę z niej wyliczany jest puls, patrz wstęp), transformaty Fouriera przed i po filtracji i wzmocnieniu oraz na ostatnim, porównanie odfiltrowanej pochodnej z wygładzoną pochodną za pomocą średniej biegnącej. Pierwsze trzy wykresy przedstawiają całe okno czasowe, ostatni zaś tylko ostatnie dwie sekundy sygnału. Wszystkie wykresy odświeżane są raz na sekundę.
V. Wyniki Niestety, jest to metoda wielce niedokładna, ale dająca wynik zgodny z prawdą z błędem pomiarowym na poziomie 10-15 %. Wyniki odnoszono do pomiarów dokonanych aplikacją opisaną we wspomnianej we wstępie pracy. Niedokładność wynika z tego, że bardzo duży wpływ na pomiar mają nie tylko warunki zewnętrzne, ale także mimika twarzy w czasie jego wykonywania. Za przykład niech posłuży choćby Rysunek 3. Widoczne na nim skoki na pierwszym wykresie to mrugnięcia oczami widoczne tak wyraźnie tylko w tych warunkach oświetleniowych. Aby zwiększyć dokładność, a przede wszystkim stabilność pomiaru, należy tkwić nieruchomo w stałych warunkach oświetleniowych i ograniczyć mimikę do minimum. Kamera powinna być umieszczona na stabilnym podłożu. Jeśli stoi na biurku, nie należy się o nie opierać, gdyż to wystarczy do zaburzenia odczytu. Oświetlenie nie powinno być zbyt intensywne, ale jasne na tyle, by kamera oferowała 30 klatek na sekundę. Przykładowo, kamera zainstalowana w moim laptopie poniżej pewnego poziomu jasności przełączała się w tryb 15 klatek na sekundę, co przez chwilę prowadziło do błędnego wniosku, że kod nie jest dobrze zoptymalizowany. Dodatkowo, nietrudno zauważyć że wyniki nie są stabilne. Kolejne pomiary potrafią różnić się nawet o 200%, zwłaszcza jeśli twarz jest zbyt mocno oświetlona. Nie zmienia to faktu, że oscylują one wokół średniej wartości, która mniej więcej zgadza się z prawdziwym pulsem kręconej osoby. Program został przetestowany na kilku osobach i wyniki dla każdej pozostawały dobre. Kolejnym argumentem za poprawnością wyników jest zwiększona wyliczona wartość pulsu dla osoby po wypiciu kawy czy po intensywnym wysiłku fizycznym. Średnia zgodna jest w podanej granicy błędu pomiarowego 15% z realnym pulsem. VI. Wnioski Taki sposób pomiaru pulsu jest jak najbardziej możliwy, a osiągnięcie dokładności ciśnieniomierzy naramiennych nie powinno stanowić większego problemu, głównie dlatego, że nie jest to wysoko zawieszona poprzeczka. Z pewnością kolejnym krokiem poprawy dokładności jest wycinanie z analizowanego obszaru oczu i ust, aby ograniczyć wpływ mrugania i mimiki na wynik.