你將需要從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貼子進一步討論這個話題。
非常感謝! – user2168 2012-01-01 02:01:50
沒問題!樂意效勞 :) – mevatron 2012-01-01 20:01:12