0

据我了解官方 Kinect 1.5 SDK,它带有人脸跟踪和骨骼跟踪。简单的斑点检测怎么样?我想做的就是跟踪一个圆形/椭圆形的物体。我在 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 本身不支持处理 blob:

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

于 2012-09-21T11:28:05.903 回答
1

从 Kinect 获得所需的图像后,您可以随意使用任何图像处理库来处理结果。

您可以使用 OpenCV 的Hough Circle Transform来检测圆圈。您可能需要先将 Kinect 图像格式转换为 cv::Mat。

我想 OpenCV 不是唯一具有该功能的库。如果您有兴趣,请在一般情况下查找 Hough 变换。

我不认为调整面部跟踪器是要走的路。

于 2012-09-21T11:29:40.777 回答