SyntaxHighlighter

ラベル デジタル・インターネット の投稿を表示しています。 すべての投稿を表示
ラベル デジタル・インターネット の投稿を表示しています。 すべての投稿を表示

2013-12-28

「過負荷に耐えるWebの作り方」を読んだ

本を紹介している記事をどこかで見つけて、その後本屋でたまたま見つけたので買ってみた。

ネットの記事やブログなどで、アクセス数が想定以上に急激に増えて、泣きながらもあの手この手を尽くして耐えきったぜという武勇伝的な話があったりするが、この本に書かれているのは、事前に発生し得ることをできる限り事前に想定して、徹底的に検証することで、大きな事故も起こらず乗り切りました、という正反対な内容だった。
前者のようなジェットコースター的な展開は技術的にも読み物的にも楽しいだが、実際仕事をするなら後者のような手堅い展開の方が顧客的にも精神衛生上もいいような気はする。その辺は趣味の問題かもしれない。

以下、内容について適当に感想をまとめると

  • まあ冗談半分の感想として、一章で、話がいつの間にか大きくなって(瞬間最大で10000アクセス/秒→連続10000アクセス/秒)、そんな性能必要なの? と思えるような性能をコミットしてしまったとあったが、SEマネジメント系に一家言ある人たちが聞いたら、「そもそもそこが間違ってる、顧客にとってもベンダーにとっても納得いくラインを交渉して妥協すべきだ」的な話が展開されるんだろうな、と。
  • 短い納期にも関わらず性能を出すために新しい技術に手を出したってところはすごいと思った。自分だったら調査している間に納期が来てしまいそうだ。業務では使っていないけど普段から新しい技術へのアンテナを張っていたから選択し得たのだろうか。
  • 性能検証のところで、クライアント用途としてAWSのようなスラウドサービスを使うってのは参考になった。機会があったら提案してみようかしら。手持ちの機器では不十分だと説明するのが大変そうだが……。
  • 「映画や劇場で携帯電源OFFにすべきところへ行くと落ち着かない」とか「10分ごとにメールを確認する」とか監視当番の方がついやってしまう行動については共感した。自分も監視当番のときに映画見に行く時って結構罪悪感を感じるのよね。だからと言って見に行かない選択肢をとると、それはそれで業務時間でもないのに行動を拘束されるなんて、と負けた気がする……。

こういった本を読むと、開発、インフラ、運用が一丸となって問題解決に向かう形ができれば、作って提供する側にとってもユーザ側にとっても一番いいんだろうなと思う。
ただ、現実は自分の会社を含めて、多くの場合、会社やら部署の壁(会社の壁より部署の壁のほうが高く厚い場合があるから恐ろしい限りだ)で連携しにくい環境だであることと、またすべての案件で全力投球、専属の人をアサインしていったら、事業がスケールしていかない可能性があるので難しいところだなとも。

新しいサービスを作ったり案件を受注した時にまた読むとよさそう。

2013-11-04

「Maker Faire Tokyo 2013」へ行ってきた

Maker Faire Tokyo 2013(2日目)を見に行ってきました。500円も安くなるので前売り券を買って。
朝一から行っていたせいかもしれませんが、去年より会場が広くなって、ブースが回りやすかったような気がしました(一部の部屋はとても狭くて身動きできなかったけど)。

相変わらずArduinoをはじめとしたお手軽開発キットがたくさん陳列されていましたが、派生物も含めてそれ以外にもmbedやRaspberry piとかも並んでて、何か作りたいと思ったときはどれを使えばいいのやらと悩みそうです。久しくこの辺追ってなかったものですっかり取残された感が。。。

3Dプリンタもたくさん陳列されていて、これもどれがいいのやらさっぱりなのです。もの自体はどんどん安くなっていっているようなので、材料費の低減と、家にそれを置ける十分なスペースを期待したい、と。。。

インターネットから情報を取得して表示するサイネージを太陽電池で動かすっていう展示があったけど、とても実用性を感じた。覚えておくと後々役立つかもしれない、と思ったり。

Z-MACHINESというロボットのバンドがあったけど、ギターはターミネーターっぽい。ドラムのやたら腕があるのはなんとなく明和電気を思い出させます(って、演奏が終わった後、ご本人様がロボットの説明を受けていたようだけど、見間違い、気のせいかしら? 作業服を着ていなかったので)。


全方位カメラ使ってMake Faire New York(だったけ)を撮影した映像を流していたブース(具体的にどこのブースか忘れてしまった。。。)で聞いた話だと、Tokyoはやってみた系が多いけど、あっちだとStartUp的なビジネスチックなものが多いそうな。
とは言いつつ、Tokyoでも大学の研究室出展やら、企業ブースが段々と多くなっている気もするし、ここまでこのイベントが有名になってくると、そのうちビジネス色が強くなっていくのかもしれないと思ったりします(3Dプリンタ部分はそんな色が出てた気がする)。

こういうのを見ていると、自分もまたやってみたくなるものです。別のことで忙しいからなかなか厳しいのだけど。

2013-02-24

「メディアはソフトウェアになる」

メディア芸術祭で「メディアはソフトウェアになる」というタイトルで受賞者プレゼンテーションをしていたので、聞いてきました。

モデレータ曰く、タイトルはこの論文から借用したらしい。
自分は読んでないけど。

「勝手に入るゴミ箱」のプレゼンテーションは、ゴミ箱自体もすごいけど、作られた動画がすごいと思います(そこも大きく評価されたとのこと)。
それ以上にすごいと感じたのは(ワンルームの)家に、NCスライサーとかオシロスコープとかが置いてあること。(自分は、そこまでの投資はできない。。。)

「I am Synth」のプレゼンテーションされていた方の話し方が漫談のようで面白かった(格好も漫談師のようだった)。アプリそのもののデモだけ見せられても、へえそうなんだ、で終わりそうなのだけど、そのアプリ開発へいたる話は、プレゼンターの話のうまさも相成って、相当面白かった。


その他興味深かったこと

DIYとか、DIWO(Do It With Othersの略らしい)、オープンソースの流れについてどう思いますか?という質問の答えが対照的で興味深かった。年齢やそれまでのバックグラウンドで、このあたりの流れの感じ方がぜんぜん違うのだ、と思い知らされます。
  • 「ゴミ箱」の開発者:調べやすくなって、動画とかでアウトプットしやすくなって、やりやすい時代
  • 「Synth」の開発者:怖くてしようがない。ホビーでビジネス以上のことが行われていて、しかも無料。
    • 昔から物作って売る商売をしていた人たちはこの流れが理解できない
    • そんな人たちも、発想を変えないといけないと頑張っているが、簡単ではない
    • でも、新しいことができそうな気はする
「Synth」の開発者は、音楽作りはそれを作曲するための機器のインターフェイスでできることが変わってくる。ツマミ、やボタンの押した感じ等。iPadなどの新しいインタフェースが登場して新しい音楽が作られるだろうか?
新しいインターフェイスによって新しいものができるのではないか?ということらしい。


こういう賞を受賞できる方々は、いろんな熱意や考え方を持っているのだなあ、と感じます。

2013-01-27

「qpstudy 2013.01」へ行ってきた

