yuv数据显示

转自:http://ticktick.blog.51cto.com/823160/568928


关于如何显示原始的YUV码流,根据我的经验,一般有三种方法:

   (1) 利用 matlab ,写相关的程序进行显示。(本文我将提供相关显示程序)

   (2) 使用 MFC + Direct Draw 来实现。(稍后整理好了再提供出来)

   (3) 使用 第三方工具(YUVviewerPlus.exe),很好的软件。(在附件中提供)

    由于使用matlab来进行图像的显示,程序代码简单易懂,直观,维护和修改方便,方便根据不同的图像尺寸和YUV码流存储方式进行相应的修改,故本文重点进行讨论。

    对于采集的图像,我们一般需要重点关注Y分量是否正确,直接显示Y分量数据就可以看到灰度图像,根据显示的灰度图像,我们可以很快地判断出图像的轮廓是否正确。大家可以根据上一节的内容提取出码流中某一帧的Y分量内容,利用下面的程序在matlab中进行显示。

    测试条件: 【图像的尺寸】:720x576;【文件内容】:只有一帧图像的Y分量;

 
 
  1. function yuvtest(filename)
  2.  
  3. % 打开图像文件 
  4. fid = fopen(filename,'r'); 
  5. if fid == -1 
  6.     error('the file can not open '); 
  7. end 
  8.  
  9. line = 576;  %图像的高 
  10. colom = 720;  %图像的宽 
  11.  
  12. im = zeros(line,colom); 
  13. for i1 = 1:line 
  14. im(i1,:) = fread(fid,colom);  %读取数据到矩阵中 
  15. end 
  16.  
  17. im = im./255;   %归一化 
  18. figure,imshow(im); %显示图像 
  19.      
  20. fclose(fid); 
  21. end 

    当然,上述程序只能显示出灰度图像,如果希望显示彩色图像,则首先需要把YUV码流转换为RGB数据流,转换公式如下:

 
 
  1. // 转换公式(浮点方式) 
  2. R = Y + 1.4075*(V-128) 
  3. G = Y - 0.3455*(U-128) - 0.7169*(V-128) 
  4. B = Y + 1.779*(U-128) 

    至于每一个像素点的YUV分量的值该怎么取,请参考本文开头提到的那篇文章,无论是YUV444、YUV422、还是YUV420格式,根据对应的方法提取完YUV并转换为RGB数据后,其文件大小应该是: 图像的高 * 图像的宽 * 3 。由于不同的YUV码流转换为RGB数据的提取方式均不相同,这里我就不提供统一的转换程序了,大家根据公式和提取YUV的方法自己来转换。

    在写文件的时候,可以考虑以如下的存储格式:

 
 
  1. R R R R R  
  2. R R R R R  
  3. R R R R R  
  4.  
  5. G G G G G  
  6. G G G G G  
  7. G G G G G  
  8.  
  9. B B B B B  
  10. B B B B B  
  11. B B B B B 

   存好转换后的RGB文件后,可以利用我提供的下面这个matlab程序进行显示,即可看到彩色图像。


     测试条件: 【图像的尺寸】:720x576;【文件内容】:由R、G、B三个分量分块组成的图像数据;

 
 
  1. function showrgb(inputFile) 
  2.  
  3. % 初始化 
  4. width = 720;   %图像的宽 
  5. height = 576;  %图像的高 
  6.  
  7. %打开文件 
  8. fid = fopen(inputFile); 
  9.  
  10. %读取数据 
  11. if fid ~= -1
  12. img = uint8(zeros(height,width,3)); 
  13. img_t = uint8(zeros(height,width));
  14. for i1=1:3 
  15.     for i2=1:height 
  16.          img_t(i2,:)=fread(fid,width);
  17. end 
  18.      img(:,:,i1) = img_t; 
  19.    end 
  20. figure,imshow(img); 
  21. fclose(fid); 
  22.  
  23. end 

      ok,到此,怎样使用matlab显示YUV码流的灰度图像和彩色图像就说到这里了,当然,附件中有一个工具“YUVviewerPlus.exe”也特别好用,可以直接选择YUV码流的格式进行显示。不过我依然建议大家自己动手写相关的matlab程序或者MFC程序来分析自己的码流,这样就可以根据实际情况相应修改代码,而不用局限于人家的软件了。

