代码如下,用于将VFW捕捉的YUV2转成RGB格式:void YUY2_RGB(BYTE *pDstData, BYTE *pSrcData, UINT nWidth, UINT nHeight)
{
long R,G,B;                                                           
int x(0), y(0);
int i=0;
long Y0(0), U(0), Y1(0), V(0);                                          
for ( y = 0; y < nHeight; y++)
{
for ( x = 0; x < nWidth; x += 2)
{
Y0 = *pSrcData++;
U  = *pSrcData++;
Y1 = *pSrcData++;
V  = *pSrcData++;
R  = 1.164383 * (Y0 - 16) + 1.596027 * (V - 128);
G  = 1.164383 * (Y0 - 16) - 0.812968 * (V - 128) - 0.391762 * (U - 128);
B  = 1.164383 * (Y0 - 16) + 2.017232 * (U - 128);
if ( R < 0 )
R = 0;
if ( R > 255)
R = 255;
if ( G < 0 )
G = 0;
if ( G > 255)
G = 255;
if ( B < 0 )
B = 0;
if ( B > 255 )
B = 255;
*pDstData++ = ( BYTE )B;
*pDstData++ = ( BYTE )G;
*pDstData++ = ( BYTE )R;
R  = 1.164383 * (Y1 - 16) + 1.596027 * (V - 128);
G  = 1.164383 * (Y1 - 16) - 0.812968 * (V - 128) - 0.391762 * (U - 128);
B  = 1.164383 * (Y1 - 16) + 2.017232 * (U - 128);
if ( R < 0 )
R = 0;
if ( R > 255)
R = 255;
if ( G < 0 )
G = 0;
if ( G > 255)
G = 255;
if ( B < 0 )
B = 0;
if ( B > 255 )
B = 255;
*pDstData++ = ( BYTE )B;
*pDstData++ = ( BYTE )G;
*pDstData++ = ( BYTE )R;
}
}
}

解决方案 »

  1.   

    解决了,可以利用StretchBlt将其在倒过来.
    StretchBlt (hdcDst, xDst, yDst, cxDst, cyDst,
                            dcSrc, xSrc, ySrc, cxSrc, cySrc, dwROP) ;
    /*
    StretchBlt也允许水平或垂直翻转图像。如果cxSrc和cxDst标记(转换成设备单位以后)不同,那么StretchBlt就建立一个镜像:左右翻转。在STRETCH程序中,通过将xDst参数改为cxClient并将cxDst参数改成-cxClient,您就可以做到这一点。如果cySrc和cyDst不同,则StretchBlt会上下翻转图像。要在STRETCH程序中测试这一点,可将yDst参数改为cyClient并将cyDst参数改成-cyClient。
    */
      

  2.   

    额如果改进效率,你可以考虑直接在YUY2_RGB里就把图象弄正。
      

  3.   

    其实数据是对的,只是gdi要输出的时候,需要Y方向颠倒的RGB数据而已。
      

  4.   


    VFW捕捉用的什么卡?
    恭喜解决了
      

  5.   

    我又找了个高效的算法:
    inline BYTE Clip255( LONG v )
    {
    if ( v < 0 ) v = 0;
    else if( v > 255 ) v = 255;
    return (BYTE)v;
    }
    //YUV2转RGB24整型版算法,注意RGB缓冲区应是YUV2的1.5倍,可以通过(((m_lpbmi->bmiHeader.biWidth * m_lpbmi->bmiHeader.biBitCount + 31) >> 5 ) << 2) * m_lpbmi->bmiHeader.biHeight;
    //算出RGB图像大小
    void YUY2ToRGB( BYTE *YUY2buff, BYTE *RGBbuff, DWORD dwYUVSize)
    {
    //
    //C = Y - 16
    //D = U - 128
    //E = V - 128
    //R = clip(( 298 * C           + 409 * E + 128) >> 8)
    //G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
    //B = clip(( 298 * C + 516 * D           + 128) >> 8)
    BYTE *orgRGBbuff = RGBbuff; for( DWORD count = 0; count < dwYUVSize; count += 4 )
    {
    //Y0 U0 Y1 V0
    BYTE Y0 = *YUY2buff;
    BYTE U  = *(++YUY2buff);
    BYTE Y1 = *(++YUY2buff);
    BYTE V  = *(++YUY2buff);
    ++YUY2buff; LONG Y,C,D,E;
    BYTE R,G,B; Y = Y0;
    C = Y-16;
    D = U-128;
    E = V-128;
    R = Clip255(( 298 * C           + 409 * E + 128) >> 8);
    G = Clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
    B = Clip255(( 298 * C + 516 * D           + 128) >> 8); *(RGBbuff)  = B;           
    *(++RGBbuff) = G;   
    *(++RGBbuff) = R;          Y = Y1;
    C = Y-16;
    D = U-128;
    E = V-128;
    R = Clip255(( 298 * C           + 409 * E + 128) >> 8);
    G = Clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
    B = Clip255(( 298 * C + 516 * D           + 128) >> 8);
    *(++RGBbuff) =   B;           
    *(++RGBbuff) = G;   
    *(++RGBbuff) = R;         
    ++RGBbuff; }
    }
      

  6.   


    我也在做这个,帮我解决问题了
    StretchDIBits(memDC.m_hDC, 0, VIDEOHEIGHT, VIDEOWIDTH, -VIDEOHEIGHT, 0, 0, VIDEOWIDTH, VIDEOHEIGHT,pImageBuffrgb, &bitInfo, DIB_RGB_COLORS, SRCCOPY);
      

  7.   

    请问,知道这个-16,-128是为什么吗?
    我做yuy2的灰度化的时候也遇到这个问题,不减的话就是粉红和绿色,为什么?
      

  8.   

    for (int i=0,j=0;i<lpVHdr->dwBufferLength;i+=4)
    {
    double y1,y2,u,v;
    y1=lpVHdr->lpData[i];
    u=lpVHdr->lpData[i+1];
    y2=lpVHdr->lpData[i+2];
    v=lpVHdr->lpData[i+3];
    pImageBuffrgb[j]=y1-16+2.03*(u-128);
    pImageBuffrgb[j+1]=y1-16-0.39*(u-128)-0.58*(v-128);
    pImageBuffrgb[j+2]=y1-16+1.14*(v-128);
    pImageBuffrgb[j+3]=y2-16+2.03*(u-128);
    pImageBuffrgb[j+4]=y2-16-0.39*(u-128)-0.58*(v-128);
    pImageBuffrgb[j+5]=y2-16+1.14*(v-128);
    j=j+6;
    }我写的转换,不知道这个怎么样?