Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu

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 #Zawierać. #Zawierać. #Zawierać. Int Main (int Argc, Char * Argv) (Iplimage * Image \u003d 0, * DST \u003d 0; // Nazwa Picture Char FileName \u003d "Image0.jpg"; // Dostajemy obraz obrazu \u003d CVLOADIMAGE (nazwa_pliku, 1); Printf ("[I] Image:% S", nazwa pliku); Assert (Image! \u003d 0); // Pokaż obraz CVNAMEDWindow ("Image"); CVShowimage ("Image", Image); // Czekam na Klucz CVWaitkey (0); // zwolnij zasoby CVREleaseImage (& Image); CVREleaseImage (& DST); // Usuń CVDestroyallWindows (); Zwrot 0;)

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ć. #Zawierać. Int Główny (INT Argc, Char ** Argv) (// Ustaw wysokość i szerokość Inthege \u003d 620 zdjęć i szerokości; Int szerokość \u003d 440; // Ustaw punkt, aby wyjść tekst CVPoint PT \u003d CVPoint (wysokość / 4 , Szerokość / 2); // Utwórz 8-bitowy, 3-kanałowy obraz IPLIMAGE * HW \u003d CVCreateMage (CVSIZE (wysokość, szerokość), 8, 3); // Wlać zdjęcie z czarnym CVSET (HW, CVSCalar (0 , 0,0)); / / Inicjalizacja czcionki czcionki czcionki CVFont; Cvinitfont (& Font, CV_Font_hershey_complex, 1,0, 1,0, 0, 1, CV_AA); // Korzystanie z czcionki, wyświetlasz tekst CVPUTTEXT (HW, Krok OpenCV według kroku ", PT i czcionki, CV_RGB (150, 0, 150)); // Utwórz okno CVNAMEDWindow (" Hello World ", 0); // Pokaż zdjęcie w utworzonym oknie CVShowimage (" Hello World ", Hw); // czekając na klucz CVWaitkey (0); // zwolnij zasoby CVREleaseImage (& HW); CVDestroyWindow ("Hello World"); zwrot 0;)

