分享

17.3 检测交通视频中的汽车目标 - 51CTO.COM

 寒山月 2010-04-14

17.3 检测交通视频中的汽车目标

http://book.51cto.com  2009-06-24 13:35  张强/王正林  电子工业出版社  我要评论()
  • 摘要:《精通MATLAB图像处理》第17章MATLAB图像分割实战,本章主要讲述了图像分割方面的7大实例,读者通过这些实例,能够熟练掌握MATLAB在图像分割方面的应用。本节为大家介绍检测交通视频中的汽车目标。
  • 标签:MATLAB  图像处理  精通MATLAB图像处理

第17章  MATLAB图像分割实战

17.3  检测交通视频中的汽车目标

检测视频中汽车目标的基本步骤如下:

读取视频文件;

读取一帧图像并检测图像中的汽车;

使用循环逐帧对图像进行检测。

下面我们通过一个例子来显示如何在交通视文件流中检测浅颜色的汽车。

例17-4   检测运动的汽车。

视频文件是由一帧一帧的图像按照一定顺序连接而成,对图像的处理方法同样适用于对视频文件的处理,只不过是逐帧选取图像,然后对每一帧图像进行处理,最后再将处理后的每帧图像按照原来的顺序连接成视频。

在智能交通中,我们通常需要对汽车的车牌号进行识别或者对某种颜色的汽车进行检测。

【本例要点】本例中使用了图像处理工具箱中很多视频处理的函数,如读取文件mmreader函数,并且使用implay函数使视频可视化。视频处理的基础仍是图像处理,在本例中根据汽车的颜色和形状来确定汽车的存在,这其中涉及很多数学形态学的操作,包括imextendedmax,imopen,bwareaopen等函数。

本例的基本步骤如下:

读取视频文件。

代码如下:

  1. trafficObj = mmreader('traffic.avi');%从多媒体文件中读取数据  
  2. get(trafficObj)%获取视频信息  
  3. implay('traffic.avi');%播放视频 

在这一步骤中,首先使用mmreader函数从多媒体文件中读取视频数据,mmreader函数可以读取的文件格式包括:AVI,MPG,MPEG,WMV,ASF和ASX,本例程序中读取的视频格式为AVI格式,使用implay函数播放视频如图17-11所示,mmreader函数还可以返回关于多媒体文件的信息,如下所示:

  1. Summary of Multimedia Reader Object for 'traffic.avi'.  
  2.   Video Parameters:  15.00 frames per second, RGB24 160x120.  
  3.                      120 total video frames available. 

为了获取关于多媒体文件更多的信息,可以使用get函数,它可以获得诸如视频持续时间、路径等更多的信息,如下所示:

  1. General Properties:  
  2.     Duration = 8.0000  
  3.     Name = traffic.avi  
  4.     Path = F:\MATLAB\R2008b\toolbox\images\imdemos  
  5.     Tag =   
  6.     Type = mmreader  
  7.     UserData = []  
  8.   Video Properties:  
  9.     BitsPerPixel = 24  
  10.     FrameRate = 15.0000  
  11.     Height = 120  
  12.     NumberOfFrames = 120  
  13.     VideoFormat = RGB24  
  14.     Width = 160 
 
(点击查看大图)图17-11  交通视频

读取一帧图像并进行处理。

代码如下:

  1. darkCarValue = 50;%阈值  
  2. darkCar = rgb2gray(read(trafficObj,71));%真彩色图像转化为灰度图像  
  3. noDarkCar = imextendedmax(darkCar,darkCarValue);%去除图像中深色的汽车  
  4. figure; subplot(131)  
  5. imshow(darkCar)%显示灰度图像  
  6. subplot(132); imshow(noDarkCar)%显示浅颜色的车  
  7. sedisk = strel('disk',2);%圆形结构元素  
  8. noSmallStructures = imopen(noDarkCar, sedisk);%开操作  
  9. subplot(133);  imshow(noSmallStructures)%去除小目标 

对于视频数据,包含很多帧图像,我们一般采取的处理方法是在视频数据中选取一幅有代表性的图像帧,在这幅图像中开发相应的算法,然后把这个算法应用到所有帧图像中。

我们选取一帧图像,这帧图像中包含深颜色的汽车和浅颜色的汽车。除了汽车外,还有很多其他结构的目标,例如公路、草坪等。

在检测浅颜色汽车前,一般需要尽可能地简化图像,通常使用的方法是采取一系列的形态学操作来去除这些无关的目标。由于这个视频文件的每帧图像都是真彩色图像,因此首先将真彩色图像转化为灰度图像,如图17-12左图所示。

 
(点击查看大图)图17-12  视频中的一帧图像及其处理结果

在视频数据中,去除深色汽车一般使用imextendedmax函数,这个函数返回二值图像,其中亮度值大于某个阈值的区域会在结果中显示出来,而亮度值小于这个阈值的目标则变成背景,如图17-12中间的图像所示。

为了去除深颜色的汽车,可以使用像素区域工具确定图像中深颜色汽车所在区域的像素值,在这个程序中,调用imextendedmax函数时使用50作为阈值。

虽然在处理后的图像中,大部分深颜色目标已经被去除,但仍然有少部分无关的目标存在,尤其是公路上的标志线。使用imextendedmax函数不能去除公路上的标志线,因为公路标志线区域的像素值也超过给定的阈值。

为了出去这些目标,可以使用形态学的开操作函数imopen来进行开操作。这个函数在使用形态学处理二值图像,在保留大目标的同时,可以去除小目标,如图17-12右图所示。

在使用形态学操作时,要首先确定函数使用的结构元素大小和形状,由于公路上的标志线是很长很细的,因此可以使用圆形的结构元素对这些目标进行去除,其中圆形结构的半径等于标志线的宽度。在这个程序中,标志线的宽度大约为2,因此结构元素的半径也为2。

经过处理后的图像中,包含的目标为浅颜色的目标,即图像中浅颜色的汽车。使用bwlabel函数可以返回一个标签矩阵,通过这个标签矩阵可以进一步求得更多的参数。例如可以使用regionprops函数获取目标的质心,并且使用质心来确定浅颜色汽车标签的位置。

使用循环处理视频数据。

代码如下:

  1. nframes = get(trafficObj, 'NumberOfFrames');%帧数  
  2. I = read(trafficObj, 1);%第一帧图像  
  3. taggedCars = zeros([size(I,1) size(I,2) 3 nframes], class(I));  
  4. for k = 1 : nframes  
  5.     singleFrame = read(trafficObj, k);%读取图像  
  6.     I = rgb2gray(singleFrame);%转化为灰度图像  
  7.     noDarkCars = imextendedmax(I, darkCarValue);%去除深色的汽车  
  8.     noSmallStructures = imopen(noDarkCars, sedisk);%去除线性目标  
  9.     noSmallStructures = bwareaopen(noSmallStructures, 150);%去小目标  
  10.     L = bwlabel(noSmallStructures);%生成标签矩阵  
  11.     taggedCars(:,:,:,k) = singleFrame;  
  12.     if any(L(:))  
  13.        stats = regionprops(L, {'centroid','area'});%求取质心和面积  
  14.        areaArray = [stats.Area];%求取目标对象的面积  
  15.        [junk,idx] = max(areaArray);%求取最大面积  
  16.        c = stats(idx).Centroid;%最大面积对应的圆心  
  17.        c = floor(fliplr(c));  
  18.        width = 2;  
  19.        row = c(1)-width:c(1)+width;%标注目标  
  20.        col = c(2)-width:c(2)+width;  
  21.        taggedCars(row,col,1,k) = 255;%设置为红色  
  22.        taggedCars(row,col,2,k) = 0;  
  23.        taggedCars(row,col,3,k) = 0;  
  24.     end  
  25. end  
  26. frameRate = get(trafficObj,'FrameRate');  
  27. implay(taggedCars,frameRate);%播放视频 

由于交通视频是由一系列的图像连接而成,在处理时需要使用循环逐帧对数据进行处理。处理后的视频数据中使用标签对浅颜色汽车进行标注,如图17-13所示。

 
(点击查看大图)图17-13  浅颜色汽车的检测

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多