hellkite 日記と雑記とメモ。

Shiki Kazamaの駄文と音楽と、時々技術な感じ

openFrameworksが64bit対応

昨年の話ですが、openFrameworksの0.9.0がリリースされて、Windows版、Mac版ともに64bit対応となりました。最近は画像処理関係は64bitアプリになるのが当たり前で、openFrameworksのためだけに32bit版のライブラリを用意していましたが、その煩わしさからついに解放されることになりました。
f:id:deis:20160102144533p:plain

特にMac版は嬉しい。こんな問題からもついに解放。。
hellkite.hatenablog.com

ついでに最新のiOS環境にも対応してくれました。よってこんなトラブルもオサラバ。
hellkite.hatenablog.com

これから本格的に使おうとしていた時に、新しいバージョンが出てきたのでタイミングがいい。詳しいチェンジログはこちらから。

Apple Developer Programの更新をしない選択

iPhone3GSを手に入れてから、これまでずっと更新し続けていたApple Developer Program。元々組込み屋だったけど、Apple Storeにアプリリリースしたと言えばアプリ方面に転向できそうだった時期に登録。一応、ヘボアプリを一件出して、はれてアプリ開発者としてそこそこの経験を積むことができた。
本当は個人開発して、とか考えていたけど、時間が取れずに頓挫。でも、Unityで作ったサンプルを実機上で動作させるために継続させていた。ここ数年間全くアプリをStoreに登録していない。
そこで、このニュースですよ。

  • 99米ドルになり、金額があがった。
  • 実機でのテストが無料になった。

内容 - Apple Developer Program
メンバーシップの選択 - サポート - Apple Developer

更新しなかった場合にこれまでのアカウント情報がクリアされると結構面倒くさいことになる。それは避けたかったが、Storeからなくなるだけで、更新すればすぐに元の状態に戻るらしい。
プログラムの更新 - サポート - Apple Developer

当分ないと思うけど、アプリをリリースすることがあったら、そのときに更新すればいいかな。
ちょっと様子見。来年は更新しない選択をしてみよう。

openFrameworksでGLSLレイマーチング

フラグメントシェーダが動かせるようになったらやってみたかったレイマーチング。ようやく環境が揃ったので実際にコードを書いて動かしてみました。

とりあえず、この辺を参考に。

GLSL Graphics Compo向けのレイマーチング向けのチュートリアルです

とりあえず、球体と床を表示させテクスチャを貼ってみるところまで。コード自体は、リンクのサイトの通りなんですけど。まぁ、自分で書いてみるのとコードを見るだけとは結構違いますからね。思ってたより簡単に書けるみたいです。

f:id:deis:20151025023952p:plain

f:id:deis:20151025023953p:plain

 このくらいなら、うちのMacでも60fps出せるみたい*1。これで色々と遊べそうな雰囲気です。いつか音楽と組み合わせてDemoを作ってみたいところ。

openFrameworksを使ってGLSLで遊ぶ方法については、こちら。 

hellkite.hatenablog.com 

*1:撮った瞬間はFPSが落ちるらしく、スクリーンショットでは57fpsになっていますが。

MacにOpenCVを入れて、openFrameworksから使ってみる

今考えている開発対象はiOSがメインですが、検証はMacでできた方がいいかな?というわけで、Mac版でのopenFrameworksでもOpenCVを入れてみました。

OpenCVのインストール

自前でソースからビルドしてみようと思ったのですが、homebrewでインストールしてみます。あまり時間がなかったので。openFrameworksが32bitなのでビルド設定として、32bitを追加しました。

$ brew tap homebrew/science
$ brew install opencv3 --32-bit --with-ffmpeg --with-gstreamer --with-jasper --with-openni --with-python3

インストールに成功すると、/usr/local/Cellar/opencv3/3.0.0にライブラリが入ってきます。こいつをopenFrameworksから使えれば、環境構築としては、完了です。

openFrameworksでOpenCV

openFrameworksから使うといっても、通常のXcodeプロジェクトと同じです。C++万歳。
通常通り、openFrameworksのProjectGeneratorを使ってプロジェクトを作成します。次に、Search Pathsを編集。Header Search Pathsに、/usr/local/Cellar/opencv3を追加、recursiveに変更しておきます。
次にライブラリファイルを追加します。Build Phasesを開き、LinkBinary With Librariesを表示、FinderでOpenCVのdylibをドラッグアンドドロップで追加。
Finderでusr/を開きたいときは、ターミナルから以下のコマンドで開けます。

$ open /usr

で、ビルドすればおしまい。。のはずが...

こんなエラーが出た。

file was built for x86_64 which is not the architecture being linked (i386)

えー。と思って、fileコマンドで確認してみた。

$ file libopencv_video.3.0.0.dylib 
libopencv_video.3.0.0.dylib: Mach-O 64-bit dynamically linked shared library x86_64

あれ?64bit...
INSTALL_RECEIPT.jsonを確認しても、ちゃんと32bitの指定になっているみたいなんだけど。何度やっても同じ、ついでにOpenCV 2.4.9を--32-bitを指定してビルドしてみたけど結果は変わらず。
iOSのときと同じようにソースからビルドしないとダメ?hellkite.hatenablog.com

