ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

OpenNI の Image, Depth, Audio でサポートされている解像度などを列挙する

昨日から Xtion LIVE を触り始めて、カメラの解像度が1280x1024もいけるそうなので試してみたところ、なかなか動作せず難儀していました。というのも、XMLでカメラ画像の解像度とフレームレートを設定したのですが「その設定が不正だ」とAPIがエラーを返すのです。


で、ちょっとヘルプを漁ってみたところ、Image, Depth それぞれがサポートするモードを取得できるAPIがあったので、それを使ったところ無事に1280x1024の解像度もできました。結果的にフレームレートを15FPSで設定していたのですが、それがダメで1280x1024でも30FPSの設定になるみたいです。
ついでに、昨日やっと動いた Audio も同じようなインタフェースをもってるので、ついでに見てみました。

こんなかんじ

デバイスは Xtion Pro LIVE です

コード

全体のコードはこちらです


例によって、ポイントの解説です

OpenNIの初期化
XnStatus rc = context.Init();

Generatorの情報を取りたいだけなので、単純に初期化します。

Image, Depth の解像度およびFPSの取得
xn::ImageGenerator image;
rc = image.Create( context );

Generatorを作成します。Context::Initで初期化したので、GeneratorはCreateで作成します。

XnUInt32 count = image.GetSupportedMapOutputModesCount();

サポートするモードの数を取得します

std::vector< XnMapOutputMode > outputmode( count );
rc = image.GetSupportedMapOutputModes( &outputmode[0], count );

std::cout << "Supported Image Output Mode Count : " << outputmode.size() << std::endl;
for ( int i = 0; i < outputmode.size(); ++i ) {
    std::cout << outputmode[i].nXRes << ", " << outputmode[i].nYRes << ", " << outputmode[i].nFPS << std::endl;
}

サポートするモードの数の XnMapOutputMode 配列を作成し、実際にサポートするモードを取得します。
あとは、そのモードを表示するだけです。

XnMapOutputMode で取得できる情報
nXRes 幅(ピクセル)
nYRes 高さ(ピクセル)
nFPS 1秒あたりのフレーム数(Frame Per Second)
Audio 情報取得

基本的には Image, Depth と同じで、メンバ関数と構造体の名称がことなるくらいです。

xn::AudioGenerator audio;
rc = audio.Create( context );

Generatorを作成します。Context::Initで初期化したので、GeneratorはCreateで作成します。

XnUInt32 count = audio.GetSupportedWaveOutputModesCount();

サポートするモードの数を取得します

std::vector< XnWaveOutputMode > outputmode( count );
rc = audio.GetSupportedWaveOutputModes( &outputmode[0], count );

std::cout << "Supported Wave Output Mode Count : " << outputmode.size() << std::endl;
for ( int i = 0; i < outputmode.size(); ++i ) {
    std::cout << outputmode[i].nSampleRate << ", " << (XnUInt32)outputmode[i].nChannels << ", " << outputmode[i].nBitsPerSample << std::endl;
}

サポートするモードの数の XnWaveOutputMode 配列を作成し、実際にサポートするモードを取得します。
あとは、そのモードを表示するだけです。

XnWaveOutputMode で取得できる情報
nSampleRate サンプリングレート(Hz)
nChannels チャネル数(1:モノラル、2:ステレオ ...)
nBitsPerSample 1サンプルあたりのビット数

まとめ

サポートするモードの取得ができると、アプリケーション起動後に、メニューなどで変更できるので、使うどころは結構あるんじゃないかなぁと思います。