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を置いたフォルダに移動し、
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でプロジェクトが開かれる。

サンプルコード

今回は読み込んだ画像を2値化して表示しました。
作成したプロジェクトフォルダの中にあるdataフォルダに読み込みたい画像を入れるのを忘れないでください。
使用した画像はこちら↓

ofApp.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を使った任意の処理を書く。今回は2値化を行う。
    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にコピペして実行すると画像が出力されます。
出力結果↓

苦労した点など

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

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