### 回答1: 在Qt中显示YUV数据可以通过使用QImage类来实现。 首先,需要创建一个QImage对象用于存储YUV数据YUV数据是一种颜色编码格式,分为Y分量(亮度)和UV分量(色度),通常以3个连续的平面存储。因此,需要将YUV数据转换为RGB格式,才能在Qt中进行显示。可以使用FFmpeg等库来进行YUV到RGB的转换操作。 接下来,可以使用QImage的setPixel函数来设置每个像素的值。循环遍历YUV数据的每个像素,依次计算对应的RGB值,并使用setPixel函数设置对应的像素值。 最后,将QImage对象显示到窗口上。可以使用QLabel或者QPainter来绘制图像。对于使用QLabel,可以使用其setPixmap函数将QImage对象设置为其显示的图像。对于使用QPainter,可以使用其drawImage函数来在绘图区域绘制QImage对象。 此外,还可以在显示过程中对图像进行缩放、裁剪、旋转等操作。可以使用QImage的scaled、copy和transformed函数来实现相应功能。 综上所述,通过以上方法可以在Qt中显示YUV数据。 ### 回答2: Qt是一个功能强大的跨平台应用程序开发框架,可以用于开发图形界面应用程序。在Qt中显示YUV数据需要进行以下步骤: 1. 首先,需要创建一个Qt的窗口组件,用于显示YUV数据。可以使用QWidget或QLabel等组件。 2. 接下来,需要将YUV数据格式转换为Qt支持的RGB格式。可以使用OpenCV库或Qt自带的相关函数进行转换。 3. 创建一个QImage对象,并使用转换后的RGB数据填充该对象。可以使用QImage的setPixel函数或者使用QImage构造函数直接传入数据。 4. 将QImage对象绘制到窗口组件上。可以使用QWidget的paintEvent函数中的QPainter对象将QImage绘制出来。 以下是一个简单的示例代码: ``` // 创建一个显示YUV数据的窗口组件 QWidget *widget = new QWidget(); // 将YUV数据转换为RGB格式 // 这里假设已经有了转换后的RGB数据,存储在rgbData中 // 创建QImage对象,并使用转换后的RGB数据填充 QImage image(rgbData, width, height, QImage::Format_RGB888); // 在窗口组件上绘制QImage对象 void Widget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawImage(0, 0, image); } ``` 通过上述步骤,就可以在Qt中显示YUV数据了。注意,以上代码是一个简单示例,实际使用中可能需要根据具体需求进行相应的修改和优化。 ### 回答3: Qt是一个跨平台的图形用户界面应用程序开发框架,可以用于开发各种类型的应用程序。如果要在Qt中显示YUV数据,可以采取以下步骤: 1. 首先,需要将原始的YUV数据转换为Qt可以理解的图像格式,例如RGB格式。可以使用各种转换算法来实现这一步骤,比如将Y、U和V三个分量合成为RGB图像。 2. 一旦将YUV数据转换为RGB格式,可以使用Qt中提供的图像处理类来创建一个QImage对象。QImage是Qt中表示图像的类,可以用于存储和处理图像数据。 3. 接着,可以将QImage对象显示在Qt的窗口中。可以使用Qt中的QWidget、QLabel或者QGraphicsView等控件,将QImage对象作为控件的背景图像显示出来。可以通过设置控件的属性或使用API来实现图像显示。 4. 如果要实现实时显示YUV数据,可以将以上步骤封装在一个循环中,并将YUV数据不断传入进行处理和显示。可以使用Qt的定时器或者多线程来实现数据的实时获取和处理。 需要注意的是,YUV数据的格式可能存在不同的变种,如YUV420、YUV422、YUV444等。在实际显示时,需要根据具体的数据格式来进行相应的转换和处理。此外,由于YUV数据是一种压缩格式,其显示效果可能与RGB格式有所不同,所以在显示时可能需要进行一些补偿或调整以获得更好的图像质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值