视频识别在皮带机上运动计数的算法设计

2016-06-29 21:20徐智广周杏樱
电脑知识与技术 2016年13期
关键词:计算机视觉图像识别

徐智广 周杏樱

摘要:传统的皮带机计算器在一个通道内无法同时识别多个目标,本文使用AForge.NET视频图像处理类库来介绍怎样使用视频识别技术检测多个运动目标并实现自动计数的功能,本文着重于算法的设计及实现方法。

关键词:图像识别;多运动目标计数;皮带机计数器;计算机视觉;AForge.NET

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2016)13-0197-04

1概述

传统的皮带机计数器是采用红外传感器安装固定在传送带的两侧,一端发射红外线、另一端接收此红外线信号,当目标物品从中间通过遮挡到红外线时,会触发计数器进行计数。由此计数器的工作原理可知,被测目标物品通常比较大件且传送带是单通道,目标物品一个一个地依次通过红外传感器进行计数,如果被测目标物品体积细薄且数量较多需要在传送带上批量计数的时候,传统的皮带机计数器将难以解决。

如今视频识别伴随计算机技术的高速发展其技术日臻成熟,广泛应用于现代加工制造业,本文介绍一种利用视频识别进行多运动目标检测自动计数的算法设计及实现方法。

2视频识别检测方法

2.1运动目标检测方法

目前视频识别使用的运动目标检测方法有以下几种:帧差法、背景差法、光流法等。通过实践证明使用帧差法能更有效地检测高速运动的目标,在此着重介绍帧差法的原理,帧差法是指将运动图像序列中相邻的两帧作差分运算来获取运动目标轮廓的方法,该方法算法简单检测速度快,适用于多个运动目标检测和实时性较强的应用场合。因此本文使用帧差法。

本文的视频识别处理过程就是对帧差法产生的一系列图像进行图像识别分析处理,就是一个持续的图像处理过程。

2.2 AForge.NET编程框架类库

AForge.NET是一个基于C#语言开发的视频和图像处理的开源类库,它包括了计算机视觉的各种基本算法,例如:图像处像和滤镜过滤,机器学习、模糊推理和视频处理等。

本文主要引用AForge.NET类库中的1.AForge.Imaging:图像处理和滤镜类库;2.AForge.Vision:计算机视觉应用类库;3.AForge.Video:视频处理类库。引用成熟AForge.NET视频和图像处理类库可以使开发者更专注于实际图像识别的算法本身,而不需要构建一个完整的图像处理数学模型。

本文软件系统环境为微软VS2012,C#编程语言,使用AForge.NET 2.2.5版本类库,硬件为USB接口的工业高速摄像枪,达到60帧/秒。

3算法设计与编程方法

我们把小型电路板作为待测计量的目标物体,把一堆小型电路板放到皮带机输送带上,此时摄像头进行拍摄,计算机服务器程序开始使用帧差法处理拍摄的图像队列。

3.1应用滤镜检测目标轮廓路径

为了检测出在皮带机上的电路板,我们使用一些图像滤镜对图像目标进行处理,首先图像需要进行灰度化,其作用是将彩色图像变成黑白灰色,有的摄像枪可以直接调节为黑白模式则可省略本步骤的过滤处理,减少资源的消耗;然后再对灰度化的图像进行二值化过滤,目的是使图像变成只有黑白色;再利用边缘路径检测函数对图像上所有的小型电路板轮廓路径进行检测,得到电路板的边缘的闭合路径图。算法程序如下:

FiltersSequence seq = new FiltersSequence();//使用过滤

seq.Add(Grayscale.CommonAlgorithms.BT709); //添加灰度滤镜,把彩色变灰色

seq.Add(new Threshold(150)); //基于阀值的二值化,即结果不是黑就是白

seq.Add(new OilPainting(10)); //边缘填充,使更好地闭合

Seq.Add(new DifferenceEdgeDetector());//边缘路径检测

得到如下图所示一个个长方形的闭合路径,即为小型电路板的轮廓路径模型。下图为应用一连串的滤镜后的图像变化结果。

3.2提取闭合路径图像块模型数组

在上图中最后滤镜处理(路径检测)其结果显示的每一个闭合长方形就是一个小型电路板轮廓模型,通过blobCounter类函数,对整个图像的所有闭合路径进行提取。为了去除干扰的因素和提高准确性,我们对提取图像块的最小宽度、最小高度以及图像块面积进行了过滤,通过了过滤的图像块数组则为图像上所有小型电路板的模型。算法程序如下:

blobCounter.FilterBlobs = true; //开启过滤条件

blobCounter.MinWidth = 40; //设置最小像素宽度

blobCounter.MinHeight = 40; //设置最小像素高度

blobCounter.ObjectsOrder = ObjectsOrder.Area;

blobCounter.ProcessImage(image); //筛选出有效的对象

Blob[] blobs = blobCounter.GetObjectsInformation();//提取图像上所有闭合路径作为图像块数组。

提取的闭合路径图像块模型数组存在于程序的内存中,现阶段没有进行图形显示。

3.3获取图像块的中心点。

根据皮带机的单方向运动的特点,我们在图像画布上画两条虚拟的起始线和结束线,图像块总从红线上向下运动,最后穿过绿线。为了方便追踪检测,我们以图像块中心点来代表一个图像块,然后只要监测中心点的运动情况即可,当中心点经过红线的时候进行追踪检测记录,当中心点通过绿线之后进行统计数量加1,如下图所示:

中心点在程序上以XY坐标值来表示,算法程序如下。

foreach (Blob blob in blobs) //遍历图像块数组

{List leftPoints, rightPoints, edgePoints; //定义泛形坐标点

blobCounter.GetBlobsLeftAndRightEdges(blob,out leftPoints, out rightPoints); //获取图像块左右边缘坐标

edgePoints = blobCounter.GetBlobsEdgePoints(blob); //获取图像块边缘坐标

edgePoints.AddRange(leftPoints); //添加左边缘坐标

edgePoints.AddRange(rightPoints); //添加右边缘坐标

int minX=0, maxY=0, maxX=0, minY=0; //定义XY轴坐标的最大最小值变量

if (edgePoints.Count > 0)

{minX = maxX = edgePoints[0].X;

maxY = minY = edgePoints[0].Y;

foreach (IntPoint pointx in edgePoints) //判断当前坐标是否越界限。

{ if (minX > pointx.X) minX = pointx.X;

if (maxX < pointx.X) maxX = pointx.X;

if (minY > pointx.Y) minY = pointx.Y;

if (maxY < pointx.Y) maxY = pointx.Y; } }

centerX = (maxX - minX) / 2 + minX; //中心X轴坐标

centerY = (maxY - minY) / 2 + minY; }//中心Y轴坐标

当图像块从上到下穿过红色开始线时,就将中心点的XY坐标值进行记录。为了记录每个图像块的坐标等信息,我们建立了一个TrackBlock类来表示图像块模型,以下为TrackBlock类的私有成员变量。

public class TrackBlock

{ private int avgX;//图像块中心点的X轴坐标

private int avgY;//图像块中心点的Y轴坐标

private int checkLine1 = 40;//起始红线的Y轴坐标

private int checkLine2 = 420; //结束绿线的Y轴坐标

private bool isCheckLine1 = false;//记录该Y轴坐标是否已经超过了checkLine1的值

private bool isCheckLine2 = false;// 记录该Y轴坐标是否已经超过了checkLine2的值

……

}

TrackBlock实体类将记录于List listBlock 这个泛型类集合中。

3.4帧差法中心点的运动轨迹统计算法

由于图像块中心点的运动轨迹总是往向下运动,在计算机程序的图像处理上,即中心点的X轴坐标不变,Y轴坐标增加。对以60帧/秒速度产生的帧差图像以及皮带机的每秒传送速度,可以计算出图像块中心点坐标两帧之间X轴允许10像素的绝对值偏差,Y轴为运动方向允许120像素的正偏差,其中允许X轴偏差是摄像头测量精度及皮带机会震动的原因,而Y轴的两帧偏差值与皮带机的运动速度有关。如果检测到中心点X轴偏移太大,或者位移太快,都认为是无效追踪到的中心点,则不参与计数,如下图所示。

由于画布上有多个运动的图像块,有刚出现的,也有已完成计数消失的,我们需要对应地识别出该图像块是新纪录还是已有记录,方法为遍历每个图像块中心坐标的值和当前已有泛型类集合(listBlock)中的中心坐标的X轴Y轴值的差,是否在上述XY轴的允许偏差范围内。如中心点的坐标偏差在允许范围内则更新泛型类集合中心点的坐标值,如果不存在记录则新增记录。程序算法如下:

for (int i = 0; i < listBlock.Count; i++)//循环泛型类集合

{//查找是否存在记录,更新中心点

if (centerX < maxX && centerX > minX && centerY < maxY && centerY > minY)//中心点坐标必须在最大最少坐标值的范围内

{ //中心点必须要范围内X轴允许10像素的绝对值偏差,Y轴为运动方向允许120像素的正偏差,

if (listBlock[i].AvgX > 0 && listBlock[i].AvgY > 0 && Math.Abs(centerX - listBlock[i].AvgX) <10 && Math.Abs(centerY - listBlock[i].AvgY) < 120 && listBlock[i].IsExist)

{ listBlock[i].AvgX = centerX;//更新中心点的信息

listBlock[i].AvgY = centerY;

isExist = true;//标识为已存在记录

break; }}}

