Podczas rozwiązywania zadań widzenia komputera nie robią bez użycia specjalistycznego oprogramowania. Chcę cię przedstawić - OpenCV - biblioteka Open Source na C ++. Posiada zestaw narzędzi do cyfryjnych obrazów, późniejszych przetwarzania za pomocą algorytmów numerycznych lub neuronowych.
Podstawowe algorytmy przetwarzania obrazu: interpretacja obrazów, kalibracja kamery za pośrednictwem standardu, eliminacja zniekształceń optycznych, definicja podobieństwa, analiza ruchu obiektu, definiowanie kształtu obiektu i śledzenia obiektu, odbudowy 3D, segmentacja obiektów, rozpoznawanie gestów .
Możesz pobrać bibliotekę na oficjalnej stronie http://sourceforge.net/projects/opencvlibrary/
Struktura biblioteki OpenCV
cXCORE - Kernel.
* Zawiera podstawowe struktury danych i algorytmy:
- podstawowe operacje na temat wielowymiarowych tablic numerycznych
- Matrix Algebra, Matematyczne FS, generatory liczb losowych
- Nagrywanie / przywracanie struktur danych do / z XML
- podstawowe funkcje Grafika 2D.
CV - obraz i komfortowy moduł przetwarzania
- Podstawowe operacje na zdjęciach (filtracja, transformacje geometryczne, konwersja pomieszczeń kolorów itp.)
- Analiza obrazów (wybór charakterystycznych cech, morfologii, wyszukiwania konturów, histogramów)
- Analiza ruchu, obiekty śledzenia
- Wykrywanie obiektów, w szczególności osób
- Kalibracja kamery, elementy renowacji struktury przestrzennej
Highgui - Moduł do wprowadzania / obrazów wyjściowych i wideo, tworzenie interfejsu użytkownika
- Przechwytywać wideo z kamer i z plików wideo, odczytaj / napisz obrazy statyczne.
- Funkcje organizowania prostego UI (wszystkie aplikacje demonstracyjne używają HighGui)
CVAUX - funkcje eksperymentalne i przestarzałe
- przestrzenie. Wizja: kalibracja stereo, samodzielna kalibracja
- Wyszukaj stereo-zgodność, kliknięcia wykresów
- Funkcje znalezienia i opisu
CVCAM - Przechwytywanie wideo
- Umożliwia przechwytywanie wideo z cyfrowych kamer wideo (obsługa zostanie zatrzymana, aw najnowszych wersjach brakuje tego modułu)
Zainstaluj OpenCV w Linux
Po pobraniu. ostatnia wersja OpenCV z witryny programisty http://sourceforge.net/projects/opencvlibrary/ musisz rozpakować archiwum i wykonać montaż przez CMAKE Wersja 2.6 lub wyższa.
Instalacja CMAKE jest standardowa:
Sudo apt-get install cmake
Aby wyświetlić okna OpenCV, musisz zainstalować biblioteki GTK + 2.x i libgtk2.0-dev.
Apt-get install libgtk2.0-dev
Zbieramy bibliotekę:
TAR -XJF OpenCV-2.2.0.TAR.BZ2 CD OPENCV-2.2.0 CMAKE -D CMAKE_BUILD_TYPE \u003d Zwolnienie -d cmake_install_prefix \u003d / usr / lokalny. Dokonaj instalacji
Aby przetestować zainstalowaną bibliotekę, możesz zbierać przykłady i coś zrobić:
Próbki CD / C / Chmod + x cold_all.sh ./build_all.sh./delaunay
Jeśli widzisz błąd "Błąd podczas ładowania wspólnych bibliotek zamiast obrazu testowego: libopencv_core.SO.2.2: Nie można otworzyć wspólnego pliku obiektów: brak takiego pliku lub katalogu", oznacza to, że program nie może znaleźć bibliotek. Musisz wyraźnie określić do nich ścieżkę:
$ Export ld_library_path \u003d / usr / local / lib: $ ld_library_path
Jeśli po tym ponownie błąd:
Błąd OpenCV: Nieokreślony błąd (funkcja nie jest zaimplementowana. Przebuduj bibliotekę z Windows, GTK + 2.x lub wsparciem węglowym. Jeśli jesteś na Ubuntu lub Debian, zainstaluj libgtk2.0-dev i PKG-CONFIG, a następnie ponownie uruchomić Skrypt cmake lub konfiguracji) w CVNAMEDWindow, plik /usr/src/opencv-2.2.0/modules/highgui/src/window.CPP, linia 274 zakończenia wywołane po rzuceniu instancji "CV :: wyjątek" co (): / USR /Src/opencv-2.2.0/modules/highgui/src/window.cppp: Błąd: (-2) Funkcja nie jest zaimplementowana. Odbuduj bibliotekę z Windows, GTK + 2.x lub wspornikiem węgla. Jeśli jesteś na Ubuntu lub Debian, zainstalować libgtk2.0-dev i PKG-CONFIG, a następnie ponownie uruchom skrypt CMAKE lub Configure w funkcji CVNAMEDWIDOW
Zapomniałeś więc zainstalować GTK + 2.x: libgtk2.0-dev. Uruchom ustawienie (patrz wyżej).
Po zakończeniu instalacji pliki nagłówkowe będą dostępne w katalogu / usr / Local / income / OpenCV, a pliki biblioteki są w / usr / Local / lib
Zbieramy program openCV:
test.cpp.
// // do testowania // // robokraft.ru // #include
Makefile.
CC: \u003d G ++ CFLAGS: \u003d -i / USR / LOKALNE / ZAŁĄCZNIK / OPENCV -L / USR / LOKALNE / LIB Obiekty: \u003d biblioteki: \u003d -lopencv_core -lopencv_imgproc -lopencv_highgui.phony: Wszystkie czyste Wszystkie: Test testowy: $ (CC) $ (Cflags) -o Test test.CPP $ (biblioteki) Czyste: RM -F * .O
Uruchomienie zespołu poleceń.
Witaj świecie!
OpenCV jest zainstalowany i gotowy do pracy. Witaj swoją pierwszą aplikację Hello Word!
#Zawierać.
Ładowanie obrazu
Ten przykład będzie podstawą wszystkich programów na OpenCV. Pobieramy obraz z pliku obrazu o mocy image0.jpg w środę.
#Zawierać.
Obsługiwane typy formatów obrazu:
- Windows BitMaps - BMP, DIB
- Pliki JPEG - JPEG, JPG, JPE
- Przenośna grafika sieciowa - PNG
- Portable Format obrazu - PBM, PGM, PPM
- Sun Rasters - SR, RAS
- Pliki TIFF - TIFF, TIF
Aby odwołać się do obrazu, który możesz wykonać takie połączenia:
Image-\u003e Nchannels // Liczba kanałów kanałów (RGB, chociaż w OpenCV - BGR) (1-4) obraz-\u003e Głębokość // Głębokość w bitach Image-\u003e Szerokość // Szerokość Picks in Pixels Image-\u003e Height // Wysokość zdjęć w obrazach pikseli-\u003e wizerunek // Pamięć - obraz (\u003d\u003d Image-\u003e Wysokość * Image-\u003e Sertthstep) Image-\u003e Widthstep // Odległość między pionowo sąsiednimi obrazami pionowymi (liczba bajtów w jednej linii Zdjęcie - może być wymagane do samodzielnego obrazu wszystkich pikseli)
Ładowanie wideo.
Ładowanie wideo nie jest znacznie bardziej skomplikowane niż ładowanie obrazu przez wyjątek, że będzie cykl, który przechodzi przez ramki.
Opóźnienie między ramkami znajduje się w 33 milisekundach. Takie opóźnienie umożliwia przetwarzanie strumienia wideo ze standardową częstotliwością 30 klatek na sekundę.
#Zawierać.
Aby uchwycić wideo z kamery, potrzebujesz trochę kodu modyfikacji - zamiast funkcji CVCreateFileCapture () będzie używany CVCreateCameracapture (). Po naciśnięciu ESC odtwarzanie przerywa i zamyka okno, a po naciśnięciu ENTER, bieżąca ramka zostanie zapisana plik jpg..
#Zawierać.
OpenCV V1.0 pokazuje i przechowuje obraz minimalnej rozdzielczości aparatu 320x240.
Uznanie obiektów obiektów
Rozpoznawanie obszarów na obrazie źródłowym na szablonie znajduje się funkcja CVMatchTemplate (). Funkcja nakłada szablon obrazu do bieżącego obrazu i zgodnie z wybranym algorytmem wykonuje wyszukiwanie korelacji między nimi. Definicja granic znalezionego szablonu na obrazie źródłowym jest wykonywana przez funkcję CVMINMAXLOC i normalizacja algorytmu wyszukiwania CVNormalize ().
// // Przykład CVMatchTemplate () // obraz porównawczy z szablonem // #include
Hej! Przede mną zadaniem było zrealizowanie rozpoznawania znaków drogowych z strumienia wideo. Ponieważ wcześniej nie natknęłam się na zadania tego rodzaju, proces realizacji sama implikuje wstępne długie "palenie" forów i bezwzględnej kpiny z przykładami innych ludzi. Dlatego postanowiłem zebrać wszystko czytane w jednym miejscu na przyszłe pokolenia, a także podczas opowieści, ustaw kilka pytań.
Preludia.
Tak więc po studiowaniu wszystkich środków, że możliwe jest wykorzystanie do wdrożenia zadania, zatrzymałem się w środowisku programistycznym Microsoft Visual Studio © 2010, przy użyciu wspaniałej biblioteki OpenCV.
Proces pracy z OpenCV sugeruje wstępne tańce z tamburynami, które mają wystarczająco szczegółowe opisy:
Drugi akt tańca z tamburynami.
W końcu zwrócił się w kierunku kaskadów szkoleniowych. "Hapure" w tym kierunku uświadomił sobie, że potrzebuję dwóch narzędzi twoich i narzędzi haartrainingowych. Ale były nieobecne i były nieobecne i odmówili skompilowania. W tym czasie wersja OpenCV wynosiła 2.4.4, skonfigurowany przez, w artykule, najpierw przeczytałem o użyciu Cmake po zainstalowaniu. W rezultacie zdecydowałem się pobrać wersję 2.3.1 i zainstalować ponownie bibliotekę. Po tym udało mi się uruchomić niezbędne narzędzia wiersz poleceń A pytanie pojawiło się, jak z nimi pracować. Wszystkie wskazówki dotyczące "i" Umieść artykuły pokazujące parametry, z którymi musisz uruchomić kreatywy i haartraining ze szczegółowym opisem tych parametrów.
Kod z czystego arkusza.
Wreszcie, odmawiając starej metody, kod został przepisany do zastępowania przeszkolonych kaskad.
Kod 2.0.
#Include "stdafx.h" #include
Środa Skonfiguruj tak samo jak w przeszłości projektu.
Powtórzenia - ojcowie ćwiczeń.
Przypadek dla "małych" do trenowania kaskad.)
Rozpoczyna się najciekawszy. Po tym zdecydowałem się napisać o wszystkich tych solarach na Habr i poprosić o radę.
Przygotowałem 500 zdjęć w rozmiarze 1600x1200. I jeden obraz o rozmiarze 80x80. Jedno zdjęcie wystarczy, ponieważ wykryjemy pewien obiekt, a nie ogromną różnorodność osób.
Więc podczas przygotowywania zdjęć i tworzenie pliku neg.dat z strukturą
Ujemny / n (1) .jpg ujemny / n (2) .jpg ujemny / n (3) .jpg ujemny / n (4)
uruchom plik openCv_createSamples.exe za pomocą CMD z następującymi parametrami
C: OpenCV2.3.1buildcommonx86OpenCV_CreateSamples.exe -vec C: OpenCv2.3.1Buildcommonx8Positive.Vect -BG C: OpenCv2.3.1Buildcommonx86Neg.dat -Img C: OpenCv2.3.1buildcommonx86ustupi.jpg -num 500-W 50 -h 50 -Color 0 -BGThresh 0 -show.
parametr -Show pokazuje utworzone dodatnie zdjęcia, ale w przeciwieństwie do tych określonych w innych artykułach.
zdjęcia, okazuje się to
mały
Oznacza to, że narzędzie cięci obraz BG dla wielkości pozytywnego obrazu. Zmiana wyników parametrów -w i -H nie dają, a tylne tło jest nadal prawie nie widoczne. Jeśli nagle ktoś wie, co się dzieje, rozważania akcji. Rozmiar negatywnych obrazów zmniejszył się do 800x600 - wynik jest taki sam.
C: OpenCv2.3.1buildcommonX86OpenCv_haartraining.exe -Data C: OpenCv2.3.1Buildcommonx86haarustupi -Vec C: OpenCv2.3.1buildcommonx86Positive.vect -BG C: OpenCv2.3.1buildcommonx86NEG.dat -NPos -Nneg 500 500 6 -nstages -NSplits 2-W 20 -h 24 -mem 1536 -mode all -nonSym -Minhitrate 0.999 -MaxFalSalarm 0.5
po tym otrzymasz długotrwały plik XML, który możesz załadować źródło programy.
W rezultacie kaskada jest lekko uczyć się i z dużą ilością fałszywe pozytywy, Reaguje na, który mnie kochał, będę ustanowił do znaku znaku.
Ale nie mogę osiągnąć dokładnych tringa, wydaje mi się, ze względu na fakt, że tylne tło jest przycięte w pozytywnych obrazach. I nie działa na zdjęciach jak w podręcznikach. Ale nadal istnieje możliwość zwiększenia liczby kroków szkoleniowych i ładowania komputera przez cały dzień, poczekaj, aż kaskada będzie bardziej "wykształcona". Co zamierzam zrobić przed pojawieniem się innych pomysłów.
Epilog
To pierwszy artykuł Hellohabr ze mną. Czekam na swoje komentarze na temat stylu materiału. I oczywiście wskazówki na temat.
Mam nadzieję, że wnioski otrzymane będą kontynuowanie historii.
Główną ideą jest uwzględnienie powiązań statystycznych między układem punktów antropometrycznych osoby. Na każdym obrazie twarzy punktu są ponumerowane w tej samej kolejności. Przez ich wzajemną lokalizację osoby są porównywane.
Dla porównania osoby mogą używać tej samej pozycji twarzy w stosunku do kamery. Bardziej preferowany dla tego.
Przechwyć strumień wideo z aparatem i wyborem
#Zawierać.
Pliki Cascade znajdują się w katalogu C: OPENCV Build ETC ... Pożądana kaskada znajduje się w katalogu projektu, gdzie i plik źródłowy Main.CPP.
Wybór specjalnych punktów twarzy
Aplikacja opiera się na kodzie C ++ dla FaceMark OpenCV
#Zawierać.
W projekcie aplikacji, gdzie i plik main.cpp, Umieszczone pliki. haarcascade_frontalface_alt2.xml., drawlandSmon.HPP. i lbfmodel.yaml. które są linkami w kodzie. Pliki Cascade znajdują się w C: OPENCV Build Its ... drawlandSmon.HPP. i lbfmodel.yaml. W pliku znajduje się w pliku facemarka_lbf.rar.
Po włożeniu kodu błędy pojawiły się ze względu na fakt, że w OpenCV 3.4.3-VC14-VC15 nie ma żadnej liczby bibliotek niezbędnych do uruchomienia aplikacji. Ukończono bibliotekę (pobierz openv_new.zip) i zainstalował go w głównym dysku C (C: OpenCV-Nowy).
Teraz wszystkie wykonywane ustawienia muszą być wykonywane dla OpenCV-NEW:
Wykonaj ustawienia w systemie Windows. Wychodzę do okna "Zmień okno zmienne" (Windows-\u003e Utilities-\u003e Panel sterowania -\u003e System i bezpieczeństwo -\u003e System -\u003e Dodatkowe opcje Systemy -\u003e Zmienne środy -\u003e Ścieżka -\u003e Edytuj). W tym oknie tworzę zmienną C: openCV-Nowy.x64 VC14 BIN. Uruchom ponownie system Windows..
W Właściwości projektu Zapoznaj się również do biblioteki OpenCV_NEW (zamiast OpenCV). W oknie "Strony właściwości" wykonuje działania:
- C / C ++ -\u003e Ogólne -\u003e Dodatkowe obejmuje katalogi -\u003e C: openCV-Nowy.\\ Zawierać.
- Linker -\u003e Ogólne -\u003e Dodatkowe katalogi biblioteki -\u003e C: \\ openCV-Nowy.x64 vc14 lib
- Linker -\u003e Wejście -\u003e Dodatkowe zależności -\u003e OpenCv_core400.lib; OpenCv_face400.lib; Openv_videooio400.lib; OpenCv_objdetec400.lib; OpenCv_imgproc400.lib; OpenCv_highgui400.lib.
Podczas uruchamiania program wyświetla błąd, jeśli w instalacjach projektu debugowania. Do wydania, rozpoczynając sukces.
Wybór funkcji do filtrowania obrazów i rozpoznawania twarzy
Rama punktowa twarzy jest wyświetlana na różne sposoby w zależności od obiektywnych i subiektywnych czynników.
Czynniki obiektywne - pozycja twarzy w stosunku do kamery.
Czynniki subiektywne - nierówne lub słabe oświetlenie, zniekształcenie twarzy z powodu emocji, płynność oczu itp. W tych przypadkach rama punktowa może być nieprawidłowa, punkty mogą nawet być rozwiedzione w imieniu:
Z pisać na maszynie wideo, takie obrazy czasami pomijają. Muszą filtrować - zarówno podczas uczenia się, jak i rozpoznawania.
Niektóre punkty są najbardziej stabilne i pouczające. Są mocno związane z twarzą, niezależnie od jej pozycji w stosunku do kamery. Ponadto są one dobrze scharakteryzowane przez specyfikę twarzy. Punkty te mogą być stosowane jako podstawa do modelowania objawów.
Dla porównania ludzie mogą korzystać z ramki punktu 2D tej samej pozycji twarzy. Jaka jest sytuacja o aparacie w stosunku do kamery najbardziej pouczającej? Oczywiście, czołowy. Nie na próżno w Forensics sprawia, że \u200b\u200bzdjęcia w twarzy i profilu. Podczas konfrontacji twarzy.
Wszystkie znaki (odległości) powinny być wymiarowe (znormalizowane), tj., Skorelowane do pewnego rozmiaru (odległość). Zakładam, że najbardziej odpowiednim rozmiarem jest odległość między środkiem punktów kątowych oczu. I dlaczego, na przykład, nie przez zewnętrzne punkty kątowe oczu, które są faktycznie zdefiniowane w tablicy dzielnicy? Faktem jest, że punkty kątowe oczu przechodzą (zamknij), gdy reagują na zmianę koloru, ekspresję zaskoczenia, migające itp. Odległość między środkiem poziomu oczu te oscylacje, a zatem korzystniej.
Jaki znak podejmie jako podstawa w pierwszym przybliżeniu? Zakładam, odległość od górnego punktu nosa do dolnego punktu brody. Sądząc po zdjęciu, ten znak może się znacząco różnić dla różnych osób.
Więc przed formowaniem znaków do uczenia się i porównania, musisz odfiltrować ramy kroplowe osób uzyskanych przez przechwytywanie wideo, które, po subiektywnych lub obiektywnych powodów, nie mają prawidłowego obrazu czołowego twarzy (AFAS).
Pozostawiamy tylko te ramy punktu, które przekazują następujące funkcje:
- Direct, który przechodzi przez ekstremalne punkty oczu (linia oczu), prostopadle do linii prostej, która przechodzi przez skrajne punkty nosa (linia nosa).
- Linia oczu jest równoległa do bezpośredniego, który przechodzi przez punkty usta (linia RTO).
- Symetria powyższych punktów obserwuje się w stosunku do linii nosa.
- Punkty narożne oczu (zewnętrzne i wewnętrzne) znajdują się na jednej linii prostej.
Przykładem obrazów frontal, które przechodzą na wszystkich podstawach:
Przykładem obrazów, które są filtrowane:
Wypróbuj swoje wyniki, aby określić, jak ze znaków obrazu nie przechodzi.
Jak są znaki, które zapewniają filtrowanie i rozpoznawanie twarzy? Zasadniczo są one zbudowane na warunkach określania odległości między punktami, warunkami równoległościami i prostopadłością. Zadanie formalizacji takich znaków jest rozpatrywane w temacie.
Algorytm rozpoznawania twarzy na punktach ramek 2D
Współrzędne punktów ramy twarzy są początkowo ustawione w układzie współrzędnych, który jest związany z górnym lewym punktem okna. Jednocześnie oś I jest skierowana w dół.
Dla wygody określania znaków używamy niestandardowego układu współrzędnych (PSK), której oś X przechodzi przez segment między środkiem oka, a oś Y jest prostopadła do tego segmentu przez jego środek w kierunku wzrostowym . Współrzędne PSK (od -1 do +1) są znormalizowane - skorelowane z odległością między środkowymi punktami oczu.
PSK zapewnia wygodę i prostotę identyfikacji znaków. Na przykład, położenie twarzy w szybkim zależy od znaku symetrii odpowiednich punktów oka w stosunku do linii nosa. Ta funkcja jest sformalizowana przez zbieg okoliczności linii nosa z osią Y, I.E. X1 \u003d x2 \u003d 0, gdzie X1 i X2 są współrzędnymi punktów ekstremalnych punktów (27 i 30) w komputerze.
Określ okno sc
Współrzędne środkowych punktów lewego i prawego oka (w lewo i prawej):
Xl \u003d (x45 + x42) / 2; Yl \u003d (y45 + y42) / 2; Xr \u003d (x39 + x 36) / 2; Yr \u003d (y39 + y 36) / 2;
Początek PSK:
X0 \u003d (XL + XR) / 2; Y0 \u003d (yl + yr) / 2;
Odległości między średnimi punktami oczu wzdłuż osi X i Y:
Dx \u003d XR - XL; DY \u003d YR - YL;
Rzeczywista odległość L między średnimi punktami oczu (Twierdzenie Pitagoreo):
L \u003d SQRRT (DX ** 2 + DY ** 2)
Drygonometryczne kąty rogu PSK:
Idź ze współrzędnych w oknie SK do współrzędnych w PSKKorzystanie z parametrów X0, Y0, L, Sin Al, Cos AL:
X_USER_0 \u003d 2 (X_Window - X0) / L;
Y_user_0 \u003d - 2 (y_window - y0) / l;
X_user. \u003d X_USER_0 * COS_AL - Y_USER_0 * SIN_AL;
Y_user. \u003d X_USER_0 * SIN_AL + Y_USER_0 * COS_AL;
Wdrażamy filtrowanie obrazu Konsekwentnie sprawdzanie znaków:
1. Prosty wierność linii nosa i oczu, a także symetria punktów kątowych oczu. Linia nosa jest określona przez pkt 27 i 30 (patrz rysunek b). Oba funkcje są wykonywane, jeśli współrzędne tych punktów x1 \u003d x2 \u003d 0 (to znaczy, linia nosa pokrywa się z osią Y) w PCC.
2. Przechodząc równoległość linii oka i linii jamy ustnej. Linia ust określana jest przez punkty 48 i 54 (patrz rysunek b). Funkcja jest wykonywana, jeśli w PSK Y1-Y2 \u003d 0.
3. Znak symetrii punktów kątowych ust. Linia ust określana jest przez punkty 48 i 54 (patrz rysunek b). Znak jest wykonywany, jeśli x1 + x2 \u003d 0
4. Znak "Punkty kątowe oczu są na jednej linii prostej". Bezpośrednio określają pary punktów: (36 i 45), a także (39 i 42). Ponieważ test na funkcji 1 jest już przekazany, wystarczy określić znak Y2-Y1 \u003d 0 w PSK tylko dla punktów 36 i 39.
Nie można istnieć bezwzględna równość, więc znaki są porównywane z dopuszczalną małą wielkością.
Program porównania twarzy jeden znak
Jako cecha, odległość między punktami mostów i podbródek (punkty orientacyjne 27 i 8, patrz rysunek b). Znak, znormalizowany jest znormalizowany w stosunku PCT: (Y1 - Y2) / L, gdzie L jest odległością między ośrodkami oczu. Podczas szkolenia programu, znak konkretna osoba Określony przez numer, który jest podświetlony obok osoby śledzonej (ta część kodu w programie jest komentowana). Po rozpoznaniu wartości atrybutu jest porównywany z określonym znakiem wprowadzonym do programu dla każdej osoby. Posiadającym wynikiem porównania, jego identyfikator pojawia się obok twarzy.
Program rozpoznaje za pośrednictwem zdjęcia, na którym mam 15 lat młodszy, a nawet w tym czasie z wąsami. Różnica na zdjęciu jest niezbędna, a nie każda osoba troszczy się. Ale program komputerowy Nie oszukuj.
Zadania kontrolne:
- Zapoznaj się z programem.
- Określ wartość atrybutu dla twarzy i kilku swoich kolegów.
- Przetestuj program do identyfikacji osób (jego i kolegów).
#Zawierać.
Ten artykuł przynosi przegląd metod wyszukiwania obiektów na obrazie.
1. Wstęp
Wiele praktycznych zadań z automatyzacji kontroli w produkcji do projektowania samochodów robotycznych jest bezpośrednio związane z zadaniem wyszukiwania obiektów na obrazie. Aby go rozwiązać, możesz zastosować dwie różne strategie, które zależą od warunków fotografowania - modelowanie tła i modelowania obiektu.- Modelowanie w tle - to podejście można zastosować, jeśli aparat jest nadal, tj. Mamy tło, które się nie zmieniają, a zatem możesz zbudować swój model. Wszystkie punkty obrazu znacznie odbiegają od modelu tła, rozważ obiekty pierwszego planu. W ten sposób możesz rozwiązać zadania wykrywania obiektów i konserwacji.
- Symulacja obiektu - Takie podejście jest bardziej ogólne, używane w przypadkach, gdy tło zmienia się stale i znacząco. W przeciwieństwie do poprzedniego przypadku musimy wiedzieć, co chcemy znaleźć, tj. Konieczne jest zbudowanie modelu obiektu, a następnie sprawdzić punkty obrazu za zgodność z tym modelem.
2. Przegląd metod
W tej sekcji damy listę podejść, z którymi można skutecznie rozwiązać zadanie wyszukiwania obiektu na obrazie, w kolejności zwiększenia złożoności.- Filtry kolorów - Jeśli obiekt jest znacznie podświetlony na tle koloru, możesz wybrać odpowiedni filtr.
- Wybór i analiza konturów - Jeśli wiemy, że obiekt jest ukształtowany, na przykład, okrąg, możesz wyszukać okrąg na obrazie.
- Mapowanie szablonu - mamy obraz obiektu, szukamy w innym obrazie obszaru zbieżnego z tym obrazem obiektu.
- Pracuj ze specjalnymi punktami - na zdjęciu z obiektem jest poszukiwanie funkcji (na przykład kątów), które próbują porównać z takimi funkcjami na innym obrazie.
- Metody uczenia maszynowego - uczymy klasyfikatora na zdjęciach z obiektem, w jakiś sposób dzielimy obraz do części, sprawdź każdą część klasyfikatora do obecności obiektu.
3. Filtry kolorów.
Metoda filtra kolorów może być stosowana w przypadkach, w których obiekt znacznie różni się od tła na kolorach i oświetleniu jest równomiernie i nie zmienia się. Szczegóły dotyczące metody filtrów kolorów można odczytać.4. Wybór i analiza konturów
Jeśli obiekt na tle w kolorze nie jest znacząco przydzielony i / lub ma złożoną kolorystykę, zastosowanie metody filtra kolorów nie da dobrych wyników. W takim przypadku możesz spróbować zastosować metodę wyboru i analizy konturów. Aby to zrobić, podkreślamy granice na obrazie. Granice są miejscami ostrych zmian jasności gradientu, można je znaleźć za pomocą metody Canny. Następnie możemy sprawdzić wybrane linie granic dla zgodności z geometrycznym obiektem obiektu, można to zrobić, można to zrobić, na przykład, stosując metodę transformacji Hough, na przykład możemy wyszukiwać w obwodzie.
Rys.4:szukaj kół
Ta metoda może być również używana w połączeniu z filtrami kolorów. Szczegóły dotyczące alokacji i analizy konturów można odczytać. Kod źródłowy przykładu z fundamentem kręgów można pobrać.
5. Mapowanie z szablonem
Jeśli obraz ma wiele małych części, analiza konturu może być trudna. W tym przypadku możesz zastosować metodę dopasowania wzoru (dopasowanie szablon). Składa się na następujący sposób - robimy zdjęcie z obiektem (rys. 5) i szukamy dużego obrazu obszaru zbieżnego z obrazem obiektu (rys.6.7).
Rysunek 5: Wyszukaj obiekt
6. Pracuj ze specjalnymi punktami
Metoda porównania z opisaną w poprzedniej sekcji poszukuje dokładnych dopasowań punktów wzorów z punktami obrazu. Jeśli obraz jest zakorzeniony lub skalowany w stosunku do parametrów szablonu, ta metoda działa źle. Aby przezwyciężyć te ograniczenia, metody są używane na podstawie tzw. Specjalne punkty, przyjrzymy się na nich dalej. Specjalny punkt (kluczowy punkt) jest małym obszarem, który jest znacznie podświetlony na obrazie. Istnieje kilka metod identyfikacji takich punktów, może to być narożniki (Harris rogu detektor) lub blob (BlOB, Drop), I.e. Małe obszary tej samej jasności, dość jasna granica stoi na ogólnym tle. Dla specjalnego punktu oblicz tzw. Deskryptor - charakterystyczny dla specjalnego punktu. Deskryptor jest obliczany zgodnie z danym sąsiedztwem specjalnego punktu, jako kierunki gradientów jasności różnych części tej okolicy. Istnieje kilka metod obliczania deskryptorów dla pojedynczych punktów: Sift, Surf, Orb itp Należy zauważyć, że niektóre metody obliczania deskryptorów są opatentowane (na przykład, Sift), a ich użycie komercyjne jest ograniczone. Szczegóły dotyczące specjalnych punktów na temat obrazów i metod pracy z nimi możesz słuchać wykładu. Szczegółowe punkty można wykorzystać do wyszukiwania obiektu na obrazie. Aby to zrobić, musimy mieć obraz żądanego obiektu, a następnie wykonać następujące kroki.- Na zdjęciu z obiektem szukamy specjalnych punktów obiektu i obliczamy ich deskryptory.
- Na analizowanym obrazie sprzedajemy również specjalne punkty i obliczamy dla nich deskryptory.
- Porównaj deskryptory specjalnych punktów obiektu i deskryptorów specjalnych punktów znalezionych na obrazie.
- Jeśli znaleziono wystarczającą liczbę korespondentów, zaznaczamy obszar odpowiednimi punktami.
Cyfra 8: Detektor obiektów do punktów specjalnych
Kod źródłowy tego przykładu można pobrać.
7. Metody uczenia maszynowego
Metoda wyszukiwania obiektów poprzez porównanie zestawów pojedynczych punktów ma swoje wady, jeden z nich jest złą zdolnością uogólniającą. Jeśli mamy zadanie, na przykład, wybór ludzi na zdjęciu, wtedy według punktów specjalnych Nasza metoda poszukuje jednego konkretnego zdjęcia. Zdjęcie, na którym podświetlono specjalne punkty, reszta osób przeznaczy gorzej, ponieważ najprawdopodobniej odpowiadają innym zestawom liczby pojedynczych punktów. Wyniki mogą być jeszcze gorsze, jeśli zmienisz widok fotografowania. Aby rozwiązać te problemy, potrzebujemy już metod uczenia maszyn, a nie jeden obraz z obiektem, ale całe zestawy szkoleniowe z setek (w niektórych przypadkach - setki tysięcy) różnych zdjęć z wizerunkiem obiektu w różnych warunkach. Stosowanie metod uczenia maszyn do wyszukiwania obiektów na obrazie będziemy przyjrzeć się drugiej części tego artykułu.Literatura
- E.S. Detektor obiektów Borysowa do stacjonarnych kamer.
- http: //syt/cv-backgr.html. - E.S. Przetwarzanie wideo Borysowa: Obiekty detektora oparte na filtry kolorów.
- http: //syt/cv-detector-Color.html. - E.s Metody przetwarzania obrazu Borysowa Borysowa.
- http: //syt/cv-base.html. - Anton Konusin Computer Vision (2011). Wykład 3. Proste metody analizy obrazu. Szablony mapowania.
- http://www.youtube.com/watch?v\u003dte99WDbrrui. - Dokumentacja OpenCV: Wykrywanie narożników Harris
- http://docs.opencv.org/3.0-beta/doc/py_Tutorials/py_feature2d/pe_peatures_harris/pe_peatures_harris.html. - Wikipedia: Blob_detection.
- http://en.wikipedia.org/wiki/Blob_detection. - Anton Konusin Computer Vision (2011). Wykład 5. Funkcje lokalne
- http://www.youtube.com/watch?v\u003dvfseuicis-s.
Biblioteka uczenia się komputera i open source. Obejmuje ponad 2500 algorytmów, w których istnieją zarówno klasyczne, jak i nowoczesne algorytmy do wizji komputerowej i uczenia maszynowego. Ta biblioteka ma interfejsy w różnych językach, wśród których jest Python (w tym artykule, którego go używamy), Java, C ++ i Matlab.
Instalacja
Instrukcje instalacji w systemie Windows można oglądać, aw Linux -.
Importuj i wyświetlaj obrazy
Import CV2 Image \u003d CV2.imRead ("./ Path / to / ImageUwaga Podczas odczytu powyższej metody obrazu znajduje się w przestrzeni kolorów, a nie RGB (jak wszyscy są przyzwyczajeni) i BGR. Być może na początku nie jest tak ważny, ale jak tylko zaczniesz pracować z kolorem - powinieneś wiedzieć o tej funkcji. Istnieją 2 rozwiązania:
- Zmień pierwszy kanał (R - Red) z trzecim kanałem (B Niebieski), a następnie czerwony będzie (0.0.255), a nie (255,0,0).
- Zmień przestrzeń kolorów na RGB: RGB_IMAGE \u003d CV2.CVTColor (obraz, CV2.Color_bgr2R2RGB)
A następnie w pracy nie działa już z obrazem, ale z RGB_IMAGE.
Uwaga Aby zamknąć okno, w którym wyświetlany jest obraz, naciśnij dowolny klawisz. Jeśli używasz przycisku zamykającego okna, możesz natknąć się na wiszącym.
W artykule pojawi się następujący kod do wyświetlania obrazów:
Import CV2 Def Viewimage: CV2.namedow (Name_of_Window, CV2.Window_normal) Cv2.imshow (Name_of_Window, Image) CV2.waitKey (0) CV2.DestroyallWindows ()
Zacząc
Pensik po przycinaniu
Importuj CV2 Cropped \u003d Image Viewimage (przycięte "Pinsyk po CADY")
Gdzie obraz jest obrazem.
Zmiana rozmiaru
Po zmianie rozmiaru o 20%
Importuj CV2 SCALE_PERCCENT \u003d 20 # procent oryginalnej szerokości rozmiaru \u003d INT (IMG.Shape * SCALE_PERCCENT / 100) Height \u003d int (img.Shape * skala_percent / 100) DIM \u003d (szerokość, wysokość) zmienić rozmiar \u003d CV2.Resize (IMG, Dim, Interpolation \u003d CV2.inter_area) Widok Zostaw (zmieniony rozmiar "po zmianie rozmiaru o 20%")
Ta funkcja uwzględnia współczynnik proporcji oryginalnego obrazu. Można zobaczyć inne zmiany rozmiaru obrazu.
Skręcać
Pensik po obracaniu 180 stopni
Importuj CV2 (H, W, D) \u003d Image.Shape Center \u003d (W //2, H //2) M \u003d CV2.GetrotationMatrix2D (centrum, 180, 1.0) obrócony \u003d CV2.warpaffin (obraz, M, (w , H)) Widok Zostaw (obrócony "Pensik po obracaniu 180 stopni")
image.Shape zwraca wysokość, szerokość i kanały. M - Turn Matrix - Włącza obraz 180 stopni wokół środka. -Ve jest kątem obrotu obrazu zgodnie z ruchem wskazówek zegara, odpowiednio, odpowiednio w lewo.
Tłumaczenie w skali szarości i na czarno-białym obrazie w progu
Pensik w szarości
Czarno-biała cipka
Import CV2 Gray_Image \u003d CV2.Color_bgr2gray) Ret, Threshold_Image \u003d CV2.TRESHOLD (IM, 127, 255, 0) Widok Zostawień (Gray_Image "Pensik w Gray Grades") Viewimage (Threshold_Image "Black and White Pensik")
gray_Image to wersja pojedynczej kanału obrazu.
Funkcja progowa zwraca obraz, w którym wszystkie piksele, które są ciemniejsze (mniej) 127 są zastępowane przez 0, a wszystkie są jaśniejsze (więcej) 127 to 255.
Dla jasności, inny przykład:
RET, THRESHOLD \u003d CV2.TRESHOLD (IM, 150, 200, 10)
Tutaj wszystko, co jest ciemniejsze niż 150 zastępuje się 10, a wszystko, co jest jaśniejsze, to 200.
Opisane są pozostałe cechy progowe.
Rozmycie / wygładzanie
Niewyraźny pensik.
Import CV2 zamazany \u003d CV2.GaussianBurur (obraz, (51, 51), 0) Widok Zostaw (zamazany "Niewyraźne Pensik")
Funkcja GaussiaBurur (Blur in Gauss) ma 3 parametry:
- Obraz źródłowy.
- Mancake z 2 dodatnimi liczbami nieparzystych. Im większa liczba, tym więcej energii wygładzającej.
- sigmax. i sigmay.. Jeśli te parametry pozostały równe 0, ich wartość zostanie obliczona automatycznie.
Rysowanie prostokątów
Obserwuj prostokąt pitę cipki
Importuj wyjście CV2 \u003d zdjęcie )
Ta funkcja zajmuje 5 parametrów:
- Sam się obraz.
- Współrzędna górnego lewego rogu (X1, Y1).
- Współrzędna prawy rogu (x2, Y2).
- Kolor prostokąta (GBR / RGB w zależności od wybranego modelu kolorów).
- Grubość linii prostokąta.
Linie rysunkowe
2 piny, oddzielone linią
Importuj wyjście CV2 \u003d Image.Copy () CV2.line (wyjście (60, 20), (400, 200), (0, 0, 255), 5) Widok (wyjście, 2 piny, oddzielone linią ")
Funkcja linii zajmuje 5 parametrów:
- Sam obraz, na którym jest rysowana linia.
- Współrzędna pierwszego punktu (X1, Y1).
- Współrzędna drugiego punktu (x2, y2).
- Kolor linii (GBBR / RGB w zależności od wybranego modelu kolorów).
- Grubość linii.
Tekst na obrazie
Obraz z tekstem
Importuj wyjście CV2 \u003d Image.Copy () CV2.puttext (wyjście, my<3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) viewImage(output, "Изображение с текстом")
Funkcja PutText zajmuje 7 parametrów:
- Bezpośrednio obraz.
- Tekst na obraz.
- Współrzędna lewego rogu tekstu tekstu (X, Y).
- Przetworzony obraz w szarym gradacji.
- Parametr ScaleeFactor. Niektóre twarze mogą być więcej niż inne, ponieważ są bliżej niż inne. Ten parametr kompensuje perspektywę.
- Algorytm rozpoznawania używa okna przesuwnego podczas rozpoznawania obiektów. Parametr Minneighbors definiuje liczbę obiektów wokół twarzy. To znaczy, tym większa wartość tego parametru, tym bardziej podobnych obiektów jest konieczna do algorytmu, aby określa aktualny obiekt jako twarz. Liczba fałszywych pozytywów wzrośnie zbyt mały, a algorytm będzie bardziej wymagający za dużo.
- minsize - bezpośrednio wielkość tych obszarów.
Znalezione osoby: 2
Importuj CV2 image_path \u003d " .TetectMultiscale (szary, Scaleefactor \u003d 1.1, Minneighbors \u003d 5, Minsize \u003d (10, 10)) Faces_deted \u003d "Osoby znalezione:" + Format (twarze) Drukuj (twarze_dektorem) # Narysuj kwadraty wokół twarzy (x, Y, W, h) w twarzach: cv2.Cregluj (obraz, (x, y), (x + w, y + h), (255, 255, 0), 2) Widok Zostawień (obraz, twarze_dektorem)
detectuctMultiscale to ogólna funkcja rozpoznawania obu osób i obiektów. Aby funkcja wyszuka dokładnie na twarzy, przekazujemy odpowiednią kaskadę.
Funkcja DetectMultiscale zajmuje 4 parametry:
Kontury - rozpoznawanie obiektów
Rozpoznawanie obiektów jest wykonane przy użyciu segmentacji kolorów. W tym celu znajdują się dwie funkcje: CV2.Findcontours i CV2.DrawContours.
W tym artykule opisano szczegółowo wykrywanie obiektów przy użyciu segmentacji kolorów. Wszystko, czego potrzebujesz, jest tam.
Zapisywanie obrazu
Importuj obraz CV2 \u003d CV2.imRead (". / Import / ścieżka. Waga") CV2.IMWRITE ("./ Eksport / ścieżka. Waga", obraz)Wniosek
OpenCV jest doskonałą biblioteką z algorytmami światła, które można wykorzystać w renderowaniu 3D, zaawansowanej edycji obrazów i wideo, śledzenia i identyfikacji obiektów i osób na wideo, szukając identycznych zdjęć z zestawu i wielu, wiele rzeczy.
Ta biblioteka jest bardzo ważna dla tych, którzy rozwijają projekty związane z uczeniem maszyny w dziedzinie obrazów.