CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

100分求教YUV422转RGB问题

楼主yousure(人类)2005-07-01 11:59:50 在 VC/MFC / 图形处理/算法 提问

求教  
   
  从摄像头传来一副图片,颜色是YUV422的,但是要转换称RGB的颜色在程序中显示出来,不知如何从YUV422转到RGB,上网查了个资料,  
        R   =   Y   +   1.140V  
        G   =   Y   -   0.395U   -   0.581V  
        B   =   Y   +   2.032U  
  但是转换后显示出来出来是花屏,晕死  
   
  各位强人们,救救我吧,有转换的方法或者有关资料,麻烦告知,谢谢  
   
  小弟100分奉上 问题点数:100、回复次数:3Top

1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-07-01 16:04:00 得分 100

void   CColorSpaceConvector::YUV2RGB(BYTE   *   pDest,   BYTE   *   pSrc,   DWORD   dwRGBBit,  
        DWORD   dwDestPitch,   DWORD   dwSrcPitch,    
        int   nHeight,   UINT   nWidth)  
  {  
  UINT   nLength   =   nWidth   *   ((dwRGBBit   +   7)   /   8);  
  if   (nHeight   <=   0)  
  {  
  nHeight   =   -nHeight;  
  switch   (dwRGBBit)  
  {  
  case   15:  
  {  
  for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++)  
  {  
  for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   4,   k   +=   4)  
  {  
  UINT   y   =   pSrc[k];  
  UINT   u   =   pSrc[k+1];  
  UINT   v   =   pSrc[k+3];  
  UINT n1=511*u-6*v-64522;  
  UINT n2=48838-125*u-255*v;  
  UINT n3=506*v-u-64522;  
  UINT   b   =   Trunc((y   <<   8)   +   n1)   >>   11;  
  UINT   g   =   Trunc((y   <<   8)   +   n2)   >>   11;  
  UINT   r   =   Trunc((y   <<   8)   +   n3)   >>   11;  
  *(WORD*)(pDest   +   j)   =   (WORD)   ((r   <<   10)   |   (g   <<   5)   |   b);  
  y   =   pSrc[k+2];  
  b   =   Trunc((y   <<   8)   +   n1)   >>   11;  
  g   =   Trunc((y   <<   8)   +   n2)   >>   11;  
  r   =   Trunc((y   <<   8)   +   n3)   >>   11;  
  *(WORD*)(pDest   +   j   +   2)   =   (WORD)   ((r   <<   10)   |   (g   <<   5)   |   b);  
  }  
  pSrc   +=   dwSrcPitch;  
  pDest   +=   dwDestPitch;  
  }  
  }  
  break;  
   
  case   16:  
  {  
  for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++)  
  {  
  for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   4,   k   +=   4)  
  {  
  UINT   y   =   pSrc[k];  
  UINT   u   =   pSrc[k+1];  
  UINT   v   =   pSrc[k+3];  
  UINT n1=511*u-6*v-64522;  
  UINT n2=48838-125*u-255*v;  
  UINT n3=506*v-u-64522;  
  UINT   b   =   Trunc((y   <<   8)   +   n1)   >>   11;  
  UINT   g   =   Trunc((y   <<   8)   +   n2)   >>   10;  
  UINT   r   =   Trunc((y   <<   8)   +   n3)   >>   11;  
  *(WORD*)(pDest   +   j)   =   (WORD)   ((r   <<   11)   |   (g   <<   5)   |   b);  
  y   =   pSrc[k+2];  
  b   =   Trunc((y   <<   8)   +   n1)   >>   11;  
  g   =   Trunc((y   <<   8)   +   n2)   >>   10;  
  r   =   Trunc((y   <<   8)   +   n3)   >>   11;  
  *(WORD*)(pDest   +   j   +   2)   =   (WORD)   ((r   <<   11)   |   (g   <<   5)   |   b);  
  }  
  pSrc   +=   dwSrcPitch;  
  pDest   +=   dwDestPitch;  
  }  
  }  
  break;  
   
  case   24:  
  {  
  for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++)  
  {  
  for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   6,   k   +=   4)  
  {  
  UINT   y   =   pSrc[k];  
  UINT   u   =   pSrc[k+1];  
  UINT   v   =   pSrc[k+3];  
  UINT n1=511*u-6*v-64522;  
  UINT n2=48838-125*u-255*v;  
  UINT n3=506*v-u-64522;  
  pDest[j     ]   =   (BYTE)   (Trunc((y   <<   8)   +   n1)   >>   8);  
  pDest[j+1]   =   (BYTE)   (Trunc((y   <<   8)   +   n2)   >>   8);  
  pDest[j+2]   =   (BYTE)   (Trunc((y   <<   8)   +   n3)   >>   8);  
  y   =   pSrc[k+2];  
  pDest[j+3]   =   (BYTE)   (Trunc((y   <<   8)   +   n1)   >>   8);  
  pDest[j+4]   =   (BYTE)   (Trunc((y   <<   8)   +   n2)   >>   8);  
  pDest[j+5]   =   (BYTE)   (Trunc((y   <<   8)   +   n3)   >>   8);  
  }  
  pSrc   +=   dwSrcPitch;  
  pDest   +=   dwDestPitch;  
  }  
  }  
  break;  
   
  case   32:  
  {  
  for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++)  
  {  
  for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   8,   k   +=   4)  
  {  
  UINT   y   =   pSrc[k];  
  UINT   u   =   pSrc[k+1];  
  UINT   v   =   pSrc[k+3];  
  UINT n1=511*u-6*v-64522;  
  UINT n2=48838-125*u-255*v;  
  UINT n3=506*v-u-64522;  
  pDest[j     ]   =   (BYTE)   (Trunc((y   <<   8)   +   n1)   >>   8);  
  pDest[j+1]   =   (BYTE)   (Trunc((y   <<   8)   +   n2)   >>   8);  
  pDest[j+2]   =   (BYTE)   (Trunc((y   <<   8)   +   n3)   >>   8);  
  pDest[j+3]   =   0;  
  y   =   pSrc[k+2];  
  pDest[j+4]   =   (BYTE)   (Trunc((y   <<   8)   +   n1)   >>   8);  
  pDest[j+5]   =   (BYTE)   (Trunc((y   <<   8)   +   n2)   >>   8);  
  pDest[j+6]   =   (BYTE)   (Trunc((y   <<   8)   +   n3)   >>   8);  
  pDest[j+7]   =   0;  
  }  
  pSrc   +=   dwSrcPitch;  
  pDest   +=   dwDestPitch;  
  }  
  }  
  break;  
  }  
  }  
  else  
  {  
  pDest   +=   (nHeight   -   1)   *   dwDestPitch;  
  switch   (dwRGBBit)  
  {  
  case   15:  
  {  
  for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++)  
  {  
  for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   4,   k   +=   4)  
  {  
  UINT   y   =   pSrc[k];  
  UINT   u   =   pSrc[k+1];  
  UINT   v   =   pSrc[k+3];  
  UINT   b   =   Trunc((y   <<   8)   +   511   *   u   -   6   *   v   -   64522)   >>   11;  
  UINT   g   =   Trunc((y   <<   8)   -   125   *   u   -   255   *   v   +   48838)   >>   11;  
  UINT   r   =   Trunc((y   <<   8)   -   u   +   506   *   v   -   64522)   >>   11;  
  *(WORD*)(pDest   +   j)   =   (WORD)   ((r   <<   10)   |   (g   <<   5)   |   b);  
  y   =   pSrc[k+2];  
  b   =   Trunc((y   <<   8)   +   511   *   u   -   6   *   v   -   64522)   >>   11;  
  g   =   Trunc((y   <<   8)   -   125   *   u   -   255   *   v   +   48838)   >>   11;  
  r   =   Trunc((y   <<   8)   -   u   +   506   *   v   -   64522)   >>   11;  
  *(WORD*)(pDest   +   j   +   2)   =   (WORD)   ((r   <<   10)   |   (g   <<   5)   |   b);  
  }  
  pSrc   +=   dwSrcPitch;  
  pDest   -=   dwDestPitch;  
  }  
  }  
  break;  
   
  case   16:  
  {  
  for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++)  
  {  
  for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   4,   k   +=   4)  
  {  
  UINT   y   =   pSrc[k];  
  UINT   u   =   pSrc[k+1];  
  UINT   v   =   pSrc[k+3];  
  UINT   b   =   Trunc((y   <<   8)   +   511   *   u   -   6   *   v   -   64522)   >>   11;  
  UINT   g   =   Trunc((y   <<   8)   -   125   *   u   -   255   *   v   +   48838)   >>   10;  
  UINT   r   =   Trunc((y   <<   8)   -   u   +   506   *   v   -   64522)   >>   11;  
  *(WORD*)(pDest   +   j)   =   (WORD)   ((r   <<   11)   |   (g   <<   5)   |   b);  
  y   =   pSrc[k+2];  
  b   =   Trunc((y   <<   8)   +   511   *   u   -   6   *   v   -   64522)   >>   11;  
  g   =   Trunc((y   <<   8)   -   125   *   u   -   255   *   v   +   48838)   >>   10;  
  r   =   Trunc((y   <<   8)   -   u   +   506   *   v   -   64522)   >>   11;  
  *(WORD*)(pDest   +   j   +   2)   =   (WORD)   ((r   <<   11)   |   (g   <<   5)   |   b);  
  }  
  pSrc   +=   dwSrcPitch;  
  pDest   -=   dwDestPitch;  
  }  
  }  
  break;  
   
  case   24:  
  {  
  for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++)  
  {  
  for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   6,   k   +=   4)  
  {  
  UINT   y   =   pSrc[k];  
  UINT   u   =   pSrc[k+1];  
  UINT   v   =   pSrc[k+3];  
  pDest[j     ]   =   (BYTE)   (Trunc((y   <<   8)   +   511   *   u   -   6   *   v   -   64522)   >>   8);  
  pDest[j+1]   =   (BYTE)   (Trunc((y   <<   8)   -   125   *   u   -   255   *   v   +   48838)   >>   8);  
  pDest[j+2]   =   (BYTE)   (Trunc((y   <<   8)   -   u   +   506   *   v   -   64522)   >>   8);  
  y   =   pSrc[k+2];  
  pDest[j+3]   =   (BYTE)   (Trunc((y   <<   8)   +   511   *   u   -   6   *   v   -   64522)   >>   8);  
  pDest[j+4]   =   (BYTE)   (Trunc((y   <<   8)   -   125   *   u   -   255   *   v   +   48838)   >>   8);  
  pDest[j+5]   =   (BYTE)   (Trunc((y   <<   8)   -   u   +   506   *   v   -   64522)   >>   8);  
  }  
  pSrc   +=   dwSrcPitch;  
  pDest   -=   dwDestPitch;  
  }  
  }  
  break;  
   
  case   32:  
  {  
  for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++)  
  {  
  for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   8,   k   +=   4)  
  {  
  UINT   y   =   pSrc[k];  
  UINT   u   =   pSrc[k+1];  
  UINT   v   =   pSrc[k+3];  
  pDest[j     ]   =   (BYTE)   (Trunc((y   <<   8)   +   511   *   u   -   6   *   v   -   64522)   >>   8);  
  pDest[j+1]   =   (BYTE)   (Trunc((y   <<   8)   -   125   *   u   -   255   *   v   +   48838)   >>   8);  
  pDest[j+2]   =   (BYTE)   (Trunc((y   <<   8)   -   u   +   506   *   v   -   64522)   >>   8);  
  pDest[j+3]   =   0;  
  y   =   pSrc[k+2];  
  pDest[j+4]   =   (BYTE)   (Trunc((y   <<   8)   +   511   *   u   -   6   *   v   -   64522)   >>   8);  
  pDest[j+5]   =   (BYTE)   (Trunc((y   <<   8)   -   125   *   u   -   255   *   v   +   48838)   >>   8);  
  pDest[j+6]   =   (BYTE)   (Trunc((y   <<   8)   -   u   +   506   *   v   -   64522)   >>   8);  
  pDest[j+7]   =   0;  
  }  
  pSrc   +=   dwSrcPitch;  
  pDest   -=   dwDestPitch;  
  }  
  }  
  break;  
  }  
  }  
  }Top

