基于OpenCV的小型生物运动检测技术研究

2017-06-05 16:55郭志彪段为
电脑知识与技术 2017年7期
关键词:机器视觉

郭志彪 段为

摘要;从图像处理在视频监控的角度出发提出了一种针对小型生物的检测,将Open CV开源计算机视觉库源代码作为基础函数库,改写或者调用其中的函数,在Visual Studio 2015平台上编程實现。将帧差法,背景减除,灰度化,二值化阈值分割等图像操作应用于视频监控中。实验结果表明,本文中方法具有良好的实时性,能够精确检测和跟踪小型生物,具有很好的鲁棒性和精确性。

关键词:运动目标检测;机器视觉;图像处理OpenCV

中图分类号:TP18 文献标识码:A 文章编号:1009-3044(2017)07-0171-02

运动目标的检测及跟踪技术在机器人导航、安全监控、航天行业等领域都有着广泛的应用,并成为当前机器视觉领域研究重点之一。但是当前的技术对于移动速度快、体积小的小型生物的跟踪很难达到准确度高,实时性强。

1运动目标检测的基本方法

近些年来,国内外的学者们在运动目标检测的问题上,已经提供了许多有效的方法,但是很多算法不能同时满足实时性,精确性的要求,特别是对于移动速度快的小型生物。目前,常用的运动目标检测算法有以下几种:光流法,基于卡尔曼滤波的运动目标跟踪,背景差分法等。

1.1光流法

光流法基本原理为检测序列图像中出现的瞬时位移场,从连续的图像序列中计算光流场,把计算得到的光流,作为检测运动目标的重要特征。光流法不受背景变化的影响,但对于噪声多的场景,光流法容易出现误判的情况。

1.2基于卡尔曼滤波的运动目标跟踪

基于卡尔曼滤波的运动目标跟踪是将目标的运动轨迹作为模型,预测目标下一时刻的位置。能减少运算量,缩小检测区域,但是当运动目标长时间被遮挡时会存在目标跟踪丢失的情况。

1.3背景差分法

背景差分法是事先将图像储存起来作为背景参考模型,再用当前图像与背景作差,找出在灰度上与背景有较大差异的点,检测运动区域。背景差分法对于运动速度快的运动目标,检测准确,但对于动态变化的场景,检测精度低。

综上所述,现有技术存在着对于快速移动的小型生物检测精度不高的问题。作者试图基于帧差法,利用Open CV函数库,寻求一种针对移动速度快、体积小的运动物体的检测。

研究主要实现的目标是对移动速度快的小型生物的检测,主要是利用视频图像序列中连续两到三帧的差异来检测运动区域。首先,获取相邻两帧图像,将前一帧作为背景,用后一帧减去背景,获取图像亮度差绝对值较大的区域,一般亮度差异较大的区域可认为由运动物体引起的。帧差法算法实现简单,受光线影响小,适应于动态场景,稳定性强。但是该算法对于两帧获取时间间隔要求高,时间间隔选取不适当,容易出现“重影”和“空洞”的现象。研究对该算法进行改进,以提高检测的精度。

2系统组成

运动目标检测系统主要由视频获取,读取相邻两帧,图像灰度化处理,相邻帧的图像对应像素值相减,差分图像二值化。

系统首先获取实时采集的序列图像。其次,读取序列图像中相邻两帧图像,对该两帧图像进行灰度化处理。将前一帧作为背景,将后一帧图像的像素值减去背景对应的像素值,获取变化大的区域,确定运动目标的位置。最后对运动目标进行二值化突显运动区域。

3算法原理

3.1图像灰度化

研究使用cvtC~lor函数实现图像的灰度化。函数声明为src和dst分别是源图像和输出图像;code是一个掩码,表示源图像和输出图像之间的转化模式。最后的&tCn表示dst图像的波段数,默认值为0,可从参数code中推断。

code的模式包括:

3.2帧差算法

研究采用帧差算法实现运动目标提取,使用函数subtract()。

函数声明为

void subtract(InputArray src1,InputArray src2,OutputArray dst,InputArray mask—noArray(),int dtype=-1)

其中,src1为第一帧图像,src2为第二帧图像,dst为输出图像,mask为自定义掩码。])type为两帧相减的方式。

本函数实现了帧差算法,读取一段序列图像,获取相邻两帧的图像,将前一帧图像作为背景src1(I),后一帧作为当前图像src2(I),用当前图像的像素值减去背景相应的像素值,获取变化较大的区域,该区域可认为由运动物体造成,具体公式可参考公式(1)。

dst(1)=saturate(srcl(D-src2(I))if mask(I)≠0 (1)

3.3差分图像二值化

差分图像二值化是在上一步获取的差分图像的基础上,进一步凸显运动物体的区域。具体实现为先设定一个阈值T,当图像的像素值大于该阈值时设定为1,否则设定为0。接着将所有设定为1的点的灰度值设置为255,所有设定为0的点的灰度值设置设置为0,具体公式可参考公式(2)。

(2)

4算法在编程环境下的具体实现

研究算法的具体实现如下:首先建立一个VideoCapture结构体,导入一段序列图像。然后读取该序列图像中的一帧图像,保存在类型为Mat的结构体中,等待5毫秒后,读取下一帧图像,同样保存在类型Mat的结构体中。接着调用灰度化函数cvtColor()对两帧图像进行预处理。调用矩阵相减函数subtract(),设定一个阈值,对相减的差分图像进行二值化。最后调用namedWindow()函数建立窗口并调用imshow()函数显示图像。

5实验结果及分析

研究对帧差算法进行改进,调用OpenCV函数库中的函数,在Visual Studio 2015平台编程实现了对于小型生物的运动检测,实验结果见下图。

图2所示为实时图像第一帧,图3所示为相邻帧,将图2,图3分别灰度化后再相减后得到图4所示图像,图5为二值化后的图像。其中在获取相邻两帧的时间间隔以及二值化的阈值,需根据实际处理的图片来不断调整数值,经过多次实验不断尝试后,时间间隔在10-30毫秒之间为最好,二值化的阈值在10-13时,运动物体的真实目标区域较完整,“重影”、“空洞”现象较少。

研究算法检测效果比较好,对于移动速度快的小型生物也能很好的检测出来,真实目标区域较完整,背景噪音较少,而它错误可以通过形态学去噪、阴影抑制、空洞修补加以完善。

6结语

研究调用OpenCV函数库中的函数,对帧差法进行改进,实现了对于小型生物的运动检测。改善了“空洞”重影”的情况,提取的真实目标区域较完整,检测效果理想,解决对于小型生物的运动检测精度不高的问题,具有一定的实用性。

猜你喜欢
机器视觉
大场景三维激光扫描仪在研究生实践教学培养中的应用