2014-04-01 10 views
0

YUV422 프레임을 PPM 파일 - (RGB888)로 변환 중입니다.yuv - rgb 변환 열이 맞지 않음

이미지가 대부분 변환됩니다. 색상은 괜찮습니다. 나는 실제 YUV - 투 - RGB 픽셀 변환이 없다는 것을 확신한다

BYTE* CYUV::toRGB() 
{ 
    BYTE* rgb = new BYTE[m_width*m_height*3]; 
    BYTE* rgb_ret = rgb; 
    BYTE* p_yuv = m_yuv_frame; 

    for (int i=m_width*m_height/2; i--;) 
    { 
     BYTE y, u, v, y2; 
     BYTE r,g, b; 

     y2 = *p_yuv++; 
     v = *p_yuv++; 
     y = *p_yuv++; 
     u = *p_yuv++; 

     r = (y + 1.370705 * (v - 128)); 
     g = (y - (0.698001 * (v - 128)) - (0.337633 * (u - 128))); 
     b = (y + (1.732446 * (u - 128))); 
     *rgb++ = b < 0 ? 0 : b > 255 ? 255 : b; 
     *rgb++ = g < 0 ? 0 : g > 255 ? 255 : g; 
     *rgb++ = r < 0 ? 0 : r > 255 ? 255 : r; 


     r = (y2 + 1.370705 * (v - 128)); 
     g = (y2 - (0.698001 * (v - 128)) - (0.337633 * (u - 128))); 
     b = (y2 + (1.732446 * (u - 128))); 
     *rgb++ = b < 0 ? 0 : b > 255 ? 255 : b; 
     *rgb++ = g < 0 ? 0 : g > 255 ? 255 : g; 
     *rgb++ = r < 0 ? 0 : r > 255 ? 255 : r; 


    } 
    return rgb_ret; 
} 

나는 많은 다른 수식을 시도했기 때문에, : 그러나 각각

추가 여기 프레임 변환 함수 인 것처럼 행, 비스듬히 것 같다 색상 왜곡 된 결과.

PPM 파일의 경우 모든 이미지 판독기에서 처리하므로 좋을 수도 있습니다.

원래의 YUV4222 프레임은 괜찮습니까?이 왜곡없이 SDL을 사용하여 표시합니다.

제안 사항?

TIA

답변

1

확인 :이 문제를 해결했다.

아주 간단합니다 : y2 전에 y 변환 된 픽셀을 작성하십시오.

거기에는 여러 가지 솔루션이 있지만 완전히 정확하지는 않습니다.

FYI : 이것은 작동하지만, yuv 4 : 2 : 2 형식에만 해당됩니다. 이것은 YUYV의 4cc 레이블에서 가장 일반적인 것 같습니다. yuv 4 : 2 : 0은 변환하기가 훨씬 더 복잡합니다. yuv 4 : 4 : 4는 1 y 구성 요소를 가져 오는이 솔루션과 동일해야하며 하나의 rgb 트리플릿 만 작성해야합니다. (다음을 확인하지만 그이 솔루션과 함께 의견이었다 수 없습니다.

희망이 누군가를하는 데 도움이됩니다.