создание изображений в формате JPEG из Kinect с openNi / NITE - PullRequest
0 голосов
/ 20 июня 2011

Я пытаюсь сгенерировать передачу кадров изображения алгоритму обнаружения / отслеживания лица от Kinect. Я видел, что лучший способ генерировать изображения в формате jpeg из текстур openGL - через 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);

Так, как я могу передать эту вещь g_pTexMap, которая будет сохранена как изображение JPEG?

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

OpenGL не работает с файлами изображений. Если вы хотите сохранить изображение в файл, передача его в OpenGL не делает правильных действий. Вместо передачи данных в glTexImage2D вы должны передать их в libjpeg или другую библиотеку доступа к файлам изображений.

Посмотрите на imlib2 http://docs.enlightenment.org/api/imlib2/html/

0 голосов
/ 21 июня 2011

Я попробовал imlib2, но было трудно преобразовать тип openNi XnRGB24Pixel в поток данных, который ищет imlib2. Кажется, что Imlib2 легче работает с файлами (например, imageName.jpg), а не с потоками данных в памяти. Затем я перешел, чтобы попробовать openCV, и вот код, который я получил и отредактировал со страницы обсуждения openni [ссылка здесь].

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

    //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);

}
...