drawColor


void drawColor(IntRect* pLocation, IntPair* pPointer, int pointerRed, int pointerGreen, int pointerBlue)
{
    if (g_DrawConfig.Streams.Color.Coloring == COLOR_OFF)
        return;

    if (!isColorOn() && !isIROn())
    {
        drawClosedStream(pLocation, "Color");
        return;
    }

    openni::VideoFrameRef colorMD;
    int depthWidth = 0, depthHeight = 0, depthFullWidth = 0, depthFullHeight = 0;
    int depthOriginX = 0, depthOriginY = 0;

    if (isColorOn())
    {
        colorMD = getColorFrame();
        if (!colorMD.isValid())
            return;
    }
     else if (isIROn())
     {
         colorMD = getIRFrame();
     }
    else
        return;

    if (!colorMD.isValid())
        return;

    if (colorMD.getFrameIndex() == 0)
    {
        return;
    }

    openni::VideoFrameRef depthMetaData = getDepthFrame();

    int width = colorMD.getWidth();
    int height = colorMD.getHeight();
    int fullWidth = colorMD.getVideoMode().getResolutionX();
    int fullHeight = colorMD.getVideoMode().getResolutionY();
    int originX = colorMD.getCropOriginX();
    int originY = colorMD.getCropOriginY();

    XnUInt8* pColor = (XnUInt8*)colorMD.getData();
    bool useDepth = false;
    openni::PixelFormat format = colorMD.getVideoMode().getPixelFormat();

    openni::DepthPixel* pDepth = NULL;

    if (depthMetaData.isValid())
    {
        useDepth = true;
        depthWidth = depthMetaData.getWidth();
        depthHeight = depthMetaData.getHeight();
        depthFullWidth = depthMetaData.getVideoMode().getResolutionX();
        depthFullHeight = depthMetaData.getVideoMode().getResolutionY();
        depthOriginX = depthMetaData.getCropOriginX();
        depthOriginY = depthMetaData.getCropOriginY();

        pDepth = (openni::DepthPixel*)depthMetaData.getData();
    }

    for (XnUInt16 nY = 0; nY < height; nY++)
    {
        XnUInt8* pTexture = TextureMapGetLine(&g_texColor, nY + originY) + originX*4;

        if (format == openni::PIXEL_FORMAT_YUV422)
         {
            YUV422ToRGB888(pColor, pTexture, width*2, g_texColor.Size.X*g_texColor.nBytesPerPixel);
             pColor += width*2;
         }
        else if (format == openni::PIXEL_FORMAT_YUYV)
        {
            YUYVToRGB888(pColor, pTexture, width*2, g_texColor.Size.X*g_texColor.nBytesPerPixel);
            pColor += width*2;
        }
         else
        {
            XnDouble dRealY = (nY + originY) / (XnDouble)fullHeight;
            XnInt32 nDepthY = dRealY * depthFullHeight - depthOriginY;

            for (XnUInt16 nX = 0; nX < width; nX++, pTexture+=4)
            {
                XnInt32 nDepthIndex = 0;

                if (useDepth)
                {
                    XnDouble dRealX = (nX + originX) / (XnDouble)fullWidth;

                    XnInt32 nDepthX = dRealX * depthFullWidth - depthOriginX;

                    if (nDepthX >= depthWidth || nDepthY >= depthHeight || nDepthX < 0 || nDepthY < 0)
                    {
                        nDepthIndex = -1;
                    }
                    else
                    {
                        nDepthIndex = nDepthY*depthWidth + nDepthX;
                    }
                }

                switch (format)
                 {
                case openni::PIXEL_FORMAT_RGB888:
                    pTexture[0] = pColor[0];
                    pTexture[1] = pColor[1];
                    pTexture[2] = pColor[2];
                    pColor+=3;
                     break;
                case openni::PIXEL_FORMAT_GRAY8:
                     pTexture[0] = pTexture[1] = pTexture[2] = *pColor;
                     pColor+=1;
                     break;
                case openni::PIXEL_FORMAT_GRAY16:
                     pTexture[0] = pTexture[1] = pTexture[2] = *((XnUInt16*)pColor) >> 2;
                     pColor+=2;
                     break;
                default:
                    assert(0);
                    return;
                 }

                // decide if pixel should be lit or not
                if (g_DrawConfig.Streams.Color.Coloring == DEPTH_MASKED_COLOR &&
                    (!depthMetaData.isValid() || nDepthIndex == -1 || pDepth[nDepthIndex] == 0))
                {
                    pTexture[3] = 0;
                }
                else
                {
                    pTexture[3] = 255;
                }
            }
        }
    }

    if (pPointer != NULL)
    {
        TextureMapDrawCursor(&g_texColor, *pPointer, pointerRed, pointerGreen, pointerBlue);
    }

    TextureMapUpdate(&g_texColor);
    TextureMapDraw(&g_texColor, pLocation);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值