GoCVを試すまでのお話

[OpenCV4が正式にリリース](https://opencv.org/opencv-4-0-0.html)されたみたいですね。
弊社のサーバチームではGo言語をメインに使っていることもあり、僕も専らGo言語でお仕事しています。GoからOpenCV4を簡単に使えないかなぁと検索すると[GoCV](https://gocv.io/)なるものを見つけました。ちゃんとOpenCV4に対応しているようです。素晴らしい。

というわけでC++でもpythonでもなく、GoCVを使ってGoからOpenCV4を使ってみます。

## OpenCV4のビルド&インストール

今回はmacOSを前提としているので、OpenCV4のビルドとインストールに関しては[こちら](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/)のページを参考にしました。
pkgconfigのインストールやpython環境の事前準備等は上記ページに任せて説明を端折りますが、今回は以下のように`cmake`します。

```
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=/path/to/opencv_contrib-4.0.0/modules \
    -D PYTHON3_LIBRARY=`python -c 'import subprocess ; import sys ; s = subprocess.check_output("python-config --configdir", shell=True).decode("utf-8").strip() ; (M, m) = sys.version_info[:2] ; print("{}/libpython{}.{}.dylib".format(s, M, m))'` \
    -D PYTHON3_INCLUDE_DIR=`python -c 'import distutils.sysconfig as s; print(s.get_python_inc())'` \
    -D PYTHON3_EXECUTABLE=/path/to/.pyenv/shims/python \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=/path/to/.pyenv/versions/3.6.3/lib/python3.6/site-packages/numpy/core/include \
    -D PYTHON3_PACKAGES_PATH=/path/to/.pyenv/versions/3.6.3/lib/python3.6/site-packages \
    -D BUILD_opencv_python2=OFF \
    -D BUILD_opencv_python3=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D INSTALL_C_EXAMPLES=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D BUILD_EXAMPLES=ON ..
```

`make`して`sudo make install`後、PKG_CONFIG_PATHを適宜設定しておきます。

```sh
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH"
```

オフィシャルなOpenCV4のpkgconfigのファイルが見つからなかったので、[こちら](https://prateekvjoshi.com/2013/10/18/package-opencv-not-found-lets-find-it/)のページを参考に以下の内容のopencv4.pcというファイルを自作して`/usr/local/lib/pkgconfig`に配置します。

```
prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib

Name: opencv4
Description: The opencv library
Version: 4.0.0
Cflags: -I${includedir}/opencv4
Libs: -L${libdir} -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_calib3d -lopencv_ccalib -lopencv_core -lopencv_datasets -lopencv_dnn -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_features2d -lopencv_flann -lopencv_fuzzy -lopencv_gapi -lopencv_hfs -lopencv_highgui -lopencv_img_hash -lopencv_imgcodecs -lopencv_imgproc -lopencv_line_descriptor -lopencv_ml -lopencv_objdetect -lopencv_optflow -lopencv_phase_unwrapping -lopencv_photo -lopencv_plot -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_stitching -lopencv_structured_light -lopencv_superres -lopencv_surface_matching -lopencv_text -lopencv_tracking -lopencv_video -lopencv_videoio -lopencv_videostab -lopencv_xfeatures2d -lopencv_ximgproc -lopencv_xobjdetect -lopencv_xphoto
```

## GoCVのインストール

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

## Hello GoCV

正しくOpenCVとGoCVがインストールされたかどうかを確認するためにGoCVのサンプルプログラムを動かしてみます。

```sh

git clone https://github.com/hybridgroup/gocv.git
cd gocv
go run ./cmd/version/main.go
```

以下のような結果が出力されれば成功です。

```
gocv version: 0.18.0
opencv lib version: 4.0.0
```


他にもgocvのリポジトリの`cmd`ディレクトリの中に色々参考になるGoのプログラムがあります。今度は`hello`を動かしてみます。

```sh

go run ./cmd/hello/main.go
```

windowが開いてカメラの映像が見れます。OpenCVを使っている実感が湧いてきます。

短いですが、今回はここまで。
他にもサンプルコードがgocvのリポジトリにあるので参考になります。

```sh
$ ls -1 gocv/cmd
README.md
basic-drawing/
caffe-classifier/
captest/
capwindow/
counter/
dnn-detection/
dnn-pose-detection/
dnn-style-transfer/
faceblur/
facedetect/
find-circles/
find-lines/
hand-gestures/
hello/
img-similarity/
mjpeg-streamer/
motion-detect/
openvino/
saveimage/
savevideo/
showimage/
ssd-facedetect/
tf-classifier/
tracking/
version/
```

僕自身Goから画像処理する必要があるのかわかりませんが、とりあえず動作したのを確認できました。
時間があるときにでも画像処理関連で何かしてみたいところです。