Ahoi,

da ich seit ein paar Tagen an einem Projekt in Go arbeite, wo ich viel mit Bilder hantieren muss, wollte ich das Rad nicht neu erfinden und OpenCV benutzen. Dabei bin ich auf das Projekt gocv.io gestoßen, welches bindings für Go bereitstellt.
Deren Dokumentation ist zwar nicht die Beste, enthält aber eigentlich alles was man braucht. Dabei liefert das Projekt direkt eine eigene Installationroutine mit, welche direkt auch OpenCV 3.4.2 installiert. Komischerweise schlug dies bei mir immer fehl, auch nachdem ich opencv über dnf installiert habe, ohne es direkt zu compilen. Deswegen habe ich OpenCV dann von Hand gebuildet, womit nun jetzt auch alles funktioniert und wie ich das gemacht habe, wollte ich hier kurz zusammenfassen.

Grundsätzlich kann man sich ganz auf die Dokumentation von opencv verlassen.

TLDR:

cd /tmp/ && mkdir -p opencv && cd opencv
wget https://github.com/opencv/opencv/archive/3.4.2.zip && unzip 3.4.2.zip
mkdir -p build && cd build

Ohne die Zusatzmodule (opencv_contrib):

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

Mit den Zusatzmodulen:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local OPENCV_EXTRA_MODULES_PATH=/abs/path/opencv_contrib3.4.2 ..

Jetzt am besten schonmal einen Kaffee holen und dann:

make -j10
sudo make install

Wenn alles erfolgreich abgeschlossen wurde, ist OpenCV installiert :).
Um nun jedoch auch gocv zum Laufen zu bekommen, müssen ein paar Sachen angepasst werden.

Zuerst solltet ihr gocv installieren:

go get -u -d gocv.io/x/gocv

Anschließend in sein Verzeichnis wechseln:

cd $GOPATH/src/gocv.io/x/gocv

Jetzt müssen die Pfade für den Linker richtig gesetzt werden, sonst kommt ihr ab jetzt nicht mehr weiter. Als erstes legt die Datei:

/etc/ld.so.conf.d/opencv.conf

an und schreibt dort: /usr/local/lib64 rein.
Damit der Linker das ganze auch übernimmt: `sudo ldconfig -v

Zum schluss setzten wir noch die richtige Flag für Go:

export CGO_CPPFLAGS="-I/usr/local/include"

Und zum Schluss:

go run ./cmd/version/main.go

Nun solltet alles compilen und dementsprechend funktionieren :)

Read next

Next Post: xtNet