룩업 테이블을 사용하여 색상 공간과 코딩 변형 사이에서 미가공 픽셀 데이터를 변환하고 있습니다.전처리기를 통해 3D 룩업 테이블 (LUT)을 초기화 하시겠습니까?
typedef struct
{
unsigned char data[3];
} rgb;
rgb LUTYUVTORGB[256][256][256];
그것은 다음과 같이 초기화된다 : 이것은 내 LUT의 정의이다
// loop through all possible values
for (int in_1 = 0; in_1 < 256; in_1++) {
for (int in_2 = 0; in_2 < 256; in_2++) {
for (int in_3 = 0; in_3 < 256; in_3++) {
int out_1, out_2, out_3;
// LUT YUV -> RGB
// convert to rgb (http://softpixel.com/~cwright/programming/colorspace/yuv/)
out_1 = (int)(in_1 + 1.4075 * (in_3 - 128));
out_2 = (int)(in_1 - 0.3455 * (in_2 - 128) - (0.7169 * (in_3 - 128)));
out_3 = (int)(in_1 + 1.7790 * (in_2 - 128));
// clamp values
if (out_1 < 0) { out_1 = 0; } else if (out_1 > 255) { out_1 = 255; }
if (out_2 < 0) { out_2 = 0; } else if (out_2 > 255) { out_2 = 255; }
if (out_3 < 0) { out_3 = 0; } else if (out_3 > 255) { out_3 = 255; }
// set values in LUT
LUTYUVTORGB[in_1][in_2][in_3].data[0] = (unsigned char)out_1;
LUTYUVTORGB[in_1][in_2][in_3].data[1] = (unsigned char)out_2;
LUTYUVTORGB[in_1][in_2][in_3].data[2] = (unsigned char)out_3;
}
}
}
후 QImage()에 픽셀 데이터를 복사하는 데 적용되는 LUT :
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
xpos = (y*w + x); // don't calculate 3 times
buff[x * 3 + 0] = psImage->comps[0].data[xpos];
buff[x * 3 + 1] = psImage->comps[1].data[xpos];
buff[x * 3 + 2] = psImage->comps[2].data[xpos];
}
memcpy(image.scanLine(y), buff, bytes_per_line);
}
LUT의 값은 정적이므로 프로그램을 시작할 때마다 초기화해야합니다. 전처리기를 통해 초기화하는 방법이 있습니까? 또는 파일로 저장하는 것이 좋습니다.
EDIT : 변환은 모든 프레임을 개별적으로 처리해야하는 시간이 중요한 비디오 응용 프로그램에서 사용됩니다.
대단히 감사드립니다.
왜 큰 (64MiB) 찾아보기 테이블이 필요합니까? 변환은 매우 간단하여 즉시 수행 할 수 있습니다. – Leon
내 구조는 파일로 저장하는 것이 좋습니다. –
@ Reeon 모든 프레임을 개별적으로 처리해야하는 시간이 중요한 비디오 응용 프로그램에서 변환이 사용된다고 언급 했어야합니다. – tlaloc