Matlab成長之路_1(圖片,視頻,攝像頭的讀取和顯示)


  在計算機視覺和圖像處理中,用matlab來驗證算法的有效性是非常重要的,可以作為前期工作,因為matlab比c/c++等編程要來得簡單些,不需要考慮那么多的數據類型和變量定義等。因此matlab在圖像和視覺處理領域的這個得力工具也是需要掌握的。

這一節簡單介紹一些matlab自帶函數實現圖像,視頻,攝像頭數據的讀取和顯示方法(因為剛入門,方法可能不是很好)。

一、圖片的讀取和顯示。

  比較簡單,一個imread和imshow就可以搞定,類似opencv的用法,代碼如下:

imshow( imread('lena.jpg') );

二、視頻的讀取和顯示

  視頻數據的讀取要用到VideoReader這個函數,按照matlab軟件中舉的例子,基本流程是在用VideoReader建立一個obj后,采用read函數來讀取一幀幀圖像,最后用movie函數來放映視頻。但是matlab自帶的函數讀取avi格式的視頻時也只能讀取那些原始格式的avi,比較局限性。其讀取過程可以采用下面2種方法:

  先讀完,再顯示。

  即先將視頻數據讀取到內存的結構體中,然后直接從內存中拿數據來顯示,這顯示的視頻看起來比較流暢,可是一開始把所有數據讀入內存的過程所用時間也有點長。

  在matlab指定目錄下放入需要讀取的視頻,我這里放的是test.avi.其代碼如下:

%% 先讀取,后播放
mov = VideoReader( 'test.avi' );
movFrames = mov.NumberOfFrames;
movHeight = mov.Height;
movWidth = mov.Width;
src(1:200) = struct( 'cdata', zeros(movHeight, movWidth, 3, 'uint8'),...
    'colormap', [] );%前面一定要是cdata,且后面要加上后面的colormap,
                    %否則運行出錯,why?
% src(1:150) = struct( 'cdata', zeros(movHeight, movWidth, 3, 'uint8') );
for i =1:200 %按照matlab自帶的例子,這里應該可以用movFrames代替200的,
            %但是運行會報錯
    src(i).cdata = read( mov, i );
end

hf = figure;
set( hf, 'position', [150 150 movWidth movHeight] );

movie( hf, src, 1, mov.FrameRate );

  讀一幀顯示一幀。

  直接從視頻數據中抽取一幀,然后顯示一幀圖像,這樣感覺視頻顯示的時候有點卡,不知道是不是程序設置問題。其代碼如下:

%% 一幀一幀的讀取視頻數據,然后播放
mov = VideoReader( 'test.avi' );
for i=1:mov.NumberOfFrames
    img = read( mov, i );
    imshow(img);
end

三、攝像頭的讀取和顯示

  攝像頭的讀取要用到videoinput這個函數,當然它也只能讀取能掃描到的攝像頭,且名字也必須對應起來。讀完后需要用preview函數來顯示讀取到的攝像頭數據。

  首先查看本機連有的攝像頭,輸入命令imaqhwinfo,顯示結果為:

  

 

  可以看出有個名為’winvideo’的攝像頭被掃描到

  查看'winvideo'攝像頭的id號,輸入命令imaqhwinfo( ‘winvideo’ ),顯示結果為:

  

  可以看出其DeviceIDs編號為1.另外返回的DeviceInfo如果為1x1的話,說明該攝像頭可用。

  自己設置顯示的屬性后即可顯示攝像頭數據了,此時的代碼如下:

%% 讀取攝像頭
%法一:

%imaqhwinfo
src = videoinput( 'winvideo', 1 );%由imaqhwinfo('winvideo')查看到DeviceIDs為1
figure( 'Name', '攝像頭:' ); 
uicontrol( 'String', 'Close', 'Callback', 'close(gcf)' );%gcf為current figure handle
                                                         %即為當前圖像句柄  
vidRes = get( src, 'VideoResolution' );%返回分辨率,即攝像頭數據的寬和高
nBands = get( src, 'NumberOfBands' );%返回攝像頭數據的通道數,我這里返回的是3
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(src, hImage);%以hImage的尺寸格式顯示攝像頭數據

  當然,還可以采用更簡單的讀取方法,即采用默認的顯示屬性,代碼如下:

%% 讀取攝像頭
%法二:

%imaqhwinfo
src = videoinput( 'winvideo', 1 );%此處第二個參數1可以省略
preview( src );%以默認格式顯示數據

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM