2011-12-31 194 views
1

我有一個數據(無符號字符*)與RGB 16位格式R:5 G:6 B:5
如何設置此數據爲IplImage格式?
我可以這樣開始:
OpenCV與RGB 16位

unsigned char* data = ...data...; 
IplImage *img = cvCreateImage(cvSize(800,480), IPL_DEPTH_8U, 3); // Should it be 16? 
cvSetData(img,data,800*2); // Here is where I am not sure 

回答

2

你將需要從IPL_DEPTH_16U(單聲道)轉換爲IPL_DEPTH_8U(三通道)。

下面是一些代碼,我趕緊寫了(這應該工作,但我沒有565圖像方便來測試它,所以我會先試試這幾個測試圖像...)

#include <opencv2/core/core.hpp> 
#include <iostream> 

using namespace std; 
using namespace cv; 

#define RED_MASK 0xF800 
#define GREEN_MASK 0x07E0 
#define BLUE_MASK 0x001F 


int main(int argc, char* argv[]) 
{ 
    IplImage *rgb565Image = cvCreateImage(cvSize(800, 480), IPL_DEPTH_16U, 1); 
    IplImage *rgb888Image = cvCreateImage(cvSize(800, 480), IPL_DEPTH_8U, 3); 

    unsigned short* rgb565Data = (unsigned short*)rgb565Image->imageData; 
    int rgb565Step = rgb565Image->widthStep/sizeof(unsigned short); 

    uchar* rgb888Data = (uchar*)rgb888Image->imageData; 

    float factor5Bit = 255.0/31.0; 
    float factor6Bit = 255.0/63.0; 

    for(int i = 0; i < rgb565Image->height; i++) 
    { 
     for(int j = 0; j < rgb565Image->width; j++) 
     { 
      unsigned short rgb565 = rgb565Data[i*rgb565Step + j]; 
      uchar r5 = (rgb565 & RED_MASK) >> 11; 
      uchar g6 = (rgb565 & GREEN_MASK) >> 5; 
      uchar b5 = (rgb565 & BLUE_MASK); 

      // round answer to closest intensity in 8-bit space... 
      uchar r8 = floor((r5 * factor5Bit) + 0.5); 
      uchar g8 = floor((g6 * factor6Bit) + 0.5); 
      uchar b8 = floor((b5 * factor5Bit) + 0.5); 

      rgb888Data[i*rgb888Image->widthStep + j]  = r8; 
      rgb888Data[i*rgb888Image->widthStep + (j + 1)] = g8; 
      rgb888Data[i*rgb888Image->widthStep + (j + 2)] = b8; 
     } 
    } 

    return 0; 
} 

您或許可以使用查找表進行轉換,但是我所擁有的應該對指導性用途更好。

另外,看看this SO貼子進一步討論這個話題。

+0

非常感謝! – user2168 2012-01-01 02:01:50

+0

沒問題!樂意效勞 :) – mevatron 2012-01-01 20:01:12