2 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-07-01 16:05:14 得分 0

其实,传过来的YUV422数据,你应该创建一个Overlay平面,直接显示,这样效率比较高,效果也比较好,就不用转换了。Top

3 楼yousure(人类)回复于 2005-07-01 16:34:03 得分 0

Overlay能否说的详细点  
  不是很懂Top

相关问题

  • 哪位知道RGB->YUV / YUV2的正确转化算法??
  • 请教:如何从YUV颜色空间转化到RGB空间?
  • 做了RGB TO YUV的转换,有颜色偏差
  • 急, RGB 怎么转换成 YV12(YUV 4:2:0)?
  • 如何进行rgb->yuv的转化(在线等)
  • 求:RGB和HSL,YUV,YCbCr,Gamma等常用色系之间的转换算法.
  • 求:RGB和HSL,YUV,YCbCr,Gamma等常用色系之间的转换算法.
  • YUV格式的图像是不是转换成RGB格式后才能显示出来彩色图像?
  • CMYK转RGB?
  • UYVY 转 RGB

关键词

  • word
  • 转换
  • pdest
  • trunc
  • dwdestpitch
  • dwsrcpitch
  • psrc
  • yuv422
  • dwrgbbit
  • uint

得分解答快速导航

  • 帖主:yousure
  • DentistryDoctor

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo