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 章を攻略するよ。完成するとこんなアプリになるらしい。
いきなり超本格的な見栄えだ。たぶん作り終えたら達成感もひとしおだと思う。

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