macのOpenCV3 C++の環境をbrewで作った


今更ながらc++の環境構築のメモ。
「詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識」が出た。1000ページ近い辞書のような本。この本はc++の本なので環境を作った。
今まではopencv3の環境を入れれてなかったので、brewで入れ直した。前提としてあまりc++に詳しくないが。

#環境

主にmac
もしかしたらg++周りの設定が抜けてるかも。
後brewは入ってる前提
ubuntuだったらビルドかな？　そのうち書きたい。

#OpenCV C++の環境を作る(brew編)

ちなみにwith contribで拡張機能を入れるとビルドされるのでbrewに時間がかかる。
opencv3だけでもよかった気がする。

```
brew tap homebrew/science
brew install opencv3 --with-contrib --with-ffmpeg --with-opengl --with-python3
brew update
brew upgrade
```

brewで入れるとCellarにopencvが入る。

```
cd /usr/local/Cellar/opencv/3.4.1_5/lib/pkgconfig
#元から/usr/local/lib/pkgconfig/opencv.pcにファイルがある場合は一応確認しておく
diff opencv.pc /usr/local/lib/pkgconfig/opencv.pc
```

問題なさそうであればコピー

```
sudo cp opencv.pc /usr/local/lib/pkgconfig/opencv.pc
```


これで動くはず

https://github.com/miyamotok0105/opencv_sample/blob/master/tutorial/learning_opencv3_examples/ch02/example_02-01.cpp


```
g++ -o example_02-01 example_02-01.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`
```


本家のgitはこっち

https://github.com/oreillymedia/Learning-OpenCV-3_examples/blob/master/example_02-02.cpp


大変参考になったページ
https://qiita.com/kuboyoo/items/3f216e18e66b8e08505b



#OpenCV2.4

多分brew install opencv3出なくてbrew install opencvで入れたんだと思う。


```
brew install opencv
```

サンプル
https://github.com/miyamotok0105/opencv_sample/tree/master/tutorial/cpp/semi_opencv2.4.13.3


自分の下の環境は2.4だったけどopencv3系に変えたかった。
一応違いも比較しておいた。

```
diff opencv.pc /usr/local/lib/pkgconfig/opencv.pc
```

かなり違う。


```
< prefix=/usr/local/Cellar/opencv/3.4.1_5
---
> prefix=/usr/local
11,13c11,12
< Version: 3.4.1
< Libs: -L${exec_prefix}/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core
< Libs.private: -L/usr/local/lib -ltbb
---
> Version: 2.4.13.3
> Libs: -L${exec_prefix}/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab

```


2.4系の状態で3系を動かそうとするとエラーが出てた。

```
g++ -o example_02-01 example_02-01.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`
```

ビルドはできるけど、実行時にそんなモジュールないよってエラーってた。


```
./example_02-01 ../images/fruits.jpg
dyld: Library not loaded: /usr/local/opt/ffmpeg/lib/libavcodec.57.dylib
  Referenced from: /usr/local/lib/libopencv_highgui.2.4.dylib
  Reason: image not found
Abort trap: 6
```

今回brew install opencv3にしてopencv.pcを指定の場所に変えることで動くようになった。


# 最後に

最近はPythonだけじゃなくてc++でも書きたいと思って、最近少しずつ手を出してる。
pdfからバイナリを読んでデコードしたり、pngなどimageのバイナリを直接読めることに楽しみを覚える。
自分でPythonで作った深層学習モデルをモバイルで高速に動かすことも興味がある。

Pythonでバイナリを動かしてた時の残骸。structライブラリを使って読み込んでた。
https://github.com/miyamotok0105/python_sample/tree/master/tutorial/struct
この辺りはC言語とかの本が強いと思う。

ちょっと分野は変わるけどセキュリティの分野で見れば「たのしいバイナリの歩き方」や「Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際」を読めばバイナリで遊べる。「リバースエンジニアリング」とかも非常に面白い文献と知り合いは言ってる。僕はまだやれてないから、いつかやりたい。



#参考

やってないけどC++のOpenCV複数バージョンの保持
https://qiita.com/shinsumicco/items/5efde7e5dbdf0f8e2c43
IOSでopencv
http://www.yukisako.xyz/entry/opencv-mac