2014年11月29日土曜日

Maker Faire Tokyo 2014 へ行ってIntel の Edison 開発ボードをいただいた。

こんにちは。
 11/24に国際展示場で開催されたMaker Faire Tokyo 2014にもっちーと行ってきました。地の利を活かして、IntelのEdison開発ボードが配布されると話題となっていた各日先着36名のワークショップに参加してEdison頂いちゃいました。ちなみに6時に家でて国際展示場に7時半につきました。

▲ポール・ニコルソンさんすみません。みんなの肖像権を優先してしまいました。

 Edison値段的になかなか手を出せない感じなのですごく嬉しかったです。SDカードサイズにWifiまで入ってるとかすごいです。ここぞというときに使いたいと思います。ワークショップではかる~く開発環境の設定をして、専用のソフトを使ってポチポチやる感じでした。ガリガリ勉強しましょう!って感じではなかったです。MFT自体のレポはどこかだれかがいっぱい写真とってますのでそっちのほうが楽しいと思います。
 僕のまわりかたがヘタだったのか、以前行った(去年のMFTは行けなかった)大岡山のが楽しかったかな〜って印象をもちました!以上です!

 
 追伸
ヤフオクで中古のオシロスコープ買っちゃいました!楽しいです!でかい!うるさい!かわいい!
_kiitaniさん(@monitorgazer)が投稿した動画 -

2014年11月16日日曜日

NATURE OF CODE買った

Amazonを眺めていたら面白そうだったので買いました。英語版だったらWebで全部見ることができます。

 内容的には副題の通り、Processingで始める自然現象のシミュレーションとなっているんだけれども、書いてある内容がそれほどProcessingに特化しているわけではないので他の言語でも十分活用できると思います。

 今日届いて眺めた感じ、めっちゃ良かったので趣味のプログラミングで面白いことをしたい人にはおすすめです。

 Chapter0、”はじめに”を読んだのでその内容を軽くまとめます。

 ”はじめに”では最も有名で簡単な運動シミュレーションとしてランダムウォークを取り上げています。”はじめに”を完了する頃には乱数を扱う技術が向上しました。パーリンノイズすごい。

 順序的には
  1. Processingでオブジェクト指向のプログラミングを行う準備と解説
  2. 擬似乱数を使用した2次元のランダムウォークの実装
  3. 偏りを持つ乱数の実装
  4. ガウス分布に従う乱数の実装
  5. パーリンノイズに従う乱数の実装
となっています。

以下、”はじめに”を読んで書いたもの
_kiitaniさん(@monitorgazer)が投稿した動画 -


_kiitaniさん(@monitorgazer)が投稿した動画 -


_kiitaniさん(@monitorgazer)が投稿した動画 -

 最後の雲のような、霧のようなエフェクトは20行ぐらいで実装しています。パーリンノイズが優秀すぎです。なぜこれまで知らなかったんだろう…。

 パーリンノイズはケン・パーリンが1980年代のはじめに映画Tronの第一作の製作に携わり、より自然なCGエフェクトを生成するために考案した自然な秩序を持った一連の擬似乱数を生成するアルゴリズムだそうです。後にアカデミー科学技術賞を受賞したお仕事です。

 この後、ベクトル、力、振動、粒子系、物理ライブラリ、自律エージェント、セル・オートマトン、フラクタル、遺伝と進化、ニューラルネットワークについてコーディングしながら学んでいくと相当表現の幅が拡がるのではないかなと思います。”はじめに”の終わりで釘を刺されたようにパーリンノイズに頼りがちなってしまう罠に気をつけ、使える道具をもっともっと増やそうと思います!

2014年11月9日日曜日

無印良品のダブルリングモバイルノートがめっちゃいい

 こんにちは。この記事は雑記です。

 手帳の季節だそうです。私はこれまで手帳に挑戦しては敗れる。という経験を繰り返してきました。巷では”手帳が人生を変える!”などのキャッチコピーが溢れてまして、「はあそれならば」と手帳を購入してきました。”手帳を使いこなしている人”というのはなんか大人っぽい感じがして憧れます。しかし、私は使いこなすことができませんでした。なぜ破れてきたか。その理由をリストアップしてみました。

  1. Google Calendarを使ってるので手帳とGoogle Cal.の両方に予定を書くのが面倒
  2. ”これは手帳”というフォーマットに対するプレッシャーにより書けなくなる
  3. 大きさの問題で持ち歩くのが面倒
見事にダメパターンに嵌っているような気がします。

 これまで試した手帳としては
  • ほぼ日手帳(文庫本サイズ、一日1ページ。どんどん白紙のページが溜まっていった。あのスペースに書ききれる書きたいことが見つからなかった。)
  • クリエイターズダイアリー(蛇腹折りで一年を総覧できる。そもそも予定に〆きり日が多く、いつからいつまでといった期間的予定がなく総覧の恩恵がうけられなかった。)
  • フラットダイアリーA4(ノート状カレンダー。Google Cal.を使えばよかった。)
があります。全く使わなくなりました。すごくもったいない!!

 つまりは…つまりは…私の生活スタイルでは手帳はあわない!(ばばーん)Google Cal.で十分!しかしです、メモを書き留めたりするためにはまだまだ紙に勝るものはないと思っています。なのでノートは必要です。今はロディアのA5方眼リングノート使っていますが、方眼の線の色が濃すぎて使いにくいかなと思います。
▲ちょっと線の色がこい。

 そこで、タイトルのノートを購入しました。もともとは蔵前のカキモリさんでオリジナルノートを作成するつもりでしたが、B5、B6サイズしかなく、実際に触ってみると表紙もちょっと薄くてガサツな私が持つには上品だったので今回はパスしました。(値段もネックでした。平山くんごめん。)

 仕様(商品シールより)は
商品名:上質紙滑らかなかき心地ダブルリングモバイルノート 
A5、70枚、6mm横罫、ゴム留め付、税込500円、となっています。

 では以下フォトレビューです。
▲Dymoのエンボステープでナンバリングした。表紙の裏にはポケット付き!

▲特筆すべきは表紙の厚さ硬さ。厚みは一円玉と同じくらいある。

▲中表紙もしっかりしています。横罫は一般的なものに近い。

 安くていいです。ロディアより300円安い。これまでA5サイズを使ってきたのでサイズ的に違和感がないのが嬉しいです。また、表紙がしっかりしていて頼れる感じがします。横罫しかラインナップがない点が少し残念ですが、まあ問題ないでしょう。
 スケジュールはGoogle Cal.を使い、趣味のプログラミングのアイデアや記録、日常の諸々はノートに書いていくというスタイルでしばらくやってみようと思います。

2014年11月1日土曜日

【openframeworks】顔認識・追従で目を盗む【ofxFaceTracker】

 こんにちは。今回は前回のむりやり笑わせるプログラムよりも簡単なプログラムを作ります。具体的には、ofxFaceTrackerの機能を利用して顔を認識し、追従し、笑い男マークを上書きするプログラムです。攻殻機動隊用語でこれを”目を盗む”と言います。
俺の目を盗みやがったな

 
 実装の方法としては、顔の位置をofxFaceTrackerで取得し、その位置に合わせて笑い男マークを描画するだけです。簡単ですね。

 では以下プログラムです。

testApp.h
#pragma once

#include "ofMain.h"
#include "ofxCv.h"
using namespace ofxCv;
using namespace cv;

#include "ofxFaceTrackerThreaded.h"

#define INPUT_MOVIE_WSIZE   640
#define INPUT_MOVIE_HSIZE   480


class testApp : public ofBaseApp {
public:
 void setup();
        void exit();
 void update();
 void draw();
 void keyPressed(int key);
 
