Help us understand the problem. What is going on with this article?

OpenFrameWorksでOpenCVを使う

More than 1 year has passed since last update.

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フォルダに読み込みたい画像を入れるのを忘れないでください。
使用した画像はこちら↓
neko.jpg

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にコピペして実行すると画像が出力されます。
出力結果↓
スクリーンショット 2019-06-04 23.16.04.png

苦労した点など

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away