GOCVの環境構築とサンプル一部紹介

## はじめに
goで画像処理してみたいと思ってネットサーフィンしていたら**GOCV**なるものをみつけたので

環境構築とサンプルコードの紹介をします。

### 環境
- windows10
- go version go1.12.6 windows/amd64

### パッケージダウンロード

``
PS C:\Users\Hoge> go get -u -d gocv.io/x/gocv
``
### MinGW-64 のインストール

http://mingw-w64.org/doku.php

- MInGW-W64って?  
64bit windowsOSでCやC++をコンパイルできるようにするツールらしい(曖昧です)

- 以下ページを参考にインストールしました

https://www.javadrive.jp/cstart/install/index6.html

### cmakeのインストール
https://cmake.org/

[Download] から **cmake-3.17.0-rc1-win64-x64.msi** を選択してダウンロード & インストール

### 環境変数の設定

自分がどのディレクトリにいても、hoge.exeを実行できるようにwindows側に.exeファイルが存在するPath(環境)を登録しておきましょう。

環境変数の設定は次のような順番で行えます
1. [スタート] - [設定] - [設定の検索]で**環境変数を編集**で検索
![setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438389/3fb5ae8f-0291-984d-e8db-f7266a563b97.png)

2. **Path**変数を選択して、編集をクリック

3. Pathに **C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin** と **C:\Program Files\CMake\bin** を追加してOKを選択する
※ インストールしたバージョンとインストールしたフォルダ名で上記の名前と違うことがあります。

### opencvの環境構築

**%GOPATH%\gocv.io\x\gocv** に **win_build_opencv.cmd** が存在するのでダブルクリックで実行しましょう

opencvのビルドが始まります

ビルド完了後、C:\opencv\build フォルダが作られているはずなので、

C:\opencv\build\install\x64\mingw\bin を再度環境変数のPathに登録しましょう。

## sample code
環境構築が完了したら、readme.mdの説明を見ながらいくつか動かしてみるといいでしょう。

readmeやソースコード内にusageがまとめられてるのもgoodですね。
> C:\Users\hoge\go\src\gocv.io\x\gocv\cmd\readme.md

何個か試してみて面白かったものを紹介します。

### hello sample

カメラデバイスにアクセスして、映像を垂れ流しするサンプル

サンプルのためカメラデバイスは0番目で決め打ちされているし、key入力受付してexitもないのには注意

```go
// gocv.io\x\gocv\cmd\hello\main.go

// +build example
package main

import (
	"gocv.io/x/gocv"
)

func main() {
	webcam, _ := gocv.OpenVideoCapture(0)
	window := gocv.NewWindow("Hello")
	img := gocv.NewMat()

	for {
		webcam.Read(&img)
		window.IMShow(img)
		window.WaitKey(1)
	}
}
```
windowにカメラ映像が表示されていればOKです

![hello.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438389/ebcdb106-6586-6a6f-2f84-a0f80d92bbc1.png)


### motion-detect

IntelのOpenVinoを使って物体認識をしているサンプルだと思います。

ある程度分類はできているようなので、返り値の値を上手く使って表示を工夫できれば面白そうですね。

どのカメラに接続するか引数で渡す必要があります。
```
go run gocv.io\x\gocv\cmd\motion-detect\main.go 0
```
![motion_detect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438389/2ca76130-4bd2-e75b-d8b7-ef555bf85721.png)

### facedetect

カスケード分類器を使った顔認識サンプルですが、あまり精度が良くない印象です。  
第一引数にカメラ、第二引数にカスケード分類器のxmlが必要で、xmlはdataフォルダにあらかじめ準備されているので、それを使いましょう。

```
go run gocv.io\x\gocv\cmd\facedetect\main.go 0 gocv.io\x\gocv\data\haarcascade_frontalface_default.xml
```

### faceblur

facedetectの発展形で顔認識した空間にblur処理(ぼかし)を行うサンプルです。

```
gocv.io\x\gocv\cmd\faceblur\main.go 0 gocv.io\x\gocv\data\haarcascade_frontalface_default.xml
```

- blur結果  
アニメキャラクターの顔も認識してますね。

![face_blur.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438389/ab17d990-efb6-0572-750b-eae7767b326f.png)

### face_detect_url

facedetectの発展形で引数に与えた**url**から取得した画像を対象に顔検出して、画像として保存します。

今回は画像処理で有名なレナさんの画像をwikipediaから取得して顔検出してみます。

```
go run gocv.io\x\gocv\cmd\faceblur\main.go https://upload.wikimedia.org/wikipedia/en/7/7d/Lenna_%28test_image%29.png gocv.io\x\gocv\data\haarcascade_frontalface_default.xml output.png
```

- 結果

![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438389/33659bb1-a609-a3e3-c138-161c0b8d115e.png)


## まとめ

goで何か作りたいなと思ってた時に、CVのライブラリを見つけたので導入方法をまとめてみました。

暇があればgoでクローラーとかも作ってみたいです。