当前位置:首页 » 操作系统 » 图片跟踪算法

图片跟踪算法

发布时间: 2022-05-07 01:50:03

A. 计算机视觉领域主流的算法和方向有哪些

人工智能是当下很火热的话题,其与大数据的完美结合应用于多个场景,极大的方便了人类的生活。而人工智能又包含深度学习和机器学习两方面的内容。深度学习又以计算机视觉和自然语言处理两个方向发展的最好,最火热。大家对于自然语言处理的接触可能不是很多,但是说起计算机视觉,一定能够马上明白,因为我们每天接触的刷脸支付等手段就会和计算机视觉挂钩。可以说计算机视觉的应用最为广泛。

目标跟踪,就是在某种场景下跟踪特定对象的过程,在无人驾驶领域中有很重要的应用。目前较为流行的目标跟踪算法是基于堆叠自动编码器的DLT。语义分割,则是将图像分为像素组,再进行标记和分类。目前的主流算法都使用完全卷积网络的框架。实例分割,是指将不同类型的实例分类,比如用4种不同颜色来标记4只猫。目前用于实例分割的主流算法是Mask R-CNN。

B. 计算机视觉中,目前有哪些经典的目标跟踪算法

电脑的视觉,是用扫描仪完成的。
扫描仪是文字和图片输入的主要设备,相当于电脑的眼睛,能够通过光电器件把光信号转换为电信号,把电信号通过模数转换器转化为数字信号传输到电脑中,把大量的文字、图片信息输入到电脑中。
扫描仪的关键器件是电荷耦合器,采用三棱镜分色光学系统,以三棱镜来分离自然光为红、绿、蓝三原色来扫描图形。
平板式扫描仪,文字和图片固定在一个玻璃窗口中,扫描头在文字或图片下移动,接受来自文字或图片的反射光,这些反射线由一个镜面系统进行反射,通过凸透镜把光聚焦到光敏二极管上面,把光变成电流,最后再转换成数字信息存储在电脑中,它能一次扫描,读入一整页的文字或图片。
扫描仪的性能指标包括:光学分辨率、色彩位数、扫描速度和幅面大小。光学分辨率也叫水平分辨率,单位为像素/英寸或点/英寸。色彩位数是扫描仪对图片色彩的分辨能力。
希望我能帮助你解疑释惑。

C. 在双目视觉系统中有哪些比较好的跟踪算法

与普通的图像模板匹配不同的是,立体匹配是通过在两幅或多幅存在视点差异、几何畸变、灰度畸变、噪声干扰的图像对之间进行的,不存在任何标准模板进行匹配。立体匹配方法一般包含以下三个问题:(1)基元的选择,即选择适当的图像特征如点、直线、相位等作为匹配基元;(2)匹配的准则,将关于物理世界的某些固有特征表示为匹配所必须遵循的若干规则,使匹配结果能真实反映景物的本来面目;(3)算法结构,通过利用适当的数学方法设计能正确匹配所选择基元的稳定算法。 根据匹配基元的不同,立体视觉匹配算法目前主要分为三大类,即区域匹配、相位匹配和特征匹配: 基于区域灰度的匹配算法是把一幅图像(基准图)中某一点的灰度邻域作为模板,在另一幅图像(待匹配图)中搜索具有相同(或相似)灰度值分布的对应点邻域,从而实现两幅图像的匹配。这类算法的性能取决于度量算法及搜索策略的选择。另外,也必须考虑匹配窗口大小、形式的选择,大窗口对于景物中存在的遮挡或图像不光滑的情况会更多的出现误匹配,小窗口则不具有足够的灰度变化信息,不同的窗口形式对匹配信息也会有不同的影响。因此应该合理选取匹配区域的大小和形式来达到较好的匹配结果。 相位匹配是近二十年发展起来的一种匹配算法,相位作为匹配基元,即认为图像对中的对应点局部相位是一致的。最常用的相位匹配算法有相位相关法和相位差——频率法,虽然该方法是一种性能稳定、具有较强的抗辐射抗透视畸变能力、简单高效、能得到稠密视差图的特征匹配方法。但是,当局部结构存在的假设不成立时,相位匹配算法因带通输出信号的幅度太低而失去有效性,也就是通常提到的相位奇点问题,在相位奇点附近,相位信息对位置和频率的变化极为敏感,因此用这些像素所确定的相位差异来衡量匹配误差将导致极不可靠的结果。此外,相位匹配算法的收敛范围与带通滤波器的波长有关,通常要考虑相位卷绕,在用相位差进行视差计算时,由于所采用的相位只是原信号某一带通条件下的相位,故视差估计只能限制在某一限定范围之内,随视差范围的增大,其精确性会有所下降。 基于特征的图像匹配方法是目前最常用的方法之一,由于它能够将对整个图像进行的各种分析转化为对图像特征(特征点、特征曲线等)的分析的优点,从而大大减小了图像处理过程的计算量,对灰度变化、图像变形、噪音污染以及景物遮挡等都有较好的适应能力。 基于特征的匹配方法是为使匹配过程满足一定的抗噪能力且减少歧义性问题而提出来的。与基于区域的匹配方法不同,基于特征的匹配方法是有选择地匹配能表示景物自身特性的特征,通过更多地强调空间景物的结构信息来解决匹配歧义性问题。这类方法将匹配的搜索范围限制在一系列稀疏的特征上。利用特征间的距离作为度量手段,具有最小距离的特征对就是最相近的特征对,也就是匹配对。特征间的距离度量有最大最小距离、欧氏距离等。 特征点匹配算法严格意义上可以分成特征提取、特征匹配和消除不良匹配点三步。特征匹配不直接依赖于灰度,具有较强的抗干扰性。该类方法首先从待匹配的图像中提取特征,用相似性度量和一些约束条件确定几何变换,最后将该变换作用于待匹配图像。匹配中常用的特征基元有角点、边缘、轮廓、直线、颜色、纹理等。同时,特征匹配算法也同样地存在着一些不足,主要表现为: (l)特征在图像中的稀疏性决定了特征匹配只能得到稀疏的视差场,要获得密集的视差场必须通过使用插值的过程,插值过程通常较为复杂。 (2)特征的提取和定位的准确与否直接影响特征匹配结果的精确度。 (3)由于其应用场合的局限性,特征匹配往往适用于具有特征信息显着的环境中,在缺少显着主导特征环境中该方法有很大困难。 总之,特征匹配基元包含了算法编程上的灵活性以及令人满意的统计特性。算法的许多约束条件均能清楚地应用于数据结构,而数据结构的规则性使得特征匹配非常适用于硬件设计。例如,基于线段的特征匹配算法将场景模型描绘成相互联结的边缘线段,而不是区域匹配中的平面模型,因此能很好地处理一些几何畸变问题,对对比度和明显的光照变化等相对稳定。特征匹配由于不直接依赖于灰度,计算量小,比基于区域的匹配算法速度快的多。且由于边缘特征往往出现在视差不连续的区域,特征匹配较易处理立体视觉匹配中的视差不连续问题。

D. 高效光线跟踪的算法有那些

浅析3D Max中的高级灯光技术

摘要:3D Max在3D制作软件中渲染功能一直比较薄弱,使其只甘居Maya等3D制作软件之下。为弥补这一缺陷,在5.0版中3D Max增加了高级灯光技术,拥有光能传递、光线追踪器两个全局照明系统,在渲染功能上有了非常显着的改善。本文主要介绍新的光能传递算法。

关键词:渲染 全局照明 光能传递

3D MAX 的渲染功能一直比较薄弱,其效果远不如其他软件(例如Maya)那样逼真,这在很大程度上是因为3D MAX默认的灯光技术不够先进。

在3D MAX中经常使用“光线追踪(Ray-Trace)”材质,与之相联系的就是光线追踪渲染算法。这种算法假设发出很多条光线,光线遇到物体时,被遮挡、反射或者折射,通过跟踪这些光线,就可以得到场景的渲染效果。但是这种方法有一个严重的缺点,就是不能反映现实生活中光的很多特性。例如,在现实生活中,灯光照射到物体后,每个物体都会发射一部分光线,形成环境光,从而导致没有被灯光直射的物体也能被照明,而不是完全出于黑暗状态。又如,把一个红色物体靠近白色的墙壁,那么墙壁靠近物体的地方会显出也带有红色。还有很多诸如此类的灯光效果,使用光线追踪算法都不能产生。

为了解决这些问题,人们发明了更先进的算法来计算灯光的效果,这就是“光能传递(Radiosity)”算法。这种算法把光作为光量子看待(实际上更符合现代物理学),通过计算光量子的能量分布获得渲染结果。这种方法能够获得最逼真的照明效果,因此,通常将光能传递算法和光线追踪算法结合起来,以获得最佳的效果。3D MAX5.0新增的高级光照功能则包含了两个不同的系统:光能传递(radiosity)和光线追踪器(light tracer)。它所得到的结果非常接近对真实事物的再现。

