C++ 使用openNi/NITE从Kinect生成jpeg图像

C++ 使用openNi/NITE从Kinect生成jpeg图像,c++,opengl,kinect,libjpeg,openni,C++,Opengl,Kinect,Libjpeg,Openni,我试图从Kinect生成图像帧,并将其传递给人脸检测/跟踪算法。我已经看到,从openGL纹理生成jpeg图像的最佳方法是通过libjpeg,但我不知道如何开始。这是我现在代码中的内容: //draw image frame to texture const XnRGB24Pixel* pImageRow = g_imageMD.RGB24Data(); XnRGB24Pixel* pTexRow = g_pTexMap + g_imageMD.YOffset()

我试图从Kinect生成图像帧,并将其传递给人脸检测/跟踪算法。我已经看到,从openGL纹理生成jpeg图像的最佳方法是通过libjpeg,但我不知道如何开始。这是我现在代码中的内容:

//draw image frame to texture       
    const XnRGB24Pixel* pImageRow = g_imageMD.RGB24Data();
    XnRGB24Pixel* pTexRow = g_pTexMap + g_imageMD.YOffset() * g_nTexMapX;

    for (XnUInt y = 0; y < g_imageMD.YRes(); ++y)
    {
        const XnRGB24Pixel* pImage = pImageRow;
        XnRGB24Pixel* pTex = pTexRow + g_imageMD.XOffset();

        for (XnUInt x = 0; x < g_imageMD.XRes(); ++x, ++pImage, ++pTex)
        {
            *pTex = *pImage;
        }

        pImageRow += g_imageMD.XRes();
        pTexRow += g_nTexMapX;
    }

    // Create the OpenGL texture map
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, g_nTexMapX, g_nTexMapY, 0, GL_RGB, GL_UNSIGNED_BYTE, g_pTexMap);
//将图像帧绘制到纹理
常量XnRGB24Pixel*pImageRow=g_imageMD.RGB24Data();
XnRGB24Pixel*pTexRow=g_pTexMap+g_imageMD.YOffset()*g_nTexMapX;
对于(XnUInt y=0;y

那么,我如何将这个g_pTexMap传递到另存为jpeg图像呢?

OpenGL不处理图像文件。如果要将图像存储到文件中,将其传递给OpenGL是不对的。您应该将数据传递到libjpeg或其他图像文件访问库,而不是将数据传递到glTexImage2D


看看imlib2,OpenGL不处理图像文件。如果要将图像存储到文件中,将其传递给OpenGL是不对的。您应该将数据传递到libjpeg或其他图像文件访问库,而不是将数据传递到glTexImage2D


看一看imlib2

我确实尝试过imlib2,但似乎很难将openNi XnRGB24Pixel类型转换为imlib2正在寻找的数据流。Imlib2似乎更容易处理文件(例如imageName.jpg),而不是内存中的数据流。然后我开始尝试openCV,下面是我从openni讨论页面获得并编辑的代码[此处链接]

void generateJpeg(const xn::ImageMetaData&g_imageMD){

//opencv将图像转换为jpeg
printf(“将图像转换为jpeg。\n”);
cv::Mat colorArr[3];
cv::Mat彩色图像;
常数XnRGB24Pixel*pPixel;
常数XnRGB24Pixel*pImageRow;
pImageRow=g_imageMD.RGB24Data();
colorArr[0]=cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),cv_8U);
colorArr[1]=cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),cv_8U);
colorArr[2]=cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),cv_8U);
对于(int y=0;ynGreen;
Rptr[x]=pPixel->nRed;
} 
皮马格罗+=g_imageMD.XRes();
} 
合并(colorArr,3,colorImage);
IplImage bgrIpl=彩色图像;
cvSaveImage(“image.jpg”和bgrIpl);
}

我确实尝试过imlib2,但似乎很难将openNi XnRGB24Pixel类型转换为imlib2所寻找的数据流。imlib2似乎更容易处理文件(例如imageName.jpg)而不是内存中的数据流。然后我开始尝试openCV,下面是我从openNi讨论页面获得并编辑的代码[链接此处]

void generateJpeg(const xn::ImageMetaData&g_imageMD){

//opencv将图像转换为jpeg
printf(“将图像转换为jpeg。\n”);
cv::Mat colorArr[3];
cv::Mat彩色图像;
常数XnRGB24Pixel*pPixel;
常数XnRGB24Pixel*pImageRow;
pImageRow=g_imageMD.RGB24Data();
colorArr[0]=cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),cv_8U);
colorArr[1]=cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),cv_8U);
colorArr[2]=cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),cv_8U);
对于(int y=0;ynGreen;
Rptr[x]=pPixel->nRed;
} 
皮马格罗+=g_imageMD.XRes();
} 
合并(colorArr,3,colorImage);
IplImage bgrIpl=彩色图像;
cvSaveImage(“image.jpg”和bgrIpl);
}

< C/C++?C?艾达?FORTRAN?添加适当的标签到你的问题。抱歉,我添加了C++标签。这是什么语言?C?C++?C?艾达?FORTRAN?给你的问题添加适当的标签。对不起。我添加了C++标签。@ Esther Goh:注意,你可以在没有支持的情况下编译IMLIB2。十、 因此,您甚至不需要安装X库(与我链接的页面中的内容相反)。@Esther Goh:注意,您可以编译imlib2而不支持X,因此您甚至不需要安装X库(与我链接的页面中的内容相反)。
    //opencv to convert image to jpeg
    printf("Converting image to jpeg.\n");
    cv::Mat colorArr[3]; 
    cv::Mat colorImage; 
    const XnRGB24Pixel* pPixel; 
    const XnRGB24Pixel* pImageRow; 
    pImageRow = g_imageMD.RGB24Data();


    colorArr[0] = cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),CV_8U); 
    colorArr[1] = cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),CV_8U); 
    colorArr[2] = cv::Mat(g_imageMD.YRes(),g_imageMD.XRes(),CV_8U); 

    for (int y=0; y<g_imageMD.YRes(); y++){ 
        pPixel = pImageRow; 
        uchar* Bptr = colorArr[0].ptr<uchar>(y); 
        uchar* Gptr = colorArr[1].ptr<uchar>(y); 
        uchar* Rptr = colorArr[2].ptr<uchar>(y); 

        for(int x=0;x<g_imageMD.XRes();++x , ++pPixel){ 
                Bptr[x] = pPixel->nBlue; 
                Gptr[x] = pPixel->nGreen; 
                Rptr[x] = pPixel->nRed; 
        } 

        pImageRow += g_imageMD.XRes(); 
    } 

    cv::merge(colorArr,3,colorImage); 
     IplImage bgrIpl = colorImage;    
    cvSaveImage("image.jpg",&bgrIpl);

}