Artist in Strada 道

こんにちは。今日は告知です。

明後日金曜日の12月10日に九州大学大橋キャンパス多次元デザイン実験棟にて、「Artist in Strada 道」というイベントを行います。概要は以下の通りです。

                                                            • -

【脚本】 望月ゆうさく
【出演】 望月ゆうさく、てのひら他
【監督】 大石啓明
【公演日時】 2010年12月10日 
19:00開演(上演時間約90分)
会場は開演の30分前となっております
【会場】 九州大学芸術工学部大橋キャンパス多次元実験棟
  〒815-8540 福岡市南区塩原4-9-1
TEL.092-553-4400(代表)
【アクセス】 西鉄福岡(天神)駅より4駅、西鉄大橋駅より徒歩5分
JR博多駅より西鉄バス約20分、塩原4丁目バス停より徒歩5分
【 料金 】 無料 事前席予約あり(ご連絡ください)
【 問合せ 】 Artist in Strada プロジェクト
TEL :090-4267-9403 ※留守電の場合があります
Email : artistinstrada@gmail.com
【 後援 】 九州大学芸術工学部源田研究室・藤原研究室

【 上演にあたって 】
ジャグリングパフォーマー望月ゆうさくの初単独公演。

望月ゆうさくのこれまでの人生、ジャグリングを始めたきっかけから、悩んだ時期、世界大会、ヨーロッパの旅、そしてこれからをジャグリングを用いた大道芸で演じます。また、現在進行中の「大道芸の研究」についてのちょっとしたプレゼンテーションも行なったりします。

実践 × 大道芸 × 研究

さまざまな表現を織り交ぜ、大道芸の未来を説く。
いまや日本を代表するパフォーマーとなった望月ゆうさくの入神の90分。
是非ご覧ください。

                                                            • -

私はUstream配信係として参加しています。
2010/12/10(金)18:30〜
URL: http://www.ustream.tv/channel/artist-in-strada-%E9%81%93
ハッシュタグ: #aism

また、放映のときにまたお知らせします。

学祭

 怒濤の学校祭が終わりを迎え、終わってから1週間経った今ですら、未だ学祭の熱気が冷めやらぬ今日この頃を送っております。

 今回はこの三年間で最も積極的に参加した学祭でした。学祭企画には2研に入るつもりでしたが1年のときにタイミングを逃し、結局無所属のままでした。そして、1年のときには学祭にはまったく参加せず、2年のときにはimpression!の黒歴史を残しただけでした。

 今年の学祭は何も学祭に対して積極的に参加しなかった2年間を後悔させられるほど楽しかったです。


 まず、前夜祭。
 去年の前夜は内部からの不満が外部の私にまで聞こえていました。内部から不満が起こる団体がいいものを残せるはずがないという考えを持っていたため、見に行こうとも思えませんでした。その点、今回の前夜祭では内部の人間から「やってやる」というやる気の声のみが聞こえ、不満の声があまり聞こえませんでした。(知り合いの前夜の大半が3年生だったからということもあるかもしれませんが)そのため、今回は絶対に前夜祭は見に行こうと思いました。

 すばらしかったです。去年、一昨年を知らないので相対的にどうかは言えませんが、絶対的によかったです。ライブイベントに参加しなれておらず、あまり好きではない私ですら楽しませてもらえました。一つ一つの演出もそうですが、ステージの設計が人に見せることを意識した空間のデザインだったと思います。impression!の展示会にはないものだと感じ深く反省しました。

 最後の前夜頭さんのお話は涙を誘うものでした。環境が悪いからできないという言い訳はせず、真っ向から環境が悪い中での最高点を目指す。その精神はこれからも見習っていくものだと思います。


 次に2研。
 私の求める「表現」がそこにありました。「結論」ではなく、「問題」という受け手側からのアプローチを許した表現。

