借鉴参考:http://blog.csdn.net/msq19895070/article/details/8019663
Matlab中的图像获取工具箱给我们提供了必要的函数,我们直接调用就可以了。在这帖中我们主要就是简单的介绍如何使用该工具箱进行对USB2.0摄像头的编程
整个过程我们需要做如下几件事情:
1、查询USB2.0Camera 的具体参数(imaqhwinfo)
2、创建视频输入对象(videoinput)
3、图像预览和显示(preview、stoppreview、closepreview和image)
4、获取视频图像(getsnapshot)
5、图像获取设备的获取和设置(get和set)
6、关闭视频对象(delete)
给我们一个摄像头我们必须知道他的相关参数,才可能进行我们的编程下。当然我们可以查询商家手册,但是那个累不累人呀。
Matlab的图像获取工具箱为我提供了imaqhwinfo(),来获取PC上以安装的图像获取硬件信息
无输入参数时,返回一个结构体, 它包含了系统中存在的适配器和Matlab相关的版本信息(第一次我们一般使用这个)
% 无输入参数,get系统存在适配器和matlab版本
info = imaqhwinfo;
info =
InstalledAdaptors: {'dcam' 'winvideo'} -->这里可以看到我的PC上安装了两个适配器
MATLABVersion: '8.4 (R2014b)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '4.8 (R2014b)'
% 有输入参数,get指定的适配器的数据信息
win_info = imaqhwinfo('winvideo');
有输入参数的时候,返回一个结构体,包含了指定的适配器的数据信息
win_info =
AdaptorDllName: 'C:\MATLAB\SupportPackages\R2014b\osgenericvideointerface\toolbox\imaq\su...'-->适配器dll文件绝对路径
AdaptorDllVersion: '4.8 (R2014b)' -->适配器dll文件版本
AdaptorName: 'winvideo' -->适配器名称
DeviceIDs: {[1]} -->设备ID号,这个我们经常需要用到
DeviceInfo: [1x1 struct] -->设备信息,这里主要是图像获取设备的一些参数
% get device ID
ID_win_info = win_info.DeviceIDs
% get device info
dev_win_info = win_info.DeviceInfo
ID_win_info =
[1]
dev_win_info =
DefaultFormat: 'RGB24_640x480' --> 获取图片的默认格式
DeviceFileSupported: 0
DeviceName: 'Integrated Camera' --> 设备名称
DeviceID: 1 -->设备号
VideoInputConstructor: 'videoinput('winvideo', 1)' --> 对象构建方式,这个绝大部分都是一样的
VideoDeviceConstructor: 'imaq.VideoDevice('winvideo', 1)'
SupportedFormats: {1x8 cell} --> 获取的图像支持格式,一般都有好多种,上面的 DefaultFormat 只是默认格式而已
%看看图像获取设备支持的图像格式
dev_win_info.SupportedFormats
ans =
1 至 5 列
'RGB24_320x180' 'RGB24_320x240' 'RGB24_640x360' 'RGB24_640x480' 'YUY2_320x180'
6 至 8 列
'YUY2_320x240' 'YUY2_640x360' 'YUY2_640x480'
--> 可以看到 摄像头支持上面8种 图片格式
% 创建视频输入对象 obj = videoinput(adaptorname,deviceID,format)
% adaptorname:适配器名称,首次可以使用不带参数的imaqhwinfo函数获取
% deviceID:设备ID号,首次可以通过imaqhwinfo函数获取
% format:视频采集格式,可以通过DeviceInfo的SupportedFormats获取,不填写则使用默认格式
obj = videoinput('winvideo',1, 'RGB24_640x480')
Summary of Video Input Object Using 'Integrated Camera'.
Acquisition Source(s): input1 is available.
Acquisition Parameters: 'input1' is the current selected source.
10 frames per trigger using the selected source.
'RGB24_640x480' video data to be logged upon START.
Grabbing first of every 1 frame(s).
Log data to 'memory' on trigger.
Trigger Parameters: 1 'immediate' trigger(s) on START.
Status: Waiting for START.
0 frames acquired since starting.
0 frames available for GETDATA.
% 打开视频预览窗口
if 1
preview(obj);
else
vidRes = get(obj, 'VideoResolution');
nBands = get(obj, 'NumberOfBands');
% 指定预览窗体显示的figure
figure()
% 指定预览窗口显示的坐标系
axes()
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(obj, hImage);
end
all code as follow:
%%%%%%%%%%%%%%%%%%%%
% nframe = 录制视频帧数;samplingRate视频的fps
%%%%%%%%%%%%%%%%%%%%
function video = camera_get_video(nframe, frame_rate)
nframe = 60;
frame_rate = 30;
% 下面这部分只需跑一次即可,获得系统适配器信息
if 0
% 无输入参数,get系统存在适配器和matlab版本
info = imaqhwinfo;
% 有输入参数,get指定的适配器的数据信息
win_info = imaqhwinfo('winvideo');
% get device ID
ID_win_info = win_info.DeviceIDs;
% get device info
dev_win_info = win_info.DeviceInfo;
%看看图像获取设备支持的图像格式
dev_win_info.SupportedFormats
end
%% 视频预览、采集和保存
% Construct a video input object obj = videoinput(adaptorname,deviceID,format)
% adaptorname:适配器名称,首次可以使用不带参数的imaqhwinfo函数获取
% deviceID:设备ID号,首次可以通过imaqhwinfo函数获取
% format:视频采集格式,可以通过DeviceInfo的SupportedFormats获取,不填写则使用默认格式
vid = videoinput('winvideo',1, 'RGB24_640x480');
% 打开视频预览窗口
if 1
preview(vid);
else
vidRes = get(vid, 'VideoResolution');
nBands = get(vid, 'NumberOfBands');
% 指定预览窗体显示的figure
figure()
% 指定预览窗口显示的坐标系
axes()
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(vid, hImage);
end
if 1
% 画面是rgb的
set(vid,'ReturnedColorSpace','rgb');
else
% 画面是黑白的
set(vid,'ReturnedColorSpace','grayscale');
end
% get the file name
T = fix(clock);
ymd = datestr(T,29);
hms = datestr(T,30);
hms = hms(10:15);
dataDir = './data';
video_avi = [ymd ' ' hms '.avi'];
filename = fullfile(dataDir ,video_avi);
writerObj = VideoWriter( filename,'Motion JPEG AVI');
writerObj.FrameRate = frame_rate;
open(writerObj);
pause(2);
% 启动软件定时器
tic
for ii = 1: nframe
% 某时刻图像捕捉
frame = getsnapshot(vid);
f.cdata = frame;
f.colormap = [];
writeVideo(writerObj,f);
%drawnow;
%pause(0.00000000001);
end
% 定时器执行时间
elapsedTime = toc
timePerFrame = elapsedTime/nframe
effectiveFrameRate = 1/timePerFrame
closepreview;
%Remove video input object from memory.
delete(vid);
end