2011-06-20 13 views
0

私はKinectから顔検出/追跡アルゴリズムに画像フレームを渡そうとしています。私は、openjpのテクスチャからjpegイメージを生成する最善の方法はlibjpeg経由であることを見てきましたが、私はどのように起動するのか分かりません。これは私が今、私のコードの上に持っているものです。openNi/NITEでKinectからjpeg画像を生成

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

は、どのように私は、JPEG画像として保存されるように、このg_pTexMapの事を渡すことができますか?

+0

何語ですか? C? C++? C#?エイダ?フォートラン?あなたの質問に適切なタグを追加してください。 – karlphillip

+0

ああ申し訳ありません。 C++タグを追加しました。 –

答えて

3

OpenGLはイメージファイルを処理しません。画像をファイルに保存したいのであれば、OpenGLに渡すことは適切なことではありません。データをglTexImage2Dに渡す代わりに、libjpegまたは別のイメージファイルアクセスライブラリに渡す必要があります。

は、のImlib2 http://docs.enlightenment.org/api/imlib2/html/

+0

リンクが非常に役立つように見える、私はそれを試してみる!ありがとう! –

+0

@Esther Goh:Xをサポートせずにimlib2をコンパイルできるので、Xライブラリがインストールされている必要はありません(リンク先のページに書かれている内容とは異なります)。 – datenwolf

0

を見てください、私は、のImlib2を試しましたが、のImlib2が探しているデータストリームにopenNi XnRGB24Pixelタイプを変換することは難しいように見えました。 Imlib2は、メモリ内のデータストリームではなく、ファイル(たとえばimageName.jpg)でより簡単に動作するようです。私はopenCVを試してみました。ここでopenniディスカッション・ページ[リンクはこちら]から入手して編集したコードです。

無効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); 

} 
関連する問題