OpenCV技术

2024-05-08

OpenCV技术(精选8篇)

OpenCV技术 第1篇

关键词:OpenCV,计算机视觉技术,三维模拟技术

21世纪是国际计算机技术高度发展的时代,人们生活中的每个角落都可以看到计算机技术的身影,尤其是现代计算机视觉技术和图像处理功能发展更加迅猛,各技术分支也逐渐趋于成熟。计算机视觉技术主要指的就是利用智能计算机系统来代替人类的眼睛对现实三维世界进行辨识和理解,整个过程均是计算机自我学习的过程,而随着这项技术研究的不断深入,其不再仅仅包含计算机技术科学,同时还涉猎了包括生理学、神经学、物理学、应用数学等多门学科,为人类科技的进步提供了有效的动力。

1 计算机对视频中运动物体检测的原理概述

在现代计算机技术基础下,对视频当中的运动物体检测原理主要包括两种,分别是从微观和宏观的角度出发。其中宏观检测技术指的是当计算机截取了视频中的某一个图像,其以整幅图像为对象进行检测;微观检测技术是指在截取图像后,根据实际需求对某一区域内的图像内容进行检测。在计算机视觉技术实际应用时,其第一步就是对图像的采集,第二步是对已经采集的图像进行预分析处理,如果采用宏观检测技术则对图像整体进行分析;如果采用微观检测技术则首先将图像进行分割,然后对分割后各图像内容中出现的运动物体影像进行分析。在图像数据获取过程中应用的是背景差分法,这一技术主要是将背景和运动物体进行分离提取,以获取没有背景图像的运动物体影像数据。还可以利用帧间差分法,这种方法主要是对一个视频图像的逐帧画面进行差别比较,从而获得各帧图像上的差值,而将这些差值帧图结合起来就是一个物体在计算机视觉下的运动轨迹。现代研究者更倾向于将背景和帧间差分法进行结合运用,这样可以获得无背景下的运动物体轨迹,进而提升计算机视觉系统捕捉数据的准确性。

2 Open CV的应用概述

Open CV是现代计算机视觉技术当中具有开源性的视觉库,其最早是由俄罗斯Intel分公司所研发,不仅高效,而且具有兼容的优势。同时与传统IPL图像处理系统相比,Open CV所处理的图像数据等级更高,例如在对运动物体进行特征跟踪、目标分割、运动轨迹分析以及三维模型重建等方面都有着巨大的优势。

Open CV本身编辑的源代码是开放式的,编写过程简洁且方便,并且程序中大多数函数已经通过了汇编的最优化,使其能够更加高效地被应用。在使用Open CV的摄像机标定模块已经为用户设计了实用性较强的接口,并且能够支持Windows界面的操作平台,使得这一技术的操作更加简便。这一技术本身操作简便,对于编程人员和检验人员个人技能素质要求并不高,视觉技术系统研发人员可以利用简便的操作来检验其设想是否能够实现,这就使得现代计算机视觉技术开发团队能够形成更好的协作研发关系,进一步提升技术研究效率。目前已知Open CV编程系统在航空航天定位、卫星地图绘制、工厂大规模生产视觉检测等方面得到了广泛的应用,同时对于无人飞行器的视觉捕捉技术也有极大的帮助。最为重要的是Open CV编程语言的兼容性较强,编程人员可以根据自己的意愿对源代码进行披露,并且国内也已经形成了规模较大的交流社区,给更多同行业者提供答疑解惑的场所,进一步扩大了Open CV的应用范围。

3 基于Open CV的计算机视觉技术

3.1 基于Open CV下的运动物体检测技术

在常规运动物体检测技术下,均是直接通过图像背景和运动物体的区分来实现运动物体的捕捉。而基于Open CV下的运动物体检测技术则不仅能够针对于图像背景的分离实现运动物体的观察,还可通过物体本身特定的信息来进行检测,主要包括形状、轮廓以及颜色等。这样就能够实现在复杂的背景当中将特定的运动物体完整抽离出来。其基本流程包括:首先,对影像数据当中某一时间点的图像进行捕捉,然后对这一视频图像的格式进行转化;其次,对转化格式后的视频图像进行早期处理,并将运动物体和复杂的背景区分开,降低周围各环境因素对运动物体主体图像的影响;第三,根据完成提取后的运动物体图像进行辨识,然后再从视频当中捕捉拥有相同特征的物体,并对该物体进行跟踪识别。而这一过程的实质则在于先利用图像捕捉技术对画面进行截取,然后同时利用背景差分法和帧间差分法对图像进行分割,逐帧地将运动物体完成提取出来,以供计算机进行视觉跟踪处理。

3.2 基于Open CV的图像预处理技术

一般情况下,计算机视觉处理技术应用的环境情况较为复杂,大多数应用环境当中均有光照的变化,并且部分计算机视觉处理设备还需要在露天环境下进行工作,此时周围环境中的风、温度、光照、气候以及运动物体数量等对视频图像的采集均有着极大的影响。环境因素会使图像采集的质量大幅度降低,同时图像当中的噪点问题也难以避免,而噪点是视觉捕捉和图像处理当中最大的影响因素。因此,在基于Open CV下的计算机视觉技术在捕捉视频图像之后先对其进行预处理,然后再由系统对运动物体进行分离、检测和跟踪。一般的预处理过程主要包括平滑度滤波、图像填充、背景实时更新等。

1)图像的平滑度滤波预处理技术

由于在实际计算机视觉捕捉过程中图像噪点是难以避免的问题,以此在对图像中运动物体进行检测前,应该相对这些噪点进行预处理,降低环境噪声对图像的影响。图像的平滑度滤波处理共分为两种方式,分别为线性和非线性。其中线性处理方式就是通过计算机处理设备的简单运算,对图像当中的噪点进行直接清除,但这一技术使用后会造成截获图像模糊不清的情况,因此仅对噪点较少的图像采用该处理方式;非线性滤波处理则是利用复杂的图像处理运算,将截获图像当中的噪点无限缩小,使其不对图像整体造成影响,并且可以有效保证图像的局部调整,但这种处理方式在运算时速度没有线性滤波处理快,因此需应用在噪点较多,图像信息较复杂的处理当中。

2)图像的填充预处理技术

这一处理技术在使用过程中运算速度较慢,主要是由于其需要对逐帧的图像均进行处理,也包括两种处理方式,分别为边缘填充和腐蚀膨胀处理。其中边缘填充处理主要指的是在确定运动物体之后,利用计算机系统自身的边缘检测处理技术,对物体的轮廓进行辨识,并利用形态学上的漫水填充方式对运动物体周围的噪点进行颜色填充,减小其对画面整体元素的影响。而腐蚀膨胀处理与边缘填充处理原理相类似,但这种处理技术主要是针对于噪点进行腐蚀和膨胀,使其在画面当中所占比例扩大,但对运动物体本身不造成影响,这使运动物体和噪点之间的差异就会更加明显,就可以将噪点的影响降到最低,但这种处理方法的效果和摄像机本身的性能、质量等有着密切的关联。

3)背景的实时更新预处理技术

在进行运动物体和背景分离过程中,计算机系统需要对图像上的背景元素进行辨识,并对其开展初始化处理,这样就能够为后期实时背景图像的差异进行凸显,以增加前景图像的效果,降低噪点对图像的影响。在运用这一技术时,首先要先对第一帧的图像进行确定,并将第一帧图像当中的背景图像元素进行辨识,然后在后期图像更新和运动物体检测过程中对背景进行实时更新处理。在更新的过程中其流程主要包括:首先,系统要对所读取的画面进行有效的判断,了解该图像是否为第一帧;其次,将Opencv处理的图像转变为单通道灰度值;第三,对转变后的图像进行高斯平滑度滤波处理,将图像当中的噪点进行去除;第四,采用形态学噪点填充技术对图像当中的噪点进行二次处理,以获得所需要更新的背景图像。

3.3 前景运动物体的提取技术

