2011/04/25

Kinectプチハック(エピソード4)

【ミッション: Kinectで立体復元に挑戦しよう】

前回奥行き情報を(一応)推定する事ができたので、そろそろ 3D にしてみようと思う。

本日のターゲットは、このどうしようもない写真。


これを、Kinect で適当に 3 次元復元して俯瞰したら、こうなった。

机上の本や PC はもちろん、部屋の隅っこの柱やパイプなどの凹凸がくっきり浮き出ている事が確認できる。

※ ちなみにぼくの隣は博士様の席なのだ。いないけど。

トイデジ探検隊

赤い屋根のバス。

2011/04/22

Kinectプチハック(エピソード3)

【ミッション: Kinectから奥行き情報を推定しよう】

前回、カメラ画像に位置を合わせた深度データを取ってくる事ができたので、今回はそれを 3 次元的にマッピングしてみようと思った。

これは、椅子と机の一部の奥行きデータを3次元的にプロットした結果である。

トイデジ探検隊

いつも乗る電車。

2011/04/21

新潟拉麺愛好會活動報告(ちゃーしゅうや武蔵篇)

このたび、めでたくちゃーしゅうや武蔵・新大前店(新潟大学前店)がオープンしたので、ご祝儀代わりに食べに行ってみた。

今でこそ関東や東海地方へと勢力を伸ばしつつあるが、もともとこのお店は新潟発祥。

新潟県内下越地方では比較的ポピュラーで、その人気は同店の『からし味噌ちゃーしゅうめん』を再現したカップラーメンが発売されたほど(※かつてサークルKで期間限定販売されたんだよ)。



今まで笹口・新発田・小針の各店に訪れた事があるが、「ちゃーしゅう」が丼からはみだすほどのアグレッシブなトッピングは新大前店が初めてである。


見事なちゃーしゅうタワーのてっぺんにちょこんと載った赤い物体。その正体はにんにくがたっぷり配合された唐辛子味噌で、これがスープに強いパンチを与えている。

そして、唐辛子味噌の溶けた濃厚で刺激的なスープに深みを与えているのは、(恐らく)魚介系のダシ。

一口食べれば、舌の上でコシの強い太縮れ麺が踊り、ちゃーしゅうがほぐれるのだ。この味覚的感動は筆舌に尽くしがたい。

※ ちなみにこの場所はかつて、小千谷発祥の名店である『らーめんヒグマ』だったのだが、残念ながらぼくが食べに行かぬまま消滅してしまった。

2011/04/18

Kinectプチハック(エピソード2)

【ミッション: OpenCVでNiSimpleViewerもどきを作ろう】

前回、Kinect の深度データと RGB 画像を OpenCV の IplImage で取得する実験をしてみた。

この調子で、OpenNI Tips に載っている『デプスと画像を重ね合わせするデモのサンプルコード』を試してみよう。


…って、あれ? ずれていてうまく重ならない。なにこれダメじゃん。

どうやら、深度センサとカメラの位置が微妙にずれているため、単なるオーバレイ表示にしただけではダメらしい。

2011/04/16

静穏なる燭光

東日本の『節電ムード』の昂揚で、行く先々で節電グッズを見かけるようになりました。

たとえば、それまでインテリア小物に過ぎなかったキャンドルが、電気照明のリプレースとして大型雑貨店の目立つ位置に陳列されるほど。

やはり日常的に使うのは少々難しいですが、雰囲気のある灯を眺めるのは心の癒しになります。

2011/04/13

Kinectプチハック

【ミッション: Kinectのカメラ映像をIplImageに変換して使おう】

前回のあらすじOpenNI を入れた

Kinect のカメラ、及び深度データを OpenCV で使うための最小限のソースコードをこの辺で見つけたので、さっそく試してみた。

自分の環境に合わせてじゃっかんソースコードを書き換えたが、概ねそのままである(下記のコードは、Visual Studio と OpenCV 2.0 のコンビネーションじゃないとうまく動かない気がする。特にライブラリのバージョンに注意)。
#include<cv.h>
#include<highgui.h>

// ※インクルードパスに
//  「C:\Program files\OpenNI\Include」
//  を追加しておこう!
#include<XnCppWrapper.h>

#pragma comment(lib,"C:/Program files/OpenNI/Lib/openNI.lib")

