OpenNI RGB 图像到 OpenCV BGR IplImage 的转换?

Posted

技术标签:

【中文标题】OpenNI RGB 图像到 OpenCV BGR IplImage 的转换?【英文标题】:OpenNI RGB image to OpenCV BGR IplImage conversion? 【发布时间】:2011-12-03 00:50:53 【问题描述】:

可以从 OpenNI Image Meta Data 中获取的图像被排列为 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 格式)的最佳方式(最快)是什么?

【问题讨论】:

没有内置机制可以做到这一点。您将不得不手动完成。 【参考方案1】:

OpenCV的颜色转换功能不好用吗?

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

【讨论】:

仅供参考,但我认为在这种情况下应该使用 CV_RGB2BGR 而不是 CV_BGR2RGB。 实际上,我遇到了 CV_RGB2BGR 问题,它说的是未知数组类型。本质上,这两种类型都描述了相同的过程(翻转 R 和 B 值)【参考方案2】:

那里有一些有趣的参考资料。

例如,此处显示的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 数据。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于OpenNI RGB 图像到 OpenCV BGR IplImage 的转换?的主要内容,如果未能解决你的问题,请参考以下文章

opencv中为啥图像局矩阵是以BGR而不是RGB显示像素的大小?

OpenCV OpenNI 校准 kinect

Python OpenCV - imshow 不需要从 BGR 转换为 RGB

python使用openCV加载图像并将BGR格式转换成HSV格式定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)并使用mask信息进行颜色分离BGR格式的图像转化为RGB并可视化

python使用openCV加载图像并将BGR格式转换成HSV格式定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)并使用mask信息进行颜色分离BGR格式的图像转化为RGB并可视化

在 OpenCV 中将 YUV 转换为 BGR 或 RGB