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로 변환을합니다. 컬러 값의 인덱싱은 정확하다고 생각하지만 색상 변환에 어떤 문제가 있는지 잘 모르겠습니다. 어떤 도움이나 다른 변환 공식을 사용해 볼 수도 있습니다.인사말
신난다. 고마워. – Christoph