2009-10-28 95 views
9

我想知道如何使用我的摄像头在MATLAB中录制视频。如何从MATLAB摄像头录制视频?

+0

从这个问题我不清楚,如果你想使用网络摄像机记录你的MATLAB会话(可能不是,但我看到人们这样做)。 [所有视频](http://blogs.mathworks.com/videos)都是用Camtasia制作和编辑的屏幕截图。 – MatlabDoug 2009-10-29 19:07:41

回答

5

如果你已经知道如何capture a single image from a webcam,那么它应该只是拼接图像汇集成一部电影的问题。您可以使用IM2FRAME将图像文件转换为动画帧,然后您可以使用AVIFILE从帧中创建视频文件。下面的代码的外观:

aviObject = avifile('myVideo.avi'); % Create a new AVI file 
for iFrame = 1:100     % Capture 100 frames 
    % ... 
    % You would capture a single image I from your webcam here 
    % ... 
    F = im2frame(I);     % Convert I to a movie frame 
    aviObject = addframe(aviObject,F); % Add the frame to the AVI file 
end 
aviObject = close(aviObject);   % Close the AVI file 

我只是用一个for循环作为一个简单的例子,但您可能需要使用一个MATLAB Timer Object,如果你不是想捕捉图像,并在规定的时间添加到AVI文件间隔。

11

下载源代码首先构建一个视频输入接口

vid = videoinput('winvideo',1,'RGB24_400x300'); 

你需要调整的最后一位为你的网络摄像头。为了找到摄像头设备(以及除了其他的东西)的列表使用:

imaqhwinfo 

下使第一摄像头为对象

a=imaqhwinfo('winvideo',1) 

找到支持的视频格式与列表

a.SupportedFormats 

然后您需要确定您的帧速率(更多关于此here):

set(vid,'FramesPerTrigger',100); 
start(vid); 
wait(vid,Inf); 

% Retrieve the frames and timestamps for each frame. 
[frames,time] = getdata(vid, get(vid,'FramesAvailable')); 

% Calculate frame rate by averaging difference between each frame's timestamp 
framerate = mean(1./diff(time)) 

FrameGrabInterval属性指定从视频流中存储帧的频率。例如,如果我们将其设置为5,则仅保留5个帧中的1个 - 其他4个帧将被丢弃。使用帧率,确定要如何往往能得到帧

set(vid,'FrameGrabInterval',10); 

要确定多少帧总共获取,计算出将在设备的帧速率获取的帧的总数,然后由分FrameGrabInterval。

capturetime = 30; 
interval = get(vid,'FrameGrabInterval'); 
numframes = floor(capturetime * framerate/interval) 

您现在准备然而,记录和使用getdata命令与视频播放(peekdata也很有帮助),...

如果大量的框架将被收购,它更实用将图像记录到磁盘而不是内存。使用图像采集工具箱,您可以将图像直接记录到AVI文件。我们使用LoggingMode属性来配置它。

set(vid,'LoggingMode','disk'); 

使用avifile命令创建要登录的AVI文件对象。我们必须指定要使用的文件名以及AVI文件应播放的帧频。然后,将视频输入对象的DiskLogger属性设置为AVI文件。

avi = avifile('timelapsevideo','fps',framerate); 
set(vid,'DiskLogger',avi); 

开始延时采集,并等待采集完成。请注意,图像采集工具箱在采集时不会捆绑MATLAB®。您可以开始采集并继续在MATLAB中工作。

start(vid); 
wait(vid,Inf); % Wait for the capture to complete before continuing. 

捕获完成后,检索AVI文件对象,并使用close函数释放与其关联的资源。

avi = get(vid,'DiskLogger'); 
avi = close(avi); 

当你与视频输入对象做,你应该使用删除功能来释放与它相关的硬件资源,并从使用功能明确工作区中删除它。

delete(vid); 
clear vid; 

的很大一部分,但不是全部,上述的从here绘制。

当您点击start(vid)时,您可能会注意到在开始获取帧之前存在一点延迟。如果您尝试将视频与某些内容进行同步,这很糟糕。在这种情况下,你会想尝试用trigger工作:对触发器和同步

triggerconfig(vid,'manual'); 
start(vid); %There'll be a delay here, but nothing is being captured 
trigger(vid); %Use this line when you want the capture to start. There should be very little delay. 

更多信息为here

0

我最近写了一篇关于如何通过向ffmpeg程序发送命令行来记录MATLAB中的同步音频和视频的博客文章。你可以找到更多的here,但下面是一些使用我的电脑上有意义的设置的示例。

dos('ffmpeg -list_devices true -f dshow -i dummy') 

dos('ffmpeg -f dshow -list_options true -i video="USB2.0 HD UVC WebCam') 

dos('ffmpeg -f dshow -video_size 1280x720 -framerate 30 -audio_buffer_size 80 -i video="USB2.0 HD UVC WebCam":audio="Microphone (Realtek High Definition Audio)" -t 10 -c:v libx264 -preset veryfast -crf 25 test_vid2.mp4');