Spisu treści:

Liczenie obiektów Raspberry Pi: 5 kroków
Liczenie obiektów Raspberry Pi: 5 kroków

Wideo: Liczenie obiektów Raspberry Pi: 5 kroków

Wideo: Liczenie obiektów Raspberry Pi: 5 kroków
Wideo: Dioda sterowana przyciskiem - Raspberry Pi Pico #1 2024, Listopad
Anonim
Zliczanie obiektów Raspberry Pi
Zliczanie obiektów Raspberry Pi

Wizja komputerowa to bez wątpienia fantastyczna rzecz! Dzięki temu komputer zyskuje zdolność „widzenia” i lepszego wyczuwania otoczenia, co pozwala na tworzenie złożonych, użytecznych i fajnych aplikacji. Aplikacje takie jak wykrywanie i rozpoznawanie twarzy, śledzenie obiektów i wykrywanie obiektów są coraz częściej obecne w naszych codziennych działaniach dzięki postępom w zakresie widzenia komputerowego.

Biorąc pod uwagę, jak zaawansowane i dostępne są frameworki i narzędzia widzenia komputerowego, aplikacja opisana w tym artykule dobrze pasuje: używając prostego Raspberry PI oraz darmowego i open-source frameworku wizji komputerowej o nazwie OpenCV do zliczania obiektów w ruchu, a dokładniej ile obiekty wchodzą i wychodzą z określonej monitorowanej strefy.

Krok 1: Coraz głębiej: w jaki sposób można wykryć ruch obiektu w strumieniu obrazu?

Coraz głębiej: w jaki sposób można wykryć ruch obiektu w strumieniu obrazu?
Coraz głębiej: w jaki sposób można wykryć ruch obiektu w strumieniu obrazu?

Teraz nadszedł czas, aby zagłębić się w rzeczy związane z przetwarzaniem obrazu:

jak uzyskać obrazy z kamery internetowej i wykryć, że coś się tam poruszyło

Składa się z pięciu kroków:

Krok 1: Aby podświetlić obiekt w ruchu

Zgodnie z definicją w fizyce klasycznej, odniesienie jest konieczne, aby wywnioskować, że coś się porusza lub czy stoi nieruchomo. Tutaj, aby ustalić, czy coś się poruszyło, jest prawie tak samo: każda klatka przechwycona przez kamerę internetową zostanie porównana z klatką odniesienia. Jeśli coś się zmieniło, to coś zostało poruszone. To proste, jak się wydaje.

Ta ramka odniesienia musi być uchwycona w najdoskonalszych warunkach (na przykład nic się nie porusza). W świecie przetwarzania obrazu to porównanie między przechwyconą klatką a klatką odniesienia polega na technice zwanej odejmowaniem tła. Odejmowanie tła polega na dosłownym odejmowaniu informacji o kolorze piksel do piksela z przechwyconej klatki i klatki odniesienia. Tak więc obraz wynikowy z tego procesu będzie podświetlał / pokazywał z większą ilością szczegółów tylko to, co różni się między tymi dwiema klatkami (lub co się przesunęło / nabrało ruchu), a wszystko inne na obrazie będzie czarne (kolor o wartości zerowej na szarym -skalować piksel). Ważne: warunki oświetleniowe i jakość przechwyconego obrazu z kamery internetowej (ze względu na jakość czujników przechwytywania) mogą się nieznacznie różnić w zależności od klatki. Oznacza to, że "równe części" z klatki odniesienia i innych klatek nie będą całkowicie czarne po odjęciu tła. Mimo takiego zachowania nie ma poważnych konsekwencji w kolejnych krokach przetwarzania obrazu w tym projekcie.

W celu zminimalizowania czasu przetwarzania obrazu, przed wykonaniem odejmowania tła, przechwycona klatka i klatka odniesienia są konwertowane na obraz w skali szarości. Ale dlaczego? Jest to kwestia wydajności obliczeniowej: obraz przedstawiający wiele kolorów (obraz kolorowy) ma trzy informacje na piksel: składowe koloru czerwonego, niebieskiego i zielonego (stary, ale złoty standard RGB). Tak więc, matematycznie, każdy piksel można zdefiniować jako tablicę trzech wartości, z których każda reprezentuje składnik koloru. Dlatego, rozszerzając go na cały obraz, ostateczny obraz będzie w rzeczywistości mieszanką trzech komponentów obrazu: komponentów obrazu czerwonego, niebieskiego i zielonego.

Aby go przetworzyć, potrzeba dużo pracy! Jednak w obrazach w skali szarości każdy piksel ma tylko jedną informację o kolorze. Tak więc przetwarzanie obrazu kolorowego jest trzykrotnie wolniejsze niż w przypadku obrazu w skali szarości (co najmniej trzy razy, w zależności od zastosowanej techniki). Co więcej: w niektórych celach (takich jak ten projekt) przetwarzanie wszystkich kolorów nie jest w ogóle konieczne ani ważne. Dlatego doszliśmy do wniosku: użycie obrazów w skali szarości jest wysoce zalecane do celów przetwarzania obrazu. Po odjęciu tła konieczne jest zastosowanie filtra Gaussian Blur.

