主要内容

在交通视频中检测车辆

这个示例展示了如何使用图像处理工具箱™可视化和分析视频或图像序列。这个示例使用VideoReader(MATLAB®),implay,以及其他图像处理工具箱函数来检测交通视频中的浅色汽车。请注意,VideoReader具有特定平台的功能,可能无法读取某些平台上提供的Motion JPEG2000视频。

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

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

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

trafficVid = 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方法提供关于视频的更多信息,比如它的持续时间(以秒为单位)。

get (trafficVid)
obj = VideoReader with properties: General properties: Name: 'traffic. obj = VideoReader with properties: Generalmj2' 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'

步骤2:用IMPLAY探索视频

探索implay

implay (“traffic.mj2”);

步骤3:开发算法

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

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

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

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

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

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

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

第四步:将算法应用到视频中

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

一个小视频(如本例中的视频)可以立即处理,并且有许多函数提供这种功能。有关更多信息,请参见过程的图像序列

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

nframes = trafficVid.NumberOfFrames;I = read(trafficVid, 1);taggedCars = 0 ([size(I,1) size(I,2) 3 nframes], class(I));k = 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];[垃圾,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;结束结束

第五步:形象化结果

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

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

另请参阅

||||||

相关的话题