在计算机视觉技术进行运动物体的检测时,只有有效保障检测流程的准确度,才能够有效保障对前景运动物体的跟踪效果。其主要分为两大步骤,其一是对二值化后的图像数据进行分割处理;其二是在图像分析前对其进行充分的填充处理,保证前景图数据的完整性。同时,在前景图像提取的过程中也分为多个步骤,其包括:首先,对所提出的前景图像和背景图像进行差分处理;其次,将差分处理后的图像二值化处理;第三,对背景当中前景物体的轮廓或边缘进行辨识,根据前景图像的轮廓对其进行填充。由于在实际操作过程中,摄像头所处环境的变化较大,并且会在不同场所内的不同角度捕捉画面,因此就需要在前景图像提取时有效提高背景图像实时更新的效果。

利用阀值二值化的分割方式能够有效将前景图像和背景图像分离开,从而使目标运动物体能够呈现独立化,并且阀值分割方式开展前要相对每个像素点进行确定,判断其是否位于灰度值的范围内。而将该图像的像素灰度和阀值进行对比后会出现两种结果,分别是灰度值低于或高于阀值。在实际应用过程中,有效确定图像的分割阀值T,就能够降低环境当中光照因素对图像质量的影响。

4 计算机视觉技术当中的三维重建技术

1)三维重建的视觉系统

计算机视觉技术在对图像进行捕捉时可以视为是对大量的图像信息进行处理,从摄像机的视觉角度出发,其所输入的图像一般为二维属性,但输出的信息确是三维数据,而这种三维空间数据能够提升对运动物体所处空间位置、距离等描述的准确性。在三维重建视觉系统工作过程中,其相对基本的图像数据框架进行确定,然后利用一个坐标点建立2.5D图像数据,即以此点为视角能够观察到的图像数据,再将2.5D图像数据进行整合从而建立三维图像。

2)双目视觉系统

当人体利用双眼在不同角度、同一时间内观察同一个物体时,就可以利用算法来测量该物体和人体之间的距离,而这种方法也被称为双目立体感,其应用的原理主要是人体视觉差所带来的影响。同时利用两台摄像机对同一图像从不同角度进行观察,就能够获得人体双目观察后的效果,因此这一三维重建技术也被称为“双目视觉系统”。两台不同的摄像机即可代表人体双眼,其对图像进行逐帧捕获,但由于角度不同和环境影响因素的差异,因此造成了图像差异,必须对其捕捉的图像进行预处理。

3)三维重构算法

在计算机视觉技术中对于视频流的采集主要依靠的是彩色摄像机、红外摄像机、红外接收摄像头等设备。还可以利用微软所提供的Kinect设备,在进行运动物体检测前能够对NUI进行初始化处理,将系统内函数的参数设定为用户信息深度图、彩图、骨骼追踪图等数据。在使用Kinect设备对视频流进行打开时,其可以遵循三个步骤,其一是彩色和深度数据的处理;其二是根据数据的索引添加颜色信息,并将其引入到深度图数据当中;其三是骨骼追踪数据。

5 结束语

计算机视觉捕捉技术是现代计算机应用当中较为先进的内容,其应用范围较广,对于运动物体的捕捉准确度较高,能够有效推进现代计算机模拟技术的发展。

参考文献

[1]张海科.基于Opencv的人手识别与跟踪定位技术研究与实现[D].昆明:云南大学,2013.

[2]李旭港.计算机视觉及其发展与应用[J].科学技术,2010(3):42.

OpenCV技术 第2篇

摘 要:针对葡萄种植中切根虫的危害,采用基于OpenCV的图像处理方法设计葡萄树干精准对靶施药系统的视觉模块。通过图像处理实验,得出基于mean shift 的图像分割结果,边缘检测结果以及直线检测结果。实验结果证明该模块设计可有效的区别出葡萄园中弯曲的葡萄树干和笔直的树桩。

关键词:OpenCV;视觉模块;图像处理

中图分类号:TP23 文献标识码:A

1 引 言

对于世界葡萄种植来说,切根虫(一种夜蛾的幼虫)是危害葡萄树生长的主要害虫之一。精准对靶施药系统可在葡萄树干上施加一个均匀的、宽度大于等于20cm的“障碍药带”,可有效的阻止切根虫夜晚从树根爬到树冠啃食新芽。由于在实际葡萄园中,每隔几棵葡萄树就会立一根树桩拉着铁丝牵引葡萄藤,所以在施药时需要区分笔直的树桩和弯曲的葡萄树干,避免不必要的施药。因此本文基于OpenCV的图像处理方法进行精准对靶施药系统视觉模块设计。

2 基于OpenCV的图像处理

OpenCV软件由C函数以及C++函数组成,可以进行例如特征检测、目标分割、三维重建等图像分析。在图像处理、计算机视觉等方面,OpenCV起到了无可取代的重要作用。在不远的将来,OpenCV对工业、航天、军事、人机对话等领域都起到了及其关键的作用。随着图像分析、视觉技术的发展,OpenCV将逐渐适用于更多的场合[1]。本文研究中采用计算机视觉技术,通过CCD摄像头采集图片,使用OpenCV来检测采集到的葡萄树干和木桩图片的外轮廓线,从而判断喷药设备前方的物体是弯曲的葡萄树干还是笔直的木桩,若判定为弯曲的葡萄树干则喷药,若判定为笔直的木桩,则发出信号,让拖车继续前行。

2.1 图像预处理

在进行轮廓检测前,首先要对采集到的葡萄树干和木桩的图片进行预处理,主要是进行形态学去噪以及图像平滑处理[2]。

2.1.1 形态学去噪

数学形态学,其本质是通过一些方法实现图像处理,比如:利用结构元素提取图像形状等。数学形态学的基本操作有两种:膨胀和腐蚀。膨胀使图像区域变大,可以实现小空间和缝隙的填充。腐蚀使图像区域变小,可以用来去掉图像菱角。膨胀和腐蚀两者没有互为逆运算,可以结合使用,对图像先膨胀再腐蚀,或者先腐蚀再膨胀。前一种运算称为闭运算,后一种称为开运算。两种运算在数学形态学中都很重要。闭运算可以弥补裂缝、填补孔洞,开运算可以去除毛刺和孤立小点,两种运算对物体的形状和位置不造成改变。本文中先用CCD相机拍摄照片,然后对照片进行闭运算和开运算,使轮廓平滑,没有毛刺和缺口。

2.1.2 利用中值滤波进行图像平滑处理

图像平滑处理多用于减少图像噪声,是数字图像处理技术的一种。对于在葡萄种植园中采集到的葡萄树干或者木桩的图片,由于场地等的原因,不可避免的存在许多噪声,进行平滑处理时最重要的是要保持葡萄树干或者木桩轮廓的清晰,还可以去除高频噪声,综合考虑,我们选择中值滤波。

中值滤波属于非线性滤波,它可以抑制图像噪声和脉冲干扰,保护图像,使图像的边缘不变模糊。也可以将图像的灰度信息保留的更多,提高对图像轮廓检测的质量[3]。

2.2 基于mean shift 的图像分割

mean shift 是通过迭代,运用非参数进行概率密度估算的方法。基于原理简单、参数少、不需要预处理等特点,mean shift 主要被运用在追踪目标、分割图像等方向[4]。使用mean shift 进行图像分割可以被当作特征空间聚类问题处理,因为被选取的空间的色彩、灰度、梯度不同,概率密度函数将会梯度上升,mean shift 沿着该方向找到局部最大值,可是将具特征类似的向量分割开来,归为一类。

2.3 边缘检测

边缘检测多是指检测图像中灰度或者亮度变化最大的部位,一般是指前景、背景的交界处,这些部位会导致数学算法模型中的一阶导数不连续,所以需要利用图像的阶梯函数,以此来求图像的边缘[5]。用的最多的方法有:Roberts 算子、Sobel 算子、Prewitt 算子和Canny 算子。

由于Canny 算子既用到了一阶导数,也用到了二阶导数,所以它的结果更加精确,因此本文运用Canny 算子对图像边缘进行检测。对于图像处理,先对原图进行灰度处理,然后通过Canny 算子就可以将图片中的物体轮廓较为精准的找出。

运用Canny 算子进行边缘检测,需要符合2个要求:①信噪比;②单位边缘响应。计算算子的零交叉点的平均距离,若该距离满足式①,则单位边缘只存在一个响应[6]。

3 图像处理试验及结果

本文利用OpenCV 提供的图像处理函数来对获得的靶标图像进行处理,先基于mean shift 进行图像分割,然后通过Canny 算子进行边缘检测,得到靶标外轮廓线,最后运用直线检测的方式来分析靶标的曲直,其工作流程如图1所示。

图1 工作流程图

计算技术与自动化2016年6月

第35卷第2期李梅竹等:基于OpenCV精准对靶施药系统视觉模块设计

3.1 基于mean shift 的图像结果

一般而言一副图像的特征点至少可以提取出5 维,即(x,y,r,g,b),众所周知,mean shift 经常用来寻找模态点,即密度最大的点。所以这里同样可以用它来寻找这5 维空间的模态点,由于不同的点最终会收敛到不同的峰值,所以这些点就形成了一类,这样就完成了图像分割的目的,有点聚类的意思在里面。

需要注意的是图像像素的变化范围和坐标的变化范围是不同的,所以在使用窗口对这些数据点进行模态检测时,需要使用不同的窗口半径。因此在OpenCV自带的mean shift分割函数pyrMeanShiftFiltering( )函数中,就专门有2个参数供选择空间搜索窗口半径和颜色窗口搜索半径的。 由函数名pyrMeanShiftFiltering可知,这里是将mean shift算法和图像金字塔相结合用来分割的,所以其参数列表中就有一个专门定义所需金字塔层数的变量。本次试验的主要过程是,首先设置好参数,然后用函数pyrMeanShiftFiltering( )对输入的图像进行分割。分割后的结果保存在该函数的第二个参数即输出图像中,最后根据该分割图像的特点用floodFill( )函数对其分割的结果用不同的颜色进行填充。试验中选取的树干原图如图2(a)、1(b)所示,图像分割后的结果如图3(a)、2(b)所示。endprint

3.2 边缘检测结果

对图像基于mean shift的图像分割后,采用Canny算子进行边缘检测。Canny算法的步骤是①降噪,任何边缘检测算法不可能在未经处理的原始数据上工作,第一步是对原始数据与高斯mask作卷积,得到的图像与原始图像相比有些轻微的模糊。②寻找图像中的亮度梯度。图像中的边缘可能会指向不同的方向,所以Canny算法使用了4个mask检测水平、数值以及对角线方向的边缘。③在图像中跟踪边缘。较高的亮度梯度比较有可能是边缘,但是没有一个确定的值来限定多大的亮度梯度是边缘,所以Canny使用了滞后阈值。上述过程完成可得到一个二值图像。通过Canny算子就可以将图片中树干的轮廓找出,其试验结果如图4所示。从图中可以看出采用OpenCV的Canny算子进行边缘检测可以较为完整的将前景区从背景区域中分离出来,得到比较理想的树干轮廓线,为进一步判断轮廓线的曲直打下基础。3.3 直线检测结果

OpenCV使用霍夫变换函数来进行直线检测。该变换利用点与线的对偶性,通过曲线表达形式,将空间中的曲线转变为一个点,于是,对于原图的曲线检测问题变为在参数空间内寻找峰值的问题。 具体的说,利用直线的参数方程ρ=xcosθ+ysinθ将(x,y)空间中的一个点变成了一条正弦曲线,如果若干个点在一条直线上,那么它们对应的正弦曲线也会交于同一个点。所以检测直线的问题,就转化为了判断交点峰值的问题。设置一个峰值,大于这个值,就判为直线。

需要注意以下几点:首先,HoughLines检测出来的不是线段,而是(ρ,θ)对,使用std vectorlines来存放。其次,由于上面的原因,画线的时候是选一个y(最小为0),求一个x,得到一个点;再选一个y(选为图像的高度)再求一个x得到另一个点,水平方向的线采用同样的方法。这样画出的线贯穿整个图像。

4 结束语

由于在实际葡萄园中,每隔几棵葡萄树就会立一根树桩拉着铁丝牵引葡萄藤,所以在施药时需要区分笔直的树桩和弯曲的葡萄树干。本文主要介绍了基于OpenCV的图像处理方法,并给出了对一棵弯曲的树和一棵笔直的树的基于mean shift的图像分割结果、边缘检测结果以及直线检测结果。实验结果证明该模块设计可有效的区别出葡萄园中弯曲的葡萄树干和笔直的树桩。

参考文献

[1] 于仕琪,刘瑞祯.OpenCV教程(基础篇)[M].北京:北京航空航天出版社,2007.

[2] 景晓军.图像处理技术及其应用[M].北京:国防工业出版社,2005.

[3] 刘慧英,王小波.基于OpenCV的车辆轮廓检测[J].科学技术与工程,2010(12): 2987-2991.

[4] SONG N, GU I Y H, CAO Z, et al. Enhanced spatial-range mean shift color image segmentation by using convergence frequency and position[C]//Prof. of 14th European Signal Processing Conference (EUSIPCO 2006), Florence, Italy. 2006.

[5] 阴国富.基于阈值法的图像分割技术[J].现代电子技术,2008,30(23):107-108.

OpenCV技术 第3篇

视频流中运动物体的自动跟踪与定位具有广泛的应用前景。常用的目标跟踪算法有基于区域的跟踪,基于运动估计的跟踪,基于目标模型的跟踪和基于主动轮廓的跟踪等。徐明利采用光流场法[1,2],实现了视频目标检测,但光流方法运算量较大,若没有特定的硬件支持一般很难满足实时处理的要求。徐琨,贺昱曜,王夏黎采用背景建模法实现了对运动车辆的检测[3,4],但其缺点在于背景突变会导致检测失败,而且对于运动速度很慢的目标通常会加入到背景中,影响检测结果,同时背景的选取和更新会消耗大量时间。

基于以上问题,提出一种基于三帧间差分与CAMShift相结合的目标检测与跟踪算法。该方法首先建立高斯背景模型,并对视频帧用三帧差分处理,检测运动目标,最后利用Camshift的算法对目标进行跟踪。实验表明,方法能较好地对动态目标进行检测与跟踪。

1 视频序列的目标检测与跟踪

1.1 混合高斯背景模型

自适应混合高斯模型是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。每个像素点用多个高斯模型混合表示。自适应混合高斯背景模型具有良好的解析形式且运算效率高,因而优于其他形式的背景模型。

在视频序列图像中,通过高斯函数可以分别对侮个像素点(x0,y0)从t0时刻到t时刻建立模型。设到第t时刻,该像素点的取值集合为:{Z1 1,…Zuv}={I(x0,y0,s)│I≤s≤t},其中I为视频帧。如果将该像素点的所有历史值用k个高斯函数来近似,那么在t时刻,像素值Zuv属于背景的概率为

式中,k是混合高斯模型中高斯分布的个数,一般取3~5,Zi,j是像素在t时刻的值。由红、绿、蓝三色分量构成,可表示为式(2)。

wi,t表示时刻t混合高斯模型中第i个高斯分布的权系数的估计值。

