2011-12-03 158 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。