nextchapter

Proba wykorzystania **openCV** do obslugi kamery. Do napisania programu wykorzystamy darmowe oprogramowanie **Dev-C++**. Do tego celu uzyjemy kamery **CHICONY DC-2120**. W celu poprawnego dzialania programow wystarczy skopiowac niezbedne biblioteki do katalogu system32 w systemie Windows. Najlepiej skopiowac wszystkie pliki z rozszerzeniem dll do tego katalogu. Oczywiscie nie mozemy zapomniec o dodaniu plikow naglowkowych do samego Dev-C++. W przypadku domyslnej instalacji biblioteki OpenCV ponizsze rysunki pokazuja niezbedne ustawienia: Po tych operacja mozemy sie zabrac zapisanie programu. Odczytanie obrazu z kamery z uzyciem wyzej wymienionej biblioteki jest bardzo proste i sprowadza sie do paru linijek kodu: //cvNamedWindow( "test", 1 );// utworzenie nowego okna CvCapture* capture = cvCaptureFromCAM(0); //uchwyt do strumienia obrazu kamery 0 - oznacza pierwsza kamere, mamy tylko jedna if( !capture ) return -1; for { IplImage* frame=cvQueryFrame(capture);// pobranie klatki if(!frame) break; cvShowImage( "test", frame ); //wyswietlenie pobranego obrazu na ekran nowo utowrzonego okna "test" c=cvWaitKey(100);// oczekiwanie 100 ms, co daje nam ok 10 klatek na sec if(c >= 0) { return 0; } }// Niestety ze wzgledu na jakosc naszego sprzetu pobrane obrazy sa bardzo slabej jakosci. Stworzylismy wiec swoje zdjecia klockow :



Dodatkowo stworzymy kopie tych obrazow ktore zostana poddane przeksztalceniom typu obrot. Obrot ten bedziemy wykonywac w przestrzeni trojwymiarowej. Podczas rozponawania tak przeksztalconych obrazow i przypisania im oryginalnego wzorca mozna wykorzystac rowniez przeksztalcenie. Jednak czas takiej operacji bylby bardzo dlugi w zaleznosci od perspektywy z ktorej patrzymy. Najlepszym sposobem jest dodanie do naszej bazy juz przeksztalconych wzorcow oraz wykonywac na nich operacje skalowania. Jesli klocki roznia sie znaczaco to takie porownanie nie powinno sprawic klopotu. Niestety w przypadku porownania pewnych znakow, wezmy dla przykladu znaki pisma z Tybetu: Dla uproszczenia stworzylismy proste znaki, ktore ukaza nam ten problem: Zauwazmy, ze patrzac na klocki powyzej potrafimy kazdy z nich rozroznic. Niestety patrzac na nie z roznych perspektyw mozemy miec wrazenie, ze np klocek drugi jest podobny do piatego, a nawet ze nim jest. W celu wyeliminowania tego bledu czlowiek probuje spojrzec na taki klocek z odpowiedniej perspektywy. Nie bedziemy przeksztalcac tych obrazkow w celu uzyskania odpowiedniego obrazu, ktory umozliwil by rozpoznanie. Zamiast tego zajmiemy sie nakierowaniem robota w odpowiednie miejsce. Jakie to miejsce? Poczatkowo problem wydaje sie miec proste rozwiazanie. Ustawimy tak robota aby boczne krawedzie klocka byly rownolegle do nas, a prostopadla krawedz gorna i dolna. Niestety od razu tutaj zauwazmy problem ze komputer nie wie ktora z nich jest boczna, dolna czy tez gorna. Jednak zmniejszymy w ten sposob ilosc przeksztalcen jakie bedziemy musieli wykonac. W najgorszym wypadku trzeba bedzie wykonac ich trzy, o kat 90, 180, 270. Mozliwosc prawidlowego rozpoznania obiektu warunkuje ze nie mamy dwoch obiektow, z ktorych jeden jest absolutnie taki sam jak drugi po obrocie o ktorys z wyzej wymienionych katow. Przed samym rozpoznaniem oczywiscie musimy podzielic obrazki na pewne klasy. Podstawowymi cechami ktore bedziemy rozpatrzac beda ilosc linii pionowych, poziomych czy tez ukosnych. Po takiej klasyfikacji mozemy dodatkowo sprawdzic stosunek pomiedzy punktami strategicznymi obrazu np pomiedzy jednym koncem linii a drugim. Oczywiscie majac stosunek tych punktow z oryginalnego obrazka i biorac pod uwage pewien prog bledu. Zanim jednak przejdziemy do kolejnego etapu sprawdzmy co potrafi wyzej wymieniona biblioteka. Rzeczy ktore nas moga zainteresowac znajdziemy w bibliotece: CvReference orazCvAux. Dla przykladu funkcje przydatne przy kalibracji naszego robota: Funkcja cvFindChessboardCorners znajduje wewnętrzne wierzchołki wzorca Funkcja cvFindCornerSubPix zwraca położeniu wierzchołków znalezionych przez cvFindChessboardCorners Funkcje do rozpoznawanie struktury obrazu [|Analiza struktury] oraz [|Rozpoznawanie wzorca] Przeglad informacji i przykladow na temat OpenCV: http://tech.groups.yahoo.com/group/OpenCV/ Przyklad wykorzystania OpenCV do wykrycia obietkow przez kamere w oparciu o funkcje powyzej: Ponizej przyklad rozpoznawania elipsy wraz z kodem zrodlowym: Przed: Po:

Kody zrodlowe do przykladu: [|Circle.zip], [|FindCircles.zip]