2011-12-03 118 views
2

可以从OpenNI Image Meta Data获得的图像排列为RGB图像。我想将其转换为OpenCV IplImage,默认情况下数据将被存储为BGR。我使用下面的代码:OpenNI RGB图像到OpenCV BGR IplImage转换?

XnUInt8 * pImage = new XnUInt8 [640*480*3]; 
    memcpy(pImage,imageMD.Data(),640*480*3*sizeof(XnUInt8)); 
    XnUInt8 temp; 
    for(size_t row=0; row<480; row++){ 
     for(size_t col=0;col<3*640; col+=3){ 
      size_t index = row*3*640+col; 
      temp = pImage[index]; 
      pImage[index] = pImage[index+2]; 
      pImage[index+2] = temp; 
     } 
    } 
    img->imageData = (char*) pImage; 

什么是执行这个转换,使得RGB图像变得BGR(以IplImage的格式)的最佳方式(最快)的C/C++?

+0

有没有内置的机制来做到这一点。你将不得不亲手做。 – karlphillip

回答

8

使用OpenCV的颜色转换功能不容易吗?

imgColor->imageData = (char*) pImage; 
cvCvtColor(imgColor, imgColor, CV_BGR2RGB); 
+0

仅供进一步参考,但我认为应在此情况下使用CV_RGB2BGR而不是CV_BGR2RGB。 – Dexter

+0

其实,我遇到了CV_RGB2BGR的问题,它说的是未知数组类型。实质上,两种类型都描述相同的过程(翻转R和B值) – Constantin

1

有一些有趣的参考。

例如,这里显示的QImage to IplImage convertion,这也将RGB转换到BGR:

static IplImage* qImage2IplImage(const QImage& qImage) 
{  
    int width = qImage.width(); 
    int height = qImage.height(); 

    // Creates a iplImage with 3 channels 
    IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); 
    char * imgBuffer = img->imageData; 

    //Remove alpha channel 
    int jump = (qImage.hasAlphaChannel()) ? 4 : 3; 

    for (int y=0;y<img->height;y++) 
    { 
     QByteArray a((const char*)qImage.scanLine(y), qImage.bytesPerLine()); 
     for (int i=0; i<a.size(); i+=jump) 
     { 
      //Swap from RGB to BGR 
      imgBuffer[2] = a[i]; 
      imgBuffer[1] = a[i+1]; 
      imgBuffer[0] = a[i+2]; 
      imgBuffer+=3; 
     } 
    } 

    return img; 
} 

这里有besides this one几个职位,说明如何对数据的IplImage迭代。

0

可能还有更多(如果编码不是openni_wrapper :: Image :: RGB)。一个很好的例子可以在the openni_image.cpp file中找到,他们在第170行中使用函数fillRGB。