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