本示例说明如何使用“图像处理工具箱”来可视化和分析视频或图像序列。本示例使用VideoReader(MATLAB),implay和其他图像处理工具箱功能来检测交通视频中的浅色汽车。请注意,VideoReader具有面向特定于平台的功能,在某些平台上可能无法读取提供的Motion JPEG2000视频。

步骤1:使用VideoReader读取视频

VideoReader函数构造一个多媒体读取对象,该对象可以从多媒体文件读取视频数据。请参阅VideoReader以了解您的平台所支持的格式。

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

 trafficVid = VideoReader('traffic.mj2')trafficVid = ​VideoReader with properties:​General Properties:Name: 'traffic.mj2'Path: '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/images/imdata'Duration: 8CurrentTime: 0NumFrames: 120​Video Properties:Width: 160Height: 120FrameRate: 15BitsPerPixel: 24VideoFormat: 'RGB24'

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

 get(trafficVid)obj = ​VideoReader with properties:​General Properties:Name: 'traffic.mj2'Path: '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/images/imdata'Duration: 8CurrentTime: 0NumFrames: 120​Video Properties:Width: 160Height: 120FrameRate: 15BitsPerPixel: 24VideoFormat: '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)figure, imshow(noDarkCar)

在经过处理的图像中,请注意在移除大多数深色汽车对象的同时,也残留了许多其他无关的对象,尤其是车道标记。区域最大值处理将不会删除车道标记,因为它们的像素值高于阈值。要删除这些对象,可以使用形态函数imopen。此函数使用形态学处理从二进制图像中删除小对象,同时保留大对象。使用形态学处理时,必须确定操作中使用的结构元素的大小和形状。由于车道标记是细长的物体,因此请使用半径等于车道标记宽度的圆盘形结构元素。您可以在implay中使用像素区域工具估算这些物体的宽度。对于此示例,将该值设置为2。

 sedisk = strel('disk',2);noSmallStructures = imopen(noDarkCar, sedisk);imshow(noSmallStructures)

要完成算法,请使用regionpropsnoSmallStructures(应该仅是浅色的汽车)中来查找其中的对象的质心。使用此信息将标签放置在原始视频中的浅色汽车上。

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

汽车标记应用程序每循环一次,处理一帧视频。(由于典型的视频包含大量帧,因此一次读取和处理所有帧会占用大量内存。)

可以一次处理一小段视频(如本例中的视频),并且有许多函数可以提供此功能。

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

 nframes = trafficVid.NumberOfFrames;I = read(trafficVid, 1);taggedCars = zeros([size(I,1) size(I,2) 3 nframes], class(I));​for k = 1 : nframessingleFrame = read(trafficVid, k);​% Convert to grayscale to do morphological processing.I = rgb2gray(singleFrame);​% Remove dark cars.noDarkCars = imextendedmax(I, darkCarValue);​% Remove lane markings and other non-disk shaped structures.noSmallStructures = imopen(noDarkCars, sedisk);​% Remove small structures.noSmallStructures = bwareaopen(noSmallStructures, 150);​% Get the area and centroid of each remaining object in the frame. The% object with the largest area is the light-colored car.  Create a copy% of the original frame and tag the car by changing the centroid pixel% value to red.taggedCars(:,:,:,k) = singleFrame;​stats = regionprops(noSmallStructures, {'Centroid','Area'});if ~isempty([stats.Area])areaArray = [stats.Area];[junk,idx] = max(areaArray);c = stats(idx).Centroid;c = floor(fliplr(c));width = 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;endend

步骤5:结果可视化

获取原始视频的帧率,然后将其用于在implay中查看taggedCars

 frameRate = trafficVid.FrameRate;implay(taggedCars,frameRate);


注:本文根据MATLAB官网内容修改而成。

可以看看以下的免费视频教程,特点是没有PPT,不掺水,直接编程环境下的实操课程:

用100分钟了解MATLAB编程

《MATLAB编程》视频课程 - 商业数据分析_数据可视化_Tableau免费课程_Tableau培训_自学Tableau_上海_1data.pro​www.1data.pro

欢迎您进一步了解以下MATLAB系列文章:

吃小羊:MATLAB作图实例:00:索引​zhuanlan.zhihu.com

吃小羊:MATLAB金融工具箱:00:索引​zhuanlan.zhihu.com

matlab 判断元素索引_MATLAB图像处理:08:在交通视频中检测汽车相关推荐

  1. matlab floor函数_MATLAB图像处理:08:在交通视频中检测汽车

    本示例说明如何使用"图像处理工具箱"来可视化和分析视频或图像序列.本示例使用VideoReader(MATLAB),implay和其他图像处理工具箱功能来检测交通视频中的浅色汽车. ...

  2. matlab 判断元素索引_MATLAB通过索引访问数组元素

    所谓索引,就是元素在数组这块内存中的顺序号,这与班级里的学号.银行的排号是一样的. 要想知道某个元素的索引,首先得知道数组元素在内存中是如何排布的. 对于一维数组,元素从前往后挨着存储即可:下标为 1 ...

  3. matlab 判断元素索引_matlab – 获取矩阵中n个最大元素的索引

    有几种方法,你可以做这个取决于你想如何处理重复的值.这里有一个解决方案,找到5个最大值(可能包括重复值)的索引: [sortedValues,sortIndex] = sort(A(:),'desce ...

  4. matlab连通区边界_Matlab图像处理学习笔记(一):二值化、开操作、连通区域提取、重心、ROI...

    本博客主要记录我学习运用matlab进行一些基本的图像处理的一些笔记,如果有不当的地方,欢迎批评指正,一起学习,一起进步. 本篇是第一篇,只涉及到一些基本的操作,涉及到的知识点如下: 1.二值化 2. ...

  5. matlab里toimage函数_MATLAB图像处理函数大全

    Import, Export, and Conversion Read and Write Image Data from Files imread Read image from graphics  ...

  6. MATLAB 长度和像素_MATLAB图像处理:把照片变成素描风格 V2 (1) 线描

    这是把照片变素描的第二种算法.感谢 @fandongxu 的提议. 算法出自于这篇论文:Combining Sketch and Tone for Pencil Drawing Production ...

  7. Knockout获取数组元素索引的2种方法,在MVC中实现

    在遍历数组.集合的时候,通常要获取元素的索引,本篇体验使用Knockout获取索引的2种方法. 假设有这样的一个模型: namespace UseIndex.Models {public class ...

  8. MATLAB应用实战系列(七十七)-【图像处理】COVID-19 防疫应用口罩检测

    前言 有关新冠研究的深度学习应用呈现显著增长,这在一定程度上得益于普遍传播且易于获取的公开数据集. 世卫组织/蒙特利尔大学的胸部 X 射线数据集(https://github.com/ieee8023 ...

  9. matlab修改图片位深度_Matlab 图像处理基本操作

    http://blog.sina.com.cn/s/blog_4a93ccea0100d1lw.html 一.图像基本操作 1.读取图像并显示: >> clear;close all    ...

最新文章

  1. tableau可视化数据分析60讲(九)-tableau数值计算字符串计算(重点知识)
  2. 缠绕多年的PCIE通道数问题终于完全明白了,欢迎指正
  3. 前端学习(2192):Promise的all的使用
  4. Bash : 索引数组
  5. Python导入运行的当前模块报错
  6. 国产自主可控的代码自动生成工具SkyEye
  7. Android逆向笔记-通过ApkTool源码分析未能反编译APK的原因
  8. DB2 char()函数引起全表扫描
  9. (工作中)Apache常见配置
  10. 04_数字的处理方法(保留小数点两位、将数字转化为千分位格式)
  11. CSS三大特性(层叠/继承/优先)
  12. 联通光纤宽带获取管理员密码和公网ip
  13. TOF相机(Time of Fight Camera)(维基百科全翻译版)
  14. 计算机科学期刊催稿,围观!520 ,最“专业”的表白方式
  15. 一进制存在吗?为什么?
  16. 史上最详细的ConcurrentHashMap详解--源码分析
  17. 使用Caffe尝试DeepID
  18. Mac上鼠标滚轮方向是和Win相反的,系统中设置后触摸板的方向又跟着变了
  19. 学习平面设计的软件都有哪些?
  20. Java模拟抽奖。奖池有以下几个奖项:【2,1888,588,388,2888】打印出抽奖结果,要求随机且不重复。两种方法(代码和优化后的代码)

热门文章

  1. 如何修改服务器标题,修改DEDECMS网页TITLE标签的方法
  2. lua --- 表操作
  3. vscode php debug
  4. 【FileOutputStream类:文档中的换行与追加】
  5. [LeetCode] Z字型变换
  6. 第一篇:容易遗忘的“枚举”
  7. Eclipse导出APK文件报错 android lint problem
  8. dispatch_after中时间的计算
  9. 标志寄存器操作(待续)
  10. C#实现 获取指定字节长度 中英文混合字符串 的方法