在計算機視覺和圖像處理中,用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 );%以默認格式顯示數據