W dzisiejszych czasach, gdy możliwości układów cyfrowych stale rosną, zaimplementowanie systemu wizyjnego w robocie mobilnym nie jest już rzeczą nieosiągalną.
Biblioteka OpenCV, którą tutaj prezentuje zawiera szereg funkcji, które zadanie to czynią jeszcze prostszym, warto więc się z nią zaznajomić.
Artykuł ten stanowi wprowadzenie do OpenCV, będzie on pomocny szczególnie tym, którzy nigdy wcześniej nie mieli z nią do czynienia. Postaram się tu bezboleśnie przeprowadzić czytelnika przez proces instalacji i tworzenia prostego programu wyświetlającego w oknie obraz wczytany z pliku.
Pracować będziemy w środowisku Eclipse, program napiszmy w języku C++. Artykuł ten opiera się o bibliotekę OpenCV w wersji 2.4.2, wszystkie programy w nim przedstawione będą napisane w OpenCV C++ API.
Instalacja OpenCV 2.4
Proces instalacji należy przeprowadzić w systemie Windows 32-bit. Zakładam, że jest już zainstalowany na komputerze pakiet MinGW oraz Eclipse dla C/C++, jeżeli nie, to należy je zainstalować przed przystąpieniem do wykonywania poniższych kroków.
1. Z odpowiedniej strony pobieramy najnowszą wersję OpenCV, na chwile obecną 2.4.2.
2. Po pobraniu wypakowujemy plik np. do C:\OpenCV2.4.
3. Z racji, że chcemy używać OpenCV z kompilatorem GNU musimy skompilować bibliotekę na naszej platformie przy użyciu tegoż kompilatora, aby otrzymać niezbędne pliki binarne. Aby tego dokonać pobieramy i instalujemy CMake w najnowszej wersji.
4. Odpalamy Cmake, najprościej uruchomić CMake-GUI jest to nakładka graficzna. Wskazujemy folder do którego rozpakowaliśmy OpenCV i w którym znajduje się plik CmakeLists.txt.
W polu poniżej wskazujemy gdzie mają trafić wygenerowane przez CMake pliki np.:
C:/OpenCV2.4/opencv/release
Klikamy w przycisk "Configure", jako generator wybieramy MinGW - make. Może wyskoczyć jakiś błąd, zatwierdzamy i klikamy jeszcze raz "Configure". Zostanie utworzona odpowiednia konfiguracja co może chwilę potrwać na koniec powinniśmy otrzymać komunikat "Configuring done".
CMake-GUI
5. Następnie przyciskiem "Generate" tworzymy pliki binarne potrzebne do kompilacji OpenCV na naszym komputerze na koniec powinien pojawić się napis "Generating done".
Poprawnie zakończony proces generowania.
6. Otwieramy konsolę i przechodzimy z jej poziomu do wygenerowanego folderu release. Musimy teraz dokonać kompilacji biblioteki. Będąc w folderze release wykonujemy z poziomu konsoli mingw32-make.
Kompilacja potrwa z pewnością kilkanaście minut.
Konsola
7. W głównym folderze z biblioteką, u mnie C:\OpenCV2.4\opencv, odnajdujemy folder build.
Zawartość folderu.
Otwieramy go i odszukujemy folder include. Znajdują się w nim pliki nagłówkowe naszej biblioteki. Najprościej jest skopiować zawartość folderu include do folderu include pakietu MinGW. Jeżeli nie chcemy tego robić, można dać znać eclipse, aby szukał w tym folderze plików nagłówkowych, jednak będziemy to musieli robić za każdym razem, gdy tworzymy nowy projekt.
Należy wówczas z górnego panelu Eclipse przejść do
Project->Properties->C/C++ Build->Settings->GCC C++ Compiler->Includes
Następnie w polu Include paths dodać link do plików nagłówkowych, u mnie:
C:\OpenCV2.4\opencv\build\include
8. W folderze build odnajdujemy również \x86\mingw\lib następnie można albo skopiować zawartość lib do tegoż samego folderu MinGW albo podobnie jak przedtem poinformować Eclipse o nowych miejscach do szukania bibliotek, czyli:
Project->Properties->C/C++ Build->Settings->MinGW C++ Linker->Libreries
W polu Library search path link do folderu.
9. Na koniec należy odnaleźć w folderze build - \x86\mingw\bin i skopiować znajdujące się tam pliki .dll do folderu Windows/system32.
Pierwszy projekt OpenCV w Eclipse
Zaczynamy od: File->New->C++ Project
Nowy projekt
Jako kompilator wybieramy MinGW, typ projektu – pusty. Finish.
Zawartość katalogu
Następnie klikamy w okienku po lewej stronie na folder OpenCV_1 prawym i dodajemy folder źródłowy New->Source Folder.
Nowy folder źródłowy
W kolejnym oknie wpisujemy nazwę folderu źródłowego, np. src
Nazwa folderu źródłowego
W lewym okienku zostanie utworzony folder src, klikamy na niego i dodajemy plik źródłowy.
Nowy plik źródłowy
W kolejnym oknie wpisujemy nazwę plik np. main.cpp i kończymy. Należy jeszcze dołączyć odpowiednie dyrektywy dla linkera, aby używał bibliotek OpenCV przy linkowaniu naszego programu. Klikamy w lewym oknie na folder OpenCV_1 i przechodzimy do:
Project->Properties->C/C++ Build->Settings->MinGW C++ Linker->Libraries
Dodajemy dyrektywy linkera
W polu Libraries należy wpisać:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
libopencv_highgui242
libopencv_features2d242
libopencv_flann242
libopencv_objdetect242
libopencv_video242
libopencv_calib3d242
libopencv_contrib242
libopencv_imgproc242
libopencv_core242
libopencv_ml242
libopencv_legacy242
libopencv_nonfree242
libopencv_photo242
libopencv_stitching242
libopencv_videostab242
Uzupełnione biblioteki:
Uzupełnione biblioteki
Spowoduje to "dolinkowanie" wszystkich bibliotek OpenCV do naszego programu. W większości przypadków nie jest to potrzebne, gdyż nie wykorzystujemy ich wszystkich, a jedynie kilka z nich. To, które biblioteki są nam potrzebne w danej chwili można wydedukować choćby na podstawie nazw dołączonych plików include.
Tutaj jednak zostają podane wszystkie co by łato je można było znaleźć w razie potrzeby, a każdy z nas już sam zdecyduje, które z nich mu w danej chili będą przydatne.
Pierwszy program
Następnie wpisujemy kod naszego programu.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <string>
#include <iostream>
using namespacecv;
using namespacestd;
intmain()
{
conststringfile_name="sunflower.jpg";
Mat img=imread(file_name);
if(!img.data)
{
cout<<"Nie odnalezionu pliku "<<file_name;
return-1;
}
conststringwindow_name="OpenCV_1";
namedWindow(window_name,CV_WINDOW_AUTOSIZE);
imshow(window_name,img);
waitKey(0);
return0;
}
Zapisujemy Ctrl+S i wykonujemy Project->Build Project, a następnie Run aby odpalić nasz program. Obrazek należy umieścić w w folderze głównym z naszym programem.
Umiejscowienie przykładowego pliku
Przeanalizujmy program. Na początku dołączamy pliki nagłówkowe OpenCV:
C
1
2
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
Korzystamy także z przestrzeni nazw OpenCV:
C
1
using namespacecv;
W dalszych krokach tworzymy zmienną przechowującą obrazek i wczytujemy do niej dane z pliku:
C
1
Mat img=imread(file_name);
Jak wynika z powyższego w OpenCV obrazy przechowujemy w klasach Mat, które mają budowę wzorowaną na macierzach. W klasach tych można przechowywać także macierze a OpenCV udostępnia szereg funkcji pozwalających na wykonywanie działań na nich.
Następnie tworzymy okno, jako nazwę podajemy łańcuch umieszczony w zmiennej window_name. Za pomocą drugiego parametru ustawiamy automatyczne dopasowanie rozmiarów okna do jego zawartości.
C
1
namedWindow(window_name,CV_WINDOW_AUTOSIZE);
Na koniec wyświetlamy obrazek funkcją imshow. Podajemy nazwę okna, w którym zostanie wyświetlony obrazek, oraz klasę Mat w której go przechowujemy.
C
1
imshow(window_name,img);
Ostatnia funkcja czeka na wciśnięcie klawisza, jako argument przyjmuję czas opóźnienia w ms.
C
1
waitKey(0);
Podsumowanie
Jak widaćOpenCV oferuje szereg funkcji upraszczających pracę z obrazami.
Gdyby podczas studiowania artykułu pojawiły się jakieś problemy proszę zadawać pytania, postaram się szybko odpowiedzieć a w miarę możliwości zmienić niezrozumiałe fragmenty tekstu jeśli takowe się znajdą.
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY na bazie Arduino i Raspberry Pi.
To nie koniec, sprawdź również
Przeczytaj powiązane artykuły oraz aktualnie popularne wpisy lub losuj inny artykuł »
Dołącz do 20 tysięcy osób, które otrzymują powiadomienia o nowych artykułach! Zapisz się, a otrzymasz PDF-y ze ściągami (m.in. na temat mocy, tranzystorów, diod i schematów) oraz listę inspirujących DIY z Arduino i RPi.
Trwa ładowanie komentarzy...