trafficObj1 = mmreader('traffic.avi');
mmplay('traffic.avi');
darkCarValue=70;
darkCar=rgb2gray(read(trafficObj1,71));
%noDarkCar=imextendedmax(darkCar,darkCarValue);
%imshow(darkCar);
%figure,imshow(noDarkCar);
sedisk=strel('disk',2);
%noSmallStructures=imopen(noDarkCar,sedisk);
%imshow(noSmallStructures);
nframes=get(trafficObj1,'NumberOfFrames'); %帧数
I=read(trafficObj1,1); %读取第一帧
taggedCars=zeros([size(I,1) size(I,2) 3 nframes],class(I)); %定义一个4维数组存放每一帧
for k=1:nframes
singleFrame = read(trafficObj1,k); %读取第k帧
I=rgb2gray(singleFrame); %转换为灰度图像
% figure,imhist(I,1000);
noDarkCars=imextendedmax(I,darkCarValue); %减去阈值,局部极大值置1,其他置0(二值化)
noSmallStructures=imopen(noDarkCars,sedisk);%开运算
noSmallStructures=bwareaopen(noSmallStructures,150); %从二值图像中移去所有小于150的连通域
L=bwlabel(noSmallStructures); %计算连通域
taggedCars(:,:,:,k)=singleFrame;
if any(L(:))
stats=regionprops(L,{'centroid','area'}); %area:计算出在图像各个区域中像素总个数 centroid:给出各个区域的重心
areaArray=[stats.Area];
[junk,idx]=max(areaArray);
c=stats(idx).Centroid; %返回像素数最多的这个区域的重心
c=floor(fliplr(c)); %左右翻转
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(trafficObj1,'FrameRate');
implay(taggedCars,frameRate);