Ł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ć. #Zawierać. #Zawierać. #Zawierać. Iplimage * Image \u003d 0; Iplimage * src \u003d 0; Int Główny (INT Argc, Char * Argv) (// Nazwa obrazu Ustawia pierwszy parametr Char * FileName \u003d ABCC \u003d\u003d 2? Argv: "Image0.jpg"; // Uzyskiwanie obrazu \u003d CVLOADIMAGE (nazwa_pliku, 1); // Klonowanie zdjęcia SRC \u003d CVCloneimage (obraz); Printf ("[I] Image:% S", nazwa pliku); Assert (SRC! \u003d 0); // Okno do wyświetlania CVNAMEDWindow ("Oryginał", CV_Window_autosize); / / Pokażemy CVShowimage ("Original", Image) Image; // Wyświetl informacje o obrazie Printf Image ("[I] Kanały:% d", Image-\u003e Nchannels; Printf ("[I] Głębokość pikseli:% d Bits N ", Image-\u003e Głębokość); Printf (" [I] Szerokość:% D Pixels N ", Image-\u003e Szerokość); Printf (" [I] Wysokość:% d Pixels N ", Image-\u003e Wysokość); Printf ("[I] Rozmiar obrazu:% D bajty N", Image-\u003e Imagizezize); Printf ("[I] Etap Szerokość:% D bajty N", Image-\u003e Szerthstep); // my my czekają na naciśnięcie klawisza CVWaitKey (0); // Uwolniliśmy zasoby CVREleaseImage (& Image); CVREleaseImage (& SRC); // Usuń okno CVDestroyWindow ("Oryginał"); zwrot 0;)

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ć. #Zawierać. #Zawierać. #Zawierać. Iplimage * Ramka \u003d 0; Int Main (int Argc, Char * Argv) (// Nazwa pliku Ustawia pierwszy parametr Char * FileName \u003d Argc \u003d\u003d 2? Argv: "Test.avi"; Printf ("[I] Plik:% s", nazwa_pliku ) Wychwytywanie); jeśli (! Ramka) (Break;) // Tutaj możesz wstawić // Procedura przetwarzania // Pokaż ramę CVShowimage ("Oryginał", rama); Char C \u003d CVWAITKEY (33); IF (C \u003d\u003d 27) (// Jeśli zostaniesz naciśnięty przez ESC - Wyjdź przerwę;)) // Uwolniamy zasoby CVRELEASECapture (& Capture); // Usuń okno CVDestroyWindow ("Oryginał"); Zwrot 0;)

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ć. #Zawierać. #Zawierać. #Zawierać. int Main (int Argc, Char * Argv) (// Uzyskaj dowolną kamerę CVCapture * Capture \u003d CVCreateCameracapture (CV_Cap_any); // CVCapturefromCAM (0); 1280); // cvetcaptureProperty (wychwytywanie, cv_cap_prop_frame_height, 480); // 960); // Dowiemy się szerokości i wysokość podwójnej szerokości \u003d CVGetCaptureProperty (Capture, CV_CAP_Prop_frame_width); Podwójna wysokość \u003d CVGetCaptureProperty (Capture, CV_CAP_Prop_frame_height); Printf ("[I]% .0f x% .0f n", szerokość, wysokość); Iplimage * Ramka \u003d 0; CVNAMEDWindow ("wychwytywanie", CV_Window_autosize); Printf ("[i] naciśnij Enter do przechwytywania obrazu i ESC do Quit! N"); Int Counter \u003d 0; Nazwa pliku char; While (true) (// Otrzymuj ramkę \u003d rama CVQueryFrame (Capture); // Pokaż CVShowimage ("Przechwytywanie", Ramka); Char C \u003d CVWAITKEY (33); ) Indziej, jeśli (c \u003d\u003d 13) (// Enter // Zapisz ramkę do pliku SprintF (nazwa pliku "Image% d.jpg", licznik); Printf ("[I] Capture ...% s ", Nazwa pliku); CVSaveImage (nazwa pliku, ramka); Counter ++;)) // Darmowe zasoby CVREleasECapture (& Capture); CVDestroyWindow ("Capture"); Powrót 0; )

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 #Zawierać. #Zawierać. #Zawierać. Iplimage * Image \u003d 0; Iplimage * Templ \u003d 0; Int Główny (INT Argc, Char * Argv) (// Nazwa obrazu Ustawia pierwszy parametr Char * FileName \u003d Argc\u003e \u003d 2? Argv: "Image0.jpg"; // Uzyskiwanie obrazu \u003d CVLOADImage (nazwa_pliku, 1); Printf ( "[I] Image:% S", nazwa pliku); Assert (Image! \u003d 0); // Szablon Char * FileName2 \u003d Argc\u003e \u003d 3? Argv: "Eye.jpg"; Printf ("[I] Szablon :% s ", nazwę pliku2); Templ \u003d CVLOADImage (FileName2,1); Assert (Templ! \u003d 0); CVNAMEDWIDOW (" Origialll ", CV_Window_autosize); Cvnamedwindow (" Szablon ", CV_Window_autosize); Cvnamedow (" Mecz " , CV_Window_autosize); CVNAMEDWindow ("RES", CV_Window_autosize); // Rozmiar Int Szerokość \u003d Templ-\u003e Szerokość; Int Height \u003d Templ-\u003e Height; // Oryginalny i CVShowimage Szablon ("Origialll", Image); CVShowimage (" Szablon ", Templ); // obraz do przechowywania wyników porównania // Rozmiar wyniku: Jeśli obraz WXH i Templ WXH, a następnie wynik \u003d (WW + 1) X (HH + 1) IPLIMAGE * RES \u003d CVCreateMage (CVSSIZE (((obraz \u003e szerokość-templ-\u003e szerokość + 1), (obraz-\u003e wysokość templ-\u003e wysokość + 1)), IPL_DEPTH_32F, 1); // porównanie obrazu z szablonem CVMatchTemplate (obraz, templ, res, cv_tm_sqdiff); // pokażemy, co dostali CVShowimage ("RES", RES); // Definicja najlepszej pozycji dla porównania // (wyszukaj obniżenie i maxima na obrazie) podwójny minval, maxval; CVPoint MinLoc, maxloc; CVMINMAXLOC (RES, & MINVAL, & MAXVAL, & MINLOC, & MAXLOC, 0); // Normalizuj CVNormalize (RES, RES, 1.0, CV_MINMAX); CVNAMEDWIDOW ("RES Norm", CV_Window_autosize); CVShowimage ("Norma RES", RES); // Wybierz obszar prostokąta CVRectangle (obraz, CVPoint (MinLoc.x, MinLoc.y), CVPoint (MinLoc.x + Templ-\u003e szerokość-1, MinLoc.y + Templ-\u003e High-1), CV_RGB (255, 0, 0), 1, 8); // pokaż obraz CVShowimage ("mecz", obraz); // czekając na naciśnięcie klawisza CVWaitKey (0); // Darmowe zasoby CVREleaseImage (& Image); CVREleaseImage (& Templ); CVREleaseImage (& Res); CVDestroyallWindows (); Powrót 0; )

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 #Zawierać. #Zawierać. Za pomocą przestrzeni nazw CV; Int main (int argc, char ** argv) (rama matowa, szara; string object_Cascade \u003d "haarustupi.xml"; Cascadeclasfier Haar (Object_Cascade); Cap wideo (0); NamedWindow ("Video", 1); wektor Obiekty; While (true) (Cap \u003e\u003e Rama; CVTColor (rama, szary, CV_BGR2Gray); Haar.detectisctispale (szary, obiekty, 1,9, 10, 0, rozmiar (50, 50)); dla (wektor :: const_terator r \u003d obiekty.begin (); R! \u003d Obiekty.end (); R ++) prostokąt (rama, R-\u003e TL (), R-\u003e BR (), skalar (0, 0, 255)); imshow ("wideo", ramka); Jeśli (czekanie (33)\u003e \u003d 0) przerwa; ) Powrót (EXIT_SUCCESS); )

