入门视频采集与处理(显示YUV数据)

简介:

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

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

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

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

    

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

    

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

    

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


function yuvtest(filename)

% 打开图像文件
fid = fopen(filename,'r');
if fid == -1
   error('the file can not open ');
end

line  = 576;  %图像的高
colom = 720;  %图像的宽

im = zeros(line,colom);
for i1 = 1:line
   im(i1,:) = fread(fid,colom);  %读取数据到矩阵中
end

im = im./255;      %归一化
figure,imshow(im); %显示图像
   
fclose(fid);
end   


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


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

    

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

    

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


R R R R R  
R R R R R  
R R R R R  
 
G G G G G  
G G G G G  
G G G G G  
 
B B B B B  
B B B B B  
B B B B B

   

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

     

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


function showrgb(inputFile) 

% 初始化  
width = 720;   %图像的宽 
height = 576;  %图像的高 

%打开文件 
fid = fopen(inputFile); 

%读取数据 
if fid ~= -1
   img = uint8(zeros(height,width,3)); 
   img_t = uint8(zeros(height,width));
   for i1=1:3 
    for i2=1:height 
        img_t(i2,:)=fread(fid,width);
      end 
      img(:,:,i1) = img_t; 
   end 
figure,imshow(img); 
fclose(fid); 

end


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




本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/568928,如需转载请自行联系原作者
相关文章
|
28天前
|
编解码 计算机视觉 Python
Opencv学习笔记(九):通过CV2将摄像头视频流保存为视频文件
使用OpenCV库通过CV2将摄像头视频流保存为视频文件,包括定义视频编码格式、设置保存路径、通过write写入视频文件,并提供了相应的Python代码示例。
108 0
音视频开发: ffmpeg采集桌面屏幕、摄像头保存为视频
音视频开发: ffmpeg采集桌面屏幕、摄像头保存为视频
1023 0
音视频开发: ffmpeg采集桌面屏幕、摄像头保存为视频
|
30天前
|
Windows
SDL基础使用07(YUV数据显示)
使用SDL库在Windows上处理和显示YUV数据,包括生成随机YUV数据、播放YUV文件以及实现带缩放的实时渲染。
32 1
|
6月前
|
编解码 算法 vr&ar
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(二)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
225 1
|
6月前
|
存储 编解码 算法
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(一)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
424 1
|
5月前
|
编解码 Linux 计算机视觉
python 调用ffmpeg使用usb摄像头录制视频,输出h264格式,自动获取摄像头的最佳帧率和最大画面尺寸
使用 Python 调用 FFmpeg 进行 USB 摄像头视频录制,需先确保安装 FFmpeg 和 Python 的 `subprocess` 模块。代码示例展示了如何自动获取摄像头的最佳帧率和最大分辨率,然后录制视频。首先通过 FFmpeg 列出摄像头格式获取信息,解析出帧率和分辨率,选择最优值。之后调用 FFmpeg 命令录制视频,设置帧率、分辨率等参数。注意 `/dev/video0` 是 Linux 的摄像头设备路径,Windows 系统需相应调整。代码中未直接实现自动获取最佳参数,通常需要借助其他库如 OpenCV。
[笔记]音视频学习之SDL篇《九》 渲染yuv数据
[笔记]音视频学习之SDL篇《九》 渲染yuv数据
|
API 计算机视觉
V4L2抓取USB摄像头YUV视频数据代码
V4L2抓取USB摄像头YUV视频数据代码
274 0
嵌入式实践教程--FFmpeg中H264裸流解码为YUV420P原像素
嵌入式实践教程--FFmpeg中H264裸流解码为YUV420P原像素
嵌入式实践教程--FFmpeg中H264裸流解码为YUV420P原像素
|
消息中间件
【音视频连载-006】基础学习篇-SDL 播放 YUV 视频文件
在前面的文章中,我们已经能够加载 YUV 帧并显示了,那是把一张图片转换成 YUV 帧得到的素材。 如果是一个 YUV 视频文件的话,那就是很多 YUV 帧连续在一起,既然能展示一帧,那肯定可以连续展示多帧。 接下来就要这样的操作。
244 0
【音视频连载-006】基础学习篇-SDL 播放 YUV 视频文件