2009-10-28 59 views
9

Tôi muốn biết cách tôi có thể quay video trong MATLAB bằng webcam của mình.Làm cách nào để quay video từ webcam trong MATLAB?

+0

Không rõ ràng với tôi từ câu hỏi nếu bạn đang cố gắng sử dụng cam web để ghi lại phiên MATLAB của bạn (có thể không, nhưng tôi thấy mọi người đang làm). [Tất cả video của tôi] (http://blogs.mathworks.com/videos) là ảnh chụp màn hình được tạo và chỉnh sửa với Camtasia. – MatlabDoug

Trả lời

5

Nếu bạn đã biết làm thế nào để capture a single image from a webcam, sau đó nó chỉ nên là một vấn đề của khâu những hình ảnh lại với nhau thành một bộ phim. Bạn có thể chuyển đổi tệp hình ảnh sang khung phim bằng cách sử dụng IM2FRAME, sau đó bạn có thể sử dụng AVIFILE để tạo tệp video từ khung. Dưới đây là cách mã có thể trông:

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 

tôi chỉ sử dụng một vòng lặp for như một ví dụ đơn giản, nhưng bạn có thể muốn sử dụng một MATLAB Timer Object nếu bạn thay vì muốn chụp ảnh và thêm chúng vào tập tin AVI lúc bình thường khoảng thời gian.

11

đầu tiên xây dựng một giao diện đầu vào video

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

Bạn sẽ cần phải điều chỉnh các bit cuối cùng cho webcam của bạn. Để tìm danh sách các thiết bị webcam (và những thứ khác ngoài) sử dụng:

imaqhwinfo 

Sau đây làm webcam đầu tiên vào một đối tượng

a=imaqhwinfo('winvideo',1) 

Tìm danh sách các định dạng video được hỗ trợ với

a.SupportedFormats 

Sau đó, bạn sẽ muốn xác định tốc độ khung hình của mình (nhiều hơn trên số này 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)) 

Thuộc tính FrameGrabInterval chỉ định tần suất khung được lưu trữ từ luồng video. Ví dụ, nếu chúng ta đặt nó là 5, thì chỉ có 1 trong 5 khung được giữ - 4 khung còn lại sẽ bị loại bỏ. Sử dụng tốc độ khung hình, xác định tần suất bạn muốn nhận được khung

set(vid,'FrameGrabInterval',10); 

Để xác định có bao nhiêu khung hình để có được trong tổng số, tính toán tổng số khung hình đó sẽ được mua lại ở tốc độ khung của thiết bị, và sau đó chia cho các FrameGrabInterval.

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

Bây giờ bạn đã sẵn sàng để ghi lại và chơi với video bằng cách sử dụng lệnh getdata (peekdata cũng rất hữu ích), tuy nhiên ...

Nếu một số lượng lớn các khung hình sẽ được mua lại, đó là thực tế hơn để ghi hình ảnh vào đĩa thay vì bộ nhớ. Sử dụng Hộp công cụ chuyển đổi hình ảnh, bạn có thể đăng ảnh trực tiếp vào một tệp AVI. Chúng ta cấu hình nó bằng thuộc tính LoggingMode.

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

Tạo đối tượng tệp AVI để đăng nhập, sử dụng lệnh avifile. Chúng tôi phải chỉ định tên tệp để sử dụng và tốc độ khung hình mà tệp AVI sẽ được phát lại tại. Sau đó, đặt thuộc tính DiskLogger của đối tượng đầu vào video thành tệp AVI.

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

Bắt đầu mua lại thời gian trôi đi và đợi quá trình mua lại hoàn tất. Lưu ý rằng Hộp công cụ chuyển đổi hình ảnh không liên kết MATLAB® trong khi nó đang thu được. Bạn có thể bắt đầu mua lại và tiếp tục làm việc trong MATLAB.

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

Sau khi chụp xong, hãy truy xuất đối tượng tệp AVI và sử dụng chức năng đóng để giải phóng tài nguyên được liên kết với nó.

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

Khi bạn hoàn thành đối tượng nhập video, bạn nên sử dụng chức năng xóa để giải phóng tài nguyên phần cứng được liên kết với nó và xóa nó khỏi không gian làm việc bằng chức năng rõ ràng.

delete(vid); 
clear vid; 

Phần lớn, nhưng không phải tất cả, ở trên được lấy từ here.

Khi bạn nhấn start(vid) bạn có thể nhận thấy rằng có một chút chậm trễ trước khi bắt đầu bắt buộc khung. Điều này là xấu nếu bạn đang cố gắng đồng bộ hóa video với nội dung nào đó. Trong trường hợp này, bạn sẽ muốn thử làm việc với 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. 

Thông tin thêm về trigger và đồng bộ hóa là here.

0

Gần đây tôi đã viết một bài đăng blog về cách ghi lại âm thanh và video được đồng bộ hóa trong MATLAB bằng cách gửi các dòng lệnh tới chương trình ffmpeg. Bạn có thể tìm hiểu thêm here, nhưng dưới đây là mẫu sử dụng một số cài đặt có ý nghĩa trên máy tính của tôi.

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'); 
Các vấn đề liên quan