http://atnd.org/event/201301qpstudy
初参加。一度は行ってみたいなあとずっと思っていて、テーマ的にも興味があったので。いきなり登壇者にビールが振る舞われていたので、ここは「酒(と書いてガソリンと読む)でも入れて、言いにくそうなことでもぶっちゃけ言い合おうぜ」って会なのでしょうか??

テーマはDevOps。ここ数年で言われるようになってバズワード感漂うものでした。
世の中的情報や、企業が宣伝するDevOpsはツール的な話が多いけど、基本は組織、ビジネス、カルチャーに関わる考え方みたいなものらしいとのことです。「Dev側とOps側でどうやって連携して行くか。そしてこのカルチャー、考え方の手段として、Ops側にDev的なツールや方法論で運用管理の効率化を目指しましょう(またはその逆?)」という理解で間違っていないのかな。
だから、今までDevとOpsが良好な関係を保っていたなら、今更DevOpsなんて……、ということになるらしい。

勉強会は登壇者間のパネルディスカッション形式でしたが、あまりにも話が発散しすぎてまとまった感じはしませんでした。もともとまとめる気も無かったらしいですが(てか、ディスカッション形式で話がまとまった事なんて見たこと無いけど)。
とにかく様々な立場の人が居ます。単純にDevとOpsに分かれるものではなく、その中でも自社で全部開発から運用しているところの人や、受託開発をしているSIerの人、開発も運用もそれぞれ別の会社にお願いしてそれらのマネジメントをしている人まで。立場によって状況も考え方も契約形態も異なる以上、一概にDevOpsと言ってもそれに期待する者はそれぞれ異なって、統一的な見解など出せようはずもない、という事みたいです。

でも、DevOpsという言葉が(どの程度の範囲かは知らないけど)脚光を浴びるということは、今のままでのDevとOpsの関係について疑問を感じている人が少なからず居ることは確かだろうと思う。この辺りは誰もが一家言持っていそうです。


問題は境界線で発生すると言っていた方がいましたが、DevとOps以外にも実際はお客さんの立場、営業、企画側の立場も登場してくるし、下手するとDev, Dev間やOps, Ops間でも境界線もあるくらいなので、火種となる境界線は枚挙にいとまがないなあと。DevOpsの考えを突き詰めて行くと、組織や会社のあり方にまで発展するのは自然な流れなのだろう。


個人的には、DevとOpsの両方の理解があって、双方の立場を考慮して決断してくれるマネージャが居てくれるだけでも大分違うのかなあと思います。そんなスーパーマンそんなに居るのかという問題はありますが。
あと、DevがOpsに手を出す、OpsがDevに手を出すには、という話もありましたが、サーバの立て方、プログラム言語を知っている程度ではあまり役に立たないのかなあと思ったりもします(もちろん必要ないとは言わない)。技術とはもっと違った、運用時に気をつける勘所とか、手順作成の考え方とか、開発方法論とか、仕様取り決めの駆け引きとか、そういった、経験とか政治的な知識も必要なのかなあと。DevOpsがカルチャーでマインドだと言う以上、DevがOpsのカルチャーを知る、OpsがDevのカルチャーを知る必要があるのだろうと思う次第です。
うん、確かにスーパーマンだ……。


最近気になることとしては、DevとOpsの連携を密にしたいという流れがある一方で、DevとOpsの分離を明確化したいという流れもある。理由は、会社が違う、部署が違うから責任範囲を明確化したい、収益構造(Dev, Opsのそれぞれどこでコストがかかっているのか)を明確化したい、セキュリティ上の理由、なあなあ開発、運用を無くしたい(非属人化)等があるそうな。
この二つの考え方は相反するのか、両立できるのだろうか、と思ったりします。

以上、取り留めのない感想。

2012-10-28

「DCEXPO 2012」へ行ってきた

毎年行っている気がします。ってか最近のブログが展示会とかセミナーへ行ってきました系ばかりなのだけど、自分、大丈夫だろうか。

土曜日に行ってきましたが午前中はそれほどでもなくても、午後からすごい人の数でした。去年よりも人が多かったのかしら?会場は狭く感じました。
いろいろデモも体験してみたかったのだけど、並んでいるところも多くて、十分見れなかったのは残念でした。平日に行くべきだったのかも知れません。
早く、平日業務時間中にこういう所へ行っても文句を言われないような職場に異動したいものです。

個人的には展示物の中では、「Gocen」と森ビルの展示が面白かったです。

「Gocen」は、フリーハンドで書いた五線と音符を書いてそれをスキャンする事で音が出る、らしいです。和音や臨時記号にも対応しているそうです。ただ四分音符以外の音符(八分音符とか全音符とか)には対応していないらしく、ユーザがスキャンの速度を変えて音のテンポを決めるらしいです。
ガジェットとしても面白いですし、素人音楽やっている私としては、こういうのは結構普通に欲しいです。なんせ楽譜見ても具体的な音が分からないんです。。。

森ビルの展示は、模型作る為に東京23区の写真や建物データを入手したけど、模型以外に何か使えないか?という事を考えておられるようです。例として表参道を再現したセカンドライフっぽいビューワと、3DのビルをARっぽく表示できて、それをKinectで操作したり、遠隔地にいる人達と一緒に操作できる、遠隔会議室的なものを展示してました。
展示しているモノ自体も興味深いですけど、森ビルという所がこう言ったARとかKinectとかで何か出来ないか?と考えている事が驚きでした。


ただ、全体的に去年に比べると、割とおとなしいというか落ち着いた感じがしたのはなんでだろう?結構既に知っている、聞いた事があるものが多かったからかもしれないだけかもしれないけど。

2012-10-07

「CEATEC 2012」へ行ってきた

ここ数年は半分惰性で行っているかも知れないけど、CEATECに一応行ってきました。

去年に比べるとブースや人が少なく感じたのは気のせいでしょうか。去年だと有名どころのブースは立錐の余地が無かったような気もしたのですが。
それでも、並んでるところは並んでいるので、体験出来なかったものも多かったです。

あと、あっと驚くような新しい感はいつもより少なかった気もします(もちろん、自分の関心がある範囲内での話です)。それよりは今ある技術を色んなものと繋げる、という方向なのかなあと思いました。

感想、なんか辛口になってしまいました。

  • KDDI Smart Box
    • テレビとスマホ、タブレットでWii Uっぽいことが出来そうな
  • KDDI HTML5でマルチデバイス対応します、的な
    • 土曜日の一般参加者に説明されても、と思いました。所詮作る側の理論だし。逆に平日の参加者なら興味深いだろうと思います。
      本当にHTML5でマルチデバイスが簡単に作れるかというのは、最近は少し疑問です。
  • DOCOMO 視線のUI
    • 視線認識によるUI自体は、面白いし使い道もあると思いますが、タブレットに対して使えるかは疑問。体験出来ていないので、デモを見ただけの感想だけど、特にブックリーダを視線で操作するのは、正直めんどうな気がしました。
  • DOCOMO うつして翻訳
    • これは普通に便利そう。特に料理メニューとか。
  • 4Kテレビ
    • ソニーブースで2Kと比べて文字もくっきり、という展示をしてましたが、ドラマやアニメ等で雑な作りは出来にくくなるだろうなあと。
      3Dテレビは何処へいったんだろう?
  • TOYOTA
    • TOYOTAって車だけではなかったのですね。家と車のネットワークとかやってるみたいです。
    • Smart INSECTというスマホと連携する車の展示をしていました。その車の頭頂部にあるカメラが取ってもKinectっぽかったのは気のせいでしょうか(モーション認識のデモをしていた)。
    • 車とスマホをつなげたときのアニメーションとかはデモ用演出なのだろうけど、どれくらい使いやすいのだろうか?
  • 超臨場感コミュニケーション
    • という幾つか企業、大学のの研究が紹介ブースがあったのだけど、最近は視覚を利用した触覚の錯覚が流行っているのでしょうか?うまく利用するとおもしろ体験は出来るかもとは思います。

