2011-12-03 20 views
2

OpenNIイメージメタデータから取得できるイメージは、RGBイメージとして配置されています。 OpenCV IplImageに変換したいのですが、デフォルトではデータはBGRとして保存されています。OpenNV 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の画像は(IplImageへの形式で)BGRになるように、この変換を実行するためにC/C++での最良の方法(最速)で何を:私は、次のコードを使用できますか?

+0

これを行うためのメカニズムはありません。あなたは手でそれをしなければならないでしょう。 – karlphillip

答えて

8

OpenCVの色変換機能は使いにくいですか?

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

ちょっと参考までに、CV_BGR2RGBの代わりにCV_RGB2BGRを使うべきだと思います。 – Dexter

+0

実際、私はCV_RGB2BGRに問題がありました、それは未知の配列タイプを言っていました。本質的には、両方のタイプが同じ手順を記述します(R値とB値を反転させます) – Constantin

1

いくつかの興味深い参考文献があります。例えば

QImage to IplImage convertionもBGRにRGBを変換する、ここに示す:

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; 
} 

IplImageへデータを反復処理する方法を示し、ここでいくつかの記事besides this oneがあります。

0

それ以上の場合があります(エンコードがopenni_wrapper :: Image :: RGBでない場合)。良い例は、the openni_image.cpp fileにあり、170行目でfillRGB関数を使用しています。

関連する問題