2014-01-07 3 views
0

저는 현재 RGB 이미지를 YV12로 변환하고 NV12로 변환 한 다음 다시 RGB로 변환하는 응용 프로그램을 만들고 있습니다.YUV에서 RGB로 변환 오류

내 전환에 다음과 같은 오류를 받고 있어요 : http://www.pic-upload.de/view-21874004/ConversionError.jpg.html

그래서 왼쪽은, 내가 원하는. 간단한 파란색. 오른쪽에는 제가 얻은 것을 표시합니다. 전환 결과에 녹색이 너무 많습니다. 당신이 수

__global__ void NV12toRGB(unsigned char* nv12, unsigned char* rgba, int decodedPitch) 
{ 
int ix = blockIdx.x * blockDim.x + threadIdx.x; 
int iy = blockIdx.y * blockDim.y + threadIdx.y; 
int i = iy * decodedPitch + ix; 
int rgbStart = (iy * gridDim.x * blockDim.x + ix) * 4; 

int quadX = (ix/2); 
int quadY = (iy/2); 

int uvAdr = decodedPitch/2 * quadY + quadX; 
int uvStart = decodedPitch * gridDim.y * blockDim.y; 

int y = nv12[i]; 
int u = nv12[uvStart + 2 * uvAdr]; 
int v = nv12[uvStart + 2 * uvAdr + 1]; 

// R 
int r = y + 1.13983 * v; 
// G 
int g = y - 0.39393 * u - 0.58081 * v; 
// B 
int b = y + 2.028 * u; 


rgba[rgbStart] = r; 
rgba[rgbStart+1] = g; 
rgba[rgbStart+2] = b; 
rgba[rgbStart+3] = 255; 

}

:

__global__ void RGBtoYV12(unsigned char* yuv, unsigned char* pData) 
{ 
int i = blockIdx.x * blockDim.x + threadIdx.x; 
int width = gridDim.x * blockDim.x * 1.5; 
int iwidth = gridDim.x; 

int rgbID = i * 4; 
int upos = blockDim.x * gridDim.x; 
int vpos = upos + upos/4; 
int col = i % iwidth; 
int row = i/iwidth; //bzw. threadIdx.x; 

int r = pData[rgbID], g = pData[rgbID+1], b = pData[rgbID+2]; 


//Y 
unsigned char y = 0.299 * r + 0.587 * g + 0.114 * b; 
yuv[upos - (row+1)*iwidth + col] = y; 


if (   !((i/gridDim.x)%2)    &&  !(i%2)) 
{ 

    //YV12 
    // U 
    yuv[width - ((iwidth/2) * ((row/2)+1) - ((col/2)+1) )] = 0.493 * (b - y);//((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128; 
    // V 
    yuv[vpos - ((iwidth/2) * ((row/2)+1) - ((col/2)+1) )] = 0.887 * (r - y); //((112 * r - 94 * g - 18 * b + 128) >> 8) + 128; 

} 

}

NV12에서 변환이 같이 처리된다 : 여기

는 YV12에 RGB 변환 코드의 GPU에서 저는 cuda로 변환을합니다. 컬러 값의 인덱싱은 정확하다고 생각하지만 색상 변환에 어떤 문제가 있는지 잘 모르겠습니다. 어떤 도움이나 다른 변환 공식을 사용해 볼 수도 있습니다.

인사말

답변

1

부동 소수점 곱셈이 있지만 결과는 정수로 선언됩니다. 거기에 모든 정밀도를 잃게됩니다. 예를

int r = y + 1.13983 * v;

를 들어뿐만 아니라 다른 문제가있을 수 있습니다

float r = y + 1.13983 * v;

으로이 교체,하지만이 우수하다.

+0

신난다. 고마워. – Christoph

관련 문제