表示t时刻混合高斯模型中第i个高斯分布的均值向量(此处假定像素的红、绿、蓝分量相互独立,如式(3)所示。

表示t时刻混合高斯模型中第i个高斯分布的协方差矩阵(此处假定像素的红、绿、蓝分量相互独立),表示为式(4)。

N表示高斯分布概率密度函数

k个高斯分布按照优先级λ=wi,t/从高到低排序(wi,t,为各高斯分布的权值和方差),取前B个高斯分布联合生成背景,表示为式(6)。

其中,T1为背景选取阈值(0

其中:a为权值的更新速率,在匹配的分布中取1,其余分布取0。对匹配的高斯分布的均值和方差按照式(8)更新,不匹配的高斯分布保持不变用下式表示:

式(6)~(9)中有两个重要的参数,分别是权值更新速率a和均值、方差的更新速率,a通过式(9)决定的大小,它们决定着背景模型的更新速度,对高斯混合模型背景更新的研究就是根据背景变化情况不断调整更新速率a和的大小。

1.2 三帧差分法

三帧差分法是利用连续的三帧视频图像序列,分别对前二帧和后二帧进行图像差分,这样得到的二帧差分图像都含有运动目标,如果将得到的二帧差分图像做相与运算,则可以得到完全基于运动目标本身的变化区域,基于此时运动目标变化区域的灰度值设定灰度检测门限可以较准确地得到运动目标在中间视频图像中的位置,以此为据,提取运动目标。三帧差分法充分考虑了运动像素的时间相关性,融合了多帧图像的像素信息,可用于动态变化的场景,该方法对运动检测比较灵敏,对随机噪声有很强的抑制作用。

三帧差分法的算法步骤为:

(1)设fk-1(x,y)、fk(x,y)、fk+1(x,y)分别表示三帧连续的原图像,分别计算相邻两帧原图像的绝对差灰度图像d(k-1,k)(x,y)和d(k,k+1)(x,y)即:

第k-1帧与第k帧差分原理如图1所示,第k帧与第k+1帧差分原理如图2所示。

(2)对d(k-1,k)(x,y)和d(k,k+1)(x,y)分别取阈值T进行二值化,得到二值化图像b(k-1,k)(x,y)和b(k,k+1)(x,y),用下式表示。

(3)将b(k-1,k)(x,y)和b(k,k+1)(x,y)在每一个像素位置进行逻辑与操作,得到三帧差分的结果二值图像Dk(x,y),计算公式如下:

两差分相与的结果如图3所示。

(4)图像的二值化处理原理,也就是阈值分割,其目的为求一个阈值T,并用T将图像分成目标和背景两部分。在实际处理中,一般用255表示背景,用0表示对象物。

1.3 基于Camshift算法的运动目标跟踪

目标跟踪是在已知目标图像或已知目标特征信息(颜色,形状,纹理等)的前提下,利用目标有效特征值,使用适当的匹配算法,在序列图中寻找与目标模板相似图像的位置。提取目标特征信息(如颜色信息),与之前检测出的目标做特征比对,如果是新目标则加入到跟踪序列中,如果是旧目标则舍弃。目标跟踪阶段,对跟踪序列中的目标采用跟踪算法,获得其运动轨迹。运动目标的跟踪算法的种类有很多,不同的算法在不同的环境下精确度、鲁棒性不同。

Camshift算法利用目标的颜色特征在视频图像中找到运动目标所在的位置和大小,在下一帧视频图像中,用运动目标当前的位置和大小初始化搜寻窗口,重复这个过程就可以实现对目标的连续跟踪。在每次搜寻前将搜寻窗口的初始值设置为运动目标当前的位置和大小,由于搜寻窗口就在运动目标可能出现的区域附近进行搜寻,这样就可以节省大量的搜寻时间,使Camshift算法具有良好的实时性。同时,Camshift算法是通过颜色匹配找到运动目标;在运动目标运动的过程中,颜色信息变化不大,目标的运动在图像序列中具有很大的相似性,所以Camshift算法具有良好的鲁棒性。

基于Camshift算法的跟踪过程,首先确定初始目标及其区域,计算出目标的色度(Hue)分量的直方图,相对于当前帧,计算搜索窗口的的二阶矩M20、M02、M11,如式(16)。

利用直方图计算输入图像的反向投影图,利用MeanShift算法在反向投影图中迭代搜索,直到其收敛或达到最大迭代次数,并保存零次矩。如果满足式(17)

则下一帧搜索窗口的长度(l)和宽度(w)分别为(18)式。

当视频序列逐帧变化时,Camshift算法逐帧进行处理,这样就可以完成对运动目标的连续跟踪。

本文提出的目标检测跟踪方法的步骤为:1)对视频帧进行捕捉;2)建立高斯背景模型;3)用三帧差分法对视频中的动态目标进行检测;4)使用Camshift算法逐帧进行处理对动态目标进行跟踪。

其流程图如图4所示。

4 结果与分析

本文以Visual C++6.0、OpenCV为软件开发工具,在Intel Core i3 CPU,主频为2.53GHz,内存为2G,512MB独立显卡的环境中进行实验。通过调取计算机自带的视频文件对视频进行测试。视频文件图像大小为640×480,视频播放速率可变。使用本文所提出的方法进行实验。

实验表明,对目标的识别与检测的效果不仅与算法的设计有关,还与阈值的设定有很大关系。本实验中选取阈值从70开始,每进行一次实验,阈值依次减10,并观测图像处理的效果。实验表明阈值的选取对运动目标检测跟踪的效果影响很大。阈值的选取最佳值为50。除此之外,对目标的识别与检测的效果在一定程度上受计算机的配置,视频播放速率,以及背景的更新速度等因素影响。这些需要基于具体情况以及处理效果的好坏对参数进行多次的调整以达到最佳处理效果。实验中的部分参数的选取数值以及相应调整如表5所示。

对参数调整后,运行程序,得到处理结果,如图5~10所示。图中高速飞行的飞机为运动目标。

图5第250帧原图像

图6第250帧背景模型

图7第250帧前景输出图像

图8第350帧原图像

图9第350帧背景模型

图10第350帧输出图像

通过对比图5与图8可知,运动目标的姿态、大小以及所处环境均发生了改变。由图6可知,用混合高斯背景建模的方法建构出了背景与前景。通过对比图6与图9可知,背景发生了改变。其原因是背景模型能随着时间的推移及时自动更新,这样当可以防止因背景更新不及时而造成对运动目标的误判。通过对比图7与图10可知,运动的目标被很好地检测出。由此可以得出的结论是,本文所采用的混合高斯背景建模与三帧差法能对运动的物体进行很好的提取以及检测。

随着目标的快速移动,目标的各种姿态以及周围的环境都时刻在发生变化,通过建立混合高斯背景模型并用三帧差法对视频序列进行处理后能够有效地检测出运动目标,本文在此基础之上采用Camshift算法对视频序列中的运动目标进行了跟踪处理。通过图11与图12、图13与图14、图15与图16三组图像的对比可知,算法能够有效地检测提取出运动的物体,并对物体进行了标注(图中红色圆圈以内为标注部分)。通过对比图12、图14、图16可知,目标能够被持续有效地检测和跟踪。运动目标的检测与跟踪受环境,以及目标自身姿态和轨迹变化的影响较小。

从上图的效果对比来看,本算法能对目标进行有效地识别和跟踪。并且可以看出时间和环境以及目标远近、大小以及姿态等因素的变化对目标识别和跟踪的影响较小,目标能持续有效地被跟踪识别。

5 小结

文中提出一种基于三帧间差分与Cam Shift相结合的目标检测与跟踪算法。该方法对视频帧用三帧差分处理,通过建立高斯背景模型,检测出运动的目标,并利用Camshift算法对目标进行跟踪。通过实验验证,文中提出的方法较好地对视频序列目标进行了检测与跟踪,有效地利用了动态目标的有效信息,获得了较准确的目标识别与跟踪,并且对环境的变化以及目标姿态的变化等因素具有良好的鲁棒性。

参考文献

[1]徐明利.基于微分的光流计算方法[J].宜春学院学报,2010(8):17-18,51.

[2]王晓卫,宁固.一种改进的基于光流的运动目标的检测算法[J].武汉大学学报,2003,28(3):351-353.

[3]徐琨,贺昱曜,王夏黎.基于背景模型的运动车辆检测算法研究[J].微计算机信息,2007(10):126-127.

[4]李海霞,范红.基于背景差法的几种背景建模方法的研究[J].工业控制计算机,2012(7):56-57.

[5]Grimsonw,Stauffer C,Romano R.Using adaptivetracking to classify and monitor activities in asite[C]//Proceedings of IEEE InternationalConference on Computer Vision and PatternRecognition,Santa Barbara,CA,USA,1998:22-29.

[6]朱胜利,等.快速运动目标的Meanshift跟踪算法[J].光电工程,2006,33(5):66-71.

[7]Amidi O,Kanade T,Fujita K.Avisual odometerfor autonomous helicopter fight[J].Robotics andAutonomous Systems,1999,28(2-3):185-193.

利用OpenCV实现人脸检测 第4篇

1 OpenCV在Visual C++2005下的安装与配置

1.1 Open CV安装

首先到OpenCV的官方网站下载OpenCV并进行安装, 安装过程很简单, 只要按照安装向导一步一步进行即可。

