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