YUY2转换为RGB的多种方法

在视频采集图像分析中,需要将采集的格式转换为所需的RGB格式,这里有两种方法:

方法1:

步骤1:转换为RGB24格式

int ConvertYUY2toRGB24(char* pOutputRgb,
                       unsigned char* pInputBuffer,
                       int tInputWidth,
                       int tInputHeight) {
  unsigned char* yuyv = pInputBuffer;
  int z = 0, i = 0, j = 0;

  for (i = 0; i < tInputHeight; i++) {
    for (j = 0; j < tInputWidth; j++) {
      int r, g, b;
      int y, u, v;

      if (!z)
        y = yuyv[0] << 8;
      else
        y = yuyv[2] << 8;
      u = yuyv[1] - 128;
      v = yuyv[3] - 128;

      r = (y + (359 * v)) >> 8;
      g = (y - (88 * u) - (183 * v)) >> 8;
      b = (y + (454 * u)) >> 8;

      r = (r > 255) ? 255 : ((r < 0) ? 0 : r);
      g = (g > 255) ? 255 : ((g < 0) ? 0 : g);
      b = (b > 255) ? 255 : ((b < 0) ? 0 : b);

      *pOutputRgb++ = b;
      *pOutputRgb++ = g;
      *pOutputRgb++ = r;

      if (z++) {
        z = 0;
        yuyv += 4;
      }
    }
  }
  return 0;
}

步骤2:发现格式颜色R和B是反的,再进行调换下

void RGBTOBGR(char* data, int length) {
  for (int i = 0; i < length; i++) {
    char tmp = data[3*i];
    data[3*i] = data[3*i+2];
    data[3*i+2] = tmp;
  }
}

方法2:采用libyuv库进行转换

步骤1:转换为ARGB格式

  uint8_t* argb_data = new uint8_t[width * height * 4];
  libyuv::YUY2ToARGB(videoFrame, width * 2, argb_data, width * 4, width, height);

步骤2:转后发现R和B相反的,再转换下

void ARGBTOABGR(int* data, int length) {
  int transBlue = 0;
  for (int i = 0; i < length; i++) {
    transBlue = (int)(data[i] >> 16);
    data[i] &= 0xFF00FFFF;
    data[i] |= (data[i] << 16 & 0x00FF0000);
    data[i] &= 0xFFFFFF00;
    data[i] |= (transBlue & 0x000000FF);
  }
}

已测试,直接可用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱技术爱生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值