1.2 对Visual C++2005进行全局设置

(1) 打开Visual C++2005, 选择“Tools (工具) |Options (选项) ”菜单项, 弹出如图1所示的对话框。

(2) 在左侧列表框中选择“Projects and Solutions (项目和解决问题方案) |VC++Directories (VC++目录) ”。

(3) 在“Show directories for (显示以下内容的目录) ”下拉列表框中选择“Library Files (库文件) ”。

(4) 在右侧库文件列表框中定位并添加“OpenCVlib”。

(5) 在“Show directories for (显示以下内容的目录) ”下拉列表框中选择“Include Files (包含文件) ”, 并在右侧列表框中定位并添加以下路径:

OpenCVcxcoreinclude

OpenCVcvinclude

OpenCVcvauxinclude

OpenCVmlinclude

OpenCVotherlibshighgui

OpenCVotherlibscvcaminclude

OpenCVMicrosoft PlatformSDKInclude

(6) 单击“OK (确定) ”按钮保存配置。

1.3 对Visual C++2005项目进行设置

新建一个项目后, 需要设置项目所需的链接库。选择“Project (项目) |Properties (属性) ”菜单项, 弹出如图2所示的对话框, 在左侧的列表框中选择“Configuration Properties (配置属性) |Linker (链接器) |Input (输入) ”, 在右侧列表框中选择“Additional Dependencies (附加依赖项) ”, 在其右侧的文本框中输入“cxcore.lib cv.lib ml.lib highgui.lib cvaux.lib”等需要的库。

2 程序开发

人脸检测是一个非常先进的问题, 它是人脸研究的一个主要方向, 其任务是对于一幅给定的图像, 采用一定的策略对其进行搜索, 以确定其中是否含有人脸、含有多少个人脸, 以及所含人脸的位置、大小和姿态。人脸检测的算法很多, Adaboost算法是其中的一种。Adaboost算法虽然十分复杂, 但应用OpenCV提供的函数和分类器进行人脸检测将是十分容易。

2.1 利用OpenCV进行人脸检测

人脸检测程序主要完成3部分功能, 即加载分类器、加载待检测图像以及检测并标示。本程序使用OpenCV中提供的“haarcascade_frontalface_alt.xml”文件存储的目标检测分类, 用cvLoad函数载入后, 进行强制类型转换。OpenCV中提供的用于检测图像中目标的函数是cvHaarDetectObjects, 该函数使用指针对某目标物体 (如人脸) 训练的级联分类器在图像中找到包含目标物体的矩形区域, 并将这些区域作为一序列的矩形框返回。分类器在使用后需要被显式释放, 所用的函数为cvReleaseHaarClassifierCascade, 这些函数原型请参看有关OpenCV手册。

2.2 程序实现

(1) 新建一个Visual C++MFC项目, 取名为“Face Detection”, 选择应用程序类型为“单文档”。将菜单中多余的项去掉, 并添加一项“人脸检测”, 其ID为“ID_FaceDetected”, 并生成该菜单项的消息映射函数。

(2) 在“FaceDetectionView.h”头文件中添加以下灰底色部分程序代码:

(3) 在“FaceDetectionView.cpp”文件中添加以下灰底色部分程序代码:

需要注意的是, 本程序运行时应将分类器文件置于程序目录下, 如果运行的是生成的EXE文件, 则应将分类器文件与该EXE文件放在同一个目录下。

3 运行结果

运行该程序, 选择人脸检测菜单项, 弹出文件打开对话框, 选择要检测的图像文件, 程序就会将检测到的人脸用圆圈标示出来, 如图3所示。本程序能顺利检测出大部分人脸, 但由于光照、遮挡和倾斜等原因, 部分人脸不能正确检测。另外, 也有一些非人脸部分由于具有人脸的某些特征, 也被当成了人脸, 这些都是本程序需要改进的部分。

(收稿日期:2009-3-12)

摘要:OpenCV全称是指开放的计算机视觉资源代码, 它具有统一的结构和功能定义、强大的图像和矩阵运算能力、方便灵活的接口等特点。在Visual C++ 2005环境下, 给出了利用OpenCV函数库开发人脸检测程序编程实现的方法, 简单、方便, 并具有较强的实用价值。

基于OpenCV的彩色目标识别 第5篇

Open CV简介

Open CV是由因特尔公司所建立的一个跨平台计算机视觉库, 可以运行在多种操作系统上。它内置了一系列C函数并包含少量C++ 类, 同时提供了如:Python、MATLAB等多种语言的接口, 实现了丰富的图像处理的通用算法, 利用该函数库可以相当便捷地实现图像的相关处理操作。本文使用Open CV 2.7 版本用于实验。

色彩空间选取

RGB色彩空间

RGB色彩空间即红 (R) 、绿 (G) 、蓝 (B) 三色空间 (图1) 。该空间依据颜色发光原理定义, 任何颜色均由红、绿、蓝三种颜色按一定比例混合叠加而成, 叠加后的色彩亮度为三色亮度之和, 调节混合比例即可得到不同的色彩。在该空间下, 色彩信息会被分为红、绿、蓝三个分量, 每个分量范围是0 ~ 255。RGB空间面向硬件设备, 是目前应用最广的色彩空间之一, 绝大多数图像显示、采集设备均使用该色彩空间。

HSV色彩空间

HSV (hue, saturation, value) 色彩空间依据人类视觉感受定义, 是面向视觉的空间定义 (图2) 。色彩信息在该空间下被分为色相、饱和度、亮度三个分量, 其中色相与饱和度分别反映了色彩波长分布与深浅度。该空间的特点是亮度分量与色相及饱和度分量无关, 也即亮度不影响色彩信息。

处理与实现

为了实现对目标的色彩识别, 需要对图像进行相关的处理。首先进行色彩空间转换, 之后是二值化处理, 即在HSV空间下, 依据所要识别的色彩将图像转换为二值图像。在二值化处理之后, 目标主体已基本显现, 但由于背景环境中也存在符合条件的像素点, 因此背景中会分布大小不一的噪点, 影响之后操作。与此同时, 由于实际环境中光影变化, 目标主体像素点往往不能全部落在所设阈值范围内, 在二值化后, 目标可能出现割裂、空洞现象。为了消除背景噪点与填补目标, 需要对二值图像进行腐蚀与膨胀处理。

色彩空间转换

与HSV空间相比, RGB空间由于其定义原理, 使该空间中三分量均与亮度信息相关。对于分析有较大亮度变化的视频图像来说, 显然HSV色彩空间更具优势, 因此将RGB空间下的视频图像信息转换至HSV空间。

转换函数:cv Cvt Color, RGB至HSV转换公式如下:

设定色彩阈值

为了识别出特定色彩, 需要在完成色彩空间转换之后根据所识别色彩在HSV空间中的分布, 确定H、S、V三个分量值的阈值, 对图像中所有像素点进行筛选。

具体实现方法:调用cvIn Ranges函数进行筛选, 函数参数为阈值上下界。依据色彩具体分布设置阈值上下界, 调用三次cvln Ranges函数, 依次对H、S、V三个分量进行阈值筛选。筛选将生成二值化图像, 所识别色彩在图像中反映为白色, 背景为黑色。

腐蚀与膨胀处理

腐蚀与膨胀处理是两种常用的形态学处理, 即使用特定形态的结构元素来处理图像, 这两种处理常被用来去除噪点和填补目标空白。

腐蚀处理原理是:在二值化图像中选取一目标像素点, 令结构元素覆盖该像素点 (一般使用矩形结构元素, 可选取3 ✕ 3 大小的像素块) , 求取该结构元素覆盖下的所有像素点的最小值来代替该目标像素点。对图像中每个像素点逐一进行该操作便实现了腐蚀效果, 所有小于结构元素大小的噪点均会被去除。

膨胀处理与腐蚀处理正好相反, 其原理是求取结构元素覆盖的所有像素点的最大值来代替目标像素点。该处理会填补目标空洞与裂隙, 使目标更加完整。

腐蚀处理使用cv Erode函数, 膨胀处理使用cv Dilate函数。一般在程序中先调用cv Dilate再调用cv Erode, 即先进行膨胀处理, 再进行腐蚀处理, 这样可以在很大程度上消除噪声影响。

