我正在尝试将图像帧传递给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);
那么如何将这个g_pTexMap事件传递给jpeg图像呢?
答案 0 :(得分:3)
OpenGL不处理图像文件。如果要将图像存储到文件中,将其传递给OpenGL是不正确的。您应该将数据传递给libjpeg或其他图像文件访问库,而不是将数据传递给glTexImage2D。
答案 1 :(得分:0)
我确实尝试过imlib2,但似乎很难将openNi XnRGB24Pixel类型转换为imlib2正在寻找的数据流。 Imlib2似乎更容易使用文件(例如imageName.jpg)而不是内存中的数据流。然后我开始尝试使用openCV,这是我从openni-discussion页面获得并编辑的代码[link here]。
void generateJpeg(const xn :: ImageMetaData&amp; 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);
}