APP下载

基于OpenCV自动运动检测控制系统设计

2022-06-10邹振兴张国安梁俊铭

电子制作 2022年11期
关键词:树莓高斯阈值

邹振兴,张国安,梁俊铭

(广东职业技术学院,广东佛山,528041)

0 引言

近年来,随着人工智能技术迅猛发展,计算机设备己经深入涉及到社会生活中的各个方面,计算机机器视觉得到快速发展。利用视觉传感器采集,进行静态及动态目标图像处理分析成为当下研究应用的主题。如在家居安全监测中,利用视觉系统对目标进行运动跟踪和检测,监测和智能人机交互及分析目标行为,可分析发现异常行为,从而监控系统发出报警,进而进行科学处理,从而提高日常生活质量。计算机视觉其目的是分析、研宄让计算机智能化一定程度实现人的眼睛和大脑感知外部环境,分析和执行等功能[1]。而其中目标运动检测与跟踪是通过视频图像的处理,采用如阈值分割、高斯模糊、滤波算子等算法进一步掌握目标图像的运动信息和特征,为后续执行系统提供信息数据依据,可以实现对运动物体的图像检测。

1 硬件选型与系统搭建

1.1 树莓派

树莓派是一款基于ARM的信用卡大小的单板计算机[2],拥有丰富的接口,能够安装任何ARM平台的操作系统,如Android、Windows等。一台这么多接口的单板计算机,实际只有掌心大小,树莓派CPU功耗低,处理能力强。比较其他开发板控制平台,树莓派提供的引脚能直接控制其他底层硬件。树莓派细小灵活,性价比高,应用成熟,开源代码多,利于开发与应用。树莓派核心板及外接引脚图如图1所示。

图1 树莓派核心板及外接引脚图

对比常规的8位单片机和32位嵌入式等控制器,树莓派拥有丰富的I/O,还能搭配灵活的操作系统,完成各种任务管理与调度,支持上层应用的开发,为了开发与设计提供更多的可能性和可靠性。随着图像处理技术发展和各种微型计算机研发,使用传统计算机作为处理图像的平台已经无法满足很多运动检测设备对处理平台简洁性的需求,而树莓派作为一个微型计算机同样可以进行图像处理,只要通过OpenCV就可以在树莓派上使用帧差法把树莓派摄像头采集到的图像进行运动检测,再通过控制程序就可以直接控制执行机构。所以把OpenCV与树莓派结合起来处理图像就可以得到一个简洁高效的自动运动检测控制系统。

1.2 Linux系统

Linux是开源免费和自由传播的操作系统,具有丰富的社区资源。开源能让用户自由裁剪,灵活性高,功能强大,成本低。Linux的开源性和稳定性,都能更好地使用户调用硬件功能,方便了查看资源的利用率。

无论是Linux的开源性、多线程、多任务的性能优点,还是其别具一格的开发用途都使得用户在学习和开发上的难度有一定的降低,尤其是Linux的开源性对本次设计有很大的帮助,由于本设计作品需要连接局域网之外还需要配置相关的编译软件和开发环境,所以Linux的开源性在搭建开发环境上就有了很大的便利性。

2 系统设计思路

基于OpenCV自动运动检测控制系统是由一块4B、2GB的树莓派、2个可调舵机和1个摄像头所组成。开发环境是在Linux系统上使用Python调用OpenCV数据库来实现一个可以自动跟踪目标并时刻拍摄的控制系统,除了自动跟踪外还可以通过控制调节摄像头的拍摄方向。在这个设计中,要做到一个自动识别物体并且实现运动目标的监测系统,需具备这几个模块图像传感器采集模块、图像数据处理模块、运动目标提取及跟踪、执行舵机动作模块等这些流程。其设计思路如图2所示。

图2 设计思路图

(1)图像传感器采集

图像传感器采集模块是利用传感器内部的光电器件的光电转换功能。将感光面上的光像转换为与光像成相应比例关系的电信号,从而实现对研究对象的视频及图像信息的抓取。包含了传感器视频数据的采集、传感器采集图像显示帧数和分辨率的调整、数据传输以及信号初始处理等。图像传感器采集是图像处理、确定边缘、定位目标及执行控制的前提。

(2)图像数据处理

传感器采集数据后,往往是进行数据处理,由于图像往往会受环境的影响,存在噪声的干扰、亮度不足、曝光不足或过度等情况,这样的数据是会增加处理难度、产生滤波的延长及边缘不清晰等。因此可以传感器采集到的视频图像数据进行预处理,进行滤波处理去除干扰,实现颜色空间转换、亮度和色度达到合理,方便二值化的处理使边缘清晰,减少算法处理时间。这部分是实现运动目标检测的关键。

(3)运动目标提取

运动监测技术日益成熟,视频图像信息通常包括多个元素,但一般背景是相对固定的,相近各帧特征变化不大,所以运动目标的提取也成为可能。运动目标提取主要就是在图像数据序列中检测出运动目标,并将前景与背景图像做分割处理,再做目标跟踪算法,这方面的算法常见有光流法、帧间差分法、背景减除法等。

(4)运动目标跟踪

在系统设计中要求监测对象要在图像处理模板的中心,所以记得多监测对象的运动轨迹进行控制。目标跟踪算法就是在相邻每帧图像之间的数据形成与监测对象匹配的关系。把运动目标在数据序列中一一对应,再通过模板匹配和算法计算得到运动目标的中心、定位、路线、速度等特征与参数。进一步将这些参数输送给后续算法处理分析,最终实现对运动目标的跟踪和定位分析。

(5) 执行舵机动作

舵机接收到上级信息信号后,执行动作,往往是系统的后续执行机构。执行舵机根据信号往往会判断图像视频中目标物体在拍摄窗口内移动的情况,按照设定的条件算法进行运动动作,达到指定位置。

3 软件环境搭建

在Linux系统下搭建OpenCV开发环境需要以下步骤:

(1)首先要启用摄像头,进入Interfacing Options->Camera->Yes,即可启用摄像头。

sudo raspi-config

检测摄像头是否正常,可以使用以下命令进行检测:raspivid -t 0 -cs 0

(2)准备视频流设备,在OpenCV中,若要读取摄像头数据,需要开启v4l2(video for linux 2),开启后,摄像头设备文件为/dev/video0,OpenCV将从该文件中读取视频流文件。

sudo vim /etc/modules

(3)更换树莓派软件源

# 编辑 `/etc/apt/sources.list` 文件,删除原文件所有内容,用以下内容取代:

git clone -b 4.1.0 --recursive https://github.com/opencv/opencv_contrib.git

4 OpenCV的运动检测设计

运动检测设计这部分是往往最复杂的,不仅要把物体和背景区分开来,还要让机器知道物体是否在移动,这需要大量的算法和数据处理支持,所幸的是在C和C++的库里有这么一个数据库可以支持计算机视觉程序开发的,这就是OpenCV函数库。它可以在Windows、Linux、Mac OS等系统上面运行。由于它的底层是C和C++所以OpenCV数据的处理能力很强, OpenCV是一个广泛应用于视频图像处理、机器视觉方、运动监测等方面的开源函数库,该库主要采用C语言进行编译与优化,编程灵活数据处理快。OpenCV具有模块化结构能为设计友好的视觉对接函数提供简便的支撑,这意味着该包包含多个共享库或静态库。这次设计加上使用Python作为开发语言,其数据与函数的调用能力相结合使得这一获取视频和识别物体的程序变得简单和方便了起来。

基于OpenCV的运动物体的视频检测原理:根据监测对象的图像处理提取特征信息,如边缘、二值化图像等, 在捕获连续图像帧信息中进行对比或进行背景图像分离等从而跟踪得到运动目标的信息等。整个过程体系如图3所示。

图3 图像分离背景程序流程图

视频图像预处理:是针对于捕获到的视频流信息进行图像处理。预处理目的是平滑图像滤除噪点,然后再进行边缘检测轮廓提取等处理,为图像特征提取分析与处理打好基础。

