昨日から Xtion LIVE を触り始めて、カメラの解像度が1280x1024もいけるそうなので試してみたところ、なかなか動作せず難儀していました。というのも、XMLでカメラ画像の解像度とフレームレートを設定したのですが「その設定が不正だ」とAPIがエラーを返すのです。
で、ちょっとヘルプを漁ってみたところ、Image, Depth それぞれがサポートするモードを取得できるAPIがあったので、それを使ったところ無事に1280x1024の解像度もできました。結果的にフレームレートを15FPSで設定していたのですが、それがダメで1280x1024でも30FPSの設定になるみたいです。
ついでに、昨日やっと動いた Audio も同じようなインタフェースをもってるので、ついでに見てみました。
コード
全体のコードはこちらです
例によって、ポイントの解説です
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サンプルあたりのビット数 |
まとめ
サポートするモードの取得ができると、アプリケーション起動後に、メニューなどで変更できるので、使うどころは結構あるんじゃないかなぁと思います。