YUYV转RGB888,RGB565

lcd1602xuexi 2013-09-10 08:20:09
我想用ARM9的板子采集摄像头输出(YUYV格式)的视频,并在LCD(显示格式RGB565)上显示,我下了一个程序,能够实现RGB888显示,为了能在LCD上显示,我把RGB888转换为RGB565,转换函数为:

unsigned short ProcessImage::RGB888toRGB565(uchar red, uchar green, uchar blue)
{
unsigned short B = (blue >> 3) & 0x001F;
unsigned short G = ((green >> 2) << 5) & 0x07E0;
unsigned short R = ((red >> 3) << 11) & 0xF800;

return (unsigned short) (R | G | B);
}

该函数是YUYV转换为RGB888格式 int ProcessImage::convert_yuv_to_rgb_pixel(int y, int u, int v)
验证成功的

下面是我修改的,
for(in = 0; in < width * height * 2; in += 4)
{
pixel_16 =
yuv[in + 3] << 24 |
yuv[in + 2] << 16 |
yuv[in + 1] << 8 |
yuv[in + 0];
y0 = (pixel_16 & 0x000000ff);
u = (pixel_16 & 0x0000ff00) >> 8;
y1 = (pixel_16 & 0x00ff0000) >> 16;
v = (pixel_16 & 0xff000000) >> 24;
pixel32 = convert_yuv_to_rgb_pixel(y0, u, v);
pixel_24[0] = (pixel32 & 0x000000ff);
pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;
pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;
// rgb[out++] = pixel_24[0]; 这是原来例程中的函数,提取R,G,B分量
//rgb[out++] = pixel_24[1];
// rgb[out++] = pixel_24[2];
travel=RGB888toRGB565(pixel_24[2],pixel_24[1], pixel_24[0]);
memcpy((void *)rgb,(void *)&travel,2);
// rgb[out++]=travel & 0xff;
//rgb[out++]=(travel>>8)& 0xff;
pixel32 = convert_yuv_to_rgb_pixel(y1, u, v);
pixel_24[0] = (pixel32 & 0x000000ff);
pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;
pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;
// rgb[out++] = pixel_24[0];
//rgb[out++] = pixel_24[1];
//rgb[out++] = pixel_24[2];
travel=RGB888toRGB565(pixel_24[2],pixel_24[1], pixel_24[0]); //我修改的,RGB888转RGB565
rgb+=2;
memcpy((void *)rgb,(void *)&travel,2);
// rgb[out++]=travel & 0xff;
//rgb[out++]=(travel>>8)& 0xff;

}


就是RGB888toRGB565 函数得到RGB565数据,然后拷贝给输出,送QT画图显示,可为什么不对呢?

convert_yuv_to_rgb_buffer(p,pp,320,240/*QWidget::width(),QWidget::height()*/);
frame->loadFromData((uchar *)pp,/*len*/320 *240 * 2 * sizeof(char));

........
painter = new QPainter(this);
frame = new QImage(pp,320,240,QImage::Format_RGB16);


有没有搞过类似开发的高手帮忙指点下?我想学学这块,求指点
...全文
1378 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
667778 2016-03-01
  • 打赏
  • 举报
回复
你好,你这好像是将YUYV转化成RGB24的程序,说是RGB24在内存空间是BGRBGR的存储方式,和RGB888一样都是24位像素,但是我不知道有什么区别,求教
relaxisland 2013-09-14
  • 打赏
  • 举报
回复
从贴出来的部分程序来看, for循环内计算第二个像素的时候,rgb的位置没有及时更新到下一个 memcpy((void *)rgb,(void *)&travel,2); 这样下一次for循环的时候, 就覆盖了上一次的结果。
max_min_ 2013-09-11
  • 打赏
  • 举报
回复
估计是RGB888转为RGB565哪里出了问题吧
lcd1602xuexi 2013-09-10
  • 打赏
  • 举报
回复
我修改的是在别人YUYV转RGB888显示视频基础上修改的,YUYV转RGB888显示是正确的,我想把RGB888转为RGB565显示,所以加了块RGB888转RGB565的代码,却显示不了啦,求高手指点

4,506

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