5

私はかなり長い間この問題に取り組んできましたが、私の創造性の終わりにあるので、他の誰かが私を正しい方向に向けるのを手伝ってくれることを願っています. Kinect を使用して、データを MATLAB にキャプチャしようとしています。幸いなことに、そうする方法はかなりあります (私は現在http://www.mathworks.com/matlabcentral/fileexchange/30242-kinect-matlabを使用しています)。キャプチャしたデータを 3D に投影しようとしたとき、従来の方法では再構成の結果が不十分でした。

簡単に言うと、再構成と位置合わせを実行する matlab 用の Kinect SDK ラッパーを作成することになりました。復興は夢のようですが…

あなたがここで見ることができるように、私は整列にたくさんの問題を抱えています:

ここに画像の説明を入力

モデルをよく見ないでください:(。

ご覧のとおり、配置が正しくありません。なぜそうなのかはわかりません。私は、他の人が同じ方法で私よりも多くの成功を収めているフォーラムをたくさん読みました。

私の現在のパイプラインは、Kinect Matlab (Openni を使用) を使用してデータをキャプチャし、Kinect SDK を使用して再構築し、Kinect SDK を使用して (NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution によって) 位置合わせを行っています。おそらく Openni が原因ではないかと思いましたが、Kinect SDK を使用してキャプチャする mex 関数呼び出しを作成することにほとんど成功していません。

誰かが私がもっと深く掘り下げるべき方向を教えてくれれば、それは大歓迎です.

編集:

図 いくつかのコードを投稿する必要があります。これは私が整列に使用するコードです:

    /* The matlab mex function */
    void mexFunction( int nlhs, mxArray *plhs[], int nrhs, 
            const mxArray *prhs[] ){

        if( nrhs < 2 )
        {
            printf( "No depth input or color image specified!\n" );
            mexErrMsgTxt( "Input Error" );
        }

        int width = 640, height = 480;

        // get input depth data

        unsigned short *pDepthRow = ( unsigned short* ) mxGetData( prhs[0] );
        unsigned char *pColorRow = ( unsigned char* ) mxGetData( prhs[1] );

        // compute the warping

        INuiSensor *sensor = CreateFirstConnected();
        long colorCoords[ 640*480*2 ];
        sensor->NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution(
                NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480, 
                640*480, pDepthRow, 640*480*2, colorCoords );
        sensor->NuiShutdown();
        sensor->Release();

        // create matlab output; it's a column ordered matrix ;_;

        int Jdimsc[3];
        Jdimsc[0]=height;
        Jdimsc[1]=width;
        Jdimsc[2]=3;

        plhs[0] = mxCreateNumericArray( 3, Jdimsc, mxUINT8_CLASS, mxREAL );
        unsigned char *Iout = ( unsigned char* )mxGetData( plhs[0] );

        for( int x = 0; x < width; x++ )
            for( int y = 0; y < height; y++ ){

                int idx = ( y*width + x )*2;
                long c_x = colorCoords[ idx + 0 ];
                long c_y = colorCoords[ idx + 1 ];

                bool correct = ( c_x >= 0 && c_x < width 
                        && c_y >= 0 && c_y < height );
                c_x = correct ? c_x : x;
                c_y = correct ? c_y : y;

                Iout[ 0*height*width + x*height + y ] =
                        pColorRow[ 0*height*width + c_x*height + c_y ];
                Iout[ 1*height*width + x*height + y ] =
                        pColorRow[ 1*height*width + c_x*height + c_y ];
                Iout[ 2*height*width + x*height + y ] =
                        pColorRow[ 2*height*width + c_x*height + c_y ];

            }

    }
4

3 に答える 3

5

これは、ステレオ ビジョン システムのよく知られた問題です。私はしばらく前に同じ問題を抱えていました。私が投稿した元の質問は、こちらにあります。私がやろうとしていたことは、これと似たようなものでした。しかし、多くの調査の結果、キャプチャされたデータセットを簡単に調整できないという結論に達しました。

一方、データセットの記録中に、関数呼び出しを使用して RGB データと深度データの両方を簡単に整列させることができます。このメソッドは、OpenNI と Kinect SDK の両方で使用できます (機能は同じですが、関数呼び出しの名前はそれぞれ異なります)。

Kinect SDK を使用してデータセットをキャプチャしているようです。データを Kinect SDK に揃えるために、MapDepthFrameToColorFrameを使用できます。

OpenNI の使用についても言及されているので、AlternativeViewPointCapabilityをご覧ください。

Kinect SDK の経験はありませんが、OpenNI v1.5 では、レコーダー ノードを登録する前に、次の関数呼び出しを行うことでこの問題全体が解決されました。

depth.GetAlternativeViewPointCap().SetViewPoint(image);

ここimageで、 はイメージ ジェネレータ ノードで、depthは深度ジェネレータ ノードです。これは、OpenNI 2.0 SDK に置き換えられた古い SDK にありました。そのため、最新の SDK を使用している場合、関数呼び出しは異なる可能性がありますが、全体的な手順は似ている可能性があります。

また、いくつかのサンプル画像を追加しています:

上記の整列関数を使用しないと、RGB の深度エッジが整列されませんでした アライメントなし

関数呼び出しを使用すると、深度エッジが完全に整列されます (いくつかのエッジを示す赤外線シャドウ領域がいくつかありますが、それらは無効な深度領域です)。 アライメントあり

于 2013-08-05T22:09:07.043 に答える
1

ここに画像の説明を入力 depth.GetAlternativeViewPointCap().SetViewPoint(画像);

うまく機能しますが、問題は深度画像を (FOCAL_rgb/FOCAL_kinect で) 縮小し、視差 d=focal*B/z で深度ピクセルをシフトすることです。工場出荷時の設定によっては、わずかに回転する場合もあります。

したがって、これらの変換を元に戻さない限り、3 つの現実世界の座標をすべて復元することはできません。そうは言っても、正確な x、y に依存せず、z のみを考慮に入れる方法 (セグメンテーションなど) は、シフトされたシフト マップでもうまく機能する可能性があります。さらに、色と深さを利用して、より優れたセグメンテーションを実行できます。

于 2013-11-26T22:34:32.667 に答える