如何在MATLAB中录制来自网络摄像头的视频?

时间:2009-10-28 14:26:02

标签: matlab video webcam video-recording

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

6 个答案:

答案 0 :(得分: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功能释放与其关联的硬件资源,并使用clear功能将其从工作区中删除。

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

答案 1 :(得分: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循环作为一个简单示例,但如果你想要捕获图像并定期将它们添加到AVI文件中,你可能想要使用MATLAB Timer Object

答案 2 :(得分:3)

答案 3 :(得分:1)

在这里你可以看到很棒的视频如何从网络摄像头捕获和处理图像,所以录制应该不难:

http://blogs.mathworks.com/videos/2008/01/18/cool-feature-video-processing-demos/

答案 4 :(得分:1)

在我的大学生活中,我将这个项目命名为

Audio/video Recorder & player application based on MATLAB

我已经在matlab编程中进行了录音和视频录制和播放。您可以从here

下载源代码

答案 5 :(得分: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');