光线追踪器比较通用,也容易使用,使用它不需要理解许多技术概念,任何模型和灯的类型都适用。光能传递相对较复杂,需要为这种处理方式专门准备模型和场景。灯必须是光度控制灯,材质也必须仔细设计。但光能传递在物理上是精确的,对于建筑模型的精确设计是必须的,这一点非常重要,尤其当建模的目的是进行光照分析时。另外,光线追踪器的结果与视点无关,而光能传递不是这样的。光线追踪器在每一帧都计算光照。光能传递只会计算一次,除非场景中的物体移动了或灯发生了变化,或者是从另一个不同的视点渲染场景时。基本原则是光线追踪器更适用于有大量光照的室外场景、角色动画和在空旷的场景中渲染物体。光能传递更适合于使用了聚光灯的室内场景和建筑渲染。

使用光线追踪器进行室内光照仿真时,为避免平坦表面上的噪波,可能需要相当高质量的设定和很长的渲染时间。光能传递则可以用更短的时间提供更好的效果。另一方面,光能传递用于有许多多边形的角色模型时,需要额外的细化步骤、过滤,甚至是Regathering(重新聚合)。而光线追踪器适用默认的设置一次渲染就可以得到更好的效果。

传统的渲染引擎值考虑直接光照

不考虑反射光,然而,反射光是

一个场景的重要组成部分。 对相同的场景使用全局光照渲染,

上图使用了光能传递(radiosity)

就可以得到一种真实的结果。

光能传递是在一个场景中重现从物体表面反射的自然光线,实现更加真实和物理上精确的照明结果。如图所示。光能传递基于几何学计算光从物体表面的反射。几何面(三角形)成为光能传递进行计算的最小单位。大的表面可能需要被细分为小的三角形面以获得更精确的结果。场景中三角形面的数目很重要。如果数目不够结果会不精确,但如果太多时间又会太长。光能传递提供一种将大的三角形面自动细分的方法,同时也可以控制每个物体的细分和细化程度。光能传递依赖于材质和表面属性以获得物理上精确的结果。在场景中进行建模时必须牢记这一点。要使用光度控制灯,而且模型的几何结构应尽可能准确。

1.单位

要获得精确的结果,场景中作图单位是一个基础。如果单位是“英寸”,一个100×200×96单位的房间可以被一个相当于60瓦灯泡的光度控制灯正确照明,但如果单位是“米”,相同场景会变得非常暗。

2.光能传递的解决方案

光能传递是一个独立于渲染的处理过程,一旦解决方案被计算出来,结果被保存在几何体自己内部。对几何体或光照作改变将使原解决方案无效。解决方案是为整个场景全局计算的,这意味着它与视点无关。一旦计算出来,就可以从任何方向观察场景。当摄像机在一个固定场景中移动时,这将会节省时间。如果对几何体或灯作了动画,每一帧都必须计算光能传递。渲染菜单中的选项允许定义如何处理光能传递过程。

E. 求一篇:图像识别的主要方法及其特点的比较的开题报告。速度!!十万火急,就这么多分!!