「同じように見えても想いはそれぞれ。あなたは何に花をそえますか?」

 受け手に問いかけて、受け手に答えを探させ、受け手の考えに何かのプラスを与える。これがあるべき表現だと思うのです。これを形として作品にすることの難しさはよく知っています。それをかなりのハイクオリティで見せてもらえたことは非常に勉強になりました。


 噴水企画。
 噴水企画では不思議な魅力を感じました。お笑いとしては、さすがにバラエティ番組にも劣る。セット的にも劣る。それでも、感じる魅力というのは「伝統」というものをよく見せようとする意識にあったと思います。「伝統」は大きい力を持っていることを実感させられました。できて二年目、伝統というものがまだできていないimpression!は私の代で伝統の基礎を作り、来年に引き継いでもらうことを願うばかりです。


 あと、火祭り。
 良い悪いの議論はOBの間でここ数年、毎年あるようです。確かに写真で見た二重円は一体となって踊っていると感じました。でも、前回のことは知りませんが、自分自身、今回の火祭りで円というものを意識せずに知らない人と踊れたのは楽しかったです。楽しいか楽しくないかで計れるものではないにしても、最終的に楽しいか楽しくないかでなければ、企画のエゴに終わってしまうのではないか。そういう考えを持っています。結論として、参加して楽しかったからよかったと思います。


 本当はdampaとcbaも行きたかったのですが、時間が合わずいけませんでした。残念です。


 さて、impression!の展示会およびテントのことについてですが、初めての企画としては上々の出来だったと思います。

 まずはテント。ポストカードとCDを販売していました。作品を売るということをすることによって、「人に買ってもらえるレベルか。」ということに挑戦する意図を持っていました。身内票が多かったとはいえ売り切れも数種類でて、コーヒー/ココアの売り上げも上々。最終的には1万円程度の黒字になったようです。

 次に展示会。推計160〜170名という過去最高の来場者数でした。アンケート回収枚数も147枚。集計するのが大変でしたが、お褒めの言葉やアドバイスも頂けて、impression!というものにいい影響を及ぼしたと思います。私が部長になってから、過去最高のいい影響を及ぼした政策だったと思います。

 個人的には、人気作品投票で二位のふなっちさんの「ミルクコーヒーはいかがですか」の46票の倍の92票を得て私の作品「音風船」が一位になったことが非常にうれしかったです。実は展示会が始まる一週間前に、「この作品じゃ周りのみんなに勝てず、部長の威厳が保てない」という強迫観念にかられ、コンセプトから作り直しました。先ほど書いた通り「表現」は「問題」でなければならないということから、今回は「五感は独立したものなのか」という問題を出しました。参加者の中には「本当にボールがあたってるみたいで痛くなってきた」というコメントもいただいたので大成功だったと思います。


 苦労した分、燃え尽きた感は大きいですが、次はグループ制作に向けて頑張っていこうと思います。

OpenCVメモ(2)

今日は色を認識するところまでできました。
完全にopenFrameworks WikiのColorTrackingの頁の写経ですが、コメントをつけてうpします。

元ページ
http://wiki.openframeworks.cc/index.php?title=Color_Tracking

ヘッダファイル testApp.h

#ifndef _TEST_APP
#define _TEST_APP

#include "ofMain.h"
#include "ofxVectorMath.h"
#include "ofxOpenCv.h"

//色の基本的な情報を持ったクラスを作ります。
class Color {
public:
	float hue, sat, bri;
	ofxVec2f pos;
};


class testApp : public ofBaseApp{

	public:
		//この辺はいつも通り
		void setup();
		void update();
		void draw();

