その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

【oFセミナーメモ4】openFrameworksと映像制作ソフトの連携

デジタルアートセミナー#3 openFrameworksで学ぶ、クリエイティブ・コーディング』のライゾマ比嘉さんのセッション『openFrameworksと映像制作ソフトの連携』のメモ。

講師 : 比嘉了

AfterEffectsやCinema4Dなどの映像ソフトとopenFrameworksを連携させる映像制作手法の紹介を行います。


講義資料はこちらで公開されています。markdown形式。


過去のセッションのレポートはこちら。

事例紹介

(ダンスのやつ。動画メモし忘れました)

  • 手と頭につけてるマーカーで軌跡を書く
  • 他の部分は動的生成ではなく、CINEMA 4Dであらかじめ用意していたもの

Illustratorとの連携:ofxPDF

ベクタデータのうち、SVGよりPDFの方がロードが10倍ぐらい速いことがあったので、それからはPDFを使っている。そのPDFをoFで取り扱うアドオン。

普通に描画
ofxPDF pdf;
pdf.loadPDF("tiger.pdf");
pdf.draw();
テキストアニメーション


(アニメーションの途中の様子です)

void draw()
{
    float app_time = ofGetElapsedTimef();
    float animation_time = fmodf(app_time, 2) / 2.;
    
    cout << "app_time: = " << app_time << ", animation_time: " << animation_time << endl;
    
    ofSetColor(0);
    
    // PDFのパスを順番に取り出して ofPolyline で描画する
    for (int i = 0; i < pdf.getNumPath(); i++)
    {
        ofPath& path = pdf.getPathAt(i);
        
        vector<ofPolyline>& polys = path.getOutline();
        for (int k = 0; k < polys.size(); k++)
        {
            ofPolyline poly = polys[k];
            
            poly = poly.getResampledByCount(100);
            
            int target_size = poly.size() * animation_time;
            poly.resize(target_size);
            
            poly.draw();
        }
    }
}


順番に見ていくと、


1. パスを取り出す

ofPath& path = pdf.getPathAt(i);


2. パスのアウトラインを取り出す

vector<ofPolyline>& polys = path.getOutline();

ofPolyline がベクタで得られる


3. ofPolylineをリサイズしながら描画する

for (int k = 0; k < polys.size(); k++)
{
    ofPolyline poly = polys[k];

    poly = poly.getResampledByCount(100);

    int target_size = poly.size() * animation_time;
    poly.resize(target_size);

    poly.draw();
}

各アウトラインが、長さ0から元の長さに戻っていく。

After Effects との連携:ofxAfterEffectsKeyframeParser

サッカーのボールの軌跡を追う

AEにはそういう機能が入っている: tracker

  • > キーフレームとして入る
  • > ofxAfterEffectsKeyframeParser で読む



画像解析不要!

Cinema 4Dとの連携:ofxAlembic

https://github.com/perfume-dev/ofxAlembic

  • メッシュアニメーション
  • パーティクル
  • polyline
  • カメラワーク

などが読み書きできる


(それぞれ ofxAlembic に付属のサンプルを実行したもの。アニメーションします)


【oFセミナーメモ5】映像解析

デジタルアートセミナー#3 openFrameworksで学ぶ、クリエイティブ・コーディング』の最終セッション『映像解析によるインタラクション』のメモです。

openFrameworksとOpenCV(ofxOpenCV、ofxCv)を組みあわせることで、映像を用いたインタラクティブな表現の可能性が大きく拡がります。このセッションでは、実例を紹介しながら映像とのリアルタイムなインタラクションの手法を探ります。


田所先生のイントロ、ひつじさんのオプティカルフロー+ドロネー変換、ライゾマ登本さんによるアドバンストな話、の3本立て構成でした。


過去のセッションのレポートはこちら。

田所先生のイントロ

講義資料: Session 6: 映像解析によるインタラクション

オプティカル・フロー

映像内の物体の動きを、ベクトル場で表したもの


2種類のアルゴリズム
  • Gunner Farneback

- 密なオプティカルフロー
- ofxCv::FlowFarneback

  • Pyramidal LK

- 疎な特徴集合に対するオプティカルフロー
- ofxCv::FlowPyrLK

ひつじさん

講義資料: オプティカルフローを使ったモーショングラフィックス生成|ひつじ|note


ダンサーさんの踊っている映像を使用して、それをリアルタイムにカットアップしながらオプティカルフローを使ったグラフィックを載せているというプログラムです。

  • YCAMのダンサーの映像にオプティカルフローをかける・・・特徴点を抽出
  • ofxDelaunay ドロネー変換


ドロネー図 - Wikipedia


登本さん

Kinectで3Dモデリング

キャリブレーション

  • Kinect3台
  • それぞれのカメラの位置がわかってない
  • そのままだと 2.5d
  • 光る玉を3台のKinectから見える位置で振る
    • kinectのcolorの方で見ると、暗い部屋との対比で、簡単に中心位置を割り出せる
  • カメラ位置の推定に、OpenCV の estimateAffine3D を使用
ofxEvm

Eulerian Video Magnification

動画の中から、人間の目ではわからないような微細な変化を検出する


Eulerian Video Magnification - YouTube

EVMのアルゴリズム

(上記動画内の解説図)

論文と MATLAB
  • 論文のコードは MATLAB で公開されてることが多い
  • EVM も MATLAB でコードが公開されてる
  • MATLAB が使われるのは、その世界ではみんな使ってるので、referされやすいから。Pythonも増えてきた。
  • MatLabからのC++エクスポート機能はつかってない。自分でC++で書き直している。
SVGでAR
  • カメラを固定して、映っている対象物の頂点の位置を示したSVGファイル をつくる
  • → その位置に別の映像をオーバーレイするとAR的なことができる
  • CameraCalibrate3D を使用 する
  • 最終的なテクスチャをズームしたり変位させたり回転させたりすることでカメラが動いてるっぽくも見える
TLD Tracker

Tracking Learning Detection



ofxTldTracker

  • ライセンスはLGPL


OpenCV 3.0 にTLDアルゴリズムのとラッカーが追加される

http://docs.opencv.org/trunk/modules/tracking/doc/tracker_algorithms.html の TrackerTLD