Spisu treści:

CribSense: bezdotykowa niania wideo oparta na wideo: 9 kroków (ze zdjęciami)
CribSense: bezdotykowa niania wideo oparta na wideo: 9 kroków (ze zdjęciami)

Wideo: CribSense: bezdotykowa niania wideo oparta na wideo: 9 kroków (ze zdjęciami)

Wideo: CribSense: bezdotykowa niania wideo oparta na wideo: 9 kroków (ze zdjęciami)
Wideo: CribSenseSetup 2024, Listopad
Anonim
CribSense: bezdotykowa niania wideo oparta na wideo
CribSense: bezdotykowa niania wideo oparta na wideo
CribSense: bezdotykowa niania wideo oparta na wideo
CribSense: bezdotykowa niania wideo oparta na wideo

CribSense to bezdotykowa elektroniczna niania oparta na wideo, którą możesz wykonać samodzielnie bez rozbijania banku

CribSense to implementacja powiększenia wideo w języku C++ dostrojona do działania na Raspberry Pi 3 Model B. W weekend możesz skonfigurować własną nianię na łóżeczku, która podniesie alarm, jeśli dziecko przestanie się poruszać. Jako bonus, całe oprogramowanie jest bezpłatne do celów niekomercyjnych i można je łatwo rozszerzać.

Pełne repozytorium zawierające pliki źródłowe i dokumentację można znaleźć pod adresem

Chociaż uważamy, że CribSense jest całkiem zabawny, należy pamiętać, że w rzeczywistości nie jest to certyfikowane, niezawodne urządzenie zabezpieczające. Oznacza to, że aby działał, musi być odpowiednio skonfigurowany i mieć dobrze kontrolowane środowisko. Na przykład, jeśli nie jest dobrze skalibrowany i/lub środowisko w filmie nie sprzyja powiększaniu wideo, możesz nie być w stanie z niego korzystać. Zrobiliśmy to jako zabawny projekt, aby zobaczyć, jak dobrze możemy mieć oprogramowanie wymagające dużej mocy obliczeniowej, takie jak powiększanie wideo, działające na sprzęcie o ograniczonej mocy obliczeniowej, takim jak Raspberry Pi. Każdy prawdziwy produkt wymagałby znacznie więcej testów niż my. Jeśli więc korzystasz z tego projektu, weź go za to, czym jest: krótka eksploracja powiększenia wideo na Pi.

Czego będziesz potrzebować:

Raspberry Pi + kamera + narzędzia konfiguracyjne:

  • Raspberry Pi 3 Model B
  • Zasilacz Micro USB 5V 2.5A
  • Moduł kamery Raspberry Pi NoIR V2
  • Karta MicroSD (użyliśmy karty 16 GB klasy 10)
  • Elastyczny kabel do kamery Raspberry Pi (12")
  • Głośniki z wejściem 3,5 mm
  • Monitor HDMI
  • Klawiatura USB
  • Mysz USB
  • [opcjonalnie] Radiator Raspberry Pi (jeśli martwisz się o ciepło, możesz przykleić jeden z nich do swojego Pi)

Obwód diody IR do pracy przy słabym oświetleniu:

  • [3x] Diody 1N4001
  • Rezystor 1 Ohm, 1 W
  • 1W IR LED
  • 2 przewody do podpięcia diody LED do Pi
  • Lutownica

Podwozie:

  • Dostęp do drukarki 3D (minimalna objętość kompilacji = 9,9 "dł. x 7,8" szer. x 5,9" wys.), aby wydrukować nasze podwozie. Możesz jednak zbudować własną.
  • Klej (dowolny rodzaj kleju będzie działał, ale do prototypowania zalecany jest klej na gorąco).

Krok 1: Warunki wstępne

Zanim zaczniesz nasz przewodnik krok po kroku, powinieneś już mieć zainstalowaną najnowszą wersję Raspbian na karcie SD i upewnić się, że Twoje Pi działa. Będziesz także musiał włączyć moduł kamery, zanim uzyskasz dostęp do kamery.

Krok 2: Instalacja oprogramowania CribSense

CribSense zależy od autoconf, libtool, OpenCV i libcanberra, a także popularnych narzędzi programowych.

  • autoconf i libtool służą do automatycznej konfiguracji plików makefile i budowania skryptów dla CribSense na wielu platformach (takich jak Linux, OSX i Raspberry Pi).
  • OpenCV to potężny pakiet wizyjny używany do przetwarzania obrazu i jest podstawą kodu powiększenia wideo i wykrywania ruchu. Ma świetne wsparcie, jest łatwy w użyciu i ma dobrą wydajność.
  • libcanberra to prosta biblioteka do odtwarzania dźwięków zdarzeń. Służy do odtwarzania dźwięku alarmu dla CribSense.

Odwiedź ich poszczególne strony, aby uzyskać pełne informacje.

Zainstaluj je, otwierając terminal na swoim Pi i uruchamiając:

sudo apt-get install git build-essential autoconf libtool libopencv-dev libcanberra-dev

Następnie musisz ustawić sterownik kamery na automatyczne ładowanie, dodając bcm2835-v4l2 do `/etc/modules-load.d/modules.conf`. Twój plik modules.conf powinien wyglądać tak:

# /etc/modules: moduły jądra do załadowania podczas startu systemu.

# # Plik zawiera nazwy modułów jądra, które powinny być # załadowane podczas startu systemu, po jednym w wierszu. Wiersze zaczynające się od „#” są ignorowane. i2c-dev bcm2835-v4l2

Po edycji pliku musisz ponownie uruchomić Pi. Ten sterownik jest używany przez CribSense do bezpośredniego pobierania klatek z kamery NoIR.

Następnie możesz sklonować repozytorium, uruchamiając:

klon git

Następnie przejdź do repozytorium i zbuduj oprogramowanie, uruchamiając

cd CribSense

./autogen.sh --prefix=/usr --sysconfdir=/etc --disable-debug make sudo make install sudo systemctl daemon-reload

Gratulacje, zainstalowałeś całe niezbędne oprogramowanie!

Konfiguracja

CribSense można dostosować za pomocą prostego pliku konfiguracyjnego INI. Po uruchomieniu `make install` plik konfiguracyjny znajduje się w /etc/cribsense/config.ini. Możesz przeglądać i edytować te parametry, uruchamiając

sudo nano /etc/cribsense/config.ini

Krótkie wyjaśnienie każdego parametru znajduje się w konfiguracji domyślnej, ale więcej szczegółów można znaleźć pod adresem https://lukehsiao.github.io/CribSense/setup/config/. Na końcu tego przewodnika omówimy również kalibrację i konfigurację.

Bieganie CribSense

CribSense został zaprojektowany do uruchamiania podczas uruchamiania za pomocą usługi systemd. Gdy jesteś podłączony do Raspberry Pi za pomocą klawiatury i myszy, powinieneś upewnić się, że parametry konfiguracyjne działają dla twojego łóżeczka. Może być konieczne ponowne dostrojenie tych parametrów, jeśli je przeniesiesz.

Podczas dostrajania parametrów możesz uruchomić cribsense do woli z wiersza poleceń, uruchamiając

cribsense --config /etc/cribsense/config.ini

Gdy będziesz zadowolony, możesz włączyć automatyczne uruchamianie, uruchamiając

sudo systemctl włącz cribsense

Możesz zatrzymać automatyczne uruchamianie Cribsense, uruchamiając

sudo systemctl wyłącz cribsense

Przegląd oprogramowania

Oprogramowanie CribSense jest sercem i duszą tego projektu. Widzieliśmy kilka świetnych demonstracji powiększenia wideo z MIT i chcieliśmy spróbować uruchomić podobny algorytm na Raspberry Pi. Wymagało to ponad 10-krotnego przyspieszenia pracy tbl3rd nad implementacją powiększenia wideo w C++ w celu uruchomienia w czasie rzeczywistym na Pi. Wymagane optymalizacje kierowały naszym projektem oprogramowania.

Na wysokim poziomie CribSense wielokrotnie przechodzi przez maszynę stanu oprogramowania. Po pierwsze, dzieli każdą klatkę wideo o rozdzielczości 640x480 w skali szarości na 3 sekcje poziome (640x160) dla lepszej lokalizacji pamięci podręcznej. Następnie powiększa każdy pasek w osobnym wątku i monitoruje ruch widoczny w kadrze. Po monitorowaniu ruchu przez kilka sekund określa główny obszar ruchu i przycina do niego ramkę. Zmniejsza to całkowitą liczbę pikseli, które algorytm musi przetworzyć. Następnie CribSense monitoruje ilość ruchu w przyciętym strumieniu i emituje alarm, jeśli żaden ruch nie zostanie wykryty przez określony czas. Od czasu do czasu CribSense ponownie otworzy widok, aby monitorować pełną klatkę w przypadku, gdy niemowlę poruszyło się i ponownie przyciąć wokół nowego głównego obszaru ruchu.

Powiększenie wideo służy do wzmocnienia stosunku sygnału do szumu przy subtelnych ruchach, takich jak oddychanie niemowląt. Nie byłoby to konieczne przy większych ruchach, ale może pomóc w przypadku bardzo subtelnych ruchów. Zauważ, że nasza implementacja jest luźno oparta na algorytmie opisanym w dokumentach MIT i nie działa tak dobrze, jak ich zastrzeżony kod.

Optymalizacje, takie jak wielowątkowość, przycinanie adaptacyjne i optymalizacje kompilatora, dały nam odpowiednio około 3x, 3x i 1,2x przyspieszenie. To pozwoliło nam osiągnąć 10-krotne przyspieszenie wymagane do działania w czasie rzeczywistym na Pi.

Pełne szczegóły można znaleźć na stronie Architektura oprogramowania repozytorium CribSense.

Jeśli jesteś zainteresowany powiększeniem wideo, odwiedź stronę MIT.

Krok 3: Przygotowanie sprzętu: Podłącz kamerę

Przygotowanie sprzętu: podłącz kamerę
Przygotowanie sprzętu: podłącz kamerę

Najpierw zamień kabel 6" dostarczony z kamerą na kabel 12". Aby to zrobić, możesz po prostu postępować zgodnie z tym samouczkiem, jak wymienić kabel kamery.

Podsumowując, z tyłu aparatu zobaczysz zakładkę popchnij/pociągnij, którą możesz wyciągnąć, aby zwolnić elastyczny kabel. Wymień krótki kabel na dłuższy i ponownie wciśnij wypustkę.

Zauważysz, że na naszych zdjęciach mamy kabel 24". Był za długi. Kabel 12" na liście materiałów ma znacznie rozsądniejszą długość.

Krok 4: Przygotowanie sprzętu: Dioda podczerwieni

Przygotowanie sprzętu: dioda podczerwieni
Przygotowanie sprzętu: dioda podczerwieni
Przygotowanie sprzętu: dioda podczerwieni
Przygotowanie sprzętu: dioda podczerwieni
Przygotowanie sprzętu: dioda podczerwieni
Przygotowanie sprzętu: dioda podczerwieni

CribSense jest stosunkowo łatwy do skonstruowania i składa się w dużej mierze z części dostępnych na rynku. Jak widać na powyższym rysunku, istnieje 5 głównych komponentów sprzętowych, z których tylko 2 są wykonane na zamówienie. Na tej stronie zostanie omówione, jak skonstruować obwód diody podczerwieni, a na następnej stronie, jak skonstruować obudowę.

Do tej części musisz zdobyć lutownicę, przewody, diody, diodę IR i rezystor. Będziemy konstruować obwód pokazany na 2 rysunku. Jeśli jesteś nowy w lutowaniu, oto miły przewodnik, który Cię dogoni. Chociaż ten przewodnik omawia lutowanie przelotowe, możesz użyć tych samych podstawowych technik, aby połączyć te komponenty ze sobą, jak pokazano na trzecim rysunku.

W celu zapewnienia odpowiedniego oświetlenia w nocy stosujemy diodę IR, która nie jest widoczna dla ludzkiego oka, ale widoczna dla kamery NoIR. Dioda IR nie zużywa dużo energii w porównaniu do Raspberry Pi, więc dla uproszczenia pozostawiamy diodę IR włączoną.

We wcześniejszych wersjach Pi maksymalny prąd wyjściowy tych pinów wynosił 50mA. Raspberry Pi B+ zwiększyło to do 500mA. Jednak dla uproszczenia używamy po prostu pinów zasilania 5 V, które mogą dostarczać do 1,5 A. Zgodnie z naszymi pomiarami napięcie przewodzenia diody IR wynosi około 1,7 ~ 1,9 V. Chociaż dioda IR może pobierać 500mA bez uszkadzania się, zmniejszamy prąd do około 200mA, aby zmniejszyć ciepło i ogólne zużycie energii. Wyniki eksperymentów pokazują również, że dioda IR jest wystarczająco jasna przy prądzie wejściowym 200mA. Aby wypełnić lukę między 5V a 1,9V, używamy trzech diod 1N4001 i rezystora 1 Ohm połączonych szeregowo z diodą IR. Spadek napięcia na przewodzie, diodach i rezystorze wynosi odpowiednio około 0,2 V, 0,9 V (dla każdego) i 0,2 V. Zatem napięcie na diodzie IR wynosi 5 V - 0,2 V - (3 * 0,9 V) - 0,2 V = 1,9 V. Rozpraszanie ciepła przez diodę LED wynosi 0,18 W i 0,2 W przez rezystor, a wszystko to w granicach ich maksymalnych wartości znamionowych.

Ale jeszcze nie skończyliśmy! Aby uzyskać lepsze dopasowanie do obudowy drukowanej 3D, chcemy, aby soczewka LED IR wystawała z obudowy, a płytka PCB była równo z otworem. Mała fotodioda w prawym dolnym rogu będzie przeszkadzać. Aby temu zaradzić, wylutowujemy go i odwracamy na przeciwną stronę planszy, jak pokazano na dwóch ostatnich zdjęciach. Fotodioda nie jest potrzebna, ponieważ chcemy, aby dioda LED była zawsze włączona. Proste przełączenie go na przeciwną stronę pozostawia oryginalny obwód LED bez zmian.

Podczas lutowania do przewodów upewnij się, że przewody mają co najmniej 12 cali długości i mają nagłówki pinów, które mogą prześlizgnąć się przez GPIO Pi.

Krok 5: Przygotowanie sprzętu: obudowa

Przygotowanie sprzętu: podwozie
Przygotowanie sprzętu: podwozie
Przygotowanie sprzętu: podwozie
Przygotowanie sprzętu: podwozie
Przygotowanie sprzętu: podwozie
Przygotowanie sprzętu: podwozie

Pliki źródłowe:

  • Sprawa STL
  • Robot do tworzenia spraw
  • Pokrywa STL
  • Robot do tworzenia okładek

Wykorzystaliśmy prostą obudowę wydrukowaną w 3D, aby pomieścić Pi, kamerę i diodę LED. Korzystanie z naszego podwozia jest opcjonalne, ale zalecane, aby zapobiec dotykaniu przez małe dzieci odsłoniętych obwodów elektronicznych. Każde łóżeczko jest inne, dlatego nasze podwozie nie zawiera wspornika montażowego. Kilka opcji montażu może obejmować:

  • Opaski
  • Podwójny zamek 3M
  • Rzep
  • Taśma

Jeśli masz dostęp do replikatora MakerBot (5. generacji), możesz po prostu pobrać pliki.makerbot dla sprawy, zakryć je na swoim replikatorze MakerBot i wydrukować. Wydrukowanie etui zajmuje około 6 godzin, a okładki 3 godziny. Jeśli używasz innego typu drukarki 3D, czytaj dalej.

Do drukowania CribSense wymagana jest minimalna objętość kompilacji wynosząca 9,9 cala (dł.) x 7,8 cala (szer.) x 5,9 cala (wys.). Jeśli nie masz dostępu do drukarki 3D o tej objętości kompilacji, możesz skorzystać z drukowania 3D online usługi (np. Shapeways lub Sculpteo) do drukowania CribSense. Minimalna rozdzielczość wydruku to 0,015 . Jeśli używasz drukarki 3D ze stopionym filamentem, oznacza to, że średnica dyszy musi wynosić 0,015 cala lub mniej. Drukarki o niższych rozdzielczościach drukowania (większe średnice dysz) mogą działać, ale Raspberry Pi może nie pasować do obudowy. Zalecamy PLA (kwas polimlekowy) jako preferowany materiał do drukowania. Inne tworzywa sztuczne mogą działać, ale Raspberry Pi może nie pasować w przypadku, gdy współczynnik rozszerzalności cieplnej wybranego tworzywa jest większy niż PLA. Jeśli twoja drukarka 3D ma podgrzewaną platformę roboczą, wyłącz grzałkę przed kontynuowaniem.

Zorientowanie modelu na platformie roboczej drukarki ma kluczowe znaczenie dla udanego drukowania. Modele te zostały starannie zaprojektowane, aby nie trzeba było na nich drukować materiału podporowego, oszczędzając w ten sposób plastik i poprawiając jakość druku. Zanim przejdziesz dalej, pobierz pliki 3D do etui i okładki. Podczas drukowania tych modeli szyjka CribSense musi leżeć płasko na platformie roboczej. Gwarantuje to, że wszystkie kąty zwisu w modelach nie przekraczają 45 stopni, eliminując w ten sposób zapotrzebowanie na materiał podporowy. Aby uzyskać instrukcje dotyczące orientacji modeli 3D w objętości roboczej drukarki, zapoznaj się z instrukcją obsługi dołączoną do drukarki 3D. Przykłady orientacji obudowy i pokrywy pokazano powyżej.

Oprócz położenia szyjki CribSense płasko na platformie roboczej, możesz zauważyć, że modele są obracane wokół osi pionowej. Może to być konieczne, aby dopasować model do objętości kompilacji drukarki 3D. Ta rotacja jest opcjonalna, jeśli objętość kompilacji jest wystarczająco długa, aby pomieścić CribSense.

Krok 6: Przygotowanie sprzętu: montaż

Przygotowanie sprzętu: montaż
Przygotowanie sprzętu: montaż
Przygotowanie sprzętu: montaż
Przygotowanie sprzętu: montaż
Przygotowanie sprzętu: montaż
Przygotowanie sprzętu: montaż
Przygotowanie sprzętu: montaż
Przygotowanie sprzętu: montaż

Po przygotowaniu całego sprzętu można rozpocząć montaż. W tym procesie można użyć dowolnego kleju, ale zalecamy klejenie na gorąco z dwóch głównych powodów. Gorący klej szybko wysycha, dzięki czemu nie trzeba długo czekać na wyschnięcie kleju. Ponadto gorący klej można usunąć, jeśli się pomylisz. Aby usunąć zaschnięty gorący klej, namocz gorący klej w alkoholu izopropylowym. Zalecamy koncentrację 90% lub wyższą, ale koncentracja 70% nadal będzie działać. Moczenie zaschniętego gorącego kleju w alkoholu izopropylowym osłabi wiązanie kleju z powierzchnią pod spodem, umożliwiając czyste odklejenie kleju. Podczas namaczania kleju w alkoholu izopropylowym Raspberry Pi należy wyłączyć i odłączyć. Upewnij się, że wszystko wyschło przed ponownym nałożeniem gorącego kleju i uruchomieniem Raspberry Pi.

Wszystkie obrazy dla tych kroków są uporządkowane i postępuj zgodnie z instrukcjami tekstowymi.

  1. Włóż Raspberry Pi do obudowy. Będziesz musiał trochę go wygiąć, aby podłączyć port audio, ale gdy już się znajdzie, gniazdo audio utrzyma go na miejscu. Po umieszczeniu upewnij się, że wszystkie porty są nadal dostępne (np. możesz podłączyć kabel zasilający).
  2. Następnie użyj gorącego kleju, aby przymocować Pi na miejscu i przymocuj kamerę do Pi. Są też otwory na śruby, jeśli wolisz ich używać.
  3. Teraz przyklej diodę LED i kamerę do przedniej pokrywy (na zdjęciu). Zacznij od przyklejenia kamery NoIR na gorąco do otworu kamery. Upewnij się, że kamera jest dobrze dopasowana i wyrównana z obudową. Nie używaj zbyt dużo kleju; w przeciwnym razie nie będziesz w stanie zmieścić aparatu w głównej obudowie. Pamiętaj, aby włączyć Pi i spójrz na kamerę (na przykład „raspistill -v”), aby upewnić się, że jest dobrze ustawiona pod kątem i ma dobre pole widzenia. Jeśli tak nie jest, usuń gorący klej i zmień jego położenie.
  4. Następnie przyklej diodę IR do otworu w szyjce osłony. Szyja jest ustawiona pod kątem 45 stopni do bocznego oświetlenia łóżeczka, co powoduje więcej cieni w warunkach słabego oświetlenia. Dodaje to większego kontrastu do obrazu, ułatwiając wykrywanie ruchu.
  5. Podłącz przewody diody podczerwieni do pinów nagłówka Raspberry Pi, jak pokazano na schematycznym obrazku.
  6. Zapakuj kable do obudowy w taki sposób, aby ich nie pofałdować ani nie nadwyrężyć. Skończyło się na złożeniu kabla w stylu akordeonu, ponieważ nasz elastyczny kabel aparatu był za długi.
  7. Gdy wszystko jest schowane, gorący klej wokół krawędzi, w których spotykają się dwa kawałki, uszczelniając je na miejscu.

Krok 7: Kalibracja

Image
Image
Kalibrowanie
Kalibrowanie

Szczegóły dotyczące parametrów konfiguracyjnych można znaleźć w dokumentacji repozytorium CribSense. Obejrzyj także wideo, aby zobaczyć przykład, w jaki sposób możesz skalibrować CribSense po skonfigurowaniu wszystkiego.

Oto przykładowy plik konfiguracyjny:

[io]; Konfiguracja we/wy

; wejście = ścieżka_do_pliku; Plik wejściowy do użycia input_fps = 15; fps wejścia (maks. 40, zalecane 15 jeśli używasz aparatu) full_fps = 4,5; fps przy których można przetwarzać pełne klatki crop_fps = 15; fps z jaką można przetwarzać przycięte klatki camera = 0; Używana kamera szerokość = 640; Szerokość wejściowej wysokości wideo = 480; Wysokość wejściowego wideo time_to_alarm = 10; Ile sekund czekać bez ruchu przed alarmem. [przycinanie]; Ustawienia przycinania adaptacyjnego crop = true; Czy przyciąć frame_to_settle = 10; # ramek do oczekiwania po zresetowaniu przed przetwarzaniem roi_update_interval = 800; # klatek między ponownym obliczeniem ROI roi_window = 50; # klatek do monitorowania przed wybraniem ROI [ruch]; Ustawienia wykrywania ruchu erode_dim = 4; wymiar jądra erozji dilate_dim = 60; wymiar jądra rozszerzenia diff_threshold = 8; różnica abs potrzebna przed rozpoznaniem czasu trwania zmiany = 1; # klatek do utrzymania ruchu przed oznaczeniem true pixel_threshold = 5; # piksele, które muszą być różne do oznaczenia jako motion show_diff = false; wyświetl różnicę między 3 klatkami [powiększenie]; Ustawienia powiększenia wideo amplifikuj = 25; Pożądany dolny punkt odcięcia w amplifikacji = 0,5; Niska częstotliwość pasma pasmowego. wysokie odcięcie = 1,0; Wysoka częstotliwość pasma pasmowego. próg = 50; Próg fazy jako % pi. pokaż_powiększenie = fałsz; Pokaż ramki wyjściowe każdego powiększenia [debug] print_times = false; Czasy analizy wydruku

Kalibracja algorytmu to wysiłek iteracyjny, bez dokładnego rozwiązania. Zachęcamy do eksperymentowania z różnymi wartościami, łącząc je z funkcjami debugowania, aby znaleźć kombinację parametrów najbardziej odpowiednią dla Twojego środowiska. Przed rozpoczęciem kalibracji upewnij się, że show_diff i show_magnification są ustawione na true.

Jako wskazówka, zwiększenie amplifikacji i wartości phase_threshold zwiększa wielkość powiększenia zastosowanego do wejściowego wideo. Należy zmieniać te wartości, aż wyraźnie zobaczysz ruch, który chcesz śledzić w klatce wideo. Jeśli widzisz artefakty, zmniejszenie phase_threshold przy zachowaniu tej samej amplifikacji może pomóc.

Parametry wykrywania ruchu pomagają zrekompensować hałas. Podczas wykrywania obszarów ruchu, erode_dim i dilate_dim są używane do określania wymiarów jąder OpenCV używanych do erozji i rozszerzania ruchu, tak aby hałas był najpierw erodowany, a następnie pozostały sygnał ruchu jest znacznie rozszerzony, aby obszary ruchu były oczywiste. Te parametry mogą również wymagać dostrojenia, jeśli łóżeczko jest ustawione w bardzo wysokim kontraście. Ogólnie rzecz biorąc, będziesz potrzebować wyższego erode_dim dla ustawień wysokiego kontrastu i niższego erode_dim dla niskiego kontrastu.

Jeśli uruchomisz CribSense z show_diff = true i zauważysz, że zbyt duża część wyjścia akumulatora jest biała lub jakaś zupełnie niepowiązana część wideo jest wykrywana jako ruch (np. migotanie lampy), zwiększ erode_dim, aż tylko część wideo odpowiadający Twojemu dziecku to największa część bieli. Pierwszy rysunek pokazuje przykład, w którym wymiar erozji jest zbyt mały dla ilości ruchu w klatce, podczas gdy następny pokazuje dobrze skalibrowaną klatkę.

Po skalibrowaniu upewnij się, że pixel_threshold jest ustawiona na taką wartość, że „Pixel Movement” zgłasza tylko szczytowe wartości ruchu pikseli, a nie wszystkie (co oznacza, że musisz wyciąć szum). Idealnie, zobaczysz dane wyjściowe w swoim terminalu, gdzie istnieje wyraźny okresowy wzór odpowiadający ruchowi:

[informacje] Ruch pikseli: 0 [informacje] Oszacowanie ruchu: 1,219812 Hz

[informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 1,219812 Hz [info] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 1,219812 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 1,219812 Hz [informacje] Poruszenie pikseli: 44 [informacje] Oszacowanie ruchu: 1,219812 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 1,219812 Hz [informacje] Poruszenie pikseli: 161 [informacje] Oszacowanie ruchu: 1,219812 Hz [informacje] Poruszenie pikseli: 121 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Poruszenie pikseli: 86 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Poruszenie pikseli: 0 [info] Oszacowanie ruchu: 0.841416 Hz [info] Poruszenie pikseli: 0 [info] Oszacowanie ruchu: 0.841416 Hz [info] Poruszenie pikseli: 0 [info] Oszacowanie ruchu: 0.841416 Hz [info] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Oszacowanie ruchu: 0 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Oszacowanie ruchu: 0 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Ruch pikseli ent: 0 [info] Oszacowanie ruchu: 0.841416 Hz [info] Poruszenie pikseli: 0 [info] Oszacowanie ruchu: 0.841416 Hz [info] Poruszenie pikseli: 0 [info] Oszacowanie ruchu: 0.841416 Hz [info] Poruszenie pikseli: 0 [info] Oszacowanie ruchu: 0,841416 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,841416 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0.841416 Hz [informacje] Poruszenie pikseli: 97 [informacje] Oszacowanie ruchu: 0.841416 Hz [informacje] Poruszenie pikseli: 74 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Piksel Ruch: 0 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Oszacowanie ruchu pikseli: 60 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Oszacowanie ruchu pikseli: 0 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Ruch pikseli: 0 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Poruszenie pikseli: 48 [informacje] Ruch Oszacowanie: 0,839298 Hz [informacje] Poruszenie pikseli: 38 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Poruszenie pikseli: 29 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Poruszenie pikseli: 28 [informacje] Oszacowanie ruchu: 0,839298 Hz [info] Poruszenie pikseli: 22 [info] Oszacowanie ruchu: 0,839298 Hz [info] Poruszenie pikseli: 0 [info] Oszacowanie ruchu: 0,839298 Hz [info] Poruszenie pikseli: 0 [info] Oszacowanie ruchu: 0,839298 Hz [info] Poruszenie pikseli: 0 [informacje] Oszacowanie ruchu: 0,839298 Hz [informacje] Ruch pikseli: 0 [informacje] Oszacowanie ruchu: 0,839298 Hz

Jeśli Twój wynik wygląda bardziej tak:

[informacje] Ruch pikseli: 921 [informacje] Oszacowanie ruchu: 1,352046 Hz

[informacje] Poruszenie pikseli: 736 [informacje] Oszacowanie ruchu: 1.352046 Hz [informacje] Poruszenie pikseli: 666 [informacje] Oszacowanie ruchu: 1.352046 Hz [informacje] Poruszenie pikseli: 663 [informacje] Oszacowanie ruchu: 1.352046 Hz [informacje] Poruszenie pikseli: 1196 [informacje] Oszacowanie ruchu: 1.352046 Hz [informacje] Poruszenie pikseli: 1235 [informacje] Oszacowanie ruchu: 1.352046 Hz [informacje] Poruszenie pikseli: 1187 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 1115 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 959 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 744 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 611 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Pixel Movement: 468 [info] Oszacowanie ruchu: 1.456389 Hz [info] Pixel Movement: 371 [info] Oszacowanie ruchu: 1.456389 Hz [info] Pixel Movement: 307 [info] Motion Motion: 1.456389 Hz [info] Pixel Movement: 270 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 234 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 197 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 179 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 164 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 239 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Poruszenie pikseli: 733 [informacje] Oszacowanie ruchu: 1.456389 Hz [informacje] Oszacowanie ruchu pikseli: 686 [informacje] Oszacowanie ruchu: 1,229389 Hz [informacje] Oszacowanie ruchu pikseli: 667 [informacje] Oszacowanie ruchu: 1,229389 Hz [informacje] Poruszenie pikseli: 607 [info] Oszacowanie ruchu: 1,229389 Hz [informacje] Poruszenie pikseli: 544 [informacje] Oszacowanie ruchu: 1,229389 Hz [informacje] Oszacowanie ruchu: 499 [informacje] Oszacowanie ruchu: 1,229389 Hz [informacje] Poruszenie pikseli: 434 [informacje] Oszacowanie ruchu: 1,229389 Hz [informacje] Poruszenie pikseli: 396 [informacje] Oszacowanie ruchu: 1,229389 Hz [informacje] Poruszenie pikseli: 375 [informacje] Oszacowanie ruchu: 1,229389 Hz [informacje] Poruszenie pikseli: 389 [informacje] Oszacowanie ruchu: 1,229389 Hz [informacje] Poruszenie pikseli: 305 [informacje] Oszacowanie ruchu: 1,312346 Hz [informacje] Poruszenie pikseli: 269 [informacje] Oszacowanie ruchu: 1,312346 Hz [informacje] Poruszenie pikseli: 1382 [informacje] Ruch E stymulacja: 1,312346 Hz [informacje] Oszacowanie ruchu pikseli: 1086 [informacje] Oszacowanie ruchu: 1,312346 Hz [informacje] Oszacowanie ruchu pikseli: 1049 [informacje] Oszacowanie ruchu: 1,312346 Hz [informacje] Oszacowanie ruchu pikseli: 811 [informacje] Oszacowanie ruchu: 1,312346 Hz [info] Poruszenie pikseli: 601 [informacje] Oszacowanie ruchu: 1,312346 Hz [informacje] Poruszenie pikseli: 456 [informacje] Oszacowanie ruchu: 1,312346 Hz

Dostosuj pixel_threshold i diff_threshold, aż widoczne będą tylko szczyty, a ruch pikseli wynosi 0 w przeciwnym razie.

Krok 8: Demonstracja

Image
Image

Oto mała demonstracja działania CribSense. Musisz sobie wyobrazić, że jest przymocowany do boku łóżeczka.

Po umieszczeniu CribSense nad łóżeczkiem należy zoptymalizować odległość między niemowlęciem a aparatem. Idealnie klatka piersiowa Twojego niemowlęcia wypełni mniej niż 1/3 ramy. Dziecko nie powinno znajdować się zbyt daleko, w przeciwnym razie wideo o niskiej rozdzielczości będzie miało trudności ze znalezieniem wystarczającej ilości szczegółów do powiększenia. Jeśli kamera jest zbyt blisko, kamera może nie widzieć Twojego dziecka, jeśli przetoczy się lub wyjdzie z ramy. Podobnie, jeśli dziecko znajduje się pod kocem „namiotowym”, gdzie jest ograniczony kontakt między kocem a klatką piersiową dziecka, wykrycie ruchu może być trudne. Wsadź je dobrze!

Warto również wziąć pod uwagę oświetlenie wokół łóżeczka. Jeśli Twoje łóżeczko znajduje się tuż obok okna, możesz uzyskać poruszające się cienie lub zmieniające się wartości światła, ponieważ słońce jest zasłaniane przez chmury lub ruch odbywa się za oknem. Gdzieś ze stałym oświetleniem jest najlepsze.

Uważamy, że przy odrobinie pracy ktoś mógłby ulepszyć nasze oprogramowanie, aby kalibracja przebiegała znacznie płynniej. W przyszłości można również dodać dodatkowe funkcje, takie jak powiadomienia push.

Krok 9: Rozwiązywanie problemów

Podczas konfigurowania CribSense możesz napotkać kilka typowych problemów. Na przykład problemy z budowaniem/uruchamianiem programu lub niesłyszenie dźwięku. Pamiętaj, że CribSense nie jest całkowicie niezawodną nianią elektroniczną. Będziemy wdzięczni za wkłady do naszego repozytorium GitHub, gdy wprowadzasz ulepszenia!

Oto kilka wskazówek dotyczących rozwiązywania problemów, które zebraliśmy podczas tworzenia CribSense.

Żaden alarm nie jest odtwarzany

  • Czy twoje głośniki działają?
  • Czy możesz odtwarzać inne dźwięki z Pi poza alarmem CribSense?
  • Jeśli Twoje Pi próbuje odtwarzać dźwięk przez HDMI, a nie przez port audio? Sprawdź stronę konfiguracji dźwięku Raspberry Pi, aby upewnić się, że wybrałeś prawidłowe wyjście.
  • Czy oprogramowanie CribSense wykrywa ruch? Jeśli CribSense działa w tle, możesz to sprawdzić za pomocą journalctl -f w terminalu.
  • Jeśli CribSense wykrywa dużo ruchu, może być konieczne skalibrowanie CribSense.

Dioda podczerwieni nie działa

  • Czy widzisz słaby czerwony kolor, gdy patrzysz na diodę podczerwieni? Gdy dioda LED jest włączona, powinien być widoczny słaby czerwony pierścień.
  • Sprawdź biegunowość połączeń. Jeśli +5V i GND są zamienione, to nie będzie działać.
  • Podłącz diodę LED do zasilacza z ograniczeniem napięcia/prądu 5 V/0,5 A. Normalnie powinien pobierać 0,2A przy 5V. Jeśli tak się nie stanie, dioda LED może działać nieprawidłowo.

CribSense wykrywa ruch, mimo że nie ma niemowlęcia

  • Czy poprawnie skalibrowałeś CribSense?
  • Pamiętaj, że CribSense po prostu szuka zmian w wartościach pikseli

    • Czy w kadrze poruszają się jakieś cienie?
    • Czy oświetlenie migocze lub się zmienia?
    • Czy CribSense jest zamontowany na stabilnej powierzchni (tj. czymś, co nie będzie się trząść, jeśli ludzie będą obok niego przechodzić)?
    • Czy w kadrze są jakieś inne źródła ruchu (lustra łapiące odbicia itp.)?

CribSense NIE wykrywa ruchu, mimo że jest ruch

  • Czy poprawnie skalibrowałeś CribSense?
  • Czy coś stoi na przeszkodzie aparatu?
  • Czy w ogóle jesteś w stanie połączyć się z kamerą z Raspberry Pi? Sprawdź, uruchamiając raspistill -v w terminalu, aby otworzyć kamerę na Pi na kilka sekund.
  • Jeśli spojrzysz na sudo systemctl status cribsense, czy CribSense faktycznie działa?
  • Czy Twoje dziecko jest pod kocem, który jest „namiot” tak, że nie ma kontaktu z dzieckiem? Jeśli między kocem a dzieckiem występują znaczne szczeliny powietrzne, kocyk może maskować ruch.
  • Czy możesz zobaczyć ruch, jeśli wzmocnisz wideo?
  • Czy widzisz ruch, jeśli dostroisz odcięcie niskich i wysokich częstotliwości?
  • Jeśli dzieje się tak tylko w słabym świetle, czy upewniłeś się, że kalibracja działa w słabym świetle?

CribSense nie buduje

Czy zainstalowałeś wszystkie zależności?

Nie mogę uruchomić Cribsense z wiersza poleceń

  • Czy przypadkowo błędnie wpisałeś coś po uruchomieniu./autogen.sh --prefix=/usr --sysconfdir=/etc --disable-debug podczas budowania oprogramowania?
  • Czy Cribsense jest obecny w /usr/bin ?
  • Jaka ścieżka jest zapewniona, jeśli uruchomisz "który cribsense"?

Zalecana: