主要内容

在交通视频中检测车辆

此示例演示如何使用图像处理工具箱™ 可视化和分析视频或图像序列。此示例使用VideoReader(MATLAB®),implay,以及其他图像处理工具箱函数,用于检测交通视频中的浅色车辆VideoReader具有特定于平台的功能,在某些平台上可能无法读取提供的运动JPEG2000视频。

步骤1:使用视频阅读器访问视频

这个VideoReader函数构造一个多媒体阅读器对象,该对象可以从多媒体文件中读取视频数据。看到VideoReader有关平台支持哪些格式的信息。金宝app

使用VideoReader访问视频并获取基本信息。

视频阅读器(‘traffic.mj2’)
trafficVid = videreader带有属性:General属性:Name: 'traffic. txt '。mj2' Path: '/mathworks/devel/bat/Bdoc21b/build/matlab/toolbox/images/imdata' Duration: 8 CurrentTime: 0 NumFrames: 120 Video Properties: Width: 160 Height: 120 FrameRate: 15 BitsPerPixel: 24 VideoFormat: 'RGB24'

get方法提供关于视频的更多信息,比如它的持续时间(以秒为单位)。

获取(流量视频)
obj=VideoReader with properties:General properties:Name:'traffic.mj2'路径:'/mathworks/devel/bat/Bdoc21b/build/matlab/toolbox/images/imdata'持续时间:8当前时间:0 NumFrames:120视频属性:宽度:160高度:120帧速率:15位像素:24视频格式:'RGB24'

步骤2:使用IMPLAY浏览视频

在中浏览视频implay

恳求(‘traffic.mj2’);

步骤3:开发算法

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

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

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

darkCarValue=50;darkCar=rgb2gray(读取(trafficVid,71));noDarkCar=imextendedmax(darkCar,darkCarValue);imshow(暗卡)图形,imshow(noDarkCar)

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

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

要完成该算法,请使用regionprops在中查找对象的质心的步骤小商店结构(应该是浅色车)。使用此信息在原始视频中定位浅色车上的标签。

步骤4:将算法应用于视频

汽车标记应用程序以循环的方式处理视频,每次一帧。(因为一个典型的视频包含大量的帧,一次读取和处理所有帧需要大量内存。)

可以一次处理一个小视频(如本例中的视频),并且有许多功能提供此功能。有关更多信息,请参阅处理图像序列

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

nframes=流量视频帧数;I=读取(交通视频,1);taggedCars=0([size(I,1)size(I,2)3nframes],class(I));对于k=1:n帧单帧=read(trafficVid,k);%转换为灰度以进行形态学处理。I=rgb2gray(单帧);%移除黑色汽车。noDarkCars = imextendedmax(I, darkCarValue);%移除车道标记和其他非盘形结构。noSmallStructures=imopen(noDarkCars,sedisk);%拆除小结构。noSmallStructures=BWAREOPEN(noSmallStructures,150);%获取帧中每个剩余物体的面积和质心。这个%对象中面积最大的是浅色汽车。创建一个副本%并通过更改质心像素来标记汽车%值为红色。taggedCars (::,:, k) = singleFrame;stats = regionprops(noSmallStructures, {)“质心”,“区域”});如果~isempty([stats.Area]) areaArray = [stats.Area];[垃圾,idx] = max (areaArray);c =统计(idx) .Centroid;c =地板(fliplr (c));宽度= 2;行= c (1) - width: c(1) +宽度;坳= c (2) - width: c(2) +宽度;taggedCars(行,坳1 k) = 255;taggedCars(行,col 2 k) = 0;taggedCars(行,坳3 k) = 0;终止终止

步骤5:可视化结果

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

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

另见

||||||

相关的话题