Matlab成长之路_1(图片,视频,摄像头的读取和显示)
在计算机视觉和图像处理中,用matlab来验证算法的有效性是非常重要的,可以作为前期工作,因为matlab比c/c++等编程要来得简单些,不需要考虑那么多的数据类型和变量定义等。因此matlab在图像和视觉处理领域的这个得力工具也是需要掌握的。
这一节简单介绍一些matlab自带函数实现图像,视频,摄像头数据的读取和显示方法(因为刚入门,方法可能不是很好)。
一、图片的读取和显示。
比较简单,一个imread和imshow就可以搞定,类似opencv的用法,代码如下:
imshow( imread('lena.jpg') );
二、视频的读取和显示
视频数据的读取要用到VideoReader这个函数,按照matlab软件中举的例子,基本流程是在用VideoReader建立一个obj后,采用read函数来读取一帧帧图像,最后用movie函数来放映视频。但是matlab自带的函数读取avi格式的视频时也只能读取那些原始格式的avi,比较局限性。其读取过程可以采用下面2种方法:
先读完,再显示。
即先将视频数据读取到内存的结构体中,然后直接从内存中拿数据来显示,这显示的视频看起来比较流畅,可是一开始把所有数据读入内存的过程所用时间也有点长。
在matlab指定目录下放入需要读取的视频,我这里放的是test.avi.其代码如下:
%% 先读取,后播放
mov = VideoReader( 'test.avi' );
movFrames = mov.NumberOfFrames;
movHeight = mov.Height;
movWidth = mov.Width;
src(1:200) = struct( 'cdata', zeros(movHeight, movWidth, 3, 'uint8'),...
'colormap', [] );%前面一定要是cdata,且后面要加上后面的colormap,
%否则运行出错,why?
% src(1:150) = struct( 'cdata', zeros(movHeight, movWidth, 3, 'uint8') );
for i =1:200 %按照matlab自带的例子,这里应该可以用movFrames代替200的,
%但是运行会报错
src(i).cdata = read( mov, i );
end
hf = figure;
set( hf, 'position', [150 150 movWidth movHeight] );
movie( hf, src, 1, mov.FrameRate );
读一帧显示一帧。
直接从视频数据中抽取一帧,然后显示一帧图像,这样感觉视频显示的时候有点卡,不知道是不是程序设置问题。其代码如下:
%% 一帧一帧的读取视频数据,然后播放
mov = VideoReader( 'test.avi' );
for i=1:mov.NumberOfFrames
img = read( mov, i );
imshow(img);
end
三、摄像头的读取和显示
摄像头的读取要用到videoinput这个函数,当然它也只能读取能扫描到的摄像头,且名字也必须对应起来。读完后需要用preview函数来显示读取到的摄像头数据。
首先查看本机连有的摄像头,输入命令imaqhwinfo,显示结果为:
可以看出有个名为’winvideo’的摄像头被扫描到
查看’winvideo’摄像头的id号,输入命令imaqhwinfo( ‘winvideo’ ),显示结果为:
可以看出其DeviceIDs编号为1.另外返回的DeviceInfo如果为1x1的话,说明该摄像头可用。
自己设置显示的属性后即可显示摄像头数据了,此时的代码如下:
当然,还可以采用更简单的读取方法,即采用默认的显示属性,代码如下:
%% 读取摄像头
%法二:
%imaqhwinfo
src = videoinput( 'winvideo', 1 );%此处第二个参数1可以省略
preview( src );%以默认格式显示数据
三:直接获取图像
imaqhwinfo
obj = videoinput('winvideo');
set(obj, 'FramesPerTrigger', 1);
set(obj, 'TriggerRepeat', Inf);
%定义一个监控界面
hf = figure('Units', 'Normalized', 'Menubar', 'None','NumberTitle', 'off', 'Name', '实时拍照系统');
ha = axes('Parent', hf, 'Units', 'Normalized', 'Position', [0.05 0.2 0.85 0.7]);
axis off
%定义两个按钮控件
hb1 = uicontrol('Parent', hf, 'Units', 'Normalized','Position', [0.25 0.05 0.2 0.1], 'String', '预览', 'Callback', ['objRes = get(obj, ''VideoResolution'');' ...
'nBands = get(obj, ''NumberOfBands'');' ...
'hImage = image(zeros(objRes(2), objRes(1), nBands));' ...
'preview(obj, hImage);']);
hb2 = uicontrol('Parent', hf, 'Units', 'Normalized','Position', [0.55 0.05 0.2 0.1], 'String', '拍照', 'Callback', 'imwrite(getsnapshot(obj), ''im.jpg'')');
参考一:http://www.cnblogs.com/tornadomeet/archive/2012/07/12/2588181.html
参考二:
http://jingyan.baidu.com/article/37bce2be14bbce1002f3a2d5.html