まぁ、今回に限らずopenFrameworksが64bitに対応していないっぽいのは結構きつい。早くopenFrameworksが64bit化してくれないかしら。

openFrameworksのofxQtVideoSaverが使えない(Mac)

openFrameworksで綺麗なアニメーションができたら動画に撮っておきたい。MacだとQuickTimeを使って画面キャプチャもできるけど、素材としての動画ならアプリから生成したいところ。

で、ofxQtVideoSaverというのがあるみたいなのでチェックしてみました。

github.com

 

ところが、最新のSDKでは使えないとのこと。10.6 SDKを見つけてインストールしておけば、Build SettingsのBase SDKを10.6にすればいいらしい。これ使えれば、次のサイトのような簡単な記述で保存できるっぽい。

sites.google.com

 

残念ながら、手持ちのMacには10.9のSDKまでしか入ってなかったので試していない。

 

Issueをみてみると、OpenCVのVideoWriterとか使ってね。って書いてある。ビデオ出力のためだけにOpenCVを入れるのは抵抗があるが、ちょっと試してみるか。

 

Gitで新しいリポジトリを作るときの注意点

適当にフォルダを作って、こんなコマンドを打つ。

$ git --bare init

で、いざ、外部アクセスしようとしたらエラーでアクセスできない。Permission Errorになる。

正解はこっち。あと、アクセスしたいユーザグループのユーザで実行すること。

$ git --bare init --shared

さて、最初のコマンドで生成してしまった場合、どうするか。削除してしまってもう一度作り直すのがお手軽な気がする。
でも、どうしてもそのまま使いたい場合は、いくつか手順が必要。

  1. configファイルにリポジトリの共有設定を追加
  2. chownで、リポジトリ内のアクセス権を変更

今回は作り直さないで設定しなおしました。具体的な作業は、この辺を参考にしました。
git で共用レポジトリを作成する -- BONNOH FRACTION 14

・・・まぁ、作り直した方が早いですな。

openFrameworks for iOSでOpenCVのcv::Matを使う

サクッと導入したOpenCVですが、openFrameworksと連携できなければ意味がありません。OpenCVでは、cv::Matクラスを使うのでopenFrameworksのデータと、このcv::Matの変換は必須です。

と言っても、非常に簡単で、openFrameworksのofVideoGrabberで取得したカメラ入力をcv::Matにコンバート、cv::Matで色変換、結果をopenFrameworksで描画するコードは、こんな感じです。

ofApp.h

class ofApp : public ofxiOSApp {
  // (中略)

  // Grabber
  ofVideoGrabber grabber;
  ofTexture tex;
  unsigned char * pix;
};

ofApp.mm

#include "ofApp.h"

#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#endif

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

  ofSetOrientation(OF_ORIENTATION_90_RIGHT);
  ofSetFrameRate(30);

  // ofVideoGrabberを初期化する
  grabber.initGrabber(320, 568, OF_PIXELS_BGRA);

  // テクスチャを確保
  tex.allocate(grabber.getWidth(), grabber.getHeight(), GL_RGB);

  // バッファを確保
  pix = new unsigned char [ (int)(grabber.getWidth() * grabber.getHeight() * 3.0)];
}

//--------------------------------------------------------------
void ofApp::update(){
  // カメラからの入力の取得と検出処理

  // カメラ入力を取得
  grabber.update();

  // cv::Mat形式に変換(OpenCVはBGR配列が標準)
  cv::Mat cvColor = cv::Mat(grabber.getWidth(), grabber.getHeight(), CV_8UC3, grabber.getPixels());
  // 色変換
  cv::Mat grayColor;
  cv::cvtColor(cvColor, grayColor, CV_BGR2GRAY);
  cv::Mat binColor; // 2値化
  cv::threshold(grayColor, binColor, 128, 255, cv::THRESH_BINARY);

  int totalPixel = grabber.getWidth() * grabber.getHeight();
  for (int i = 0; i < totalPixel; i++) {
    pix[3*i+0] = binColor.data[i];
    pix[3*i+1] = binColor.data[i];
    pix[3*i+2] = binColor.data[i];
  }

  // 結果を表示
  tex.loadData(pix, grabber.getWidth(), grabber.getHeight(), GL_RGB);
}

//--------------------------------------------------------------
void ofApp::draw(){
  // カメラからの入力を描画
  grabber.draw(0, 0);

  // 結果のテクスチャを描画
  tex.draw(0, 0, tex.getWidth() / 2, tex.getHeight() / 2);
}

実行結果
f:id:deis:20150623005243p:plain

ofVideoGrabberのピクセルデータをフォーマットで渡すだけです。
cv::MatからofTextureへの変換もフォーマット指定で渡すだけ。なんですが、グレースケールにした後、ofTextureへうまく戻せなかったので、一旦RGBでバッファに変換してからGL_RGBで渡しています。
たしかグレースケールならGL_LUMINANCEで変換できると思ったんですけどうまくいかなかった。

ちなみに、前回のOpenCV導入記事はこちら。hellkite.hatenablog.com