利用计算机进行遥感信息的自动提取则必须使用数字图像,由于地物在同一波段、同一地物在不同波段都具有不同的波谱特征,通过对某种地物在各波段的波谱曲线进行分析,根据其特点进行相应的增强处理后,可以在遥感影像上识别并提取同类目标物。早期的自动分类和图像分割主要是基于光谱特征,后来发展为结合光谱特征、纹理特征、形状特征、空间关系特征等综合因素的计算机信息提取。
常用的信息提取方法是遥感影像计算机自动分类。首先,对遥感影像室内预判读,然后进行野外调查,旨在建立各种类型的地物与影像特征之间的对应关系并对室内预判结果进行验证。工作转入室内后,选择训练样本并对其进行统计分析,用适当的分类器对遥感数据分类,对分类结果进行后处理,最后进行精度评价。遥感影像的分类一般是基于地物光谱特征、地物形状特征、空间关系特征等方面特征,目前大多数研究还是基于地物光谱特征。
在计算机分类之前,往往要做些预处理,如校正、增强、滤波等,以突出目标物特征或消除同一类型目标的不同部位因照射条件不同、地形变化、扫描观测角的不同而造成的亮度差异等。
利用遥感图像进行分类,就是对单个像元或比较匀质的像元组给出对应其特征的名称,其原理是利用图像识别技术实现对遥感图像的自动分类。计算机用以识别和分类的主要标志是物体的光谱特性,图像上的其它信息如大小、形状、纹理等标志尚未充分利用。
计算机图像分类方法,常见的有两种,即监督分类和非监督分类。监督分类,首先要从欲分类的图像区域中选定一些训练样区,在这样训练区中地物的类别是已知的,用它建立分类标准,然后计算机将按同样的标准对整个图像进行识别和分类。它是一种由已知样本,外推未知区域类别的方法;非监督分类是一种无先验(已知)类别标准的分类方法。对于待研究的对象和区域,没有已知类别或训练样本作标准,而是利用图像数据本身能在特征测量空间中聚集成群的特点,先形成各个数据集,然后再核对这些数据集所代表的物体类别。
与监督分类相比,非监督分类具有下列优点:不需要对被研究的地区有事先的了解,对分类的结果与精度要求相同的条件下,在时间和成本上较为节省,但实际上,非监督分类不如监督分类的精度高,所以监督分类使用的更为广泛。
细小地物在影像上有规律地重复出现,它反映了色调变化的频率,纹理形式很多,包括点、斑、格、垅、栅。在这些形式的基础上根据粗细、疏密、宽窄、长短、直斜和隐显等条件还可再细分为更多的类型。每种类型的地物在影像上都有本身的纹理图案,因此,可以从影像的这一特征识别地物。纹理反映的是亮度(灰度)的空间变化情况,有三个主要标志:某种局部的序列性在比该序列更大的区域内不断重复;序列由基本部分非随机排列组成;各部分大致都是均匀的统一体,在纹理区域内的任何地方都有大致相同的结构尺寸。这个序列的基本部分通常称为纹理基元。因此可以认为纹理是由基元按某种确定性的规律或统计性的规律排列组成的,前者称为确定性纹理(如人工纹理),后者呈随机性纹理(或自然纹理)。对纹理的描述可通过纹理的粗细度、平滑性、颗粒性、随机性、方向性、直线性、周期性、重复性等这些定性或定量的概念特征来表征。
相应的众多纹理特征提取算法也可归纳为两大类,即结构法和统计法。结构法把纹理视为由基本纹理元按特定的排列规则构成的周期性重复模式,因此常采用基于传统的Fourier频谱分析方法以确定纹理元及其排列规律。此外结构元统计法和文法纹理分析也是常用的提取方法。结构法在提取自然景观中不规则纹理时就遇到困难,这些纹理很难通过纹理元的重复出现来表示,而且纹理元的抽取和排列规则的表达本身就是一个极其困难的问题。在遥感影像中纹理绝大部分属随机性,服从统计分布,一般采用统计法纹理分析。目前用得比较多的方法包括:共生矩阵法、分形维方法、马尔可夫随机场方法等。共生矩阵是一比较传统的纹理描述方法,它可从多个侧面描述影像纹理特征。
图像分割就是指把图像分成各具特性的区域并提取出感兴趣目标的技术和过程,此处特性可以是像素的灰度、颜色、纹理等预先定义的目标可以对应单个区域,也可以对应多个区域。
图像分割是由图像处理到图像分析的关键步骤,在图像工程中占据重要的位置。一方面,它是目标表达的基础,对特征测量有重要的影响;另一方面,因为图像分割及其基于分割的目标表达、特征抽取和参数测量的将原始图像转化为更抽象更紧凑的形式,使得更高层的图像分析和理解成为可能。
图像分割是图像理解的基础,而在理论上图像分割又依赖图像理解,彼此是紧密关联的。图像分割在一般意义下是十分困难的问题,目前的图像分割一般作为图像的前期处理阶段,是针对分割对象的技术,是与问题相关的,如最常用到的利用阈值化处理进行的图像分割。
图像分割有三种不同的途径,其一是将各象素划归到相应物体或区域的象素聚类方法即区域法,其二是通过直接确定区域间的边界来实现分割的边界方法,其三是首先检测边缘象素再将边缘象素连接起来构成边界形成分割。
阈值是在分割时作为区分物体与背景象素的门限,大于或等于阈值的象素属于物体,而其它属于背景。这种方法对于在物体与背景之间存在明显差别(对比)的景物分割十分有效。实际上,在任何实际应用的图像处理系统中,都要用到阈值化技术。为了有效地分割物体与背景,人们发展了各种各样的阈值处理技术,包括全局阈值、自适应阈值、最佳阈值等等。
当物体与背景有明显对比度时,物体的边界处于图像梯度最高的点上,通过跟踪图像中具有最高梯度的点的方式获得物体的边界,可以实现图像分割。这种方法容易受到噪声的影响而偏离物体边界,通常需要在跟踪前对梯度图像进行平滑等处理,再采用边界搜索跟踪算法来实现。
为了获得图像的边缘人们提出了多种边缘检测方法,如Sobel, Canny edge, LoG。在边缘图像的基础上,需要通过平滑、形态学等处理去除噪声点、毛刺、空洞等不需要的部分,再通过细化、边缘连接和跟踪等方法获得物体的轮廓边界。
对于图像中某些符合参数模型的主导特征,如直线、圆、椭圆等,可以通过对其参数进行聚类的方法,抽取相应的特征。
区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或其它区域归并到目前的区域中从而逐步增长区域,直至没有可以归并的点或其它小区域为止。区域内象素的相似性度量可以包括平均灰度值、纹理、颜色等信息。
区域增长方法是一种比较普遍的方法,在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图像,如自然景物。但是,区域增长方法是一种迭代的方法,空间和时间开销都比较大。
基于像素级别的信息提取以单个像素为单位,过于着眼于局部而忽略了附近整片图斑的几何结构情况,从而严重制约了信息提取的精度,而面向对象的遥感信息提取,综合考虑了光谱统计特征、形状、大小、纹理、相邻关系等一系列因素,因而具有更高精度的分类结果。面向对象的遥感影像分析技术进行影像的分类和信息提取的方法如下:
首先对图像数据进行影像分割,从二维化了的图像信息阵列中恢复出图像所反映的景观场景中的目标地物的空间形状及组合方式。影像的最小单元不再是单个的像素,而是一个个对象,后续的影像分析和处理也都基于对象进行。
然后采用决策支持的模糊分类算法,并不简单地将每个对象简单地分到某一类,而是给出每个对象隶属于某一类的概率,便于用户根据实际情况进行调整,同时,也可以按照最大概率产生确定分类结果。在建立专家决策支持系统时,建立不同尺度的分类层次,在每一层次上分别定义对象的光谱特征、形状特征、纹理特征和相邻关系特征。其中,光谱特征包括均值、方差、灰度比值;形状特征包括面积、长度、宽度、边界长度、长宽比、形状因子、密度、主方向、对称性,位置,对于线状地物包括线长、线宽、线长宽比、曲率、曲率与长度之比等,对于面状地物包括面积、周长、紧凑度、多边形边数、各边长度的方差、各边的平均长度、最长边的长度;纹理特征包括对象方差、面积、密度、对称性、主方向的均值和方差等。通过定义多种特征并指定不同权重,建立分类标准,然后对影像分类。分类时先在大尺度上分出"父类",再根据实际需要对感兴趣的地物在小尺度上定义特征,分出"子类"。

F. 现在所说的多目标跟踪是在单摄像头还是多摄像头下的

一、静态背景下的目标跟踪方法1、单目标:目标跟踪还可以分为单目标的跟踪和多目标的跟踪。单目标的静态背景下的目标跟踪指的是摄像头是固定在某一方位,其所观察的视野也是静止的。通常采用背景差分法,即先对背景进行建模,然后从视频流中读取图像(我们称之为前景图像),将前景图像与背景图像做差,就可以得到进入视野的目标物体。对于目标的描述,通常用目标连通区域的像素数目的多少来表达目标的大小,或者用目标区域的高宽比等。目标的位置信息可采用投影的方式来定位。2、多目标:静态环境下的多目标跟踪,需要确定每个目标的特征,位置,运动方向,速度等信息。3、预处理:由于获得的图像总会有着噪声,需要对图像做一些预处理,如高斯平滑,均值滤波,或者进行一些灰度拉伸等图像增强的操作。二、动态背景下的目标跟踪 摄像头在云台控制下的旋转,会使得他所采集的图像时可在变化,所以,对于整个目标跟踪过程来说,背景是变化,目标也是在整个过程中运动的,所以跟踪起来较有难度。 目前课题组提出的方案是:跟踪过程:在摄像头不同偏角情况下取得若干背景图片,建立背景图片库――>摄像头保持固定时,取得当前帧图片,与图片库中的背景图像匹配,背景差分(灰度差分?),获得目标――>目标特征提取――>实时获得当前帧图片,采用跟踪算法动态跟踪目标。 提取特征是一个难点,课题组提出多颜色空间分析的方法。根据彩色图像在不同的颜色空间里表征同一物体呈现出的同态性,可以把目标物体在不同的颜色空间里进行分解,并将这些关键特征信息进行融合,从而找出判别目标的本质特征。跟踪过程中采用的各种方法说明:1)在0-360度不同偏角时,获得背景图片,可进行混合高斯背景建模,建立图片库,以俯仰角和偏转角不同标志每张背景图片,以备匹配使用;2)背景差分获得目标后,对差分图像需要进行平滑、去噪等处理,去除干扰因素;3)对目标采用多颜色空间(HSV、YUV)特征提取,对不同颜色空间的特征相与(AND),得到目标特征,以更好的在当前帧图片中找到目标;4)实时得到的当前帧图片,进行混合高斯建模,排除树叶摇动等引起的背景变化;5)跟踪算法可采用多子块匹配方法、camshift方法等。

G. 什么叫图像跟踪技术,主要应用的什么领域

利用可见光成像和红外成像传感器实现实时目标成像跟踪是精确制导武器的核心技术,随着实际战场环境日益复杂,伪装、隐身等目标特性控制技术飞速发展,极大地增加了实时目标成像跟踪系统研究的难度。目前,尽管国内外对该领域的关键技术进行了大量的研究,并取得了一些成果,但实时成像跟踪系统研究中许多实际问题仍没有得到很好的解决,有待进一步深入研究。红外跟踪处理器系统对实时性要求极高,要求必须具有处理大数据量的能力,以保证系统的实时性;其次对系统的体积、功耗、稳定性等也有较严格的要求。实时信号处理算法中经常用到对图像的求和、求差运算,二维梯度运算,图像分割及区域特征提取等不同层次、不同种类的处理。其中有的运算本身结构比较简单,但是数据量大,计算速度要求高,适于用FPGA进行硬件实现;有些处理对速度并没有特殊的要求,但计算方式和控制结构比较复杂,难以用纯硬件实现,适于用运算速度高、寻址方式灵活、通信机制强大的DSP芯片来实现。本系统选择计算简单,匹配精度高的平均绝对差(MAD)算法,为了方便硬件实现,对算法加以适当改进,同时提高了系统运算速度及目标定位精度。并研究了相关跟踪置信度评估、模板自适应刷新准则,系统抗干扰能力,以及相似目标辨识、目标丢失判断和再捕获策略,有效地提高了系统复杂场景条件下目标跟踪的稳定性。

H. 如何使用opencv实现金字塔光流lk跟踪算法

#include <stdio.h>
#include <windows.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <opencv2\opencv.hpp>
using namespace cv;

