gusucode.com > 《matlab图像处理与界面编程宝典》秦襄培 编著,每章的MATLAB源代码程序 > 第2章/第2.7.1节中的代码.txt

    
trafficObj = mmreader('traffic.avi') % 视频文件目录为\MATLABR2008a\toolbox\images\imdemos
  Video Parameters:  15.00 frames per second, RGB24 160x120.
                     120 total video frames available.
get(trafficObj) %get函数得到目标物的属性值
General Properties:
    Duration = 8.0000
    Name = traffic.avi
    Path = E:\MATLABR2008a\toolbox\images\imdemos
    Tag = 
    Type = mmreader
    UserData = []
  Video Properties:
    BitsPerPixel = 24
    FrameRate = 15.0000
    Height = 120
    NumberOfFrames = 120
    VideoFormat = RGB24
    Width = 160
implay('traffic.avi');                % 播放avi视频文件
darkCarValue = 50;% 设定阈值为50
darkCar = rgb2gray(read(trafficObj,71));
% 彩色图像转换为灰度
% 这里的read(trafficObj,71)来源于句法video = read(obj, index),读出第71帧图像。
noDarkCar = imextendedmax(darkCar, darkCarValue);
% imextendedmax句法为:BW = imextendedmax(I,H),其中I为图像,H为阈值。
imshow(darkCar)% 
figure, imshow(noDarkCar)
% figure函数增加一个图形窗口,然后在新的窗口显示图像。
sedisk = strel('disk',2);
% strel函数生成结构矩阵,句法为:SE = strel(shape, parameters)
noSmallStructures = imopen(noDarkCar, sedisk);
% imopen 函数进行开启运算,句法为:IM2 = imopen(IM,SE)
imshow(noSmallStructures)
nframes = get(trafficObj, 'NumberOfFrames');
I = read(trafficObj, 1);
taggedCars = zeros([size(I,1) size(I,2) 3 nframes], class(I));
for k = 1 : nframes %这里设置循环以便依次读出视频中的图像。
    singleFrame = read(trafficObj, k);    
% 将原始图像转换为灰度图像以便进行数学形态学处理。
    I = rgb2gray(singleFrame);    
% 去除深色车辆。
    noDarkCars = imextendedmax(I, darkCarValue); 
    % 去除车道标志线和其它非圆碟形状的结构目标物。
    noSmallStructures = imopen(noDarkCars, sedisk);  
    %去除小结构目标物。
    noSmallStructures = bwareaopen(noSmallStructures, 150); 
    % 得到帧画面中每个留存目标物的面积和质心。大面积的目标物是浅色车辆。
    % 生成一个原始帧图像的拷贝图像,在车辆上进行标记,将标记符像素色彩变为红色。
    L = bwlabel(noSmallStructures);
    taggedCars(:,:,:,k) = singleFrame;
    if any(L(:))
       stats = regionprops(L, {'centroid','area'});
    %  regionprops 函数句法为:STATS = regionprops(L, properties)
       areaArray = [stats.Area];
       [junk,idx] = max(areaArray); % max 函数求数组最大值,句法为:C = max(A)
       c = stats(idx).Centroid;
       c = floor(fliplr(c));% fliplr函数对矩阵进行从左到右翻转
       width = 2;
       row = c(1)-width:c(1)+width;
       col = c(2)-width:c(2)+width;
       taggedCars(row,col,1,k) = 255;
       taggedCars(row,col,2,k) = 0;
       taggedCars(row,col,3,k) = 0;
    end
end
frameRate = get(trafficObj,'FrameRate');
implay(taggedCars,frameRate);