0

私が知る限り、公式の Kinect 1.5 SDK には、Face Tracking と Skeleton Tracking が付属しています。単純なブロブ検出はどうですか? 私がやりたいのは、円形/楕円形のオブジェクトを追跡することだけです。そのためのコードが SDK に見つからないので、opencv またはその他のライブラリを使用する必要がありますか?

(私のコードは C++ です)

EDIT1フェイス トラッカーを調整して、一般的に (顔ではなく) 丸い形状を検出することはできますか?

EDIT2 SDK に同梱されているサンプルの深さ処理コードです。OpenCV で blob を抽出するにはどうすればよいですか?

void CDepthBasics::ProcessDepth()
{
    HRESULT hr;
    NUI_IMAGE_FRAME imageFrame;

    // Attempt to get the depth frame
    hr = m_pNuiSensor->NuiImageStreamGetNextFrame(m_pDepthStreamHandle, 0, &imageFrame);
    if (FAILED(hr))
    {
        return;
    }

    INuiFrameTexture * pTexture = imageFrame.pFrameTexture;
    NUI_LOCKED_RECT LockedRect;

    // Lock the frame data so the Kinect knows not to modify it while we're reading it
    pTexture->LockRect(0, &LockedRect, NULL, 0);

    // Make sure we've received valid data
    if (LockedRect.Pitch != 0)
    {
        BYTE * rgbrun = m_depthRGBX;
        const USHORT * pBufferRun = (const USHORT *)LockedRect.pBits;

        // end pixel is start + width*height - 1
        const USHORT * pBufferEnd = pBufferRun + (cDepthWidth * cDepthHeight);

        while ( pBufferRun < pBufferEnd )
        {
            // discard the portion of the depth that contains only the player index
            USHORT depth = NuiDepthPixelToDepth(*pBufferRun);

            // to convert to a byte we're looking at only the lower 8 bits
            // by discarding the most significant rather than least significant data
            // we're preserving detail, although the intensity will "wrap"
            BYTE intensity = static_cast<BYTE>(depth % 256);

            // Write out blue byte
            *(rgbrun++) = intensity

            // Write out green byte
            *(rgbrun++) = intensity;

            // Write out red byte
            *(rgbrun++) = intensity;

            // We're outputting BGR, the last byte in the 32 bits is unused so skip it
            // If we were outputting BGRA, we would write alpha here.
            ++rgbrun;

            // Increment our index into the Kinect's depth buffer
            ++pBufferRun;

        }

        // Draw the data with Direct2D
        m_pDrawDepth->Draw(m_depthRGBX, cDepthWidth * cDepthHeight * cBytesPerPixel);
    }

    // We're done with the texture so unlock it
    pTexture->UnlockRect(0);

    // Release the frame
    m_pNuiSensor->NuiImageStreamReleaseFrame(m_pDepthStreamHandle, &imageFrame);
}
4

2 に答える 2

1

残念ながら、OpenCV はブロブ自体の処理をサポートしていないため、これを使用できます。

http://opencv.willowgarage.com/wiki/cvBlobsLib

于 2012-09-21T11:28:05.903 に答える
1

Kinect から必要な画像を取得したら、その結果に対して任意の画像処理ライブラリを自由に使用してください。

OpenCV のHough Circle Transformを使用して円を検出できます。最初に Kinect 画像形式から cv::Mat に変換する必要がある場合があります。

その機能を備えたライブラリは OpenCV だけではないと思います。興味がある場合は、ハフ変換全般を調べてください。

ただし、フェイストラッカーを調整することが道だとは思いません。

于 2012-09-21T11:29:40.777 に答える