matlab通過攝像頭獲取影象進行處理
阿新 • • 發佈:2019-02-07
-
安裝攝像頭
筆記本自帶也行,或者買一個usb攝像頭,安裝驅動之後檢查能否正常獲取。有時候即使usb攝像頭在電腦硬體中顯示了,在matlab中還是不能呼叫攝像頭,可以在命令視窗中寫一句程式碼:imaqreset ,以使得matlab載入電腦中能夠獲取圖片的硬體。輸入videoinput('winvideo')沒有報錯即可。 -
獲取攝像頭硬體資訊
使用imaqhwinfo函式,來獲取電腦上安裝的攝像頭的名稱,比如'winvideo',之後可以利用imaqhwinfo('winvideo')來進一步獲取裝置ID等邊資訊,這在之後的視訊流獲取中會用到。獲取裝置ID之後(比如ID為1),可以進一步用imaqhwinfo('winvideo',1)來獲取視訊的預設格式大小等資訊。
我們令win_info=imaqhwinfo('winvideo'); d_win_info=imaqhwinfo('winvideo',1); d_win_info.SupportedFormats
可得到
ans =
'YUY2_160x120' 'YUY2_176x144' 'YUY2_320x240' 'YUY2_352x288' 'YUY2_640x480' -
建立視訊物件
通過第二步得知的攝像頭資訊,我們就可以通過函式vid = videoinput(camera_name, camera_id, format)來建立一個名為vid的視訊物件。 -
預覽獲取的視訊流
在進行影象資料處理之前想要預覽一下攝像頭所獲取的視訊流,可以通過函式preview(vid)來建立一個視窗進行預覽。關閉視窗用closepreview(vid)。 -
設定獲取的視訊流的屬性值(可選)
視訊物件包括視訊輸入物件,以及視訊源物件,當攝像頭獲取輸入物件時,同時產生一個視訊源物件。源物件是matlab用來進行處理的物件(個人理解)。
獲取視訊影象的資訊可以通過get函式來獲取,如get(vid)或者get(getselectedsource(vid))。使用set函式可以設定攝像頭獲取的影象的一些屬性值,也可以直接使用結構陣列的“點”來賦值,比如,要持續通過攝像頭獲取影象,則可以將TriggerRepeat的值設定為Inf(無窮),一下兩個程式碼等價:
設定完攝像頭觸發重複時間後,再設定攝像頭獲取影象的快慢,可通過設定FrameGrabInterval的值來實現,設定方法同上。set(vid,'TriggerRepeat',Inf); vid.TriggerRepeat= Inf; %持續不斷獲取影象
設定好視訊輸入物件之後,再對源物件進行設定:vid.FrameGrabInterval=5; %每隔5幀取一幅影象 set(vid,'ReturnedColorSpace','rgb'); %設定顏色空間為RGB set(vid,'ReturnedColorSpace','grayscale'); %設定顏色空間為灰度
vid_src=getselectedsource(vid); set(vid,'Tag','motion detection setup'); set(gcf,'doublebuffer','on');
-
獲取影象資料
使用start函式來開始進行影象獲取,結束時使用stop函式。 -
附上原始碼:
%http://wenku.baidu.com/view/674357ff0242a8956bece470.html?re=view %Track from folder a = imaqhwinfo; [camera_name, camera_id, format] = getCameraInfo(a); % Capture the video frames using the videoinput function % You have to replace the resolution & your installed adaptor name. vid = videoinput(camera_name, camera_id, format); set(vid, 'TriggerRepeat', Inf); % Set the properties of the video object set(vid, 'FramesPerTrigger', 1); set(vid, 'ReturnedColorspace', 'rgb'); vid.FrameGrabInterval =1;%抓取時間間隔 vid_src=getselectedsource(vid);%add set(vid,'Tag','motion ');%add set(gcf,'doublebuffer','on');%add %set(vid, 'FrameGrabInterval', 5);%also OK %start the video aquisition here start(vid) % Set a loop that stop after 100 frames of aquisition while(vid.FramesAcquired<=Inf) % Get the snapshot of the current frame %data = getsnapshot(vid); data=getdata(vid,2);%add diff_im=imabsdiff(data(:,:,:,2),data(:,:,:,1));%add % Convert the resulting grayscale image into a binary image. diff_im = im2bw(diff_im,0.18); % Remove all those pixels less than 300px bw = bwareaopen(diff_im,300); rows = size(bw, 1); %pixels的第1維即為視訊畫面的行數 cols = size(bw, 2); % 尋找上下邊界 topEdge = 0; bottomEdge=0; cou=1; for h = 1:rows for w = 1:cols if bw(h, w) > 0.5 bottomEdge = h; if cou == 1 topEdge = bottomEdge; end cou = cou+1; break; end end end % 尋找左右邊界 rightEdge=0; leftEdge=0; coun=1; for w = 1:cols for h = 1:rows if bw(h, w) > 0.5 rightEdge = w; if coun == 1 leftEdge = rightEdge; coun = coun+1; end break; end end end %add % 矩形框生成 wd = rightEdge-leftEdge; hg = bottomEdge-topEdge; widt = wd/2; heit = hg/2; cenx = leftEdge+widt; ceny = topEdge+heit; cenx1(1)=cenx; % 建立一個動態陣列來記錄矩形框的中心座標 ceny1(1)=ceny; % 顯示並標記 figure(1); % Display the image imshow(data(:,:,:,2))%add(:,:,:,2) hold on if wd>0&&hg>0 rectangle('Position',[leftEdge topEdge wd hg], 'EdgeColor', 'r', 'LineWidth', 2); plot(cenx1,ceny1, 'm-.s','MarkerSize',7, 'LineWidth', 1) end hold on end % Stop the video aquisition. stop(vid); % Flush all the image data stored in the memory buffer. flushdata(vid); % Clear all variables clear all function [camera_name, camera_id, resolution] = getCameraInfo(a) camera_name = char(a.InstalledAdaptors(end)); camera_info = imaqhwinfo(camera_name); camera_id = camera_info.DeviceInfo.DeviceID(end); resolution = char(camera_info.DeviceInfo.SupportedFormats(end));