		void keyPressed  (int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void windowResized(int w, int h);

	
	//カメラの映像を取得するためのオブジェクト
	ofVideoGrabber vidGrabber;
	
	//カメラの幅と高さ
	int camWidth;
	int camHeight;
	
	//もともとの映像情報
	ofxCvColorImage colorImg;
	
	//HSV系に変換した映像情報
	ofxCvColorImage colorImgHSV;
	
	//HSV系の色相、彩度、明度のマップ
	ofxCvGrayscaleImage hueImg;
	ofxCvGrayscaleImage satImg;
	ofxCvGrayscaleImage briImg;

	//色を追跡して輪郭を出すための映像情報
	ofxCvGrayscaleImage reds;
	
	//追跡する色です。
	Color one;
	
	//もとの映像情報のピクセルの彩度と明度が
	//指定した色に近ければ255を代入、遠ければ0を代入
	unsigned char * colorTrackedPixelsRed;

	//二値画像
	ofTexture trackedTextureRed;
	
	//輪郭を判別してくれるメチャクチャ便利なやつです。
	ofxCvContourFinder finderRed;
};

#endif

CPPファイル testApp.cpp

#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup(){
	//最初は色が原点にあることにします
	one.pos = ofxVec2f(0,0);
	
	//カメラの大きさを指定
	camWidth = 320;
	camHeight = 240;

	//それぞれの映像情報の大きさを指定してあげます。
	colorImg.allocate(camWidth, camHeight);
	colorImgHSV.allocate(camWidth, camHeight);
	
	hueImg.allocate(camWidth, camHeight);
	satImg.allocate(camWidth, camHeight);
	briImg.allocate(camWidth, camHeight);
	
	reds.allocate(camWidth, camHeight);
	
	//二値画像を作るための配列の大きさを指定
	colorTrackedPixelsRed =new unsigned char [camWidth*camHeight];

	//二値画像の大きさ
	trackedTextureRed.allocate(camWidth, camHeight, GL_LUMINANCE);

	//Grabberの「何か」と大きさ設定
	//setVerboseってなんだろ? Verbose:冗長な、言葉数の多い
	vidGrabber.setVerbose(true);
	vidGrabber.initGrabber(camWidth, camHeight);
}

//--------------------------------------------------------------
void testApp::update(){
	//映像を取得!
	vidGrabber.grabFrame();

	//colorImgの中身をピクセルごとに指定
	colorImg.setFromPixels(vidGrabber.getPixels(), camWidth, camHeight);

	//HSV系に変換
	colorImgHSV = colorImg;
	colorImgHSV.convertRgbToHsv();

	//色相、彩度、明度にマッピング
	colorImgHSV.convertToGrayscalePlanarImages(hueImg, satImg, briImg);

	//ここが何やってんのか分からん。
	hueImg.flagImageChanged();
	satImg.flagImageChanged();
	briImg.flagImageChanged();

	//ピクセルの配列をそれぞれに作成
	unsigned char * huePixels = hueImg.getPixels();
	unsigned char * satPixels = satImg.getPixels();
	unsigned char * briPixels = briImg.getPixels();

	//ピクセルの数
	int nPixels = camWidth*camHeight;

	//ピクセルの色が指定した色と色相と彩度が近ければ、
	//colorTrackedPixelsRedに255を、遠ければ0を代入。
	for (int i=0; i<nPixels; i++) {
		if ( (huePixels[i]>=one.hue-12 && huePixels[i] <= one.hue + 12) &&
			 (satPixels[i]>=one.sat-24 && satPixels[i]<=one.sat+200)){
			colorTrackedPixelsRed[i] = 255;
		}else {
			colorTrackedPixelsRed[i]=0;
		}

	}

	//colorTrackedPixelsRedをもとにredsを作成
	//redsは輪郭線を求めるためだけにあるのかな?
	reds.setFromPixels(colorTrackedPixelsRed, camWidth, camHeight);

	//輪郭線を見つける
	finderRed.findContours(reds, 10, nPixels/3, 1, false, true);

	//colorTrackedPixelsRedをもとにtrackedTextureRedを作成
	//これが二値画像になってるっぽい
	trackedTextureRed.loadData(colorTrackedPixelsRed,
				 camWidth, camHeight, GL_LUMINANCE);

	//追跡する色の位置を中心にあわせる
	if (finderRed.blobs.size()>0) {
		one.pos = ofxVec2f(finderRed.blobs[0].centroid.x,
				finderRed.blobs[0].centroid.y);
	}
}

