XcodeでOpenFrameWorksを動かし、OpenCVを導入しようとしたら色々手こずったので、macのopenframeworks内でOpenCVを動かすまでの流れを共有します。
#動作環境
macOS mojave10.14.5
XCode 10.2.1
openframeworks v0.10.1_osx
#環境構築
##openFrameworksのインストール
-
https://openframeworks.cc/ja/download/
↑ここからosx版のopenframeworksをダウンロード - 解凍したフォルダを適当な所に置く
##ofxCVの追加
- ターミナルでopenFrameworksを置いたフォルダに移動し、
cd addon
git clone https://github.com/kylemcdonald/ofxCv
とコマンドを打ち、addonフォルダ内にofxCvをクローンする。
##プロジェクトの作成
- openFrameworksフォルダ内のprojectGenerator/projectGenerator.appを起動。
- Project nameをつける
- Addonsで"ofxCv"と"ofxOpenCv"(←忘れないよう注意!)を追加
- "Generate"を押す
- "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()するのがわからず、無駄に時間を食いました。
以上です。間違いなど見つかればご指摘いただけると嬉しいです。