2011-12-03 2 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_RGB2BGR이 CV_BGR2RGB 대신이 경우에 사용되어야한다고 생각합니다. – Dexter

+0

사실, CV_RGB2BGR에 문제가 있습니다. 알 수없는 배열 유형입니다. 본질적으로 두 유형 모두 동일한 절차를 설명합니다 (R 및 B 값 반전) – Constantin

1

몇 가지 흥미로운 참고 자료가 있습니다.

예를 들어

, 또한 BGR에 RGB 변환 여기에 표시된 QImage to IplImage convertion : IplImage 데이터를 반복하는 방법을 보여 여기 besides this one 여러 게시물이 있습니다

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

.

0

그 이상일 수 있습니다 (인코딩이 openni_wrapper :: Image :: RGB가 아닌 경우). 좋은 예는 the openni_image.cpp file에서 찾을 수 있는데, 여기서 그들은 170 행에서 fillRGB 함수를 사용합니다.