查找轮廓与目标筛选

经过腐蚀与膨胀, 二值图像中的目标裂隙与空洞已经被填补, 背景中噪点基本消除。调用cv Find Contours函数, 查找轮廓。该函数输入为二值图像, 输出图像将显示轮廓线, 即二值图像中黑白区域的边界。

在进行完膨胀与腐蚀处理之后, 虽然已消除了相当一部分的噪声, 但由于视频拍摄环境的复杂, 图像背景中难免会有落入色彩选取阈值的景物, 成为一种干扰。面积较小的背景景物干扰会在腐蚀处理的作用下消除, 而其中面积较大的干扰将会继续存在。考虑到所要识别的目标往往都是图像的主体, 面积远大于背景中干扰的面积, 因此可以通过筛选最大面积的方法过滤掉背景干扰。Open CV中提供了cv Contour Area函数用于求取轮廓包围面积, 在程序中调用此函数后筛选出最大面积即为所要识别目标。

最后调用rectangle函数在可原图像中绘制边框框选目标。

实验结果

根据上述实现流程, 在Windows 7 操作系统下, 使用VS2010 调用Open CV库函数进行实验。

图3 为原始图像。图4 为阈值选取后二值化图像 (选取蓝色) , 可以看出存在明显的噪声干扰。

图5 为膨胀与腐蚀处理后的二值图像, 可以看出绝大部分噪声已被明显消除。但依旧存在难以消除的干扰, 且在膨胀处理后干扰又扩大趋势。此时通过对连通区域面积的筛选可滤掉干扰, 将目标主体选取出来。

图6 为轮廓查找及面积筛选后的最终结果, 可以看到在经过腐蚀、膨胀以及面积筛选等一系列相关处理后, 可以很好地实现对特定色彩目标的识别。

结语

OpenCV技术 第6篇

1 系统组成和开发环境

文章利用Open CV的人脸识别系统是在Linux操作系统下开发出的图形界面, 使用OpenCV处理库中提供的相关功能进行图像数据的采集, 调用Harry分类器对采集的图像进行人脸检测, 检测得出的结果再利用PCA算法进行省份识别, 利用Camshift和LucasKanade算法进行人脸表情识别。图片来自于Basler acA640-100gc相机, 此相机操作系统为Fedora 10, 在编译OpenCV之前为了处理图像还需要编译FFmpeg。

2 基于OpenCV人脸识别研究

人脸识别在当前人工智能中是一个重要的课题, 很多学者提出了多种算法, 但是在动态图像的人脸识别中研究不是太多。文章主要采用OpenCv软件研究人脸识别, 保存了需要的重要信息, 提高配识别率。

应用系统开发设计主要流程为图1所示。图像的采集主要通过cvCaptureFormCam相机得到, 并利用相关文件对返回的结构进行设置 (部分) :

利用函数开启定时器, 每个固定的时间发送槽函数, 并将槽函数放入缓存中, 在从内部缓存中使用cvGrabFramea将图像读取数据, 在qt中显出并转化为QPixmap类型。现根据图像大小分配到缓冲区绿, 再把缓冲区指针拷贝到Qimage的指针中, 在进一步循环把图像的数据拷贝到缓冲区内, 程序如下 (部分) :

在图像的预处理环节中, 由于目前大多数的脸部检测算法对于人脸图像的大小以及位置等都比较敏感, 因此需要对检测部位进行灰度处理。人脸检测器利用XML中的数据来搜索图像的位置, OpenCV即是采用这种人脸检测器进行检测, 最终监测的数据结果保存到cvRect中, 识别基本步骤为先读入训练图像, 再创造PVA子空间, 把数据投影到子空间, 再训练结果, 把结果进行保存进行图像识别。特征检测方法的思想为图像向量经过K-L变换后转变为低维向量, 进而形成特征子空间, 把图像投影到低维空间中。在识别人脸时, 仅仅需要对比数据库中的目标样本集合投影系数, 就可以确定人脸图片属于哪一类。在使用PCA算法时需要经历生成阶段和识别阶段。

在训练阶段先在训练脸照片集上计算特征脸, 把随对应的图片最大特征值, 这些图片定义为元空间的一个子空间, 若是需要添加新的图像, 这个子集可以进行更新和重新计算。在这个子集中图片数据投影到特征脸上, 进而计算权重向量, 也即是各个图片数据的坐标值。OpenCV先使用cvLoadImage函数将图片转化为灰度图片, 在进行PCA操作, 计算出向量的数组, 利用函数将图片的投影到PCA子空间上, 把结果保存到矩阵数组中, 把结果保存到XML文件中。在识别新的人脸图片是先给予前面得到的特征脸, 将采集到的图片投影到特征脸中, 计算权重向量, 判断图片是否属于人脸图像, 若是判断结果为是, 就需要根据前面的极端的权重向量规划到最初计算的个体中或是规划为新的个体图片。简单而言就是根据权重向量来判断图片的性质。进一步更新特征脸, 如实一个未知的人脸图像没有什么记录, 但是又出现了很多次, 此时就需要把他的特征向量添加到新的个体中。OpenCV实现点用函数采集如片映射到PCA子空间上。如图2是得到的部分特征脸图像。

针对脸部表情识别而言, 主要是采用Camshift函数进行计算, 这种计算方法能够利用目标的颜色直方图模拟将图像转换为颜色概率分布图, 把搜索窗的位置和大小进行初始化, 得出结果, 并根据所得的结果自适应调整搜索窗口的位置和大小, 从而定位中心位置, Camshift具有解决目标图像变形的优势, 这个函数本身对于系统资源的要求度比较低, 时间都复杂度也不高, 因此在简单背景下具有很强的跟踪效果。具体而言OpenCV来实现脸部表情的识别需要分为以下几步, 首先OpenCV充分调动cvCvtColor () 函数, 将色彩空间的数据转化到HSI空间, 接着在调用vCreateHist () 函数来计算ID直方图, 在调用vCamShift () 函数计算图片的位置和面积。这种光流算法能够准确的得出不同图像间的的细微变化, Lucas-Kanade光流算法能够计算两帧在一定时间段内的每个像素点位置的移动。在利用这种光流算法时需要注意先使用shi-Tomasi算法来提取图像的特征点, 也就是找到图片中感兴趣的需要跟踪的点集, 并定义为第一帧的数目, 找到特征值, 接下来是使用函数实现光溜计算的系数迭代版本。输出函数主要包括图像本身的特征数值点, 通过这些点来确定局部区域的特征, 如眼部以及嘴巴等, 如下图3是追踪眼睛眨动图像眼睛通过比较数值的变化, 来对比脸部的一些简单表情。

3 结束语

综上所述, 文章先简单介绍了该研究的系统组成和开发环境, 重点讲述以OpenCV图像处理软件为中心, 设计人脸识别系统。本文设计的人脸识别系统具有很好的实用性可识别能力、准确性和可移植性, 减小了识别误差, 但是还存在很多方面的不足, 如若是主机上控制多个控制端, 就会占用很大的内存, 识别准确率和种类还有待提高, 这些还需要更多的人去努力。

摘要:计算机人脸识别技术是利用计算机对人脸图像进行分析和理解的技术, Open CV是用于图像处理软件, 具有很好的效率, 文章主要基于Open CV结合隐马尔科夫模型研究用于人脸识别的模型, 并提出一般研究步骤, 经过大量室内试验证明基于Open CV的研究在人脸识别中具有高效性。

关键词:Open CV,隐马尔科夫模型,人脸识别

参考文献

[1]刘静.基于OpenCV机器视觉库的人脸图像预处理方法研究与实现[J].电子设计工程, 2012, 20 (16) :186-187, 190.

[2]梁路宏, 艾海舟, 徐光聿, 等.人脸检测研究综述[J].计算机学报, 2002, 25 (05) :449-458.

[3]李英, 赖剑煌, 黄琼燕, 等.非均匀光照下的人脸表情多状态检测与分类[J].中山大学学报, 2006, 45 (05) :17-21.

[4]聂伟乐, 瞿建荣.基于OpenCV的运动目标光流算法[J]仿真应用光学, 2008, 29 (6) :867-869.

[5]余九华, 王敬东, 李鹏.基于Camshifl的人脸跟踪算法计算机技术与发展[J].白动画学报, 2008, 18 (9) :12-15.

[6]刘青山, 卢汉清, 马颂德.综述人脸识别中的子空问方法[J].白动化学报, 2003, 29 (6) :900-911.

[7]沈永增, 刘小磊.眼部疲劳状态检测算法的研究与实现[J].计算机应用与软件, 2011, 18 (03) :106-109.

[8]伍文峰, 王虎帮.基于模板匹配的目标识别算法的设计与实用[J].计算机应用, 2006, 6 (21:133-134.

OpenCV技术 第7篇

用于处理图像的软件有很多,比如MATLAB、HALCON、Visual C++、Lab VIEW等。与图像处理方法相似,这些软件在进行图像处理的同时也具有不同程度的不足。其中MATLAB的优势在于处理功能十分强大、操作界面简洁友好,并且具有一定的开放性,但存在的不足之处在于代码效率极低,比其他软件要低好几倍;Lab VIEW在代码、数据的基础上,可以实现图形化编程,并且具有较好的数据流传输特点和无限嵌套子VI等优点,但是,在驱动程序的实现和系统程序的调用方面存在较大不足,不能很好满足用户需求;HALCON则具有较为强大的视觉函数库,在处理图片时可以做到更为精准、速度更快,不足之处与Lab VIEW相似;Visual C++可以很好地实现各种程序或软件的开发建设,并且具有很高的代码效率,但Visual C++的代码在编写中复杂性非常强,也就是说,使用Visual C++开发软件程序,过程较慢、难度较大;Open CV也是处理图像的软件之一,是一种更为开放的数字图像处理和计算机视觉库,使用Open CV进行图像处理,其中具备是分开放的C源代码,还有较为统一的结构,具有较强的功能定义和强大的图像运算处理能力,方便用户使用的接口,Open CV还可以同时支持MS-Windows和LINUX,并且代码的编写相对简单,容量较小占用系统资源较小,利于整个程序实现。

2 采用同态滤波对图像进行处理

提高图像质量的方式有很多种,同态滤波是其中较为有效的一种。其操作原理主要是将频率过滤与灰度变换相结合,根据图像的实际清晰度、灰度均匀程度等,适当结合照度/反射率模型作为图像频域处理的基础,然后再对图像进行灰度压缩或者对比度增强来实现灰度的校正。

2.1 同态滤波原理分析

将图像在某一点(x,y)的灰度值s,假定为入射光照度i与反射率r的产物,在这一逻辑原理设定下,其相应的数学模型等式1为s(x,y)=i(x,y)*r(x,y),并且在这一模型等式中,0<i(x,y)<∞,0<r(x,y)<1。

通过以上等式可以看出,由于图像的实际入射光照度的变化不大,可以将这一特征视为低频成分,而反射率由于相关因素的影响导致其有较大变化,所以是高频成分。于是,再对图像的照度和反射率进行处理,即可改善灰度失真现象。同态滤波的处理流程如图1所示。

从图1可以看出,s为原始图像,t为处理后的图像,log表示对数运算,FT代表傅里叶变换,LF表示现行高通滤波器,IFT表示叶逆变换,EXP表示指数运算。

其具体算法步骤为:根据等式1可知,灰度s为乘法运算组合的形式,将其转换为对数运算的乘积模型,等式2为ln s(x,y)=ln i(x,y)+ln r(x,y),在此基础上将时域空间转化为频域空间,对等式2进行傅里叶变换,可以得出一个新的等式3,即F(u,v)=I(u,v)+R(u,v)。在频域空间进行一定的滤波处理,目的在于减少光照不均匀对图像整体质量的影响,在降低照度分量的同时提高反射分量,同时采用线性高通滤波,转换得到等式4:G(u,v)=H(u,v)*F(u,v)=H(u,v)*I(u,v)+H(u,v)*R(u,v)。完成这一步骤的滤波转换后,需要对图像进行时域转换,即对等式4进行傅里叶逆变换得出等式5:g(x,y)=F-1{H(u,v)*F(u,v)}。

在完成以上多重流程步骤的转换运算后,对等式5进行反对数的变化,可以得出同态滤波处理后的图像t,即t(x,y)=exp{g(x,y)},经过一系列的运算转换得出这一等式的数值后,即完成同态滤波图像灰度校正的算法。

2.2 采用Open CV实现同态滤波的算法

根据以上对同态滤波算法原理的分析,当采用Open CV进行灰度校正时,原理不变,使用代码来实现图像的处理,更加简单快捷。

2.2.1 像素点对数运算的Open CV编程实现

像素点对数运算在图像处理过程中有着较为重要的作用,因为图像的像素越高,相应的显示效果就会越好,反之则效果越差。像素点的对数运算,主要是将灰度不均匀的图像像素数值经过对数函数的运算,然后将其映射到相应的目标空间,以目标空间的具体映射数值为最终像素值。

实现这一部分编程代码的编写,需要用到Open CV软件中的Ipl Image来对图像的头部src Image进行定义设计,提取出坐标(x,y)处的像素值val,在得出的等式基础上,使用相关的函数标签对灰度值做出以e为底数的对数。最终得出Val=((uchar*)(src Im g→image Data+src Im g→with Step*y))[x]=val这一等式。当运算到这一步骤时,也就完成了Open CV编程像素点对数的运算。

2.2.2 傅里叶变换及逆变换的Open CV编程实现

傅里叶变换在图像的预处理中,可以实现图像相应序列的变换,也就是将空间域和频域结合起来,原有的空间序列可以通过一定的变换得出与之相对应的频域中的序列。而逆变换则是在已有频域基础上,进行反变换处理得出空间域中相对应的序列。

函数的基础原型为:viod cv DET(const Cv Arr*src,Cv Arr*dst,intflags)。在这一函数代码中,src和dst是输入和输出的变量数组,在运行过程中需要注意这两个数组要保持同样的数据类型和容量大小,flags是数据或数组变换的标志,cv_dxt_forward表示数据信息在实现正向一维或者二维的变换,cv_dxt_inverse则表示进行逆向的变换,根据图像的实际情况,使用cv_dxt_scale,可以更加便利地实现最终结果的缩放。

3 减去背景算法的实现

3.1 背景估计的Open CV编程实现

通过利用Open CV编程中的相关函数进行形态滤波算法的背景估计,所需要用到的函数为cv Create Structuring Element Ex,并且在实现的代码中需要对元素的行和列的具体数量、元素的锚点和水平、垂直偏移量、元素指针包括元素的结构形状等进行相应的赋值,通过函数等式的运算,得出具体数值,才能完成整体的背景运算。

在此基础上,可以对图像进行形态学的开、闭操作,开操作是指先膨胀、后腐蚀,闭操作则与之相反。根据做出的操作,来进行图像背景亮度的估计。

3.2 原图像与背景图像相减的Open CV编程实现

在Open CV编程实现的过程中,像素点的数值是重要的运算数据,因为有了这一数据的支持,图像灰度校正的运算过程会更加准确和清晰,将原图像与背景图像相减,得出具体的元素差值,不仅提升运算结果的准确性,对Open CV编程的实现也起到了非常积极的影响。函数原型为:

Void cv Sub(const Cv Arr*src1,const Cv Arr*src2,const Cv Arr*dst,const Cv Arr*mask=NULL)

在这一代码原型中,src1和src2是为求出两者的差值而输入的两个数组,dst表示输出的数组,mask为操作掩码。

4 使用Open CV处理的图像效果

笔者基于Open CV编程,结合相关的灰度处理算法,实现对光照不均匀和低噪信比的灰度不均匀图像的处理,根据其实际情况进行同态滤波和去背景的处理。

首先是对光照不均匀的图像进行处理的结果,图像处理前和处理后的对比,处理前的图像中的墙壁等轮廓模糊不清晰,细节部分体现不出来,在经过Open CV编程进行同态滤波的灰度校正方法处理后,墙角的一些直线以及墙壁都呈现出清晰明了的状态,并且图像的整体亮度和色彩度,也都有了明显改善。

通过Open CV编程算法实现对低信噪比图像的处理,可以明显看出处理前的图片较为平面化,没有立体感,并且灰度分布不均匀现象相对明显,米粒的轮廓也不够清晰,而经过减去背景灰度算法处理过后,图像呈现出了较好的立体感,灰度分布更加均匀。图像达到了这样的效果,主要依赖于将原图像与背景图像进行相减处理,实现了灰度均衡的效果。

5 结语

笔者利用Open CV编程对存在光照不均匀的图像进行同态滤波处理,对低信噪比图像进行减去背景法的处理后,纠正原图像的灰度不均匀现象,并且得出的效果比较好。利用Open CV图像灰度校正算法对图像进行处理,具有较好的处理效果,跨平台使用的开放性较强,同时简化了图像处理过程,编程变得更加简单快捷,相对其他图像处理方法,Open CV可以满足计算机视觉系统的需要,同时更好地满足用户的使用需求。

参考文献

[1]刘佳男,张秋菊.基于Open CV的图像灰度校正算法的实现[J].江南大学学报(自然科学版),2011,(6):662-666.

OpenCV技术 第8篇

1二值化检测法

数字图像处理技术主要研究有数字化图像、图像编码、图像的增强和复原、图像描述、图像识别等[2]。图像处理方法可分为二种:第一种包括各种几何变换方法,特点是将图像通过几何方法,变换到其他频域中进行处理后,再变换到原来的域中。第二种方法是数学形态学运算,它区别于常见的频域和空域,是建立在积分几何和集合论基础上的运算。

PCB元件是一种体积偏小、色彩单一的元器件,对检测精度有较高要求。另外,PCB元件的检测属于全面检测,注重检测速率的快慢。综合考虑图像处理须接受较好的光照及形成较高的图像质量,采用传统图像二值化检测法[3,4]。

2 Open CV视觉库

Open CV计算机视觉库是由一些基本的C函数和C++类所组成的函数库,用来实现计算机图像算法,解决复杂困难的计算机图像处理问题。该库的所有代码都经过优化,计算效率很高,主要用于对图像进行高级处理,例如特征检测与跟踪[5,6]。它的主要方向是提供良好的机器视觉接口函数,让复杂的机器视觉产品可以更好的供人们使用。Open CV视觉库非常庞大,包含了有横跨工业产品检测、医学图像处理、安防、用户界面、摄像头标定、三维成像、机器视觉等领域的超过500 个接口函数[7]。因此,它目标成为一种用于实时系统的视觉开源库。

3 PCB元件缺陷检测过程

3.1 检测流程

Open CV视觉库提供图像处理函数,对PCB元件进行平滑处理、边缘检测等全面处理,较完整地获取PCB元件中存在的缺陷,检测流程如图1所示。

3.2 PCB元件检测过程

3.2.1 图像去噪

去除图像噪声的常用方法有邻域平均法均值滤波器、中值滤波、自适应维纳滤波器、小波去噪等。实验采用的是中值滤波方法,它的原理是将数字序列中某一点的值用该点一个邻域中各点值的中值替换,其主要功能是让周围像素灰度值的差比较大的像素改取与周围的像素值接近的值,从而可以消除孤立的噪声点[8],它对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,使边缘不被模糊。此外,中值滤波的算法比较简单,也易于实现。

中值滤波的方法是采用一个长度为奇数的二维滑动窗口,设定某一个时刻,对这窗口内的信号样本值按照像素值的大小进行排序。二维中值滤波输出公式为:

g(x,y)= med{ f (x - k,y - 1),(k,1 ∈ w)} (1)

其中,f (x,y) , g(x,y) 分别为未处理图像和处理后图像;W为二维模板,取以目标像素为中心的一个领域子矩阵窗口,对窗口内的像素灰度值进行排序,用数据序列的中值代替中心点的灰度值。

Open CV中提供的平滑滤波函数如下:

voidcv Smooth(constCv Arr*src,Cv Arr*dst,int smooth_types=CV_MEDIAN, int parameter1=3, int parameter2=0;double parameter3=0, double parameter4=0);

其中smooth_types取以下几种值。

CV_MEDIAN:对图像进行像素值为parameter1×parameter1的中值滤波。

CV_BLUR_NO_SCALE:对每个像素的parameter1×parameter2领域求和。

CV_BLUR:对每个像素parameter1×parameter2邻域求和并做尺度变换1/(parameter1×parameter2)。

CV_GAUSSIAN:对图像进行像素值为parameter1×parameter2的高斯卷积。

CV_BILATERAL:应用双向3x3 滤波,彩色sigma=parameter1,空间sigma=parameter2。

利用Open CV提供的函数实现对PCB元件图像的处理,得到滤波图像,结果如图2所示。

3.2.2 阈值分割

使用阈值分割方法将图像有效和图像缺陷部分进行分割,提取有效部分进行处理,提高PCB图像缺陷的识别精度和准确度。这种方法特别适合用于背景占据不同灰度级的图像,不仅可以很大程度地压缩数据量,而且也简化了分析和处理步骤,提高生产效率。

最常见的阈值分割是固定阈值分割方法,Open CV提供了固定阈值分割方法的函数:

void cv Threshold(const Cv Arr* src, Cv Arr* dst, double threshold, double max_value, int threshold_type );

其中,

:初始数组,数值为或者浮点数。

dst:输出数组,必须与src的类型一致。

threshold:阈值。

max_value:使用CV_THRESH_BINARY和CV_THRESH_BINARY_INV的最大值。

threshold_type:阈值类别。

利用Open CV视觉库检测阈值分割函数,实现对PCB元件图像的分割,结果如图3所示。

3.2.3 边缘检测

常用的一阶边缘算子有Prewitt算子和Canny算子等。本实验采用的是Canny算子[9]。Canny算子有以下3大优点:

(1) 图像边缘信息的漏检、误检率较小,图像的检测整体效果较好。

(2) 实现高精度的定位,Location越大越好。

(3) 响应次数最少,保证只有唯一像素点响应。

Open CV提供的Cv Canny函数原型如下:

void cv Canny( const Cv Arr* image, Cv Arr *edges, double threshold1, double threshold2, int aperture_size=3);

其中,

threshold1:第一个阈值。

threshold2:第二个阈值。

aperture_size:算子内核大小。

采用Open CV提供的cv Canny函数。运用Canny算子进行PCB元件的边缘检测,实验结果如图4所示。

在经过以上处理之后,可以将检测后的PCB元件图像与标准模板PCB图像进行匹配,匹配成功后得到函数返回值,最终确定PCB元件的缺陷。Open CV中提供的形状比较的函数如下:

Double cv Match Shapes( const void* object1, constvoid* object2, int method, double parameter=0 );

其中,

object1:第一个轮廓或灰度图像。

object2:第二个轮廓或灰度图像。

Method:比较方式在以下3 种方式中:CV_CONTOUR_MATCH_I1,CV_CONTOURS_MATCH_I2,CV_CONTOURS_MATCH_I3。

Parameter:数值参数,函数匹配完成后,会返回一个匹配的数值,表明匹配程度。

利用Open CV提供的匹配函数,可以获得相应的匹配结果,如图5所示。

3.2.4 实验与分析

模板的选择会影响匹配的结果,模板选得太大,对较小的缺陷不敏感;而模板选得太小,像素点采集不够,实验结果不准确,容易产生误差。实验采用600 < X,Y < 1500 像素的图像作为模板。

定义一个变量pcb Result,获取函数的返回值。当PCB元件没有缺陷时,pcb Result的值为0,但是,实际结果与理论存在一定的误差,经过反复试验、严格对比,使结果更加可靠,选取PCB存在缺陷的临界值为0.2。所以,当pcb Result等于0时,图像完全匹配,没有缺陷;当pcb Result小于0.2时,认为图像基本匹配,不存在缺陷或缺陷不会影响PCB的正常使用。当pcb Result大于0.2 时,则表明PCB元件存在缺陷,无法匹配。实验结果如图6所示。

4 结论

上一篇:化学实验教学中的体会下一篇:罗马的碎片