9

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

4

6 回答 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也很有帮助)录制和播放视频,但是...

如果要获取大量帧,将图像记录到磁盘而不是内存更实用。使用 Image Acquisition Toolbox,您可以将图像直接记录到 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.

有关触发器和同步的更多信息在这里

于 2012-09-19T09:45:41.843 回答
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

timer我只是使用了一个 for 循环作为一个简单的示例,但如果您想要捕获图像并以固定的时间间隔将它们添加到 AVI 文件中,您可能想要使用 a 。

于 2009-10-28T15:18:28.993 回答
3

谷歌透露了这些:

  1. 从图像或设备创建视频文件
  2. 在 MATLAB 中使用网络摄像头捕获图像
于 2009-10-28T14:55:13.813 回答
1

在这里,您可以看到精彩的视频如何从网络摄像头捕获和处理图像,因此录制应该不难:

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

于 2009-10-30T10:13:54.100 回答
1

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

基于 MATLAB 的音频/视频记录器和播放器应用程序

在这方面,我在 matlab 编程中进行了音频录制和视频录制和播放。你可以从这里下载源代码

于 2011-12-26T10:58:40.943 回答
0

我最近写了一篇关于如何在 MATLAB 中通过向 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');
于 2016-08-22T09:44:21.070 回答