1

作为初学者,我是 openNI 和 Kinect 的新手,我尝试通过 OpenNI.org 中的教程在此链接中实现 OpenNI SimpleViewer:http: //openni.org/docs2/Tutorial/smpl_simple_view.html

我已经实现了本教程中描述的代码,但我仍然面临问题,因为程序抛出异常并且没有显示任何输出。

我已经链接了所有库并正确安装了 kinect。我还包含了带有 openNI 的 OpenCV 库。

这是我实现的 C++ 代码:

int main()
{
    rc = context.InitFromXmlFile(XML_PATH,&errors);
    if(rc == XN_STATUS_NO_NODE_PRESENT)
    {
        XnChar strError[1024];
        errors.ToString(strError,1024);
        printf("%s\n",strError);
        return(rc);
    }
    else if(rc != XN_STATUS_OK)
    {
        printf("Open failed : %s\n", xnGetStatusString(rc));
        return(rc);
    }

    rc = context.FindExistingNode(XN_NODE_TYPE_DEPTH,depth);
    if(rc != XN_STATUS_OK)
    {
        printf("No Depth Node Found. Check XML!\n");
        return -1;
    }
    depth.GetMetaData(depthMD);
    image.GetMetaData(imageMD);

    if(imageMD.FullXRes() != depthMD.FullXRes() || imageMD.FullYRes() != depthMD.FullYRes())
    {
        printf("The device depth and image resolution must be equal\n");
        return -1;
    }
    if(imageMD.PixelFormat() != XN_PIXEL_FORMAT_RGB24)
    {
        printf("The Device Image Format must be RGB24\n");
        return -1;
    }

    unsigned short textMapX = (((unsigned short)(depthMD.FullXRes() - 1)/512) + 1 * 512);
    unsigned short textMapY = (((unsigned short)(depthMD.FullYRes() - 1)/512) + 1 * 512);
    XnRGB24Pixel* pTextMap = (XnRGB24Pixel*) malloc(textMapX * textMapY * sizeof(XnRGB24Pixel));
    rc = context.WaitOneUpdateAll(depth);
    depth.GetMetaData(depthMD);
    image.GetMetaData(imageMD);
    const XnDepthPixel* pDepth = depthMD.Data();
    const XnUInt8* pImage = imageMD.Data();
    unsigned int imageScale = GL_WIN_SIZE_X/depthMD.FullXRes();

    xnOSMemSet(depthHist,0,MAX * sizeof(float));
    unsigned int numberOfPoints = 0;
    for(XnUInt y = 0; y < depthMD.YRes(); ++ y)
    {
        for(XnUInt x = 0; x < depthMD.XRes(); ++x, ++pDepth);
        {
            if(*pDepth != 0)
            {
                depthHist[*pDepth]++;
                numberOfPoints++;
            }
        }
    }
    for(int index = 1; index < MAX; index++)
    {
        depthHist[index] += depthHist[index - 1];
    }
    if(numberOfPoints)
    {
        for(int index = 1; index < MAX; index++)
        {
            depthHist[index] = (unsigned int)(256 * (1.0f - (depthHist[index]/numberOfPoints)));
        }
    }
    return 0;
}

我也面临理解代码后面部分的问题。

4

0 回答 0