1. 程式人生 > >matlab通過攝像頭獲取影象進行處理

matlab通過攝像頭獲取影象進行處理

  1. 安裝攝像頭

    筆記本自帶也行,或者買一個usb攝像頭,安裝驅動之後檢查能否正常獲取。有時候即使usb攝像頭在電腦硬體中顯示了,在matlab中還是不能呼叫攝像頭,可以在命令視窗中寫一句程式碼:imaqreset  ,以使得matlab載入電腦中能夠獲取圖片的硬體。輸入videoinput('winvideo')沒有報錯即可。
  2. 獲取攝像頭硬體資訊

    使用imaqhwinfo函式,來獲取電腦上安裝的攝像頭的名稱,比如'winvideo',之後可以利用imaqhwinfo('winvideo')來進一步獲取裝置ID等邊資訊,這在之後的視訊流獲取中會用到。獲取裝置ID之後(比如ID為1),可以進一步用imaqhwinfo('winvideo',1)來獲取視訊的預設格式大小等資訊。
    我們
    win_info=imaqhwinfo('winvideo')
    ,則ID可用win_info.DeviceIDs來獲取,同理,可用以下程式碼獲取攝像頭支援的格式
    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'

  3. 建立視訊物件

    通過第二步得知的攝像頭資訊,我們就可以通過函式vid = videoinput(camera_name, camera_id, format)來建立一個名為vid的視訊物件
  4. 預覽獲取的視訊流

    在進行影象資料處理之前想要預覽一下攝像頭所獲取的視訊流,可以通過函式preview(vid)來建立一個視窗進行預覽。關閉視窗用closepreview(vid)。
  5. 設定獲取的視訊流的屬性值(可選)

    視訊物件包括視訊輸入物件,以及視訊源物件,當攝像頭獲取輸入物件時,同時產生一個視訊源物件。源物件是matlab用來進行處理的物件(個人理解)。
    獲取視訊影象的資訊可以通過get函式來獲取,如get(vid)或者get(getselectedsource(vid))。使用set函式可以設定攝像頭獲取的影象的一些屬性值,也可以直接使用結構陣列的“點”來賦值,比如,要持續通過攝像頭獲取影象,則可以將TriggerRepeat的值設定為Inf(無窮),一下兩個程式碼等價:
    set(vid,'TriggerRepeat',Inf);
    vid.TriggerRepeat= Inf;   %持續不斷獲取影象
    設定完攝像頭觸發重複時間後,再設定攝像頭獲取影象的快慢,可通過設定FrameGrabInterval的值來實現,設定方法同上。
    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');
  6. 獲取影象資料

    使用start函式來開始進行影象獲取,結束時使用stop函式。
  7. 附上原始碼:

    %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));