OpenFrameWorksでOpenCVを使う

XcodeでOpenFrameWorksを動かし、OpenCVを導入しようとしたら色々手こずったので、macのopenframeworks内でOpenCVを動かすまでの流れを共有します。

#動作環境
macOS mojave10.14.5
XCode 10.2.1
openframeworks v0.10.1_osx

#環境構築
##openFrameworksのインストール
1. https://openframeworks.cc/ja/download/  
↑ここからosx版のopenframeworksをダウンロード
2. 解凍したフォルダを適当な所に置く

##ofxCVの追加
1. ターミナルでopenFrameworksを置いたフォルダに移動し、  

```Bash
cd addon
git clone https://github.com/kylemcdonald/ofxCv
```

とコマンドを打ち、addonフォルダ内にofxCvをクローンする。

##プロジェクトの作成
1. openFrameworksフォルダ内のprojectGenerator/projectGenerator.appを起動。
2. Project nameをつける
3. Addonsで"ofxCv"と"ofxOpenCv"(←忘れないよう注意！)を追加
4. "Generate"を押す
5. "Success!"と表示されるので、Open in IDEを押すとXCodeでプロジェクトが開かれる。

#サンプルコード
今回は読み込んだ画像を２値化して表示しました。
作成したプロジェクトフォルダの中にあるdataフォルダに読み込みたい画像を入れるのを忘れないでください。
使用した画像はこちら↓
![neko.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195465/fc808e2e-77df-f69a-21bd-1a44215f846a.jpeg)

ofApp.cpp

```cpp
#include "ofApp.h"
#include "ofxCv.h"
#include "ofxOpenCv.h"

ofImage showImg;

//--------------------------------------------------------------
void ofApp::setup(){
    // apps/myApps/myTest/bin/data ディレクトリに置いた画像を読み込む
    ofImage loadImg;
    loadImg.load("neko.jpg");
    cv::Mat img = ofxCv::toCv(loadImg);//ofImageをcv::Matに変換
    
    //読み込んだ画像が無事cv::Matに変換されたので、OpenCVを使った任意の処理を書く。今回は２値化を行う。
    cv::Mat grayImg;
    cv::cvtColor(img, grayImg, CV_RGB2GRAY);
    
    cv::Mat binaryImg;
    cv::threshold(grayImg, binaryImg, 130, 255.0, cv::THRESH_BINARY);
    
    ofxCv::toOf(binaryImg, showImg); //cv::MatをofImageに変換
    showImg.update(); //ofImageの値を書き換えた後はupdateをしないと正しく表示されない。
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
    float scale = 0.5; //適当に縮小倍率を指定
    showImg.draw(0, 0, showImg.getWidth() * scale, showImg.getHeight()*scale);//ウィンドウにshowImgを描画
}

//--------------------------------------------------------------
void ofApp::keyPressed(int key){

}

//--------------------------------------------------------------
void ofApp::keyReleased(int key){

}

//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){

}

//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mouseEntered(int x, int y){

}

//--------------------------------------------------------------
void ofApp::mouseExited(int x, int y){

}

//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){

}

//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg){

}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){ 

}
```

上のコードをofApp.cppにコピペして実行すると画像が出力されます。
出力結果↓
<img width="1136" alt="スクリーンショット 2019-06-04 23.16.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195465/6137b5de-9ac9-6bd7-998f-63e609a97a61.png">

#苦労した点など
ofxOpenCvアドオンだけでもOpenCVのいくつかの関数は使えましたが、記法が素のOpenCVと異なるので非常に使いづらかったです。ofxCvは記法がほとんど同じなのでOpenCVで書いておいたコードをコピペするだけで割と使えます。
最初はofApp::setup()の最後でcv::Matから変換したofImageをupdate()するのがわからず、無駄に時間を食いました。

以上です。間違いなど見つかればご指摘いただけると嬉しいです。