捕获最小包围领域,从其中图像中提取目标对象可以进一步减小算法计算量提高图像处理时间,也可以对图像进行灰度处理、阈值分割及二值化处理等。采用帧差法将相邻的两帧图像对应像素点进行相减而得到运动目标数据[3]。在帧差法运动检测前对灰度图像可进行滤波平滑。然后使用灰度重心法确定运动物体的坐标,进而将背景与目标分离。为减小噪声对运动检测的影响,可对运动检测结果进行阈值分割,阈值分割处理得到运动物体的二值化图像。对于从图像中提取目标对象,本质就是对于目标边缘检测及分割的过程。通常就是利用图像像素之间的差异性,判断是否有运动目标,算法处理步骤一般为相邻帧对比相减、阈值分割、滤波噪声、膨胀处理、边缘检测、绘制外接矩形区域等,其中阈值的选择也很重要,阈值过低无法去除噪声,太高则影响图像中变化数据,可能会无法提取完整运动目标信息。

在OpenCV中可将运动部分划为感兴趣区域ROI(region of interest)[4],来计算出运动目标的几何中心。ROI的几何中心在运动目标上,通过计算ROI几何中心的坐标,可得出其与图像中心的距离,通过控制执行机构,将几何中心与图像中心重合则选定运动目标中心。计算采集到的图像的中心坐标算法用灰度重心法。灰度重心法原理就是将区域内每一个像素位置处的灰度值当作该点的质点,其求区域中心的公式如下:

(1)式中,f(u,v)是坐标为 (u,v)的像素点的灰度值, Ω是目标区域的集合,是区域的中心坐标。

设计过程中还需留意OpenCV的设置,因为它是C和C++所提供的库,所有OpenCV类和函数都放在cv命名空间中。因此,要从代码中访问此功能,需要在程序中说明cv:符或using namespace cv;指令,由于设计需要用到Python来进行编译程序所以需要把OpenCV和Python对接,而OpenCV for Python就是通过NumPy进行绑定的,如果读取图像首先要导入OpenCV包。

5 高斯模糊算法

对于检测物体图像可以利用帧差法可将背景与目标分离,从而获得的前景和背景的差图,再使用阈值分割技术,从而将目标物体分离出图像。在本项目设计中使用OpenCV处理图像时除了用阈值分割法之外,还用到了高斯模糊算法。高斯模糊可有效过滤掉可能被误认为运动检测目标的高斯噪声[5],所谓模糊其实相当就是将每一个像素都取周边像素的平均值。高斯模糊本质是属于低通滤波器,它是将正态分布用到了图像处理中,处理得出图像的每个像素点是原图像相应像素点与相邻像素点的加权和。其计算公示如下所示:

式中, (,)Huv表示频率域;σ表示高斯曲线标准差,是方差: (u,v)D表示傅里叶变换后某点距离远点的距离。当 0Dσ= 时,即 0D取到截止频率,当滤波器的频率域下降到其最大值时,经过这种滤波后能够增强图像的细节部分。即在保证全部图像清晰的同时又能滤除局部的干扰噪声。

使用cv2做高斯模糊,需要调用GaussianBlur函数

void GaussianBlur( InputArray src,OutputArray dst, Size ,Ksize double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )

Ksize 为高斯滤波器窗口大小;double sigmaX 为X方向滤波系数;

double sigmaY=0 为Y方向滤波系数。

6 总结

通过实验证明,本文选用树莓派作为运动检测的核心硬件,使用智能摄像头结合了库和实时釆集视频帧数据,进行图像处理,通过OpenCV库可以做到物体的自动识别和跟踪。OpenCV库的是C和C++所编写的函数库,它提供了Python的接口,可以用Python来调用OpenCV的函数,结合了Python和CC++的优点,选取帧差法、阈值分割、高斯模糊等合适高效的算法进行图像序列的分析和处理,可以分析出运动物体的运动情况和轨迹,控制舵机转动,实现目标物体的跟踪。

猜你喜欢

树莓高斯阈值
非平稳声信号下的小波变换去噪方法研究
土石坝坝体失稳破坏降水阈值的确定方法
非均匀光照下文本图像分割算法研究
数学王子高斯
利用迭代软阈值方法抑制恒时演化类核磁共振实验中的采样截断伪峰
黄金水果红树莓
树莓红了 游人醉了
e络盟率先推出第三代树莓派
年度睡姿大盘点(下)
从自卑到自信 瑞恩·高斯林