YUY2 转 rgb24


typedef       struct       tagTABLE_YUV2RGB  
{  
 unsigned       short       YtoR[256];  
 unsigned       short       YtoG[256];  
 unsigned       short       YtoB[256];    
 unsigned       short       UtoG[256];  
 unsigned       short       UtoB[256];  
 unsigned       short       VtoR[256];  
 unsigned       short       VtoG[256];    
}TABLE_YUV2RGB;  

TABLE_YUV2RGB       table_yuv2rgb;  

void Init()
{
 for (long  j  = 0; j < 256; ++j)  
 {    
  table_yuv2rgb.YtoR[j]       =       table_yuv2rgb.YtoG[j]  
   =  table_yuv2rgb.YtoB[j]  = (unsigned       short)(j << 7);  
  table_yuv2rgb.VtoR[j]       =       j       *       180;  
  table_yuv2rgb.VtoG[j]       =       j       *       91;  
  table_yuv2rgb.UtoG[j]       =       j       *       44;  
  table_yuv2rgb.UtoB[j]       =       j       *       226;  
 }  
}

void  ConvertYUY2toRGB24(BYTE* pDst, BYTE* pSrc, int w, int h)  
{  
   
 long       m       =       0;  
 long       k       =       0;  
 int   n=w/2;  
 int   dec=w*4;  
   
 int       tmpR0       =       0;  
 int       tmpG0       =       0;  
 int       tmpB0       =       0;  
 int       tmpR1       =       0;  
 int       tmpG1       =       0;  
 int       tmpB1       =       0;  
 k=(h-1)*w<<1;  
 for(   int   i=h-1;i>-1;i--)  
 {  
  
  for(int   j=0;j<n;j++)  
  {  
   tmpR0       =       (table_yuv2rgb.YtoR[pSrc[k       +       0]]       +       table_yuv2rgb.VtoR[pSrc[k       +       3]]       -       22906)       >>       7;    
   tmpG0       =       (table_yuv2rgb.YtoG[pSrc[k       +       0]]       -       table_yuv2rgb.VtoG[pSrc[k       +       3]]       -       table_yuv2rgb.UtoG[pSrc[k       +       1]]       +       17264)       >>       7;        
   tmpB0       =       (table_yuv2rgb.YtoB[pSrc[k       +       0]]       +       table_yuv2rgb.UtoB[pSrc[k       +       1]]       -       28928)       >>       7;  
   
   tmpR1       =       (table_yuv2rgb.YtoR[pSrc[k       +       2]]       +       table_yuv2rgb.VtoR[pSrc[k       +       3]]       -       22906)       >>       7;    
   tmpG1       =       (table_yuv2rgb.YtoG[pSrc[k       +       2]]       -       table_yuv2rgb.VtoG[pSrc[k       +       3]]       -       table_yuv2rgb.UtoG[pSrc[k       +       1]]       +       17264)       >>       7;    
   tmpB1       =       (table_yuv2rgb.YtoB[pSrc[k       +       2]]       +       table_yuv2rgb.UtoB[pSrc[k       +       1]]       -       28928)       >>       7;    
   
   if       (tmpR0       >       255)       tmpR0       =       255;  
   if       (tmpG0       >       255)       tmpG0       =       255;  
   if       (tmpB0       >       255)       tmpB0       =       255;  
   if       (tmpR1       >       255)       tmpR1       =       255;  
   if       (tmpG1       >       255)       tmpG1       =       255;  
   if       (tmpB1       >       255)       tmpB1       =       255;  
   
   if       (tmpR0       <       0)       tmpR0       =       0;  
   if       (tmpG0       <       0)       tmpG0       =       0;  
   if       (tmpB0       <       0)       tmpB0       =       0;  
   if       (tmpR1       <       0)       tmpR1       =       0;  
   if       (tmpG1       <       0)       tmpG1       =       0;  
   if       (tmpB1       <       0)       tmpB1       =       0;  
   
   pDst[m       +       0]       =     tmpB0;  
   pDst[m       +       1]       =       tmpG0;  
   pDst[m       +       2]       =       tmpR0;  
   pDst[m       +       3]       =       tmpB1;  
   pDst[m       +       4]       =       tmpG1;  
   pDst[m       +       5]       =       tmpR1;  
   
   k       +=       4;  
   m       +=       6;  
  }  
  k=k-dec;  
 }
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV中的YUY2是一种色彩编码格式,它使用Y表示亮度信息,U和V表示颜色信息。在YUY2RGB24的函数中,通过对YUV值的计算,将YUY2格式的图像换为RGB24格式的图像。具体的换过程如下: 1. 首先,根据输入图像的宽度和高度,使用双重循环遍历每个像素点。 2. 通过判断z的值,确定当前像素点的YUV值的索引。当z为0时,取yuyv作为Y的值,否则取yuyv作为Y的值。 3. 获取当前像素点的U和V的值,并减去128进行偏移,得到u和v。 4. 根据以下公式计算R、G、B的值: r = (y + (359 * v)) >> 8; g = (y - (88 * u) - (183 * v)) >> 8; b = (y + (454 * u)) >> 8; 5. 对计算得到的R、G、B值进行范围限制,保证它们在0到255之间。 6. 将计算得到的R、G、B值依次存储到输出图像的对应位置。 7. 根据z的值更新当前像素点的索引,当z为1时,z重置为0,yuyv索引增加4。否则继续保持z为0,yuyv索引增加2。 8. 循环结束后,返回值为0,表示换成功完成。 这个函数的作用是将YUY2格式的图像换为RGB24格式的图像,从而方便后续的图像处理和分析。<span class="em">1</span> #### 引用[.reference_title] - *1* [YUY2RGB](https://blog.csdn.net/u013470224/article/details/68065731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值