Ś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ć. Za pomocą przestrzeni nazw CV; Int Main () (// załaduj twarz Cascade (plik .xml) Cascadeclasfier Face_Cascade; Face_Cascade.Load ("haarcascade_frontalface_alt2.xml"); MAT IMG; CAP (0); While (true) (Cap \u003e\u003e img; // CVTColor (IMG, IMG, CV_BGR2Gray); // Detect Faces Std :: Vector twarze; face_cascade.detectMultiscale (img, twarze, 1,1, 2, 0 | CV_HAAR_SCALE_IMAGE, rozmiar (30, 30)); // wyciągnij koła na wykrywanych twarzach (Int i \u003d 0;< faces.size(); i++) { Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5); ellipse(img, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); } imshow("Detected Face", img); waitKey(1); } return 0; }

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ć. #Zawierać. #Zawierać. #Zawierać. #Zawierać. #Zawierać. #include "drawlandmarks.hpp" za pomocą przestrzeni nazw STD; Za pomocą przestrzeni nazw CV; Za pomocą przestrzeni nazw CV :: twarz; Int Główny (INT Argc, Char ** Argv) (// Załaduj czujnik twarzy Cascadeclasfier Faceedetector ("Haarcascade_frontalface_alt2.xml"); // Utwórz instancję FaceMarka PTR Facemarka \u003d facemarkaLbf :: tworzenie (); // ładuj czujnik punktowy Facemark-\u003e Loadmodel ("LBFMODEL.YAML"); // skonfiguruj kamerę kamery do przechwytywania wideo Cam (0); // zmienna do przechowywania ramki wideo i jego ramy maty w skali szarości, szare; // Przeczytaj ramkę (Cam.Read (Frame) (// znajdź wektor twarz twarze; // Konwertuj ramkę do Graysscale, ponieważ // Foredeetector wymaga obrazu w skali szarości. CVTColor (rama, szary, kolor_bgr2gray); // wykrywanie twarzy foretetector.detectMultispale (szary, twarze); // zmienna dla zabytków. // Zabytki na jedną twarz to wektor punktów // w obrazie może być więcej niż twarz. Stąd my // używamy wektora punktów. Wektor< vector \u003e Punkty orientacyjne; // Run Landmark Detector Bool Sukces \u003d FaceMark-\u003e< faces.size(); i++) { cv::rectangle(frame, faces[i], Scalar(0, 255, 0), 3); } for (int i = 0; i < landmarks.size(); i++) { drawLandmarks(frame, landmarks[i]); /*for (size_t j = 0; j < landmarks[i].size(); j++) circle(frame, Point(landmarks[i][j].x, landmarks[i][j].y), 1, Scalar(255, 0, 0), 2);*/ } } // Display results imshow("Facial Landmark Detection", frame); // Exit loop if ESC is pressed if (waitKey(1) == 27) break; } return 0; }

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:

  1. Zapoznaj się z programem.
  2. Określ wartość atrybutu dla twarzy i kilku swoich kolegów.
  3. Przetestuj program do identyfikacji osób (jego i kolegów).

#Zawierać. #Zawierać. #Zawierać. #Zawierać. #Zawierać. #Zawierać. #include "drawlandmarks.hpp" za pomocą przestrzeni nazw STD; Za pomocą przestrzeni nazw CV; Za pomocą przestrzeni nazw CV :: twarz; Int Główny (INT Argc, Char ** Argv) (// Załaduj czujnik twarzy Cascadeclasfier Faceedetector ("Haarcascade_frontalface_alt2.xml"); // Utwórz instancję FaceMarka PTR Facemarka \u003d facemarkaLbf :: tworzenie (); // ładuj czujnik punktowy Facemark-\u003e Loadmodel ("LBFMODEL.YAML"); // skonfiguruj kamerę kamery do przechwytywania wideo Cam (0); // zmienna do przechowywania ramki wideo i jego ramy maty w skali szarości, szare; // Przeczytaj ramkę (Cam.Read (Frame) (// znajdź wektor twarz twarze; // Konwertuj ramkę do Graysscale, ponieważ // Foredeetector wymaga obrazu w skali szarości. CVTColor (rama, szary, kolor_bgr2gray); // wykrywanie twarzy foretetector.detectMultispale (szary, twarze); // zmienna dla zabytków. // Zabytki na jedną twarz to wektor punktów // w obrazie może być więcej niż twarz. Stąd my // używamy wektora punktów. Wektor< vector \u003e Punkty orientacyjne; // RUN Landmark Detector Bol Sukces \u003d FaceMark-\u003e Fit (Ramka, twarze, Zabytki); Jeśli (sukces) (// jeśli udany, renderuj zabytków na twarzy (size_t i \u003d 0; ja< faces.size(); i++) { cv::rectangle(frame, faces[i], Scalar(0, 255, 0), 3); } for (int i = 0; i < landmarks.size(); i++) { //if((i >\u003d 30) && (i<= 35)) drawLandmarks(frame, landmarks[i]); for (size_t j = 0; j < landmarks[i].size(); j++) { circle(frame, Point(landmarks[i][j].x, landmarks[i][j].y), 1, Scalar(255, 0, 0), 2); } line(frame, Point(landmarks[i].x, landmarks[i].y), Point(landmarks[i].x, landmarks[i].y), Scalar(0, 0, 255), 2); float XL = (landmarks[i].x + landmarks[i].x) / 2; float YL = (landmarks[i].y + landmarks[i].y) / 2; float XR = (landmarks[i].x + landmarks[i].x) / 2; float YR = (landmarks[i].y + landmarks[i].y) / 2; line(frame, Point(XL, YL), Point(XR, YR), Scalar(0, 0, 255), 2); float DX = XR - XL; float DY = YR - YL; float L = sqrt(DX * DX + DY * DY); float X1 = (landmarks[i].x); float Y1 = (landmarks[i].y); float X2 = (landmarks[i].x); float Y2 = (landmarks[i].y); float DX1 = abs(X1 - X2); float DY1 = abs(Y1 - Y2); float L1 = sqrt(DX1 * DX1 + DY1 * DY1); float X0 = (XL + XR) / 2; float Y0 = (YL + YR) / 2; float sin_AL = DY / L; float cos_AL = DX / L; float X_User_0 = (landmarks[i].x - X0) / L; float Y_User_0 = -(landmarks[i].y - Y0) / L; float X_User27 = X_User_0 * cos_AL - Y_User_0 * sin_AL; float Y_User27 = X_User_0 * sin_AL + Y_User_0 * cos_AL; X_User_0 = (landmarks[i].x - X0) / L; Y_User_0 = -(landmarks[i].y - Y0) / L; float X_User30 = X_User_0 * cos_AL - Y_User_0 * sin_AL; float Y_User30 = X_User_0 * sin_AL + Y_User_0 * cos_AL; if (abs(X_User27 - X_User30) <= 0.1) { //putText(frame, std::to_string(abs(L1 / L)), Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); if (abs((L1 / L) - 1.6) < 0.1) { putText(frame, "Roman", Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); } if (abs((L1 / L) - 1.9) < 0.1) { putText(frame, "Pasha", Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); } if (abs((L1 / L) - 2.1) < 0.1) { putText(frame, "Svirnesvkiy", Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); } } putText(frame, "Incorrect", Point(landmarks[i].x, landmarks[i].y), 1, 2, Scalar(0, 0, 255), 2); } } // Display results imshow("Facial Landmark Detection", frame); // Exit loop if ESC is pressed if (waitKey(1) == 27) break; } return 0; }

Evgeny Borisov. Poniedziałek, 24 lipca 2017

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.
  1. 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.
  2. 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.
Czasami warunki zadania pozwalają łączyć obie podejścia, może znacząco poprawić wyniki. Rozwiązywanie problemu z modelowaniem tła na stałą kamerę można znaleźć w. Następnie rozważymy zastosowanie drugiej strategii, tj. Symulacja obiektu wyszukiwania.

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.
  1. Filtry kolorów - Jeśli obiekt jest znacznie podświetlony na tle koloru, możesz wybrać odpowiedni filtr.
  2. 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.
  3. Mapowanie szablonu - mamy obraz obiektu, szukamy w innym obrazie obszaru zbieżnego z tym obrazem obiektu.
  4. 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.
  5. 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.
Następnie uwzględniamy te metody więcej szczegółów.

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

Szczegóły dotyczące metody porównania z szablonem można słuchać wykładu. Kod źródłowy tego przykładu można pobrać.

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.
  1. Na zdjęciu z obiektem szukamy specjalnych punktów obiektu i obliczamy ich deskryptory.
  2. Na analizowanym obrazie sprzedajemy również specjalne punkty i obliczamy dla nich deskryptory.
  3. Porównaj deskryptory specjalnych punktów obiektu i deskryptorów specjalnych punktów znalezionych na obrazie.
  4. Jeśli znaleziono wystarczającą liczbę korespondentów, zaznaczamy obszar odpowiednimi punktami.
Poniżej Rys.8 przedstawia wyniki pracy wyszukiwania obiektu dla specjalnego punktu.


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

  1. E.S. Detektor obiektów Borysowa do stacjonarnych kamer.
    - http: //syt/cv-backgr.html.
  2. E.S. Przetwarzanie wideo Borysowa: Obiekty detektora oparte na filtry kolorów.
    - http: //syt/cv-detector-Color.html.
  3. E.s Metody przetwarzania obrazu Borysowa Borysowa.
    - http: //syt/cv-base.html.
  4. Anton Konusin Computer Vision (2011). Wykład 3. Proste metody analizy obrazu. Szablony mapowania.
    - http://www.youtube.com/watch?v\u003dte99WDbrrui.
  5. 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.
  6. Wikipedia: Blob_detection.
    - http://en.wikipedia.org/wiki/Blob_detection.
  7. 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 / Image

Uwaga 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:

  1. 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).
  2. 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:

  1. Obraz źródłowy.
  2. Mancake z 2 dodatnimi liczbami nieparzystych. Im większa liczba, tym więcej energii wygładzającej.
  3. 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:

  1. Sam się obraz.
  2. Współrzędna górnego lewego rogu (X1, Y1).
  3. Współrzędna prawy rogu (x2, Y2).
  4. Kolor prostokąta (GBR / RGB w zależności od wybranego modelu kolorów).
  5. 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:

  1. Sam obraz, na którym jest rysowana linia.
  2. Współrzędna pierwszego punktu (X1, Y1).
  3. Współrzędna drugiego punktu (x2, y2).
  4. Kolor linii (GBBR / RGB w zależności od wybranego modelu kolorów).
  5. 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:

  1. Bezpośrednio obraz.
  2. Tekst na obraz.
  3. Współrzędna lewego rogu tekstu tekstu (X, Y).
  4. 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:

    1. Przetworzony obraz w szarym gradacji.
    2. Parametr ScaleeFactor. Niektóre twarze mogą być więcej niż inne, ponieważ są bliżej niż inne. Ten parametr kompensuje perspektywę.
    3. 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.
    4. minsize - bezpośrednio wielkość tych obszarów.

    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.

Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu