文档

在交通视频中检测汽车

这个例子展示了如何在交通视频中检测车辆。您可以使用图像处理工具箱™可视化和分析视频或图像序列。这个例子使用了VideoReader(MATLAB®),implay,以及其他图像处理工具箱功能,以检测交通视频中的浅色汽车。请注意,VideoReader具有特定于平台的功能,可能无法在某些平台上读取所提供的Motion JPEG2000视频。看到的文档VideoReader获取有关您的平台支持哪些格式的信息。万博1manbetx

步骤1:使用videereader访问视频

VideoReader函数构造了一个多媒体读取器对象,该对象可以从多媒体文件中读取视频数据。看到的文档VideoReader获取有关您的平台支持哪些格式的信息。万博1manbetx

使用VideoReader访问视频并获得有关它的基本信息。

trafficVid =视频阅读器(“traffic.mj2”
trafficVid =带有属性的videereader:普通属性:名称:'traffic。mj2' Path: '/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/images/imdata' Duration: 8 CurrentTime: 0 Tag: " UserData:[]视频属性:宽度:160高度:120帧速率:15比特像素:24 VideoFormat: 'RGB24'

get方法提供有关视频的更多信息,例如以秒为单位的持续时间。

get (trafficVid)
obj =带有属性的videereader:普通属性:名称:'流量。mj2' Path: '/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/images/imdata' Duration: 8 CurrentTime: 0 Tag: " UserData:[]视频属性:宽度:160高度:120帧速率:15比特像素:24 VideoFormat: 'RGB24'

步骤2:用IMPLAY探索视频

浏览视频implay

implay (“traffic.mj2”);

步骤3:开发你的算法

在处理视频数据时,从视频中选择一个有代表性的帧并在该帧上开发算法会很有帮助。然后,该算法可以应用于视频中所有帧的处理。

对于这个汽车标记应用程序,检查一个包含浅色和深色汽车的框架。当图像有很多结构时,比如交通视频帧,在尝试检测感兴趣的对象之前,尽可能地简化图像是有用的。对于汽车标记应用程序,一种方法是抑制图像中不是浅色汽车的所有对象(深色汽车、车道、草地等)。通常,需要结合一些技术来移除这些无关的对象。

从视频帧中删除深色汽车的一种方法是使用imextendedmax函数。该函数返回一个二值图像,用于识别强度值高于指定阈值(称为区域极大值)的区域。图像中像素值低于此阈值的所有其他对象都成为背景。为了消除深色汽车,确定图像中这些物体的平均像素值。(使用rgb2gray将原始视频从RGB转换为灰度。)您可以使用像素区域工具implay查看像素值。在调用时指定平均像素值(或稍高的值)作为阈值imextendedmax.在本例中,将值设置为50。

darkCarValue = 50;darkCar = rgb2gray(read(trafficVid,71));noDarkCar = imextendedmax(darkCar, darkCarValue);imshow (darkCar)

图中,imshow (noDarkCar)

在处理后的图像中,注意大部分深色的汽车物体被移除,但许多其他无关的物体仍然保留,特别是车道标记。区域极大值处理不会删除车道标记,因为它们的像素值高于阈值。要删除这些对象,可以使用形态学函数imopen.该函数使用形态学处理从二值图像中删除小对象,同时保留大对象。在使用形态处理时,必须决定操作中使用的结构元素的大小和形状。因为车道标记是又长又薄的物体,所以使用半径与车道标记宽度相对应的圆盘形结构元素。您可以使用像素区域工具implay来估计这些物体的宽度。本例中设置为2。

Sedisk = strel(“磁盘”2);noSmallStructures = imopen(noDarkCar, sedisk);imshow (noSmallStructures)

要完成该算法,请使用regionprops求物体的质心noSmallStructures(应该是浅色的车)。使用此信息将标签定位在原始视频中的浅色汽车上。

步骤4:将算法应用到视频中

汽车标签应用程序在循环中一次处理一帧视频。(因为一个典型的视频包含大量的帧,一次读取和处理所有帧会占用大量内存。)

一个小视频(如本例中的视频)可以一次处理,有许多功能提供这种功能。有关更多信息,请参见的文档

为了更快的处理,请预先分配用于存储处理过的视频的内存。

nframes = trafficVid.NumberOfFrames;I = read(trafficVid, 1);taggedCars = 0 ([size(I,1) size(I,2) 3 nframes], class(I));1: nframes singleFrame = read(trafficVid, k);%转换为灰度做形态处理。I = rgb2gray(singleFrame);移除深色汽车。noDarkCars = imextendedmax(I, darkCarValue);移除车道标记和其他非盘状结构。。noSmallStructures = imopen(noDarkCars, sedisk);移除小结构。noSmallStructures = bwareaopen(noSmallStructures, 150);获取帧中每个剩余对象的面积和质心。的面积最大的物体是浅色的汽车。创建一个副本%的原始帧,并通过改变质心像素来标记汽车%值变为红色。taggedCars(:,:,:,k) = singleFrame;stats = regionprops(noSmallStructures, {“重心”“区域”});如果~isempty([stats.Area]) areaArray = [stats.Area];[junk,idx] = max(areaArray);c = stats(idx).Centroid;C =地板(fliplr(C));宽度= 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;结束结束

第五步:可视化结果

获取原始视频的帧率并使用它来查看taggedCarsimplay

frameRate = trafficVid.FrameRate;implay (taggedCars,帧速率);

这个话题有用吗?