Filtr Rozmycie gaussowskie zastosowany na obrazie z odjętym tłem wygładza wszystkie kontury poruszającego się wykrytego obiektu. Na pewno pomoże w kolejnych krokach obróbki obrazu.

Krok 2: Binaryzacja

Binaryzacja
Binaryzacja

W większości przypadków przetwarzania obrazu binaryzacja jest niemal obowiązkowym krokiem po wyróżnieniu obiektów / cech na obrazie. Powód: w obrazie binarnym każdy kolor piksela może przyjmować tylko dwie wartości: 0x00 (czarny) lub 0xFF (biały). To bardzo pomaga w przetwarzaniu obrazu, ponieważ wymaga jeszcze mniejszej „mocy obliczeniowej” do zastosowania technik przetwarzania obrazu w następnych krokach. Binaryzację można przeprowadzić, porównując każdy kolor piksela obrazu w skali szarości z określonym progiem. Jeżeli wartość koloru piksela jest większa niż próg, ten kolor piksela przyjmie wartość białą (0xFF), a jeżeli wartość koloru piksela jest niższa od progu, ten kolor piksela przyjmie wartość czarną (0x00). Niestety wybór wartości progowej nie jest taki łatwy. Zależy to od czynników środowiskowych, takich jak warunki oświetleniowe. Zły wybór wartości progowej może dalej zrujnować wszystkie kroki. Dlatego zdecydowanie zalecam ręczne dostosowanie progu w projekcie dla swojego przypadku przed podjęciem jakichkolwiek dalszych działań. Ta wartość progowa musi gwarantować, że poruszający się obiekt będzie widoczny na obrazie binarnym. W moim przypadku po odpowiednim doborze progu uzyskuje się to, co widać na rysunku 5.

Rysunek 5 - obraz binarny

Krok 3: Rozszerzać

Do tej pory możliwe było wykrywanie poruszających się obiektów, podświetlanie ich i zastosowanie binaryzacji, co daje całkiem wyraźny obraz poruszającego się obiektu (= całkiem wyraźny obraz obiektu do celów przetwarzania obrazu). Przygotowanie do liczenia obiektów jest PRAWIE wykonane. „Prawie” oznacza tutaj, że przed przejściem dalej trzeba wprowadzić pewne drobne poprawki. W tym momencie istnieje realna szansa na obecność „dziur” w obiektach (czarne masy pikseli w podświetlonym na biało obiekcie). Te otwory mogą być dowolne, od określonych warunków oświetleniowych po jakąś część kształtu obiektu. Gdy dziury mogą "produkować" fałszywe obiekty wewnątrz rzeczywistych obiektów (w zależności od tego, jak duże i gdzie się znajdują), konsekwencje obecności dziur na obrazie mogą być katastrofalne dla zliczania obiektów. Sposobem na wyeliminowanie tych dziur jest użycie Technic przetwarzania obrazu o nazwie Dilate. Użyj tego, a dziury znikną.

Krok 4: Poszukiwanie konturów (i ich centroidów)

Poszukiwanie konturów (i ich centroidów)
Poszukiwanie konturów (i ich centroidów)

W tym momencie mamy podświetlone obiekty, bez dziur w środku i gotowe na to, co dalej: poszukiwanie konturów (i ich centroidów). W OpenCV są zasoby do automatycznego wykrywania konturów, ale wykryte kontury muszą być mądrze wybrane (aby wybrać tylko rzeczywisty obiekt lub obiekty). Tak więc kryterium wykrywania konturów jest obszar obiektu mierzony w pikselach². Jeśli kontur ma większą powierzchnię niż granica (skonfigurowana w oprogramowaniu), musi być traktowany jako rzeczywisty obiekt do zliczenia. Wybór tej granicy/kryteriów obszaru jest bardzo ważny, a zły wybór oznacza błędne liczenie. Musisz wypróbować kilka wartości granicznych wartości obszaru i sprawdzić, co lepiej pasuje do twojego zastosowania. Nie martw się, te limity nie są trudne do znalezienia / dostosowania. Po wybraniu wszystkich obiektów na obrazie następnym krokiem jest narysowanie na nim prostokąta (ten prostokąt musi zawierać w sobie cały wykryty obiekt). A środek tego prostokąta to…. centroid obiektu! Być może myślisz „O co chodzi z tym centroidem?”, prawda? Oto twoja odpowiedź: nieważne jak duży lub jaki jest kształt obiektu, jego ruch jest taki sam jak środek ciężkości. Innymi słowy: ten prosty punkt zwany centroidem reprezentuje cały ruch obiektu. To sprawia, że liczenie jest teraz bardzo proste, prawda? Zobacz obrazek poniżej (rysunek 6), gdzie centroid obiektu jest przedstawiony jako czarny punkt.

Krok 5: Ruch Centorydy i liczenie obiektów

Wielki finał: porównaj współrzędne centroidów obiektu ze współrzędnymi linii wejścia i wyjścia i zastosuj opisany wcześniej algorytm liczenia. I będzie liczenie poruszających się obiektów!

Wynik końcowyJak pokazano na samym początku tego postu, oto projekt w akcji:

Zalecana: