首先构建一个视频输入接口
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.
更多关于触发器和同步的信息可以在这里查看。
如果您已经知道如何从网络摄像头捕获单个图像,那么将图像拼接成电影只是一个简单的问题。您可以使用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
。在这里,您可以看到一些很棒的视频,学习如何捕获和处理来自网络摄像头的图像,因此录制不应该很难:
http://blogs.mathworks.com/videos/2008/01/18/cool-feature-video-processing-demos/
我最近写了一篇关于如何通过向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');