static const double pi = 3.14159265358979323846;
inline static double square(int a)
{
return a * a;
}
/*该函数目的:给img分配内存空间,并设定format,如位深以及channel数*/
inline static void allocateOnDemand(IplImage **img, CvSize size, int depth, int channels)
{
if (*img != NULL) return;
*img = cvCreateImage(size, depth, channels);
if (*img == NULL)
{
fprintf(stderr, "Error: Couldn't allocate image. Out of memory?\n");
exit(-1);
}
}
/*主函数,原程序是读取avi视频文件,然后处理,我简单改成从摄像头直接读取数据*/
int main(int argc, char *argv[])
{

//读取摄像头
VideoCapture cap(0);
//读取视频文件

//VideoCapture cap; cap.open("optical_flow_input.avi");
if (!cap.isOpened())
{
return -1;
}
Mat frame;

/*
bool stop = false;
while (!stop)
{
cap >> frame;
// cvtColor(frame, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);
// imshow("当前视频", edges);
imshow("当前视频", frame);
if (waitKey(30) >= 0)
stop = true;
}
*/

//CvCapture *input_video = cvCaptureFromFile( "optical_flow_input.avi" );
//cv::VideoCapture cap = *(cv::VideoCapture *) userdata;

//if (input_video == NULL)
// {
// fprintf(stderr, "Error: Can't open video device.\n");
// return -1;
// }

/*先读取一帧,以便得到帧的属性,如长、宽等*/
//cvQueryFrame(input_video);

/*读取帧的属性*/
CvSize frame_size;
frame_size.height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
frame_size.width = cap.get(CV_CAP_PROP_FRAME_WIDTH);

/*********************************************************/

/*用于把结果写到文件中去,非必要
int frameW = frame_size.height; // 744 for firewire cameras
int frameH = frame_size.width; // 480 for firewire cameras
VideoWriter writer("VideoTest.avi", -1, 25.0, cvSize(frameW, frameH), true);

/*开始光流法*/
//VideoWriter writer("VideoTest.avi", CV_FOURCC('D', 'I', 'V', 'X'), 25.0, Size(640, 480), true);

while (true)
{
static IplImage *frame = NULL, *frame1 = NULL, *frame1_1C = NULL,
*frame2_1C = NULL, *eig_image = NULL, *temp_image = NULL,
*pyramid1 = NULL, *pyramid2 = NULL;

Mat framet;
/*获取第一帧*/
// cap >> framet;
cap.read(framet);
Mat edges;
//黑白抽象滤镜模式
// cvtColor(framet, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);

//转换mat格式到lpiimage格式
frame = &IplImage(framet);
if (frame == NULL)
{
fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
return -1;
}

/*由于opencv的光流函数处理的是8位的灰度图,所以需要创建一个同样格式的
IplImage的对象*/
allocateOnDemand(&frame1_1C, frame_size, IPL_DEPTH_8U, 1);

/* 把摄像头图像格式转换成OpenCV惯常处理的图像格式*/
cvConvertImage(frame, frame1_1C, 0);

/* 我们需要把具有全部颜色信息的原帧保存,以备最后在屏幕上显示用*/
allocateOnDemand(&frame1, frame_size, IPL_DEPTH_8U, 3);
cvConvertImage(frame, frame1, 0);

/* 获取第二帧 */
//cap >> framet;
cap.read(framet);
// cvtColor(framet, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);
frame = &IplImage(framet);
if (frame == NULL)
{
fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
return -1;
}

/*原理同上*/
allocateOnDemand(&frame2_1C, frame_size, IPL_DEPTH_8U, 1);
cvConvertImage(frame, frame2_1C, 0);

/*********************************************************
开始shi-Tomasi算法,该算法主要用于feature selection,即一张图中哪些是我
们感兴趣需要跟踪的点(interest point)
input:
* "frame1_1C" 输入图像.
* "eig_image" and "temp_image" 只是给该算法提供可操作的内存区域.
* 第一个".01" 规定了特征值的最小质量,因为该算法要得到好的特征点,哪就
需要一个选择的阈值
* 第二个".01" 规定了像素之间最小的距离,用于减少运算复杂度,当然也一定
程度降低了跟踪精度
* "NULL" 意味着处理整张图片,当然你也可以指定一块区域
output:
* "frame1_features" 将会包含fram1的特征值
* "number_of_features" 将在该函数中自动填充上所找到特征值的真实数目,
该值<= 400
**********************************************************/

/*开始准备该算法需要的输入*/

/* 给eig_image,temp_image分配空间*/
allocateOnDemand(&eig_image, frame_size, IPL_DEPTH_32F, 1);
allocateOnDemand(&temp_image, frame_size, IPL_DEPTH_32F, 1);

/* 定义存放frame1特征值的数组,400只是定义一个上限 */
CvPoint2D32f frame1_features[400];
int number_of_features = 400;

/*开始跑shi-tomasi函数*/
cvGoodFeaturesToTrack(frame1_1C, eig_image, temp_image,
frame1_features, &number_of_features, .01, .01, NULL);

/**********************************************************
开始金字塔Lucas Kanade光流法,该算法主要用于feature tracking,即是算出
光流,并跟踪目标。
input:
* "frame1_1C" 输入图像,即8位灰色的第一帧
* "frame2_1C" 第二帧,我们要在其上找出第一帧我们发现的特征点在第二帧
的什么位置
* "pyramid1" and "pyramid2" 是提供给该算法可操作的内存区域,计算中间
数据
* "frame1_features" 由shi-tomasi算法得到的第一帧的特征点.
* "number_of_features" 第一帧特征点的数目
* "optical_flow_termination_criteria" 该算法中迭代终止的判别,这里是
epsilon<0.3,epsilon是两帧中对应特征窗口的光度之差的平方,这个以后的文
章会讲
* "0" 这个我不知道啥意思,反正改成1就出不来光流了,就用作者原话解释把
means disable enhancements. (For example, the second array isn't
pre-initialized with guesses.)
output:
* "frame2_features" 根据第一帧的特征点,在第二帧上所找到的对应点
* "optical_flow_window" lucas-kanade光流算法的运算窗口,具体lucas-kanade
会在下一篇详述
* "5" 指示最大的金字塔层数,0表示只有一层,那就是没用金字塔算法
* "optical_flow_found_feature" 用于指示在第二帧中是否找到对应特征值,
若找到,其值为非零
* "optical_flow_feature_error" 用于存放光流误差
**********************************************************/

/*开始为pyramid lucas kanade光流算法输入做准备*/
CvPoint2D32f frame2_features[400];

/* 该数组相应位置的值为非零,如果frame1中的特征值在frame2中找到 */
char optical_flow_found_feature[400];

/* 数组第i个元素表对应点光流误差*/
float optical_flow_feature_error[400];

/*lucas-kanade光流法运算窗口,这里取3*3的窗口,可以尝试下5*5,区别就是5*5
出现aperture problem的几率较小,3*3运算量小,对于feature selection即shi-tomasi算法来说足够了*/
CvSize optical_flow_window = cvSize(5, 5);
// CvSize optical_flow_window = cvSize(5, 5);
/* 终止规则,当完成20次迭代或者当epsilon<=0.3,迭代终止,可以尝试下别的值*/
CvTermCriteria optical_flow_termination_criteria= cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3);

/*分配工作区域*/
allocateOnDemand(&pyramid1, frame_size, IPL_DEPTH_8U, 1);
allocateOnDemand(&pyramid2, frame_size, IPL_DEPTH_8U, 1);

/*开始跑该算法*/
cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2,frame1_features, frame2_features, number_of_features,
optical_flow_window, 5, optical_flow_found_feature,optical_flow_feature_error, optical_flow_termination_criteria, 0);