2012-04-01

mapamokで遊んでみた

YCAMのInterLabで公開されていたmapamokと言うツールを、気まぐれにプロジェクターを買ってしまったので、遊んでみました。
と言っても、チュートリアルの通りやってみただけです。

流れとしては、以下のような感じみたいです。

  • 投影したい物体のモデルをGoogleのSketchUpで作成して、mapamokに読み込ませる
  • mapamokの画面をプロジェクターで物体に投影させる
  • モデルの頂点と実際の物体の頂点をプロジェクターの光をみながら対応づける。対応付けの際にカメラやチェッカー模様のキャリブレーションパターンが必要ない
  • 対応づけたら、shaderでいろんなパターンを投影してみる

やってみた感じは、以下の動画です。
線画だとちゃんと物体に投影してるのか分からん、とか、何だあの箱は?的なツッコミはなしで。

やってみた感じは、
  • 対応付けが結構難しいかなあと思っていたけど、慣れるとさくさく出来ました。
  • と言う事で、多分一番大変なのはSketchUpでモデルを作る事。でも直方体数個レベルなら、大丈夫。モデル作成も動画撮影まで含めて3時間もかかってないはず。
  • 対象の物体は、白っぽいものの方がいいです(当たり前ですが。。。)。最初黒い箱でやったら、プロジェクターの光が全然分かりませんでした。。
  • シェーダがさくさく書ける人ならかなり楽しめそうな気がします

シェーダの勉強をちゃんとやりたくなります

2012-03-27

ターミナル勉強会

人のターミナルの使い方が気になる今日この頃で、ターミナル勉強会へ行ってきました。

誰得(マニアック?)なコマンド、オプションが解説されたり、sshの便利な使い方などが内容でした。
普段定型的なコマンドしか使わない(使えない)ので、珍しいオプションなどが知れて面白かったです。sshの使い方は勉強になりました。
でもって結局最後はmanに聞け、なんだなあ、と。
OS(Linux, Unix, Mac??)によってオプションの意味が変わる場合があるので、両方の環境を使わないと行けない人達に取っては大変なのよねえ〜〜。でも、使い方自体はmanで知らべればいいけど、このコマンドで、こんな使い方も出来る!ということを知っておくのは重要だよね、と思います(でないと調べる気が起こらない)。

あと、devlove主催の勉強会には行ったの初めてでしたけど、結構静かだったなあと。本当はこういう勉強会の方が多いのかも知れないけど。

2012-02-23

なんちゃって赤外線カメラで

Wiredで暗視ゴーグルを通して「Kinect」を見る、という記事を見て、自分がかつて工作した赤外線カメラ(LogicoolのWebCamにIRフィルタを張っただけ)を使っても見えるんじゃないかと、試した結果が下記の写真。電気を消した状態で、Kinectを起動させて壁側に向けて、工作した赤外線カメラをKinctとほぼ同位置から壁に向けて撮りました。


上記記事のようなきれいな斑点はさすがに見えない。でもなんか不思議なパターンが出てるんだなあというぐらいは分かります。それだけです。
すでにほかでもいろいろやられているので、いまさら珍しくもないのだけど。
まあ。思わぬところで昔の工作が生きた(?)と。。。

2012-01-10

商用版Kinectが発売されるらしい

予想していた人も居そうだけど(自分は昨日になってひらめいた)、CESでKinectの商用版が2月1日より発売される事が発表されたようです。

  • http://blogs.msdn.com/b/kinectforwindows/archive/2012/01/09/kinect-for-windows-commercial-program-announced.aspx
  • 冗長な↑のエッセンスを抽出した感じhttp://internet.watch.impress.co.jp/docs/news/20120110_503368.html
気になるところとしては
  • 小売り希望価格、249ドル。
    • Xtionに対する価格面でのアドバンテージが無くなったなあ。
    • 今後のMicrosoftの対応次第で、Xtion + OpenNI派に宗旨替えする人が出てくるかも
  • とりあえず数量限定
    • 何処で売り出されるの?最初は企業・研究機関向けの販売になるのかしら。一般人は手に入るのかしら??
  • ベータ提供は3年間提供延長
    • そもそもベータとの関係はどうなるのかしら。ベータはもう今後開発されず、(商用版=安定版、ベータ=開発版というような構図ではなく)商用版だけが開発されていくという認識で良いのかな?
    • 商用版Kinect買えない人はベータで我慢するってこと?
  • 1800万台を売るヒット商品
    • そのうちハック目的で買った人はどれ位いるのだろう。。。
今後出てくる情報に期待かしら。

2011-12-23

Interface1月号の内容を試してみた

12月18日にKinect(など)ハッカソンというのがあったので参加してきました。
ちょうどInterfaceの1月号にKinectの特集が掲載されていたので、それを読んで勉強していました。勉強したのは、「Kinectのマイクロホン・アレーによる音声信号処理」(p.112-116)です。まわり全員がほぼカメラと遊んでいる中、たぶん一人だけマイクと戯れたいたみたいです。。。自分は天邪鬼的性格らしい。

自分の能力不足でいろいろはまったけど、一応記録しておきます。


git

まず、サンプルをgitで取得、というところで躓いてしまいました。gitクライアントなど自分のWindowsに入っていません。てか、gitよく分かんない。。。
参照URLにはzip形式のファイルがあることにはあるけど、サンプルのVisual Studioのプロジェクトがないので、自分でプロジェクトの設定をしないといけない。

サンプルのコンパイル

Visual Studioのプロジェクトファイルを自分で作ることにしたけど、C/C++のプロジェクトの作り方をすっかり忘れてしまっていました。戒めのために、書いておくと、
  • ソリューションエクスプローラー内の対象のプロジェクトを選択して、プロパティを選ぶ
  • 構成プロパティ>C/C++>全体 の「追加のインクルードディレクトリ」で、openrafのヘッダファイルのあるincludeディレクトリを追加
  • 構成プロパティ>リンカー>全般 の「追加のライブラリディレクトリ」に、openrafのLibファイルのあるlibディレクトリを追加
  • 同じく、リンカー>入力 の「追加の依存ファイル」に、openraf.libを追加
  • ビルド後、実行前にexeファイルと同じディレクトリにopenraf/bin以下にあるdllファイルがあるか確認、なければコピー
リンカーの設定で、ずっとdllのディレクトリを選択していて、かなり詰まってました。。。

スピーカーの設定

