2

OpenNI Image Meta Data から取得できる画像を RGB 画像として配置します。デフォルトでデータがBGRとして保存されることを前提とするOpenCV 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++ でこの変換を実行する最良の方法 (最速) は何ですか?

4

3 に答える 3

8

OpenCVの色変換機能が使いにくい?

imgColor->imageData = (char*) pImage;
cvCvtColor( imgColor, imgColor, CV_BGR2RGB);
于 2011-12-07T12:37:43.843 に答える
1

そこにいくつかの興味深い参考文献があります。

たとえば、ここに示すQImageからIplImageへの変換は、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;
}

これ以外にも、IplImageデータを反復処理する方法を示すいくつかの投稿があります。

于 2011-12-03T01:53:37.953 に答える
0

それ以上のものがあるかもしれません (エンコーディングが openni_wrapper::Image::RGB でない場合)。良い例は、openni_image.cpp ファイルの170 行目で関数 fillRGB を使用しています。

于 2012-04-14T14:40:01.103 に答える