1

他の人がOpenNIレコーダーモジュールを使用して記録したデータを使用しています。残念ながら、レコーディング中に誤ってミラーリング機能をオンに設定してしまったため、1。MirrorCapを使用して深度をミラーリングし、2。AlternateViewPointCapを使用して深度をrgbに合わせるという問題がいくつかあります。次のように、深度ノードからこれらの機能にアクセスしてみました。

xn::Context ni_context;
xn::Player player;
xn::DepthGenerator g_depth;
xn::ImageGenerator g_image;
ni_context.Init();
ni_context.OpenFileRecording(oni_filename, player);
ni_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
ni_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image); 
g_depth.GetMirrorCap().SetMirror(false);
g_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);

ただし、これは機能しませんでした。ミラーをfalseに設定した後でも、g_depthのIsMirrored()コマンドはtrueとして返され、alternateviewpointcapはジェネレーターから受け取る深度マップを変更しません。

また、モックノードを介してそれを実行してみました。

xn::MockDepthGenerator m_depth;
m_depth.CreateBasedOn(g_depth);
m_depth.GetMirrorCap().SetMirror(false);
m_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);
xn::DepthMetaData temp;
g_depth.GetMetaData(temp);
m_depth.SetMetaData(temp);

これは、m_depthから取得した深度マップにも影響しません。色と深さの情報を揃える方法について、あらゆる提案をいただければ幸いです。このデータは記録が難しく、何らかの形で使用する必要があります。

私の現在の解決策は、SetMetaData関数で設定する前に、モック深度ノードを作成し、独自のルーチンを使用してすべてのピクセルを反転することです。次に、OpenCVを使用して、ユーザーに4ポイントをクリックさせることにより、RGB画像から深度画像への遠近法変換を作成します。次に、この変換をrgbフレームに適用して、値を揃えます。完璧ではありませんが、機能します。ただし、データを使用する必要がある可能性のある他の人のために、より適切な修正を行いたいと思います。

4

2 に答える 2

1

残念ながら、OpenNIでのいくつかの設計上の決定は、Primesense SoCの影響を受けたようです。具体的には、SoCはハードウェアで深度->RGB登録とミラーリングを実行できます。残念ながら、これは、録音したときのジェネレーターの出力があなたが持っているものであることを意味します。ごめん。

Primesenseドライバーのコードを見て登録(XnDeviceSensorV2 / Registration.cpp)を行う方法を見ると、OpenNIからアクセスできる方法でレンズパラメーターをエクスポートしていないようですが、これは残念なことです。私が目にする唯一のハッキーな解決策は、データをエクスポートするためにドライバーを変更して再コンパイルすることです(これはユーザーモードのコードなので、それほど悪くはありません。おそらくAvin2のSensorKinectをフォークすることをお勧めします)。

また、FYI(モックジェネレーターはそれ自体では処理を行いません)。NiRecordSyntheticサンプルは、モックノードの使用方法の例を示しています。

于 2012-03-13T03:10:14.747 に答える
0

Roeeの答えに加えて、OpenNIを使用してKinectからレンズデータにアクセスできます。これは少し注意が必要です。探しているものの名​​前と種類を知っている必要があります。たとえば、このコードは、深度ジェネレータのZeroPlanePixelSizeとZeroPlaneDistanceを抽出します。これらは、後で投影ポイントを実世界のポイントに変換するために使用されます(デバイスごとに変わります)。

XnUInt64 zpd;
XnDouble zpps;
g_DepthGenerator.GetIntProperty("ZPD", zpd);
g_DepthGenerator.GetRealProperty("ZPPS", zpps);

Avin2Sensorファイルを調べて、その深度からRGB視点への変換が実際に行われる場所を見つけることで、必要なアルゴリズムとkinectパラメーターを取得できる可能性があります。

于 2012-03-13T20:29:53.270 に答える