入力としてKinectのみを使用するサンプルは動いたけど、出力側のスピーカーを使用するサンプル(raf_ds.cppとか)が最初うまく動かなかった。raf_openを実行しても認識してくれなかった(raf_valid_device(da)がfalseになる)。
どうやら、スピーカー>再生デバイス>構成>オーディオチャネル の値を4チャンネルにしていたのが悪さしていたらしい。設定をステレオにすると認識してくれるようになった。サンプルプログラムは2チャンネルの出力デバイスを検索しているみたい。

謎の実行時エラー

出力も使用してraf_enable_stftを使用するサンプルでたまに、libfftw3-3.dllでエラーが出てたり出なかったりした。理由は全く分からない。自分の環境がMacのBootCampを使用しているからかも???



ちょっとした音源定位

何はともあれ、Kinectの4つのマイクからデータが取得できるようになったらしいので(本当に正しくデータが取得できているのかは確認しようがないけど。。。)、最後に http://www.enjoy.ne.jp/~k-ichikawa/soundLoc3.html を参考に、相互相関を使った音源方向を推定するプログラムを書いてみました。既にKinect SDKにあるのに、完全に車輪の再発明状態です。
テストなので、normで割っているとか、かなり無駄も多いし、怪しいところ満載な感じですけど。。

/* pとかcは、openrafのサンプルコードから */
static double p[4][3] ={
 -0.115,0,0,
 0.035,0,0,
 0.075,0,0,
 0.115,0,0
};
static double T = 15; // 室温
static double c = 20.055*sqrt(T+273.15); // 音速

static double VOLUME_TH = 0.05; // 音源定位を実施する音の大きさのしきい値


double correlation(float* X, int N, int channel, int c1, int c2, int t) {
 double R = 0;
 for(int n=0;n<N;n++){
  int tmpT = t+n;
  if (t+n < 0) {
   tmpT = t+n + N;
  } else if (N < t+n) {
   tmpT = (t+n) - N;
  }
  R += X[channel * n + c1 ] * X[channel * (tmpT) + c2];
 }
 return R;
}

double calcTheta(int Tau, int c1, int c2, double* theta) {
 if (Tau == 0) {
  *theta = 0;
  return 1;
 }

 double diffTime = Tau / 16000.0;

 double delta = c * diffTime;
 double length = sqrt(pow((p[c2][0]-p[c1][0]), 2) + pow((p[c2][1]-p[c1][1]), 2) + pow((p[c2][2]-p[c1][2]), 2));
 if (length > fabs(delta)) {
  *theta = asin(delta/length) * 180.0/M_PI;
  return 1;
 } else {
  return 0;
 }
}

double calcLikelyTheta(float* X, int N, double* norm, int channel, int c1, int c2, double* theta) {
 double maxR = 0;
 int maxTau = -1000;
 for (int t=-N/2; t<=N/2; t++) {
  double R = correlation(X, N, channel, c1, c2, t)/(norm[c1]*norm[c2]);
  if (maxR < R) {
   maxR = R;
   maxTau = t;
  }
 }
 int ret = calcTheta(maxTau, c1, c2, theta);
 if (ret) {
  printf("R:%e, t:%2d theta: %5f Volume:%3f\n", maxR, maxTau, *theta, norm[c1]);
 } else {
  printf("R:%e, t:%2d theta: N/A Volume:%3f\n", maxR, maxTau, norm[c1]);
 }
 return ret;
}

/* フレーム処理を行うコールバック */
void callback(const raf_vector& input, raf_vector& output, void* info)
{
 float* X = (float*)input.data;
 float* Y = (float*)output.data;
 int channel=input.M; int N=input.N;

 double norm[4] = {0,0,0,0};
 for (int i=0; i<N; i++) {
  for (int j=0; j<4; j++) {
   norm[j] += pow(X[channel * i + j], 2);
  }
 }
 for (int j=0; j<4; j++) {
  norm[j] = sqrt(norm[j]);
 }

 if (norm[1] > VOLUME_TH) {
  int NumT = 3;
  double theta[3];
  int NumOK = 0;
  int chpair[3][2] = { {3, 0}, {2, 0}, {1, 0} };
  for (int i=0; i<NumT; i++) {
   int ret = calcLikelyTheta(X, N, norm, channel, chpair[i][0], chpair[i][1], &(theta[NumOK]));
   if (ret) {
    NumOK++;
   }
  }
  if (NumOK >= 2) {

   double meanT = 0;
   for (int i=0; i<NumOK; i++) {
    meanT += theta[i];
   }
   meanT /= (double)NumOK;
 
   double sigma = 0;
   for (int i=0; i<NumOK; i++) {
    sigma += pow(theta[i] - meanT, 2);
   }
   sigma /= (double)NumOK;
   printf("***** Theta mean:%f sigma:%f *****\n", meanT, sqrt(sigma));
  } else {
   printf("!!!!! not enough thetas !!!!!\n");
  }
 } else {
//  printf("!!!! too small volume !!!!\n");
 }

 /* ESCキーが押されたらコールバックを抜ける */
 if (kbhit()){
  if(getch()==0x1b) raf_cb_complete(info);
 }
}

書いたは良いけど、会場が静か過ぎて、音を出すのがはばかられて、テストできませんでした。。。

お家へ帰ってから確かめてみた結果は、下記のとおりです。まあ、動いていないこともないかなあ、という感じです。コマンドプロンプトなど貼り付けても理解されないだろうけど。



今回の感想

  • 音系の製作は、ハッカソンのような人が集まる場所でやるものではない。
  • 画像に比べると、音は扱いにくいかなあ、やっぱり。画像だとOpenCVという有名どころで簡単に扱えるようになっているし、応用もいっぱい考えられているけど、音だと、どんなライブラリが結局良いんだろうか??応用も音声認識と音源定位以外になにかあるのかしら?
  • OpenNIの方が発展性がありそうな気がしてきた。。

2011-10-22

DCEXPO行ってきた

(会社休んで!)21日(金)と 22日(土)に未来館でやっていたDCEXPOに行ってきました。会社休んでまで、どんだけハマってるんだ、ってツッコミが怖いですが、楽しかったです。
金曜日は、ブースを見て回って、Kinectの開発講座を聴きました。土曜日はセンターステージのイベントやシンポジウムを聞いてました。


