Matlab攝像頭基本操作
借鑑參考:http://blog.csdn.net/msq19895070/article/details/8019663
Matlab中的影象獲取工具箱給我們提供了必要的函式,我們直接呼叫就可以了。在這帖中我們主要就是簡單的介紹如何使用該工具箱進行對USB2.0攝像頭的程式設計
整個過程我們需要做如下幾件事情:
1、查詢USB2.0Camera 的具體引數(imaqhwinfo)
2、建立視訊輸入物件(videoinput)
3、影象預覽和顯示(preview、stoppreview、closepreview和image)
4、獲取視訊影象(getsnapshot)
5、影象獲取裝置的獲取和設定(get
6、關閉視訊物件(delete)
給我們一個攝像頭我們必須知道他的相關引數,才可能進行我們的程式設計下。當然我們可以查詢商家手冊,但是那個累不累人呀。
Matlab的影象獲取工具箱為我提供了imaqhwinfo(),來獲取PC上以安裝的影象獲取硬體資訊
無輸入引數時,返回一個結構體, 它包含了系統中存在的介面卡和Matlab相關的版本資訊(第一次我們一般使用這個)
% 無輸入引數,get系統存在介面卡和matlab版本
info = imaqhwinfo;
info =
InstalledAdaptors: {'dcam' 'winvideo'}
MATLABVersion: '8.4 (R2014b)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '4.8 (R2014b)'
% 有輸入引數,get指定的介面卡的資料資訊
win_info = imaqhwinfo('winvideo');
有輸入引數的時候,返回一個結構體,包含了指定的介面卡的資料資訊
win_info =
AdaptorDllName: 'C:\MATLAB\SupportPackages\R2014b\osgenericvideointerface\toolbox\imaq\su...'-->介面卡dll檔案絕對路徑
AdaptorDllVersion: '4.8 (R2014b)' -->介面卡dll檔案版本
AdaptorName: 'winvideo' -->介面卡名稱
DeviceIDs: {[1]} -->裝置ID號,這個我們經常需要用到
DeviceInfo: [1x1 struct] -->裝置資訊,這裡主要是影象獲取裝置的一些引數
% get device ID
ID_win_info = win_info.DeviceIDs
% get device info
dev_win_info = win_info.DeviceInfo
ID_win_info =
[1]
dev_win_info =
DefaultFormat: 'RGB24_640x480' --> 獲取圖片的預設格式
DeviceFileSupported: 0
DeviceName: 'Integrated Camera' --> 裝置名稱
DeviceID: 1 -->裝置號
VideoInputConstructor: 'videoinput('winvideo', 1)' --> 物件構建方式,這個絕大部分都是一樣的
VideoDeviceConstructor: 'imaq.VideoDevice('winvideo', 1)'
SupportedFormats: {1x8 cell} --> 獲取的影象支援格式,一般都有好多種,上面的 DefaultFormat 只是預設格式而已
%看看影象獲取裝置支援的影象格式
dev_win_info.SupportedFormats
ans =
1 至 5 列
'RGB24_320x180' 'RGB24_320x240' 'RGB24_640x360' 'RGB24_640x480' 'YUY2_320x180'
6 至 8 列
'YUY2_320x240' 'YUY2_640x360' 'YUY2_640x480'
--> 可以看到 攝像頭支援上面8種 圖片格式
% 建立視訊輸入物件 obj = videoinput(adaptorname,deviceID,format)
% adaptorname:介面卡名稱,首次可以使用不帶引數的imaqhwinfo函式獲取
% deviceID:裝置ID號,首次可以通過imaqhwinfo函式獲取
% format:視訊採集格式,可以通過DeviceInfo的SupportedFormats獲取,不填寫則使用預設格式
obj = videoinput('winvideo',1, 'RGB24_640x480')
Summary of Video Input Object Using 'Integrated Camera'.
Acquisition Source(s): input1 is available.
Acquisition Parameters: 'input1' is the current selected source.
10 frames per trigger using the selected source.
'RGB24_640x480' video data to be logged upon START.
Grabbing first of every 1 frame(s).
Log data to 'memory' on trigger.
Trigger Parameters: 1 'immediate' trigger(s) on START.
Status: Waiting for START.
0 frames acquired since starting.
0 frames available for GETDATA.
% 開啟視訊預覽視窗
if 1
preview(obj);
else
vidRes = get(obj, 'VideoResolution');
nBands = get(obj, 'NumberOfBands');
% 指定預覽窗體顯示的figure
figure()
% 指定預覽視窗顯示的座標系
axes()
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(obj, hImage);
end
all code as follow:
%%%%%%%%%%%%%%%%%%%%
% nframe = 錄製視訊幀數;samplingRate視訊的fps
%%%%%%%%%%%%%%%%%%%%
function video = camera_get_video(nframe, frame_rate)
nframe = 60;
frame_rate = 30;
% 下面這部分只需跑一次即可,獲得系統介面卡資訊
if 0
% 無輸入引數,get系統存在介面卡和matlab版本
info = imaqhwinfo;
% 有輸入引數,get指定的介面卡的資料資訊
win_info = imaqhwinfo('winvideo');
% get device ID
ID_win_info = win_info.DeviceIDs;
% get device info
dev_win_info = win_info.DeviceInfo;
%看看影象獲取裝置支援的影象格式
dev_win_info.SupportedFormats
end
%% 視訊預覽、採集和儲存
% Construct a video input object obj = videoinput(adaptorname,deviceID,format)
% adaptorname:介面卡名稱,首次可以使用不帶引數的imaqhwinfo函式獲取
% deviceID:裝置ID號,首次可以通過imaqhwinfo函式獲取
% format:視訊採集格式,可以通過DeviceInfo的SupportedFormats獲取,不填寫則使用預設格式
vid = videoinput('winvideo',1, 'RGB24_640x480');
% 開啟視訊預覽視窗
if 1
preview(vid);
else
vidRes = get(vid, 'VideoResolution');
nBands = get(vid, 'NumberOfBands');
% 指定預覽窗體顯示的figure
figure()
% 指定預覽視窗顯示的座標系
axes()
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(vid, hImage);
end
if 1
% 畫面是rgb的
set(vid,'ReturnedColorSpace','rgb');
else
% 畫面是黑白的
set(vid,'ReturnedColorSpace','grayscale');
end
% get the file name
T = fix(clock);
ymd = datestr(T,29);
hms = datestr(T,30);
hms = hms(10:15);
dataDir = './data';
video_avi = [ymd ' ' hms '.avi'];
filename = fullfile(dataDir ,video_avi);
writerObj = VideoWriter( filename,'Motion JPEG AVI');
writerObj.FrameRate = frame_rate;
open(writerObj);
pause(2);
% 啟動軟體定時器
tic
for ii = 1: nframe
% 某時刻影象捕捉
frame = getsnapshot(vid);
f.cdata = frame;
f.colormap = [];
writeVideo(writerObj,f);
%drawnow;
%pause(0.00000000001);
end
% 定時器執行時間
elapsedTime = toc
timePerFrame = elapsedTime/nframe
effectiveFrameRate = 1/timePerFrame
closepreview;
%Remove video input object from memory.
delete(vid);
end