//不存在符合条件,则新增记录

if (!isExist)

{ //新增条件, 中心点Y值必须要在第一条横线之前出现,即值小于50;

if (50 - centerY > 5) //5像素为一个相对的误差值

{ TrackBlock trackBlock = new TrackBlock();

trackBlock.AvgX = centerX;

trackBlock.AvgY = centerY;

trackBlock.IsExist = true;

listBlock.Add(trackBlock); }}

在更新中心点的信息时,就会触发TrackBlock类中AvgY的赋值函数。赋值函数中将实时中心点Y值与设定的红色开始线的Y值(checkLine1)比较,当中心点Y值大于红线Y值且IsCheckLine1 =false且IsCheckLine2=false(没有穿过红线而且也没有穿过绿线),则IsCheckLine1 =true表示该图像块已经进入了追踪检测的范围。

如果大于绿线Y值且IsCheckLine1 =true(已经穿过了红线)且IsCheckLine2=false(没有穿过绿线)则IsCheckLine2=true。算法程序如下:

public int AvgY

{get

return avgY;

set

{ avgY = value;

//检测是否通过了开始线

if (!IsCheckLine1 && !IsCheckLine2)// 原来并没有穿过红色开始线或是绿色结束线,即新出现的记录

{if (value - checkLine1 > 2) //大于2像素,2像素表示一个相对的误差范围值

{IsCheckLine1 = true; }}

//检测是否通过了结束线

if (IsCheckLine1 && !IsCheckLine2)// 已经穿过了红色开始线但之前没有穿过绿色结束线

{if (value - checkLine2 > 2) //大于2像素,2像素表示一个相对的误差范围值

{IsCheckLine2 = true; }}}}

当IsCheckLine2等于true,表示穿过了结束线,可以进行计数加1,并在泛型类集合中删除该中心点的实体类。至此整个视频识别在皮带机上运动计数的算法设计就完成了。

4目标物品堆叠的处理

在进行大规模的自动计数的时候,被测物体电路板会被大批倒在皮带机上,其不规则的摆放会导致电路板在皮带机上产生堆叠的情况,在此情况下自动计数将不能使用像上述理想模型的处理方法。为此我们需要在皮带机上增加物理过滤以及改进物体轮廓提取的算法。

4.1筛选过滤装置

对于被测物体可能产生的堆叠情况,可以在皮带上放置一个挡板来限制被测物体的高度,使用双挡板可以确保消除物体的堆叠情况。

对于被测物体可能互相重叠的情况会影响到视频识别的追踪检测,可以在皮带机上放置一个导航间隔栏来引导和打散被测物体,见下图。

4.2程序算法的筛选过滤处理

在使用blobCounter类提取图像块的时候,可以设定过滤条件,对于只有二个目标物体之间的重叠,是可以通过宽度高度和面积像素大小的情况进行识别,但对三个以上的物体重叠情况则比较复杂,因为重叠之后计算机并没有获取到全部的图像信息,基于二维图像分析blobCounter类库没有办法实现自动识别,闭合路径检测会把多个重叠的目标闭合组成了一个。

对于规则的目标物体可以使用ExhaustiveTemplateMatching基于模板的图像匹配函数来查找。即把目标物体作为模板来查找整个图像中的匹配情况。但对于过度重叠和堆叠的目标物品,需要开发更复杂的算法,现结合物理上的筛选过滤装置可以分离出独立运动的被测目标物体。

5结束语

本文使用帧差法作为视频运动目标检测,使用了AForge.NET类库的灰度化、二值化、路径检测、图像块提取等图像处理技术方法,使计算机获取到了目标物体的模型坐标,通过对目标物体中心点坐标的持续追踪检测,实现了自动计数的功能。

本文着重于实现算法的本身,程序经过大量试验并多次修正,能实现自动计数的功能。对于运动目标重叠堆叠严重的情况,程序未能完全进行自动识别检测,需要借助物理上的筛选过滤装置处理,但对于研究视频识别多个运动目标的检测或在皮带机上多运动目标计数的工业应用,具有一定的借鉴意义。

参考文献:

[1] 楼亮亮,金彦亮. 基于AForge.NET类库的视频移动目标检测[J].现代电子技术,2015,38(17):58-60.

[3] 谢树煜,陈倩,朱虹. 实时视频对象识别与计数系统的模型和算法设计[J].清华大学学报:自然科学版,2001,41(7):61-64.

猜你喜欢
计算机视觉图像识别
基于Resnet-50的猫狗图像识别
高速公路图像识别技术应用探讨
图像识别在物联网上的应用
图像识别在水质检测中的应用
危险气体罐车液位计算机视觉监控识别报警系统设计