展示ブースで気になったもの
  • Kinectで取得したdepth情報を表示して、棒で粘土のように押しつぶす事が出来るVR体験システム、面白かった、押しつぶすモノによってはストレス発散にもなりそうww
  • テレビの世界遺産の3D。これは是非3Dで見たい

    センターステージ・シンポジウム
    • 球形飛行体:コンテンツの世界に防衛省!という自体そのものが驚きだけど、デモしていた球形飛行体自体も衝撃でした。お話も明朗で聞いていて楽しかったです(飛行理論云々や兵器の種類なんてさっぱりだけど)。アメリカの犬型(?)ロボットと、どっちがブットんだ開発か、競って頂きたい気がする。。。
    • Kinect開発講座:前半はマイクロソフトの方自らが、Kinectの概要とライブコーディングを行って、Kinect開発(の取っ掛かり)が如何に簡単であるかを紹介されていました。
      後半は大学の白井先生という方の講演で、これからKinectのような体を使ったゲームや操作が世界的に流行るという話を、歴史的経緯を交えながらお話しされていました。そして、実際使い物になるNUIを実現するのは難しい、いろんな人達が模索中で、解決策を見いだすと、学会で評価されたり特許ができる、というようなお話でした。前半は何度か聞いた事があるので、後半の講義が大変為になりました。ただ、この辺も特許合戦が始まっちゃうと、弱小開発者は立場が辛いなあと言うのも正直なところです。
    • 音手パフォーマンス:拍手する機械。自動拍手機能と、遠隔拍手機能があるらしい。○○するための機械と聞くと、明和電機の笑う機械を思い出すなあ。。。
    • シンポジウム ソーシャルコンテンツ大爆発うんぬんかんぬん:チームラボの猪子さん、IAMASの小林さん、FabLabの田中さんと、個人的にはそうそうたるメンバーと思ったシンポジウムでした。FabLabあたりの話から、展開が何やら、大量生産とカスタム生産についてがメイントピックになっていたような気がします。
      大量生産vs.カスタム生産と構図を促したいわけではなく(小林さんのおっしゃる通り、大量生産あってこそのカスタム生産と言う部分もあるので、この2つは対立構造ではない)、ソフトウェアがオープンソースという(ソーシャルな)ネットワークで発達したのと同様に、物理的なものをつくることもこれから同様な経緯をもって広まるだろう、ような話だったと思います。
      それに対して、そのパーソナルファブリケーションという運動の恩恵をアメリカは受けるだろうけど、日本は個人的なものつくりをしなくとも、下町工場(?)のような手取り足取り(格安で)作ってくれるプロフェッショナルな方々が沢山居るので(例えばこんなの?)、個人で一から作る事がそれほど広まるのか?と言うような、話もあり、興味深かったです。個人的には興味ある分野で、注視していきたいなあと思います。
      ゲーミフィケーションの話も聞きたかったなあ〜。
      あと、個人的にはフィジカルコンピューティングもARも(インタフェースの拡張という意味では)同じようなものじゃない?って思ってるんですけど、違うんですかねえ??
    • Tokyo AR Show:先生と名の付く職業に就く方々は歴史から入るのが好きらしいw(ペッパーの幽霊という元祖ARが紹介されていました)。Kinect使ってARDroneを操縦したり、ARマーカーをうまく使ってタッチパネルからロボットを操作するデモや、AR三兄弟の仕事内容とかが紹介されていました。
      一時期、そこら中で(企画やマーケティングを中心に)ARうんぬんと言われていた時期があって、消化不良気味だったけど、このステージはARっていろいろな可能性があるのね!って思わされました。
      球形飛行体のデモ
      音手のデモ
      その他の感想
      • そこら中でKinect登場し過ぎw。3D技術が多いのは、「国際3D FAIR」がDCEXPOの一部なのだから、当然なのだけど、それにも匹敵するKinect利用率である。14800円(小売り希望価格)は伊達じゃない!ってことか。この傾向が続くのなら、来年は協賛なり後援にMicrosoftが入って、「日本Kinect FAIR」がプログラムに追加されそうな気がする。
      • 先生と言う名の付く職業の方は、流行だけを追わずに、やはり考えている事が2歩3歩先を見ているなあ、というのをシンポジウムやブースを見て思いました。企業が何も考えていないと言うわけでは決してないのだけど、企業系のブースと大学のブースではちょっと見ている先が異なるのかな、と感じました。。。具体的に何処が?とは、言えるほどはっきりした考えではないのですが、ただ感じただけです。

      DCEXPOを見た後、森美術館でメタボリズムの未来都市展とドラゴンクエスト展を見に行くような人は、観客多しといえども、自分くらいのような気がする。。。
      でもこれも良かった。前者はいろいろ考えさせられましたし、後者は懐かしい!!、です。

      2011-10-16

      KinectのViewerとMercurial

      Kinectを触っていると、.Netが楽しくなってくる。とりあえずVisual Studioが便利で、.Netの豊富なライブラリがすばらしいと思えてくる。普段、自分が、ゴージャスな環境で、オブジェクト指向なプログラムを書いていないだけなのかも知れないけど。。。MicroSoftはKinectという餌で、Visual Studioユーザを増やそうというのが魂胆なのではないかとすら思えてくる。

      Kinect SDKのサンプルでSkeletonデータをCanvas上で2次元に投影して描写するというものがあったけど、任意の視点から表示できないかと考えてて、すると、3Dモデルが扱えないといけないわけで、OpenGLとかWindowsだったらDirectXか、で面倒だなあ(特にDirectXなんて触ったことすらない)と思っていたら、Viewport3DなんていうWPFのクラスが在りやがりました。.Net恐るべし。
      GUIのツールボックスには見当たらないのだけど(私は2010 Expressを使っているので、別バージョンだとあるのかも。。。)、XAMLのテキスト編集には直接書けるみたい。

      書き方はリンク参照のこと、だけど、OpenGLのコードを一度書いたことある人なら、それほど違和感なくかける感じです。とってもオブジェクト指向だから書き方は全く違うのだけど、雰囲気というか、考え方は一緒みたい。きっと実体はグラフィックライブラリのラッパなのでしょうね。

      めでたく.Netで3Dを描写する方法が分かったので、任意視点のSkeletonデータ表示が作れました。この程度の3Dなら問題なく動くようです。
      上から、のつもり。。。(左はいつもの2D投影、右が任意視点)

      横から、のつもり。。。(画像説明は上と同じ)

      各セグメントモデルは直方体としているので、もう少し色を変えるなり、幅を変えればもう少し、見栄えが良くなるかも。間接角度等を追加で表示させられたら、プログラムでデバックの一助になるかも知れない。
      ただ、素の.Netだけで頑張ろうとしている人ってどれ位居るんだろう・・・?


      で、話がガラッと変わって、先日(15日)にPython Developers Festaというかなり異業種交流会的な勉強会で、Mercurialという分散バージョン管理システムのハンズオンを受けて、Mercurial派の軍門に下ってきました(ちなみにまだgitは触ったことありません)。
      そして、bitbucketというサービスで(無料で)使えるということで、せっかくなので初めて登録して使ってみました(ソース暴露デビュー??)。
      https://bitbucket.org/ffuyyo/kinect_skeleton_viewer
      と言いつつ、まだbitbucket使い方とか全然わかってません。ハンズオンはMacだったのでコマンドラインも楽だったけど、WindowsでTortoiseHgを使ってみたけどよく分からない。やっぱりWindowsで開発は難しい、、、あれっ????
      こういう使い方で良いのか?とか、こんなファイルを登録して大丈夫?とかとっても気になるけど、まあ、まだこれしか登録していないので、失うものは何もない。。。(多分)


      この記事の内容が異種格闘技戦っぽくなってきた、、、

      2011-08-29

      KinectでFFT

      注)β時代のSDKを使っていた頃の記事です。最新版では動かないと思います。。。

      KinectのマイクロフォンからのデータをFFTできたら面白いかなあと思った続き。

      いろいろあって、すごく時間が空いてしまったような気がするけど、とりあえず、kinectのマイクロフォンのデータを取得する関数からの出力を使って、FFTができるようになった。

      いろいろ変なところもあろうが、該当部分のソースを晒してみることにした。

      • FFTの本体
      const int fftLength = 1024;
      byte[] rawData;
      const int rawDataLength = 1024 * 2;
      AForge.Math.Complex[] fftBuf;
      
      public void doFFT(Stream audioStream)
      {
        int recordLength = rawDataLength;
        while (recordLength > 0)
        {
          int count = audioStream.Read(rawData, 0, recordLength);
          recordLength -= count;
        }
        for (int i = 0; i < fftLength; i++)
        {
          fftBuf[i].Re = (rawData[2 * i + 1] << 8 | rawData[2 * i]);
          fftBuf[i].Im = 0;
        }
        AForge.Math.FourierTransform.FFT(fftBuf, AForge.Math.FourierTransform.Direction.Forward);
      }
      
      • 使う側
      using (var source = new KinectAudioSource())
       {
         source.SystemMode = SystemMode.OptibeamArrayOnly;
         using (var audioStream = source.Start())
         {
           while (true)
           {
             doFFT(audioStream);
           }
         }
      }
      

      ぶっちゃけ、これだけ。あとは枝葉末節(AForgeライブラリに関しては、以前の記事を参照のこと)。


      スピードは、FFTの処理自体は付いてきてくれているはずだけど。。。この後、前回記事のように、FFTの結果をスペクトルっぽく表示しているのだけど、ちょっと遅れているように感じる。。。どこか悪いのだろうか??
      あと、関数から取得できるデータって、1入力だけなのかしら。マイク4つあるはずだから、4入力取得できる方法があるのかしら(しっかりマニュアル読んでないだけだけど)。


      しかし、慣れてないせいもあって、C#、というよりWindowsで図とか表示するの難しいなあ。KinectやらFFTで悩んでいる時間より、画面に図形とかを表示する方法が分からなくて悩んでいる時間のほうが長いや。。。


      2011-08-21

      勉強会2連戦

      この土日に勉強会と言うか、カンファレンスと言うか、に連続して参加してみた。これこれ(全くアクセサビリティのない書き方。。。)。普段の会社の仕事よりも頭使ったんじゃないかなあとすら思えます。。。

      どちらも、熱い内容で(天候は寒いくらいだったけど)、大いに刺激を受けました。

      Javascriptが今流行ってるということで、ちゃんと勉強して、技術をキャッチアップしていく必要があるなあと改に思いました。

      HTML5に関して思ったことが、まだ勧告という形で標準化されていないから様子見、ではなくて、まだ標準化に至ってないからこそ、どんどん使って広めていくべきものなのかなあと。。。多分、積極的に使用しているところはそんな心意気でやっているのかも??

      技術面だけでなく、コミュニケーションとか、考え方とか、それ以外の部分も大切だなあと思う次第です。どちらか一方が欠けても駄目なんだろうなあ。。。とか言って経験とかないうちに思想とか語っても空しいだけだけど。

      普段、サーバ管理とかのインフラ寄りの仕事をしている人間が、Javascriptとかの開発系のイベントに行くのは、とってもアウェー感漂って、参加している方と話す時に、話があうのかなあと尻込みしてしまうのが、いつも思うことなんだなあ。。。どうなんだろう。でも開発楽しそうなんだよねえ。。。

      あとは、色々勉強会とか行くとどれも面白そうで目移りしてしまって、結局何れも中途半端になりがちなので気をつけないと。

      なんかとっても日記っぽいブログになった。多分理解できる人はいない。(未来の自分も含めて)

      2011-07-10

      FFT

      MSのKinect SDK betaで取得できるマイクからのデータを、フーリエ変換できたら面白そうだなあと思いつきで、C#でFFTが行えるライブラリを探していました。そしたら、AForge というライブラリを見つけた。あまり日本語解説が見当たらないけど、ページを軽く見てみると、NeuroとかMachineLearningとかが見えてなかなか面白そうと思う機会があったら別の関数も試してみたい。
      ただ今回はFFTがしたいだけなので、AForge.Mathだけが必要のようだ。
      ほかにもC#でFFTができるライブラリはあるらしいけど、とりあえずやってみる用途だと、これが一番簡単そう、ということで、とりあえず使ってみた。(FFTなんて学生時代のプログラム課題以来だなあ・・・)

      Kinectとかとりあえず忘れて、難しいことはすべて置いておいて、単純にwavファイルからFFTを実施した結果。何とか窓関数はまったく使ってないです。
      ちゃんとそれらしいグラフが得られているような気がするけど、確かめる術はないなあ。。。

      FFTより画面に描写している時間のほうが長いような。。。

      でもって、ここから先に進める日は何時のことだろうか???(きっとそのうち忘れそう・・・)

      2011-06-29

      ウェブオペレーションという本を読んだ

      ウェブオペレーションという本を、見た目的に興味深かったので読んでみました。

      開発者と運用者の壁というかいがみ合いというか、お互いがお互いの足を引っ張りあっているというか、お互いがお互いを、アイツ使えね〜と思っていると言うのは、どこにでもあるのだな〜と思えてきます。
      特に興味深かったのは、4章と10章と16章あたり。アジャイルとかも言葉ぐらいしか知らずに、分かったような分からないような知識しかないので、これを気に少し勉強してみようかな〜と、思ったりもするのでした。

      ちなみに、本を読んだ時に、次これ読みたいと思ったり、これ勉強してみたいと思わせる本が、自分の中で良い本の一つの定義だったりしてます、、、、全然関係ないですが

      2011-06-04

      kinect勉強会に行ってきた

      今更だけど、kinect勉強会vol.2 に行ってきました。とても参考になる面白い会でした、主催者さま、発表者さま、事務局のみなさま、ありがとうございました。
      ただ、平日夜(しかも金曜日じゃない)、大森、遠い。


      勉強会のUstとすばらしいまとめが、Team-lablogにあるので、とくに自分なりのまとめをするつもりはなくて、例によって感想をつらつらと書くだけです。

      「ちょっと深いOpenNIとNITEの話(でも初心者歓迎!!) 」
      OpenNI、NITEとは何ぞやと、その中身について、でした。OpenNIをようやく、発表者さまの本を買って勉強し始めたところなので、どういうものなのか今ひとつ理解してませんでしたが、いろいろなことが難しい画像処理をすることなく実現できそうで、使いこなせるようになると楽しいなあと思いました。

      「OpenCVとKinect」
      こっちは反対に、OpenCVを使って画像処理をごりごり頑張っていく話でした。色々な開発事例が紹介されてどれも興味深かったです。チームラボにはコンピュータビジョンを使った案件を色々行われているようで、大変うらやましく思います。。。

      「NUI(Natural User Interface)とKinect」
      kinectを使って、どのようにNUIを行えば良いのか検討していました。学習データを作る方法は大変参考になりました。脳波センサーも興味深い。
      質問で、既に発表者さまが説明していたのに、自分が、あまりしっかり聞いておらず、あまりに低レベルな質問をしてしまいました。申し訳ない気持ちで一杯です。以後気をつけます。

      (LT)「kinect on HTML5へぇ~」
      発表者さまが操作すると、みんなのPCのブラウザ上に表示されたスライドが同期して動く、さらにkinectのスケルトン情報を表示させる、というものすごい発表でした。HTML5すげえなあ。。。

      (LT)「SPECIFICITY チームラボ」
      是非、体験してみたい。

      (LT)「Kinectゲームつくってます」
      kinectで対戦ゲームを作ってる(アメーバピグのキャラクターで)、ってお話。普通にXBOXのゲームで出てきそうです。。。
      #ああそうか、kinectって今のところゲームで遊ぶ用の機器なんだよね。。。

      (LT)「MSのくせになまいきだ チームラボ」
      kinect->MAC->arduino->willリモコンをつないで、カービィーで遊ぶ、というお話。こういう話大好きです!!

      全体の感想

      • ある程度高度なことをしようとすると、機械学習等を使用したちゃんとした物体認識が必須みたいだなあ。すると、個人で遊ぶレベルを超え始めているような。。。その意味では学習データの作り方はとても参考になりました。
      • カメラ間のキャリブレーションはちゃんと勉強しておきたい。
      • でもって、発表者さま、参加者さまのレベルが高くて、それに比べて(比べるのもおこがましい)自分のやっていることがしょぼいなあ、萎えそう。。。

      2011-05-29

      WebSocket勉強会に行ってきた

      タイトル通り、5/28に開催されたWebSocket勉強会に行ってきました。内容自体は、リンク先の発表資料(29日時点では歯抜け状態ですけど)やUstの録画、はたまたTogetterを見れば良いとして、折角なので自分なりの感想を書いておくことにしよう。

      • 最初のコマにWebSocketのプロトコル内容を中心とた発表がありました。どんどん内容が変わっているようで、いつ策定されるんだろうというのがとにかく気になります。自分アプリケーションの開発屋さんじゃなくて、サーバとかインフラ寄りの人なので、プロトコルは気になるところです。とりあえず時間のある時にプロトコルの仕様書に挑戦してみようかと思いました。
      • その後いくつか事例紹介が続きましたが(と一括りにしてしまって、発表者さんごめんなさい><)、よく出てくる組み合わせがnode.jsとさくらのVPS。
        • HTML5とかに興味ある人って基本Javascript好きな人っていう勝手な先入観があるので、サーバのjavascriptで書きたいのかなあ。まあ単純にWebSocketと相性が良いのかも知れない(その辺がよく分からない)。C10Kってのも話は聞いたことあるだけで細かいことは知らないので、この辺も勉強しておきたいところ。サーバ関係の仕事してるなら、知っとけって言われるかも知れないし。
        • node.jsも折角なんで使ってみたい。
        • さくらのVPSは個人ユーザ向けサーバでは鉄板なのだろうか。確かに1ヶ月1000円未満でサーバ使えるのは魅力。
      • ブラウザとハードウェアをつなげる話も出てきました。ブラウザでハードウェア操作は自分も興味ある部分です。遠い過去の昔に対抗心だけでこんなブログも書いたことあるし。。。そういう自分も今や完全にkinectの軍門に下ったわけだけど。
        • node.jsがあれば、機器がTCPを喋れれば(喋れなかったらさらにプロキシ 見たいなものを挟む)websocketで通信が出来るらしい。面白い。
        • しかし、@ndrugerさんのこの分野への投資額は相当なものだなあ。kinectにHMD、しかも対戦ゲームを作ってるってことなので、もう一セットあるのかしら。。。
      • 最後の方は、どちらかと言うとサーバに寄った話だったような気がする。node.js以外にJetttyという選択肢もあるとか。
        • 数あるHTML5関係の機能の中でWebSocketはサーバ機能が必須、というのが敷居を高くしている要因の一つらしい。アプリケーションの仕様や設計に依ることが大きいと思うけど、クライアント側のコードを書くよりサーバ側のコードを書く方が圧倒的に難しい気がする。単純なウェブアプリケーションではなくて、コネクションを管理したりと正にサーバを作成するような感じな気がする(まあ、実際はWebSocketサーバがその辺よしなにやってくれるとは思うけど)。個人的には、サーバ側の開発パターンが確立、整理されるようになると、もう少し敷居が下がるのかなあと思ったりします。
        • まあ、WebSocketが使えるサーバのサービスがほとんどない(だからさくらVPSが流行る)っていう状況も何とかなると、って思います。クライアント側のネットワーク(プロキシとかプロキシとかプロキシとか。。。)とサーバ側のネットワーク(通信に影響を与えるかも知れない機能を許可するのは、インフラ屋さん的にはとっても嫌がるってのは、身にしみて感じております。。。)がネックになりそう。
        • あと、WebSocketのサーバサービスが増えるにはWebSocketは儲かる匂いがしないと、、、そんな匂いを漂わせるにはWebSocket対応サービスが増えないと、、、というジレンマ。
        • だからしばらくはLAN内での使用に限定されるのかも。
        • iPhoneで操作できるプレゼン機能、欲しい。。。
      なかなか、濃縮されて深い勉強会だったと思いました。次回までにもう少しWebSocketについて勉強して、参加できればなあと思いました。
      なんか、勉強したいことがどんどん増えていくな、時間は有限なのに。。。

      # WebSocketなのかWebsocketなのかwebsocketなのか、正式名はなんでしょう。。。?

      2011-05-06

      kinectで遊んでみる 再び

      大型連休にも関わらず、自分は何やっているんだろうと思いつつ、またkinectを触っています。
      今回はARっぽいものを作ろうとしたけど、結論から言うと、(例によって)あまり実りの無い実装をしてしまったようです。なので、反面教師的な意味を込めて記録しておきます。

      内容は4月にあったkinectハッカソンvol.2 +そのとき構想だけのことろを実際に作ってみたらこうなった、という部分です。

      やろうとしたこと
      ちょっと前に(今も??)ARってのが流行ってたけど、基本、画像にとあるモデルをオーバーラップさせて表示させているけど、kinect使うと3次元空間上(細かい人だと2.5次元と言ったりするらしい。。。)に(3次元復元した)画像データとモデルを(比較的簡単に、というか、先人たちの情報を使って)表示出来そうなので、頑張ってみようと思いました。
      従って、やるべきことは、RGB画像からモデルを表示する領域(以下対象領域)を取得して、その点を3次元上にプロットして、そこにOpenGLでモデルを表示させる、と言うことになります。

      まあ、誰かがどこかでやってそうな内容だけど、気にしない、気にしない(あまりそういう調査をしない人なので)。。。

      構成
      流れはこんな感じ。
      1. RGB画像から、モデルを表示する対象領域を切り出す(手とか、方眼紙とか。。。)
      2. 1.で求めた領域に対応するdepth画像の領域を取り出す
      3. 2.で取り出した領域を3D点に復元する
      4. 3D点から平面を推定して、位置とx,y,z軸を頑張って計算する
      5. 4.で求めた座標上にモデルを表示する
      6. その他の領域を3Dに復元して表示する
      使ったツールは、kinect制御にlibfreenect、画像処理ツールとしてOpenCV2.2、描写にOpenGLを使った。言語はCです。

      RGB画像の領域を切り出す
      調べていないので、とっても推測ですけど、OpenNIとかのボーン検出って、depth画像を元にやっていそうな気がするけど、あまのじゃくな自分としては、RGB画像から領域を取得することにしました。単純しごくな方法で、kinectのRGBカメラ画像から色情報(HSV)を使って切り出すことにしました。
      1. RGBからHSVに変換
      2. 各ピクセルについてしきい値内にあるものを取得
      3. オープニングとクロージングを使ってノイズを削減
      4. 輪郭抽出をして、最も面積が大きいものを対象領域とする
      あまりに単純なため、色の明るさが自動で調節されてしまう上に、パラメータが職人的でそのわりに、精度も良くない。あくまでkinectのRGBカメラは表示用なんだなあと思います。
      RGB画像
      対象領域候補の抽出:上のパラメータを変えて色の範囲を決めます。。。

      depth画像の領域を切り出す
      RGB画像から取得した対象領域を3次元上に表示する為には、対象領域の対応するdepth画像上の点を取得する必要があります。
      そのやり方は単純に、
      img_rgb.x = img_depth.x, img_rgb.y = img_depth.y
      では無いです。depth画像のある(dx, dy)に対応するRGB画像の(cx, cy)を求める計算方法は、http://nicolas.burrus.name/index.php/Research/KinectCalibration とか http://graphics.stanford.edu/~mdfisher/Kinect.html に詳しいです。これをパラメータ値も含めて、参考にしました。本当はキャリブレーションしないといけないところなんですが、、、

      3次元点の復元
      depth画像から3次元点の復元が出来ます。これも、上記の2つのリンクに詳しいです。libfreenectのサンプルコードや、ofxKinectにもやり方があります。

      抜粋:
       img_depth : depth画像のなまデータ
       mask_hand : RGB画像から抽出した対象領域(名前は昔の名残。。。)
       img_targetarea : RGB画像から抽出した対象領域に対応したdepth領域
       map_3d : depth画像の各点の3次元点を記憶
       map_image : depth画像の各点に対応するRGB画像の座標値を記憶 

      cvSetZero(img_targetarea);
       cvSetZero(map_3d);
       cvSetZero(map_image);
       for (int i=0; i<DISPLAY_SIZE_H; i++) {
        for (int j=0; j<DISPLAY_SIZE_W; j++) {
         float tx, ty, tz;
         float w, h;
         uint16_t d = CV_IMAGE_ELEM(img_depth, uint16_t, i, j);
         if (0 < d && d < 2047) {
          transformDepthTo3D(j, i, d, &tx, &ty, &tz);
          CV_IMAGE_ELEM(map_3d, float, i, j*3)     = tx;
          CV_IMAGE_ELEM(map_3d, float, i, j*3 + 1) = ty;
          CV_IMAGE_ELEM(map_3d, float, i, j*3 + 2) = tz;
          transform3DToRGBImage(tx, ty, tz, &w, &h);
          CV_IMAGE_ELEM(map_image, float, i, j*2)     = w;
          CV_IMAGE_ELEM(map_image, float, i, j*2 + 1) = h;
          int rw = cvRound(w);
          int rh = cvRound(h);
          if (0<= rw && rw<DISPLAY_SIZE_W && 0 <= rh && rh < DISPLAY_SIZE_H) {
           uint8_t c = CV_IMAGE_ELEM(mask_hand, uint8_t, rh, rw);
           if (c > 0) {
            // 対象領域
            CV_IMAGE_ELEM(img_targetarea, uint8_t, i, j) = 255;
           }
          }
         }
        }
       }
      

      この辺のコードが出てきたから、自分のやり方がどうもうまく行かない気がしてきました。。。
      四角い青いカード
      四角い青いカードに対応するdepth画像を切り出したところ

      前段の画像処理がうまくないせいか、プログラムが間違っているせいか、キャリブレーションをちゃんとやっていないせいか、はずれ値データが沢山取れてしまいます(そもそも構想から問題があった、が正解のような気がします)。

      対象領域の位置とx,y,z軸を計算する
      モデル表示の為に、対象領域の3次元上の位置と3軸が必要になります。そのために対象領域の3次元上の平面推定をします(平面が推定できればあとは適当な条件をつけてやれば、位置と3軸が求まります、きっと。。。)。
      ところで、3次元点列からの平面推定ってどうやるんでしょう。私は一般的な方法を知りません。あったとしてもとても面倒そう。
      z軸の誤差を最小にするする方法なら、例えばこんな感じらしいけど、ある点から平面への垂線の距離を最小にする場合、面倒らしい。このQAページによると、主成分分析を使うといいらしい、とのことで、OpenCVの cvCalcPCA 関数を使って、固有値の大きい順にx, y, z軸を決めることにしました(位置も一緒に求められます)。なので頑張らなくても計算できました。

      でも、計算した軸はかなりふらついてしまって、その結果、きれいに物体が表示できないのが正直なところです(主成分分析のせいではなくて、前段の画像処理の部分の制度の問題と思われます)。あまりのふらつき具合に、座標軸なんて推定するだけ無駄のような気になってきます。

      座標上にモデルを表示する
      対象領域の3次元上の位置と軸を求めたので、そこから、OpenGL上でのMODEL_VIEW変換行列が計算できます。座標変換してお望みのモデルなり何なりを表示出来ます。
      抜粋:
       hand_X_axis : 対象領域の各軸
       hand_center : 対象領域の中心

      void loadHandPositionMatrix() {
       GLfloat mat[16] = {
        hand_x_axis[0], hand_x_axis[1], hand_x_axis[2], 0,
        hand_y_axis[0], hand_y_axis[1], hand_y_axis[2], 0,
        hand_z_axis[0], hand_z_axis[1], hand_z_axis[2], 0,
        hand_center[0], hand_center[1], hand_center[2], 1
       };
       glMultMatrixf(mat);
      

      その他の領域を3次元に復元して表示
      3次元上に生成した点にRGB画像をテクスチャとして貼る方法も、libfreenectのサンプルコードにあります。

      結果
      対象領域の3次元点
      対象領域にモデル表示、その他領域も表示
      ちなみに処理の速度を測ってみると、7FPSくらい。かなり微妙。。。

      感想と反省
      • RGB画像上で画像処理するのはやはり、あまり賢い選択ではないようです。折角のdepth画像を有効に使って領域を取得した方がいいんだなあと思います。
      • となると、RGBの画像処理を使わずに、OpenNIのボーン検出をして、そこから特徴点の3次元を取得、3次元点を使ってモデルを表示した方が精度が高くなるような気がします。また、きっとそっちの方がkinectらしい気もします。。。
      • あくまでRGB画像処理派なら、ARToolkitを使うということも考えられます。それはどこかの誰かがやっていたような気がしますが。。。
      • OpenCV1.xを少し触ったことあるけど、2x、ヘッダファイルとか変わり過ぎでしょ。関数はそれほど変わってないけど、引数の増えた関数もあった。ウェブ上にもまだあまり日本語情報が無い。。。
      • OpenCVもC++の方が情報が多いような気がするので、C++使えるならそっちを使った方が良いのでしょう(今更勉強する気にはあまりなれないけど)。
      • まあOpenCVとかOpenGLの勉強になったので良しとしよう。。。
      • 例によって自己満足な誰得?な内容です。
      Related Posts Plugin for WordPress, Blogger...