(1)Matlab環境下使用USB2.0攝像頭編程
Matlab中的圖像獲取工具箱給我們提供了必要的函數,我們直接調用就可以了,主要就是簡單的介紹如何使用該工具箱進行對USB2.0攝像頭的編程。
TAG: USB攝像頭? Matlab
Matlab中的圖像獲取工具箱給我們提供了必要的函數,我們直接調用就可以了。在這帖中我們主要就是簡單的介紹如何使用該工具箱進行對USB2.0攝像頭的編程
廢話不多說,我們開始言歸正傳了。但是一定記住你必須安裝了PC攝像頭才可以進行下面的東西,如果說首次安裝攝像頭最好重啟下PC,否則可能出現沒法識別攝像頭。
整個過程我們需要做如下幾件事情:
1、查詢USB2.0Camera 的具體參數(imaqhwinfo)
2、創建視頻輸入對象(videoinput)
3、圖像預覽和顯示(preview、stoppreview、closepreview和image)
4、獲取視頻圖像(getsnapshot)
5、圖像獲取設備的獲取和設置(get和set)
6、關閉視頻對象(delete)
在正式講解之前,我想說明下幾個在圖像獲取工具箱中的術語:
圖像獲取設備:比如攝像頭、掃描儀
圖像獲取適配器:主要的目的是通過驅動在Matlab和圖像獲取設備之間傳遞信息
ROI:region-of-interest 感興趣區域
再說說幾個常用的函數,我們這里只是說明它的作用,具體如何使用參考幫助系統
getselectedsource
imaqfind
isvalid
peekdata
getdata
imaqmontage
查詢USB2.0Camera的具體參數
給我們一個攝像頭我們必須知道他的相關參數,才可能進行我們的編程下。當然我們可以查詢商家手冊,但是那個累不累人呀。
Matlab的圖像獲取工具箱為我提供了imaqhwinfo(),來獲取PC上以安裝的圖像獲取硬件信息
沒有輸入參數時,返回一個結構體, 它包含了系統中存在的適配器和Matlab相關的版本信息( 第一次我們一般使用這個)
>> info=imaqhwinfo
info =
InstalledAdaptors: {'coreco'?'winvideo'}%這里可以看到我的PC上安裝了兩個適配器
MATLABVersion: '7.6 (R2008a)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '3.1 (R2008a)'
復制代碼
有輸入參數的時候,返回一個結構體,包含了指定的適配器的數據信息
>> win_info=imaqhwinfo('winvideo')%我們看看第二適配器的具體參數
win_info =
AdaptorDllName: [1x81 char]%適配器dll文件絕對路徑
AdaptorDllVersion: '3.1 (R2008a)'%適配器dll文件版本
AdaptorName: 'winvideo'%適配器名稱
DeviceIDs: {[1]}%設備ID號,這個我們經常需要用到
DeviceInfo: [1x1 struct]%設備信息,這里主要是圖像獲取設備的一些參數,比較重要
%====================下面我們了解下,這個圖像獲取設備到底有哪些的詳細信息吧====================
>> win_info.DeviceIDs
ans =
[1]
>> dev_win_info=win_info.DeviceInfo
dev_win_info =
DefaultFormat: 'RGB24_320x240'%獲取圖片的默認格式
DeviceFileSupported: 0
DeviceName: 'USB PC CAMERA P227'%設備名稱
DeviceID: 1%設備號
ObjectConstructor: 'videoinput('winvideo', 1)'%對象構建方式,這個絕大部分都是一樣的
SupportedFormats: {1x12 cell}%獲取的圖像支持格式,一般都有好多種,上面的DefaultFormat只是默認格式而已
%==================================看看圖像獲取設備支持的圖像格式==================================
>> dev_win_info.SupportedFormats%可以看到我的PC上的攝像頭支持下面12中圖片格式
ans =
Columns 1 through 5
'I420_160x120'???'I420_176x144'???'I420_320x240'??? 'I420_352x288'??? 'I420_640x480'
Columns 6 through 9
'RGB24_1280x960'???'RGB24_160x120'??? 'RGB24_176x144'??? 'RGB24_320x240'
Columns 10 through 12
'RGB24_352x288'???'RGB24_640x480'??? 'RGB24_800x600'
視頻預覽、采集和保存
(1)創建視頻輸入對象
obj =videoinput(adaptorname,deviceID,format)
adaptorname:適配器名稱,首次可以使用不帶參數的imaqhwinfo函數獲取
deviceID:設備ID號,首次可以通過imaqhwinfo函數獲取
format:視頻采集格式,可以通過DeviceInfo的SupportedFormats獲取,不填寫則使用默認格式
>> obj =videoinput('winvideo',1,'RGB24_320x240')%這里我們使用默認的視頻采集格式
Summary of Video Input Object Using 'USB PCCAMERA P227'.
Acquisition Source(s):? input1 isavailable.
Acquisition Parameters:? 'input1'is the current selected source.
10 frames pertrigger using the selected source.
'RGB24_320x240'video data to be logged upon START.
Grabbing first ofevery 1 frame(s).
Log data to 'memory'on trigger.
Trigger Parameters:? 1 'immediate'trigger(s) on START.
Status:? Waiting for START.
0 frames acquiredsince starting.
0 frames availablefor GETDATA.
(2)打開視頻預覽窗口
himage=preview(obj,himage)
obj:視頻采集對象
himage:視頻預覽窗口對應的句柄,也就是說在指定的句柄對象中預覽視頻,該參數可以空缺
至于預覽窗口的關閉和停止可以使用colsepreview和stoppreview函數
vidRes = get(obj, 'VideoResolution');
nBands = get(obj, 'NumberOfBands');
figure()%指定預覽窗體顯示的figure
axes()%指定預覽窗口顯示的坐標系
hImage = image( zeros(vidRes(2), vidRes(1),nBands) );
preview(obj, hImage);
(3)圖像捕捉、顯示和保存
%frame是H×W×B的矩陣。H圖像高度,由ROIPosition指定;w圖像寬度,由ROIPosition指定;B索線個數,由NumberOfBands指定
frame = getsnapshot(obj);%獲取視頻的一幀
imshow(frame);%顯示獲取那一幀
imwrite(frame,'snap.jpg','jpg');
(2)
Matlab攝像頭數據采集
www.diybl.com????時間?:?2010-07-10??作者:網絡 ??編輯:huyang629點擊:??24?[?評論?]
1、??查詢USB2.0Camera 的具體參數
輸入 imaqInfo = imaqhwinfo
返回信息
InstalledAdaptors: {'winvideo'}
MATLABVersion: '7.1 (R14SP3)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '1.9 (R14SP3)'
輸入imaqInfo.InstalledAdaptors
返回信息
ans =
'winvideo'
輸入winvideoinfo = imaqhwinfo('winvideo')
返回信息
winvideoinfo =
AdaptorDllName: [1x76 char]
AdaptorDllVersion: '1.9 (R14SP3)'
AdaptorName: 'winvideo'
DeviceIDs: {[1]}
DeviceInfo: [1x1 struct]
輸入 winvideoinfo.DeviceInfo
返回信息
ans =
DefaultFormat: 'YUY2_160x120'
DeviceFileSupported: 0
DeviceName: 'USB 視頻設備'
DeviceID: 1
ObjectConstructor: 'videoinput('winvideo', 1)'
SupportedFormats: {1x5 cell}
輸入device1 = winvideoinfo.DeviceInfo(1)
返回信息
device1 =
DefaultFormat: 'YUY2_160x120'
DeviceFileSupported: 0
DeviceName: 'USB 視頻設備'
DeviceID: 1
ObjectConstructor: 'videoinput('winvideo', 1)'
SupportedFormats: {1x5 cell}
輸入device1.DeviceName
返回信息
ans =
USB 視頻設備
輸入device1.DeviceID
返回信息
ans =
1
輸入device1.DefaultFormat
返回信息
ans =
YUY2_160x120
輸入device1.SupportedFormats
返回信息
Columns 1 through 4
'YUY2_160x120'????'YUY2_176x144'????'YUY2_320x240'????'YUY2_352x288'
Column 5
'YUY2_640x480'
2、??最簡單采集實驗,輸入如下代碼,可以得到預覽下的默認格式的攝像頭捕捉窗口
obj=videoinput('winvideo',1);
preview(obj);
3、??輸入如下代碼
% Access an image acquisition device.
vidobj = videoinput('winvideo',1,'YUY2_640x480');
sources = vidobj.Source;
whos sources
set(vidobj,'SelectedSourceName','input1');
sources
selectedsrc = getselectedsource(vidobj);
get(selectedsrc);
delete(vidobj);
clear vidobj;
返回信息
Name??????????Size????????????????????Bytes??Class
sources???????1x1???????????????????????726??videosource object
Grand total is 30 elements using 726 bytes
Display Summary for Video Source Object:
Index:???SourceName:???Selected:
1????????'input1'??????'on'
General Settings:
Parent = [1x1 videoinput]
Selected = on
SourceName = input1
Tag =
Type = videosource
Device Specific Properties:
BacklightCompensation = on
Brightness = -16
Contrast = 120
FrameRate = 30.0000
Gamma = 60
Hue = 0
Saturation = 40
Sharpness = 3
4、??輸入如下代碼
clc;
clf;
clear all;
imaqmem(30000000);???????????????%申請內存空間
%ADAPTOR:MATLAB與視頻設備之間的接口,主要的目的是傳遞信息
vid = videoinput('winvideo', 1, 'YUY2_640x480');
preview(vid);
start(vid);
h=figure('NumberTitle','off','Name','視頻',...
'MenuBar','none','color','c',...
'Position', [0, 0, 1, 1], 'Visible', 'on');?????????%新建窗口
set(h,'doublebuffer','on','outerposition',get(0,'screensize'));
h1=axes('Position', [0.02, 0.1, 0.4, 0.8],'Parent',h); %新建顯示窗口
hold on;
axis off;
while ishandle(h)?????%判斷是否有效的圖像對象句柄
a=getsnapshot (vid);?????% 捕獲圖像
flushdata(vid);?????%清除數據獲取引擎的所有數據、置屬性SamplesAvailable為0
imshow(a);???????????????????%顯示圖像
drawnow;?????????????????????% 實時更新圖像
end;
delete(vid);