这个示例展示了如何使用图像处理工具箱™可视化和分析视频或图像序列。这个示例使用VideoReader
(MATLAB®),implay
,以及其他图像处理工具箱函数来检测交通视频中的浅色汽车。请注意,VideoReader
具有特定平台的功能,可能无法读取某些平台上提供的Motion JPEG2000视频。
的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'
探索implay
.
implay (“traffic.mj2”);
在处理视频数据时,从视频中选择一个有代表性的帧并在该帧上开发算法是很有帮助的。然后应用该算法对视频中的所有帧进行处理。
对于这个汽车标签应用程序,检查一个包括浅色和深色汽车的框架。当图像具有许多结构时,如交通视频帧,在尝试检测感兴趣的对象之前,尽可能地简化图像是有用的。对于汽车标签应用程序,一种方法是抑制图像中所有非浅色汽车的对象(深色汽车、车道、草地等)。通常,需要结合各种技术来移除这些无关的对象。
一种从视频帧中删除深色汽车的方法是使用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;结束结束
获取原始视频的帧率并使用它来查看taggedCars
在implay
.
帧速率= trafficVid.FrameRate;implay (taggedCars,帧速率);
视频查看器|VideoReader
|rgb2gray
|imextendedmax
|imopen
|regionprops
|bwareaopen