F7从USB摄像头读取回来的图像数据显示在LCD上不正常,求助!!!

2019-03-23 18:10发布

本帖最后由 zhanghuichun 于 2015-11-11 21:05 编辑

采集回来的YUY2数据转换成RGB565格式之后显示出来的效果居然是这样的。
P51111-201957.jpg
YUY2转RGB565代码:
  1. static void replace_yuy2_to_rgb565_1(uint8_t *buf, uint32_t len)
  2. {
  3.         int32_t c, d, e, r, g, b;
  4.         
  5.         len = len >> 2;
  6.         while (len)
  7.         {               
  8.                 d = buf[1] - 128;
  9.                 e = buf[3] - 128;
  10.                
  11.                 c = buf[0] - 16;
  12.                 r = (298 * c + 409 * e + 128) >> 8;
  13.                 if (r < 0)
  14.                         r = 0;
  15.                 else if (r > 255)
  16.                         r = 255;
  17.                 g = (298 * c - 100 * d - 208 * e + 128) >> 8;
  18.                 if (g < 0)
  19.                         g = 0;
  20.                 else if (g > 255)
  21.                         g = 255;
  22.                 b = (298 * c + 516 * d + 128) >> 8;
  23.                 if (b < 0)
  24.                         b = 0;
  25.                 else if (b > 255)
  26.                         b = 255;
  27.                
  28.                 //r = 255;
  29.                 //g = 255;
  30.                 //b = 255;
  31.                         
  32.                 *(uint16_t *)buf = ((r & 0xf8) << 11) | ((g & 0xfc) << 5) | ((b & 0xf8) >> 3);
  33.                 buf += 2;
  34.                
  35.                 c = buf[0] - 16;
  36.                 r = (298 * c + 409 * e + 128) >> 8;
  37.                 if (r < 0)
  38.                         r = 0;
  39.                 else if (r > 255)
  40.                         r = 255;
  41.                 g = (298 * c - 100 * d - 208 * e + 128) >> 8;
  42.                 if (g < 0)
  43.                         g = 0;
  44.                 else if (g > 255)
  45.                         g = 255;
  46.                 b = (298 * c + 516 * d + 128) >> 8;
  47.                 if (b < 0)
  48.                         b = 0;
  49.                 else if (b > 255)
  50.                         b = 255;
  51.                
  52.                 //r = 255;
  53.                 //g = 255;
  54.                 //b = 255;
  55.                
  56.                 *(uint16_t *)buf = ((r & 0xf8) << 11) | ((g & 0xfc) << 5) | ((b & 0xf8) >> 3);               
  57.                 buf += 2;
  58.                
  59.                 len--;
  60.         }
  61. }
复制代码数据处理代码:
  1. void uvc_decode_report_recv(void *dev_data, struct vsfusbh_uvc_param_t *param,
  2.                 struct vsfusbh_uvc_payload_t *payload)
  3. {
  4.         uint8_t RGB_Buff[2000];
  5.         uint8_t YUY_Buff[2000];
  6.         uint32_t i=0;
  7.         if (dev_data == NULL)
  8.                 return;
  9.         
  10.         if (test_uvc_data == NULL)
  11.         {
  12.                 struct vsfusbh_uvc_param_t param = {1, 1, 0,
  13.                                 VSFUSBH_UVC_VIDEO_FORMAT_YUY2, 30, 640, 480};
  14.                 test_uvc_data = dev_data;
  15.                 vsfusbh_uvc_set(dev_data, ¶m);
  16.         }
  17.         else if (payload != NULL)
  18.         {
  19.                 if (payload->len > 12)
  20.                 {         
  21.                         // just for record frame length
  22.                         if (frame_cnt < 300)
  23.                         {
  24.                               replace_yuy2_to_rgb565_1(&payload->buf[12], payload->len - 12);
  25.                               fill_frame_rgb565(&payload->buf[12], payload->len - 12, frame_shift);
  26.                                 frame_bytes[frame_cnt] += payload->len - 12;
  27.                                 if (payload->buf[1] & 0x2)
  28.                                 {
  29.                                         frame_cnt++;
  30.                                         frame_shift = 0;
  31.                                 }
  32.                                 else
  33.                                 {
  34.                                 frame_shift += (payload->len - 12) / 2;
  35.                                 }
  36.                         }
  37.                         else
  38.                         {
  39.                                 frame_cnt = 0;
  40.                                 memset(frame_bytes, 0, sizeof(frame_bytes));
  41.                         }
  42.                 }
  43.         }
  44.         else
  45.         {
  46.                 // get current param
  47.         }
  48. }
复制代码

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。