 ofVideoGrabber cam;
 ofxFaceTrackerThreaded tracker;
 ofVec2f position;
 float scale;
 ofVec3f orientation;
 ofMatrix4x4 rotationMatrix;
 
 Mat translation, rotation;
        ofImage ringImg,faceImg;
        cv::Mat ringMat,faceMat;
 ofMatrix4x4 pose;
 
        bool isFirstRead = true;
    
 ofEasyCam easyCam;
};


testApp.cpp
#include "testApp.h"

using namespace ofxCv;
using namespace FACETRACKER;

void testApp::setup() {
 ofSetVerticalSync(true);
 ofSetDrawBitmapMode(OF_BITMAPMODE_MODEL_BILLBOARD);
 
 cam.initGrabber(INPUT_MOVIE_WSIZE, INPUT_MOVIE_HSIZE);
 tracker.setup();
    //笑い男マークの文字のリングパーツをロード
    ringImg.loadImage("img/laughingman_ring.png");
    ringMat = toCv(ringImg);
    //笑い男マークの顔パーツをロード
    faceImg.loadImage("img/laughingman_face.png");
    faceMat = toCv(faceImg);
    
}

void testApp::exit() {
    tracker.waitForThread();
}

void testApp::update() {
 cam.update();
 
    if(cam.isFrameNew()) {
  tracker.update(toCv(cam));
  position = tracker.getPosition();
  scale = tracker.getScale();
  orientation = tracker.getOrientation();
  rotationMatrix = tracker.getRotationMatrix();
 }
}

void testApp::draw() {
 ofSetHexColor(0xffffff);
 cam.draw(0, 0);
    
 ofDrawBitmapString(ofToString((int) ofGetFrameRate()), 10, 20);
 
 if(tracker.getFound()) {
  ofSetLineWidth(1);
        //顔が見つかったら、画像の大きさをちょうどいい大きさに(改善必要)
        if(isFirstRead){
            cv::resize(ringMat, ringMat, cv::Size(ringImg.width/2,ringImg.height/2));
            cv::resize(faceMat, faceMat, cv::Size(faceImg.width/2,faceImg.height/2));
            isFirstRead = false;
        }
        
        ringImg.setFromPixels(ringMat.data, ringMat.cols,ringMat.rows, OF_IMAGE_COLOR_ALPHA);
        faceImg.setFromPixels(faceMat.data, faceMat.cols,faceMat.rows, OF_IMAGE_COLOR_ALPHA);
        //リングパーツと顔パーツの描画位置を決定
        int faceCenterX = (int)tracker.getImagePoint(29).x - ringImg.width/2;
        int faceCenterY = (int)tracker.getImagePoint(29).y - ringImg.height/2;
        int ringCenterX = (int)tracker.getImagePoint(29).x;
        int ringCenterY = (int)tracker.getImagePoint(29).y;
        ofPushMatrix();
            ofTranslate(ringCenterX, ringCenterY); //座標中心をピボット回転の中心へ移動
            ofPushMatrix();
                ofRotate(ofGetFrameNum() * -1, 0, 0, 1);//ピボット回転の中心に移動した座標軸を回転
                ofPushMatrix();
                    ringImg.draw(-ringImg.width/2, -ringImg.height/2);//オフセットを初期化し、描画
                ofPopMatrix();
            ofPopMatrix();
        ofPopMatrix();
        faceImg.draw(faceCenterX,faceCenterY);
    }
}

void testApp::keyPressed(int key) {
 if(key == 'r') {
  tracker.reset();
 }
}

 少し複雑な処理をしているのはリング部分を回転させるために座標軸の移動をしている点です。回転中心と画像の中心がずれてしまうと、その場でぐるぐる回るという動作をしなくなってしまうので注意する必要があります。また、写り込んだ顔の大きさに合わせて笑い男マークの縮尺を変更する処理を入れていないので、改善する必要があります。

以下はプログラムを動作をさせている際に撮影した動画です。