MKNM "Synergia"

Kompilacja OpenCV i modułów opencv_contrib, ustawienia Visual Studio

Kompilacja OpenCV i modułów opencv_contrib, ustawienia Visual Studio

OpenCV to biblioteka oparta na otwartym kodzie, wykorzystywana podczas obróbki i analizy obrazu. Choć sama w sobie zawiera mnóstwo pożytecznych funkcji to istnieją również dodatki, znacznie rozszerzające jej funkcjonalność. Znaleźć je można w oddzielnym repozytorium, pod nazwą opencv_contrib. Moduły te nie są jeszcze w pełni przetestowane i całkowicie stabilne, dlatego zamieszczane są oddzielnie.

Idea szczytna, jednak wielu początkujących użytkowników ma problem z uruchomieniem całości. W niniejszym artykule postaram się pokazać jak od początku do końca przejść przez ten proces. Jest to zbiór informacji z artykułów i tutoriali zamieszczonych w źródłach na końcu artykułu, zaktualizowany i poprawiony o kilka detali.

W chwili powstawania artykułu najnowsza wersja OpenCV to 3.20, i tę właśnie wersję skompiluje i uruchomię. Korzystam z Visual Studio 2013, system Win10 x64.

 

Zaczynajmy więc!

Krok 0:

Aby skompilować biblioteki potrzebujemy GITa oraz CMake, pobrać je można stąd:

Krok 1:

Na dysku C (lub w dowolnym innym miejscu) tworzymy katalog, na przykład zgodnie z sugestią dokumentacji, opencv_root:

 

Krok 2:

Uruchamiamy GITa, przechodzimy do utworzonego wcześniej katalogu i wydajemy następujące polecenia:

$ git clone https://github.com/opencv/opencv
$ git clone https://github.com/opencv/opencv_contrib

Pobiorą one kody źródłowe najnowszych wersji opencv oraz opencv_contrib

Podczas nawigacji w terminalu użyteczne będą komendy:
ls   –   wyświetl zawartość folderu, w którym aktualnie się znajdujesz
cd <nazwa>  –   przejdź do katalogu <nazwa>
cd ..   –   przejdź o jeden poziom do góry

Krok 3:

GIT spełnił już swoje zadanie, możemy go zamknąć. Teraz kolej na CMake:

W pierwszym polu wybieramy ścieżkę, która prowadzi do pobranego przed chwilą folderu opencv, w drugim zaś wybieramy miejsce do którego mają trafić pliki po zbudowaniu. W moim przypadku jest to build_opencv znajdujący się w tym samym miejscu, co katalogi pobrane w kroku 2. Wybór zatwierdzamy klikając Configure. Jeśli wybraliśmy ścieżkę do nieistniejącego jeszcze katalogu program zapyta, czy powinien go utworzyć

Krok 4:

W tym okienku wybieramy kompilator i wersję systemu. Klikamy Finish

Krok 5:

Czekamy aż pasek postępu załaduje się do końca. Następnie na liście znajdujemy pozycję OPENCV_EXTRA_MODULES_PATH, która jak zdradza nam nazwa, wskazuje ścieżkę do katalogu modules, znajdującego się w opencv_contrib.

Wybór zatwierdzamy klikając Configure

Krok 6:

Moduł dodatkowe umieszczone są na początku listy, ich nazwy zaczynają się od BUILD_opencv… W tym momencie możemy zaznaczyć, które z nich chcemy dołączyć. Domyślnie wybrane są wszystkie.

Ponadto zaznaczamy opcje:
BUILD_opencv_contrib_world
BUILD_opencv_world
dzięki temu otrzymamy jeden plik nazwany opencv_world, zamiast kilkudziesięciu pomniejszych bibliotek

Kolejnym krokiem który musiałem wykonać, była zmiana parametrów  CPU_BASELINE oraz CPU_DISPATCH na SSE2. Bez tego, przy próbie zbudowania bibliotek kompilator zwracał błędy.

Po wykonaniu powyższych czynności zatwierdzamy nasze wybory klikając Configure, a gdy pasek postępu znów się załaduje klikamy Generate. W ten sposób, w katalogu build_opencv wybranym przez nas w kroku 3 powinny pojawić się pliki potrzebne do zbudowania bibliotek

Krok 7:

Uwaga: kolejne wersje biblioteki różnią się od siebie tym, że nie działa w nich co innego. Użyte mogą być typy zmiennych, rzutowania czy funkcje których nie obsługuje Twój komputer. W takim przypadku pozostaje wyłączenie generacji problematycznych modułów z poziomu CMake, ręczna korekcja plików źródłowych tak, by zastąpić problematyczne linijki kodu lub użycie prekompilowanej biblioteki. Jeśli pomimo najszczerszych chęci nie jesteś w stanie skompilować biblioteki – zajrzyj do FAQ na końcu artykułu.

