如何在MATLAB中录制摄像头视频?

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

从问题中我并不清楚您是否尝试使用网络摄像头来记录MATLAB会话(可能不是,但我看到有人这样做)。我的所有视频都是使用Camtasia进行屏幕捕获和编辑制作的。 - MatlabDoug
6个回答

11

首先构建一个视频输入接口

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

你需要根据你的网络摄像头进行最后一个部分的调整。要查找摄像头设备列表(以及其他内容),请使用:

imaqhwinfo
以下代码将第一个网络摄像头转换为对象:
a=imaqhwinfo('winvideo',1)

使用以下代码查找支持的视频格式列表:

a.SupportedFormats

接下来,您需要确定帧率(有关更多信息,请参见此处):

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;

上面的大部分(但并非全部)内容来自 这里

当你点击start(vid)时,你可能会注意到在帧开始获取之前有一点延迟。如果你想要将视频与某些东西同步,这是不好的。在这种情况下,你需要尝试使用触发器

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.

更多关于触发器和同步的信息可以在这里查看。


5
注意: 这已经更新以适用于新版本的MATLAB,因为一些旧功能已被取代和删除。

如果您已经知道如何从网络摄像头捕获单个图像,那么将图像拼接成电影只是一个简单的问题。您可以使用VideoWriter对象打开一个电影文件,然后使用writeVideo方法添加连续的图像。例如:

aviObject = VideoWriter('myVideo.avi');  % Create a new AVI file
for iImage = 1:100                       % Capture 100 frames
  % ...
  % You would capture a single image I from your webcam here
  % ...
  writeVideo(aviObject, I);  % Add the image to the AVI file
end
close(aviObject);  % Close the AVI file

我只是举了一个简单的例子,使用了 for 循环,但如果您想要在固定时间间隔内捕获图像并将其添加到 AVI 文件中,则可能需要使用 timer


1

1

0

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

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');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接