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

zhanghuichun   2015-11-11 20:55 楼主
采集回来的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. len = len >> 2;
  5. while (len)
  6. {
  7. d = buf[1] - 128;
  8. e = buf[3] - 128;
  9. c = buf[0] - 16;
  10. r = (298 * c + 409 * e + 128) >> 8;
  11. if (r < 0)
  12. r = 0;
  13. else if (r > 255)
  14. r = 255;
  15. g = (298 * c - 100 * d - 208 * e + 128) >> 8;
  16. if (g < 0)
  17. g = 0;
  18. else if (g > 255)
  19. g = 255;
  20. b = (298 * c + 516 * d + 128) >> 8;
  21. if (b < 0)
  22. b = 0;
  23. else if (b > 255)
  24. b = 255;
  25. //r = 255;
  26. //g = 255;
  27. //b = 255;
  28. *(uint16_t *)buf = ((r & 0xf8) << 11) | ((g & 0xfc) << 5) | ((b & 0xf8) >> 3);
  29. buf += 2;
  30. c = buf[0] - 16;
  31. r = (298 * c + 409 * e + 128) >> 8;
  32. if (r < 0)
  33. r = 0;
  34. else if (r > 255)
  35. r = 255;
  36. g = (298 * c - 100 * d - 208 * e + 128) >> 8;
  37. if (g < 0)
  38. g = 0;
  39. else if (g > 255)
  40. g = 255;
  41. b = (298 * c + 516 * d + 128) >> 8;
  42. if (b < 0)
  43. b = 0;
  44. else if (b > 255)
  45. b = 255;
  46. //r = 255;
  47. //g = 255;
  48. //b = 255;
  49. *(uint16_t *)buf = ((r & 0xf8) << 11) | ((g & 0xfc) << 5) | ((b & 0xf8) >> 3);
  50. buf += 2;
  51. len--;
  52. }
  53. }
数据处理代码:
  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. if (test_uvc_data == NULL)
  10. {
  11. struct vsfusbh_uvc_param_t param = {1, 1, 0,
  12. VSFUSBH_UVC_VIDEO_FORMAT_YUY2, 30, 640, 480};
  13. test_uvc_data = dev_data;
  14. vsfusbh_uvc_set(dev_data, ¶m);
  15. }
  16. else if (payload != NULL)
  17. {
  18. if (payload->len > 12)
  19. {
  20. // just for record frame length
  21. if (frame_cnt < 300)
  22. {
  23. replace_yuy2_to_rgb565_1(&payload->buf[12], payload->len - 12);
  24. fill_frame_rgb565(&payload->buf[12], payload->len - 12, frame_shift);
  25. frame_bytes[frame_cnt] += payload->len - 12;
  26. if (payload->buf[1] & 0x2)
  27. {
  28. frame_cnt++;
  29. frame_shift = 0;
  30. }
  31. else
  32. {
  33. frame_shift += (payload->len - 12) / 2;
  34. }
  35. }
  36. else
  37. {
  38. frame_cnt = 0;
  39. memset(frame_bytes, 0, sizeof(frame_bytes));
  40. }
  41. }
  42. }
  43. else
  44. {
  45. // get current param
  46. }
  47. }
本帖最后由 zhanghuichun 于 2015-11-11 21:05 编辑

回复评论 (13)

楼主很厉害,用单片机调UVC的摄像头
点赞  2015-11-11 21:32
引用: IC爬虫 发表于 2015-11-11 21:32
楼主很厉害,用单片机调UVC的摄像头

不是我写的驱动,是le062大神写的,我负责显示部分
点赞  2015-11-11 21:55
你在看看f7的像素显示格式就知道了我上次也遇到这个问题,后来发现f7的格式是argb?还是agbr来着? 反正是这样 本帖最后由 247153481 于 2015-11-13 11:20 编辑
点赞  2015-11-13 11:15
我看图像这样可能是像素数据对齐的方式反了?
有高位对齐和低位对齐
点赞  2015-11-13 11:21
F7学习中,帮顶一下
点赞  2015-11-13 11:21
颜色不对,应该是yuv数据格式问题,你把yuv图片数据保存下来,然后到电脑上打开看看知道了,如果图片正确显示,就是rgb转换后的显示正常,那就是渲染问题了,送你个yuv调试工具~
LAD~}XWC]X_()UNIPBK5}YA.png
YUV Player windows with reg key.rar (535.99 KB)
(下载次数: 28, 2015-11-13 11:25 上传)
HELLO_WATER
点赞  2015-11-13 11:27
引用: shinykongcn 发表于 2015-11-13 11:27
颜色不对,应该是yuv数据格式问题,你把yuv图片数据保存下来,然后到电脑上打开看看知道了,如果图片正确显 ...

只接触过手机端的视频,格式多用yuv420,不过这个影响不大,如果显示不对,一般存在的原因无非是,采集到的yuv数据格式不是预设的(表现问颜色不对)、采集到的yuv数据分辨率不对(表现为图像显示不全或者很块)
HELLO_WATER
点赞  2015-11-13 11:30
引用: 247153481 发表于 2015-11-13 11:15
你在看看f7的像素显示格式就知道了我上次也遇到这个问题,后来发现f7的格式是argb?还是agbr来着?
反正是 ...

我已经把lcd显示模式改为RGB565了,默认是ARGB8888
点赞  2015-11-13 13:04
引用: IC爬虫 发表于 2015-11-13 11:21
我看图像这样可能是像素数据对齐的方式反了?
有高位对齐和低位对齐

能具体说说么?
点赞  2015-11-13 13:05
那就把数据发往电脑看看吧,确定问题所在
点赞  2015-11-13 13:11
大神们,求助,F7有开发的IAR版本和破解文件么?
点赞  2015-11-14 21:21
大神,正准备用F7来驱动UVC的,但是不太理解之前的一堆堆配置以及同步传输到底是怎么个驱动方式,求解惑啊
点赞  2016-5-11 21:30
能给穿一份代码看看吗?
点赞  2016-6-12 13:14
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复