Gdy pasek postępu dojdzie do końca, możemy zamknąć CMake i otworzyć katalog build_opencv. Tam odnajdujemy OpenCV.sln, które uruchamiamy. Gdy pasek postępu dojdzie do końca, powinniśmy zobaczyć takie okno:

 

Teraz:
a) Upewniamy się, że wybrana jest opcja Debug, zaś obok wersja naszego systemu
b) Klikamy prawym na ALL_BUILD, wybieramy pierwszą opcję z menu czyli build
c) Czekamy kilka minut, jeśli kompilacja zakończy się bez błędów klikamy na INSTALL, gdzie również wybieramy build

Następnie zmieniamy z menu a) wybieramy opcję Release, i powtarzamy punkty b) i c)

Krok 8:

Właśnie zbudowaliśmy biblioteki. Teraz musimy je zainstalować i wskazać ich lokalizacje kompilatorowi. Istnieją różne metody, my skorzystam ze zmiennych środowiskowych. Opisany niżej proces przedstawia film użytkownika OpenCV Moments umieszczony jako Źródło [2] na końcu artykułu.

Przez panel sterowania dostajemy się do Systemu, tam wybieramy zakładkę
a) Zaawansowane ustawienia systemu, następnie
b) Zmienne środowiskowe po czym tworzymy nową, o nazwie OPENCV_DIR, która wskazuje na wybraną przez nas wersją Visuala (w moim przypadku jest to vc12) w katalogu install.

Następnie edytujemy zmienną systemową path, dopisując na końcu %OPENCV_DIR%\bin

Krok 9:

Zbliżamy się do końca. Teraz należy stworzyć nowy projekt w visualu i wskazać linkerowi gdzie znajdują się biblioteki. W procesie tym, który użytkownik OpenCV Moments przedstawia w filmie umieszczonym jako Źródło [3] na końcu artykułu dokonujemy drobnej korekty.

Zaznaczamy
a) Nazwę naszego projektu, z menu zaś wybieramy
b) Propertis
Upewniamy się że zaznaczona jest opcja c) Release

Kolejno, w:
d) C/C++ General jako e) Additional Include Directory podajemy ścieżkę prowadzącą do bibliotek, czyli $(OPENCV_DIR)\..\..\include,

W f) Linker General, w linijce g) Additional Library Directories wpisujemy $(OPENCV_DIR)\lib,


zaś w h) Linker Input, w linijce i) Additional Dependencies podajemy nazwę wygenerowanej biblioteki, (czyli w przypadku biblioteki w wersji 3.2.0) opencv_world320.lib

UWAGA! Wersja biblioteki zmienia się co jakiś czas, upewnij się że podajesz właściwą, np. dla wersji 3.3.0 plik world będzie nosił nazwę opencv_world330.lib

 

Teraz zmieniamy opcję k) Release na Debug  i powtarzamy czynności od d) do i) z tą różnicą, że na samym końcu zamiast opencv_world320.lib wpisujemy opencv_world320d.lib

Krok 10:

W tym momencie wykonaliśmy ostatnią czynność, biblioteki są zalikowane do tego projektu. Biblioteki zazwyczaj działają od razu, czasami jednak wymagane jest ponowne uruchomienie Visual Studio

Aby przekonać się że działają, możemy uruchomić taki oto kod:

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
    cout << "Wersja: " << CV_VERSION << endl;
    return 0;
}

Co powinno dać następujący wynik:

 

FAQ:

 

Kompilacja biblioteki nie działa, co robić?

Na synergicznym drive w podfolderze biblioteki dostępna jest skompilowana wersja 3.3.0

 

Ściągnąłem prekompilowane biblioteki, przykładowy kod nie chce się skompilować, co robić?

Upewnij się że wybrałeś projekt w wersji x64. Jeśli i to nie pomogło, skontaktuj się z autorem niniejszego artykułu

 

 

Źródła:
[1]   https://www.youtube.com/watch?v=tHX3MLzwF6Q
[2]   https://www.youtube.com/watch?v=EcFtefHEEII
[3]   http://docs.opencv.org/3.2.0/de/d25/tutorial_dnn_build.html
[4]  http://maxpixel.freegreatpicture.com/Blue-Machine-Look-Mechanical-Eye-Lens-Bionics-1776925 – obrazek