/*画光流场,画图是依据两帧对应的特征值,
这个特征值就是图像上我们感兴趣的点,如边缘上的点P(x,y)*/
for (int i = 0; i< number_of_features; i++)
{
/* 如果没找到对应特征点 */
if (optical_flow_found_feature[i] == 0)
continue;
int line_thickness;
line_thickness = 1;

/* CV_RGB(red, green, blue) is the red, green, and blue components
* of the color you want, each out of 255.
*/
CvScalar line_color;
line_color = CV_RGB(255, 0, 0);

/*画箭头,因为帧间的运动很小,所以需要缩放,不然看不见箭头,缩放因子为3*/
CvPoint p, q;
p.x = (int)frame1_features[i].x;
p.y = (int)frame1_features[i].y;
q.x = (int)frame2_features[i].x;
q.y = (int)frame2_features[i].y;

double angle;
angle = atan2((double)p.y - q.y, (double)p.x - q.x);
double hypotenuse;
hypotenuse = sqrt(square(p.y - q.y) + square(p.x - q.x));

/*执行缩放*/
q.x = (int)(p.x - 5 * hypotenuse * cos(angle));
q.y = (int)(p.y - 5 * hypotenuse * sin(angle));

/*画箭头主线*/
/* "frame1"要在frame1上作画.
* "p" 线的开始点.
* "q" 线的终止点.
* "CV_AA" 反锯齿.
* "0" 没有小数位.
*/
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);

/* 画箭的头部*/
p.x = (int)(q.x + 9 * cos(angle + pi / 4));
p.y = (int)(q.y + 9 * sin(angle + pi / 4));
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
p.x = (int)(q.x + 9 * cos(angle - pi / 4));
p.y = (int)(q.y + 9 * sin(angle - pi / 4));
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
}
/*显示图像*/

/*创建一个名为optical flow的窗口,大小自动改变*/
cvNamedWindow("Optical Flow", CV_WINDOW_NORMAL);
cvFlip(frame1, NULL, 2);
cvShowImage("Optical Flow", frame1);

/*延时,要不放不了*/
cvWaitKey(33);

/*写入到文件中去*/

// cv::Mat m = cv::cvarrToMat(frame1);//转换lpimgae到mat格式
// writer << m;//opencv3.0 version writer

}
cap.release();
cvWaitKey(33);
system("pause");
}

I. 若对一个视频图像中的人物进行跟踪,会用到哪些图像处理技术请用流程图将之间

录像监控人物活动时通常需要对人物进行跟踪。人物的行为信息可以从他们运动产生轨迹线的特点以及他们之间的相互作用中推得。对单个对象的位置或者轨迹线进行分析,可以检测出人物是否处在禁区、在跑、在跳或是在躲藏。把两个人或是更多人的信息联系在一起,就可以得到他们之间的互动信息。从采集的图像获取其中包含的物体信息的过程中,两个步骤显得尤为重要:前景检测和目标跟踪。本文中,我们提出了一种简单的基于亮度对比度的前景检测方法和一种仅仅依赖于对象匹配信息的跟踪算法,而不需要对模型进行统计学描述或是运动特性预测那么麻烦。用到的追踪器是英国工程和自然科学研究委员会在PerSer[14]项目中研发的软件中的一部分。最初计划与伦敦地铁站(室内)的CCTVfootage合作,但相比获得目标的精确轨迹,他们更侧重于实时性和对象间相互作用的研究。虽然没用到背景更新技术,这个算法已经经过了PETS2001图像集的测试,证明它能够提供简单的运动轨迹。建议事件监测的进一步研究要基于对象重心和运动轨迹

热点内容
直出服务器怎么样 发布:2024-10-07 15:41:36 浏览:476
比亚迪唐dmi哪个配置性价比 发布:2024-10-07 15:19:28 浏览:901
编译器按变量 发布:2024-10-07 15:07:03 浏览:773
怎么忘记电脑wifi密码怎么办 发布:2024-10-07 15:02:18 浏览:424
安卓开发java开发 发布:2024-10-07 15:01:29 浏览:94
工业级安卓主板价格怎么样 发布:2024-10-07 14:07:57 浏览:627
编程先乘除 发布:2024-10-07 13:58:45 浏览:269
编译内核时发生循环编译 发布:2024-10-07 13:58:43 浏览:495
当下笔记本电脑什么配置好 发布:2024-10-07 12:57:33 浏览:471
安卓倒车轨迹怎么调 发布:2024-10-07 12:54:47 浏览:916