OpenNI RGB изображение в OpenCV BGR IplImage преобразования? - PullRequest
2 голосов
/ 03 декабря 2011

Изображение, которое можно получить из метаданных OpenNI Image, упорядочено как изображение RGB. Я хотел бы преобразовать его в OpenCV IplImage, который по умолчанию предполагает, что данные будут храниться как BGR. Я использую следующий код:

    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;

Каков наилучший (самый быстрый) способ в C / C ++ для выполнения этого преобразования, чтобы изображение RGB стало BGR (в формате IplImage)?

Ответы [ 3 ]

8 голосов
/ 07 декабря 2011

Разве не легко использовать функцию преобразования цвета OpenCV?

imgColor->imageData = (char*) pImage;
cvCvtColor( imgColor, imgColor, CV_BGR2RGB);
1 голос
/ 03 декабря 2011

Есть несколько интересных ссылок.

Например, показанное здесь преобразование 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.

0 голосов
/ 14 апреля 2012

Может быть и больше (если кодировка не openni_wrapper :: Image :: RGB). Хороший пример можно найти в файле openni_image.cpp , где в строке 170 используется функция fillRGB.

...