//--------------------------------------------------------------
void testApp::draw(){
	//背景色を指定
	ofBackground(100, 100, 100);

	ofSetColor(0xffffff);

	//元映像を表示
	vidGrabber.draw(0, 0);

	//HSV系に変換したものを表示
	colorImgHSV.draw(340, 0);

	//二値画像を表示
	trackedTextureRed.draw(20, 300);
	ofDrawBitmapString("red", 20, 280);

	//元映像に輪郭線を表示
	finderRed.draw();

	//二値画像の方に輪郭線表示
	glPushMatrix();
		glTranslatef(20, 300, 0);
		finderRed.draw();
	glPopMatrix();

	//追跡する色の位置を表示
	if (finderRed.blobs.size()>0) {
		char tempStr1[255];
		sprintf(tempStr1, "x:%f\ny:%f",
		finderRed.blobs[0].centroid.x,
		finderRed.blobs[0].centroid.y);
		ofDrawBitmapString(tempStr1, 20, 250);
	}
}

//--------------------------------------------------------------
void testApp::keyPressed(int key){
.
.
.
.

//--------------------------------------------------------------
void testApp::mousePressed(int x, int y, int button){
	unsigned char * huePixels = hueImg.getPixels();
	unsigned char * satPixels = satImg.getPixels();
	unsigned char * briPixels = briImg.getPixels();

	//クリックした場所の色を追跡する色に設定。
	x=MIN(x,hueImg.width-1);
	y=MIN(y,hueImg.height-1);
	
	if (button==0) {
		one.hue = huePixels[x+(y*hueImg.width)];
		one.sat = satPixels[x+(y*satImg.width)];
		one.bri = briPixels[x+(y*briImg.width)];
	}
}

//--------------------------------------------------------------
void testApp::mouseReleased(int x, int y, int button){
.
.
.

これで、色の追跡ができています。実行結果は次のようになります。

ここでは紫色を追跡色に設定しています。ちゃんと追跡できていますね。

openCVメモ(1)

 お久しぶりです。最近は10月展示会があり、そこで電子工作をしようとしつつ挫折して、結局、過去作品という失態をさらしてしまいました。

 次回は学祭内にある芸工紹介展の一角をかりて、展示会を行います。そこに出そうと思っている作品に画像認識を使おうと思っているので、openFrameworksでopenCVを使うためのメモ。

Xcodeでテンプレート開く

グループとファイルでプロジェクトを右クリック→追加→新規グループ(名前はaddonsに)

できたaddonsフォルダを右クリック→追加→既存ファイルの追加

使用したいアドオンを選ぶ。(今回の場合はofxOpenCv)

今、わかったところはここまでですが、また勉強したら書いていきます。

もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら

 お久しぶりです。今日は本の感想を。

今日、ご紹介する本は
もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら
という本です。

あらすじは、タイトルのまんまなんですが、

弱小高校野球部のマネージャーになった主人公みなみが経営学の祖ピーター・ドラッカーの著書『マネジメント』にヒントを得ながら、野球部を甲子園まで導いていく。

というものです。


 『マネジメント』は経営学の本ではありますが、組織・団体一般に言えることが書いてある本らしいので、一度、読んでみたかったのですが、この本が流行っているので、取っ付きに読んでみました。ちょっと前には知ってたんですが、何せ表紙があれなんで買いづらくて、なかなか手が出せませんでした。

 一言でいうと、面白かったです。面白かったので、一気に読み通してしまいました。とりあえず、ザッと読んだ感じで要約すると、次のようにまとまります。

 組織は目的を持つ。その目的は「顧客」の視点に立ったものでなければならない。すなわち、「顧客は誰か」を定義することから始まる。

 マネジメントには以下の三つの役割がある。

1、団体の使命
 団体は「顧客」を満足させるという使命のために存在する。そのために「顧客」の求めるものを知り、それを満足させる。これをマーケティングという。
2、責任と働きがい
 生産的な活動をする人には成果を与え、働きがいを与えなければならない。そのためには責任というものが必要である。そして、人のマネジメントは人の長所、強さを活かすところにある。マネジメントではその強みを生産に結びつけることが重要である。「人は最大の資産である。」
3、社会への働き
 団体が存在することによって生じる社会への影響を処理するとともに、社会の問題を考え、それの改善に貢献できるように働きかける。その際、既存のものは陳腐なものであるとして除外し、常に新しいものを求めていく。

 あともう一つ。これは実際に思うことではあるけど、「関心を努力でなく、成果に向けさせなければならない」ということ。たとえば、授業で言えば、テスト前だけに頑張って「結構、頑張ったよ」と言っても、テストで点が取れず、Dを取っているようなら、それは誇れるものではない。サークルで言えば、頑張って作品を作っていても、実際クオリティが高くなければ、評価はできない。後者は自ら痛感しているところ。常に少し上の目標にしていることを言い訳にして、クオリティに妥協してないか、と考えると、反省させられる。


 まとめるとこんな感じですが、実際はもっと詳しく書いてあります。近いうちに、ドラッカーのマネジメントを読んでみようかな。最近、サークルの運営の方でいろいろと行き詰まっているので、これも参考にして、いい方向に持っていきたいです。

openFrameworksでHSV系を使う方法

こんにちは。お久しぶりです。MacBookPro買って、openFrameworksの勉強に励む今日この頃です。proce55ingで作ったSeq:crossという作品をopenFrameworksに移植中なのですが、openFrameworksにはHSV系で色を表現することができない(少なくとも私の調べた中では)ようなので、HSVを使えるようにopenFrameworksを少し改造しました。


1."ofGraphics.h"の改造
ヘッダファイル"ofGraphics.h"の中のofSetColor(int hexColor)が宣言されている部分のすぐ下に

//h: 0-360 , s: 0-100, v: 0-100, a: 0-255
void ofSetHSVColor(int _h, int _s, int _v, int _a);
void ofSetHSVColor(int _h, int _s, int _v);

を付け足します。


2."ofGraphics.cpp"の改造
 cppファイル"ofGraphics.cpp"の中のofSetColor(int hexColor)が定義されている部分のすぐ下に

void ofSetHSVColor(int _h, int _s, int _v, int _a){

	float s = (float)_s/100, v = (float)_v/100; 
	if (s==0) {
		ofSetColor(255*v, 255*v, 255*v);
		return;
	}
	float r,g,b;
	int hi = (int)(floor((double)_h/60))%6;
	float f = (float)_h/60-(float)hi;
	float p = v*(1-s);
	float q = v*(1-f*s);
	float t = v*(1-(1-f)*s);
	switch (hi) {
		case 0:
			r=v;
			g=t;
			b=p;
			break;
		case 1:
			r=q;
			g=v;
			b=p;
			break;
		case 2:
			r=p;
			g=v;
			b=t;
			break;
		case 3:
			r=p;
			g=q;
			b=v;
			break;
		case 4:
			r=t;
			g=p;
			b=v;
			break;
		case 5:
			r=v;
			g=p;
			b=q;
			break;
		default:
			break;
	}
	ofSetColor(255*r, 255*g, 255*b, _a);
}

void ofSetHSVColor(int _h, int _s, int _v){
	ofSetHSVColor(_h, _s, _v, 255);
}

を付け足します。これでHSV系で色を指定できるofSetHSVColor(int _h, int _s, int _v)が使えるようになります。


 HSV系くらい標準装備されてそうなもんだけど。。。何かほかに方法があれば、コメントなどで教えてもらえれば助かります。