Xcode8でOpenCVを動かしてみる

※2016年12月頃のメモです

## 動作環境
| 項目 |   内容  |
|:------------:|:------------:|
| OS |     macOS Sierra 10.12.1     |
| OpenCV |   2.4.13.1    |
|   Xcode |     8.1     |
|   言語 |     C++     |

## Xcodeでプロジェクトを新規作成する
[macOSへのOpenCVを導入](https://qiita.com/thomi40/items/14d796493d3b5ea1db36)し、Xcode側でプロジェクトを作成する。

### プロジェクトの作成

Xcodeを立ち上げて `File > New > Project` からプロジェクトを作成。
![31035381750_0a71ac7b5b_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/efcb1c4f-79c7-1381-c0f7-6cd1faaa77c4.jpeg)

続いて `macOS > Command Line Tool` を選択。
![30597143923_eb04723d18_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/ce55f7d5-f49b-2e5a-8d2b-90f720ff78e0.jpeg)

次に `Project Name` などの必要事項を入力。
今回は動作確認なので適当に入力し、言語は `C++` を選択。

![31035381460_69e60290a5_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/2578aa06-1e72-a01c-3f30-d03a2a9d8fb5.jpeg)

## ソースコードを入力
左側の`main.cpp`を選択してエディタ画面を開く。
![30597143663_0a690830d4_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/513fdf58-0e88-cf8c-371f-95d5d0b9d743.jpeg)

今回はバイラテラルフィルタによる平滑化処理のサンプルコードを動かしてみる。

```cpp
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main(int argc, char *argv[])
{
    Mat src_img = imread("画像のパスを指定", 1);
    
    if(src_img.empty()) {
        printf("画像を読み込めませんでした。\n");
        return -1;
    }
    
    Mat dst_img;

    bilateralFilter(src_img, dst_img, 10, 40, 200);

    imshow("src image", src_img);
    imshow("result", dst_img);
    
    waitKey(0);
}
```

## Xcode側の設定
これで完了！と言いたいところだが、このままビルドすると以下のような警告が出力される。

```
'opencv2/core/core.hpp' file not found
```

XcodeでOpenCVをビルドするためには(NuGetを使わない場合)Visual Studioと同様ヘッダサーチパスとライブラリサーチパスを設定する必要がある。

### ヘッダーサーチパスの設定

ヘッダーサーチパスを設定することでコンパイル時にOpenCVのインクルードファイルを参照することができる。
パスを設定するために左側の`Navigator`からXcodeのプロジェクト(今回は`opencv-sample`)を選択。

`Build Settings > All > Search Paths > Header search Paths` へ移動し、 `/usr/local/Cellar/opencv`を`recursive`で設定。
パスはそれぞれの環境によるが、HomebrewでOpenCVを導入した場合はおそらく上記のパスで問題ないはず。

![31035381930_daf22cb3d2_h.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/302b3ab0-8dee-f45d-387e-bd3643181553.jpeg)

### ライブラリサーチパス
リンクするライブラリファイルを指定するためにライブラリサーチパスも設定する。
`Build Phases > Link Binary With Libraries`から任意のライブラリファイルを追加して設定。
設定にあたってまずはFinderからライブラリを探す。


Finderのタブから`移動 > フォルダへ移動`を選択し、`/usr/local/Cellar/opencv/2.4.13.1/lib`と入力。
移動したディレクトリから今回は以下の3つのライブラリを選択し、Xcodeの`Link Binary With Libraries`へドラックアンドドロップしてパスを設定。
※OpenCVのバージョンやインストール方法によってパスは適宜変更すること

```
libopencv_imgproc.2.4.13.dylib
libopencv_highgui.2.4.13.dylib
libopencv_core.2.4.13.dylib
```

![31035381110_8301e94667_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/354aca20-1aa6-2873-6acd-f2c6fd7ee97a.jpeg)

## Xcodeでビルドする
設定が終わればあとは実行だけ。
今回は先ほどのサンプルコードをビルドしてみる。

![30597143263_0224d029f7_b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134341/fa29f5f5-68c0-7832-b080-753212b5d402.jpeg)
右の画像がフィルタをかけた結果。問題なく動作していることを確認。

## 参考リンク
[OpenCV.jp : OpenCV逆引きリファレンス — OpenCV-CookBook](http://opencv.jp/cookbook/index.html)
[HomebrewとXcode5でつくるOpenCVの環境 – なんてこったいブログ](http://nantekottai.com/2014/04/16/opencv-xcode5-homebrew/)