#define SAMPLE_XML_PATH "C:/Program Files/OpenNI/Data/SamplesConfig.xml"

int main() {
    xn::Context context;
    xn::EnumerationErrors errors;

    context.InitFromXmlFile(SAMPLE_XML_PATH);

    xn::DepthGenerator depth; // 深度コンテキスト
    context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth);

    xn::ImageGenerator image; // イメージコンテキスト
    context.FindExistingNode(XN_NODE_TYPE_IMAGE, image);

    xn::DepthMetaData depthMD;
    xn::ImageMetaData imageMD;

    cv::Mat depthshow;
    cv::Mat show;
    int key = 0;
    bool isWarp=false;
    while (key!='q')
    {
        // waitとエラー処理
        context.WaitAnyUpdateAll();

        image.GetMetaData(imageMD);
        depth.GetMetaData(depthMD);

        // 画像と深度はOpenCVのMatに格納
        cv::Mat depth16(480,640,CV_16SC1,(unsigned short*)depthMD.WritableData());
        cv::Mat imni(480,640,CV_8UC3,(uchar*)imageMD.WritableData());

        // RGB色空間をBGRに変換
        cv::cvtColor(imni,show,CV_RGB2BGR);  
        
        // 11ビット画像を8ビット画像に変換
        depth16.convertTo(depthshow,CV_8U,-255/4096.0,255);

        cv::imshow("depth",depthshow);
        cv::imshow("image",show);
        key = cv::waitKey(33);
    }
    context.Shutdown();
    return 0;
}
これで、Kinect から労せずしてカメラ映像を取得する事ができるようになった。

……と見せかけて、上記のサンプルコードのままでは(僕にとって)多少問題がある

この段階で、画像データは OpenCV の汎用行列クラスである cv::Mat のオブジェクトとして扱えるようになるのだが、このページの情報によると、 cv::Mat のメンバである step の値が、4 バイト単位に調整されなくなるという不都合が残っているらしい。

以前書いたような Windows API との連携を考えた場合、画像の管理には素性がはっきりしている IplImage 構造体を用いた方が、面倒も少なくて済むだろう。

僕がてきとうに調べた限り、Kinect から取ってきた画像データを直に IplImage に変換するような先人のソースコードを見つける事はできなかった。

それでも、恐らく需要はあるかも知れないと思い、ちょっと作ってみることに。

2011/04/12

非線型最適化テスト

【ミッション: 最急降下法を実装せよ】

新学期早々、ちょっと必要に迫られて、非線型最適化手法をてきとうに実装する事になった。

今回は簡単のために、以下のような多変数関数 f(x, y) = x2 + y2 を最小化する x 及び y の値を求めるプログラムを作ってみる。

2011/04/05

新潟拉麺愛好會活動報告(いっとうや篇)

本日ご紹介するのは、紫竹山の人気店・いっとうや。

少し見つけにくい場所にあるため、街道を適当に走って運よく辿りつける確率は奇跡に近い(言いすぎ)。


特筆すべきは、こんがり炙られた厚切りチャーシューの圧倒的な存在感。ジューシーで香ばしく、噛むほどに舌の上で幸せが広がる。

スープは魚介ベースの醤油味で思いの外あっさりしており、主役であるチャーシューの味をうまく中和している。

一方、麺は癖のないストレートで、ボリュームも控えめ。

スープ・麺ともに、チャーシューを邪魔しないような『配慮』が感じられた。



【自分用メモ: 最寄りのバス停留所】
  • 紫竹 (京王団地線、東明線、水原線、二本木・新津線、山二ツ線、亀田・酒屋線、沢海・新津線)
  • 紫竹山 (南長潟線、鵜の子線)
  • (南長潟線、鵜の子線)
いずれも新潟駅南口バスターミナルから乗車可能。

2011/04/03

もっと! Android

【ミッション: Android 開発本を攻略しよう】

前回のあらすじ: Android の本を買った

今日は第 4 章を攻略するよ。完成するとこんなアプリになるらしい。
いきなり超本格的な見栄えだ。たぶん作り終えたら達成感もひとしおだと思う。

※ この記事は、本の内容をただなぞっているだけなので、解説ではなく単なるお勉強の実況中継だよ。ここを読んでも再現はできないから、やってみたい人は本を買おう。