基于双目视觉的不规则堆料体积测量研究

2020-04-29 13:02丁嗣禹苗红霞齐本胜
计算机测量与控制 2020年4期
关键词:视差双目像素点

丁嗣禹,苗红霞,齐本胜,张 衡

(河海大学 物联网工程学院,江苏 常州 213022)

0 引言

在工业生产过程中经常遇到需要快速测量堆状物料(如煤堆、沙堆、垃圾堆等)体积的情况[1],对于各种规则物体,体积计算有明确的计算公式,计算过程简单方便,但是对于不规则堆体的体积测算就比较困难了。而且此类堆料一般体积较大且较重,直接测量体积难度较大。传统的人工称重等体积测量方法耗费人力、速度慢、误差大,不能满足实际的工业需求。近年来双目视觉技术因其具有非接触、高精度、快速、自动化等特点受到越来越广泛的关注[2],同时双目视觉技术的测距原理可以借鉴到物体的体积测量领域,因此本文拟采用双目视觉技术测量不规则堆料的体积。大部分的双目视觉测体积的方法都需要借助结构光[3-4],但是这种基于结构光的体积测量方法在测量静态堆料时需要保证激光扫描仪以固定的速率平稳地滑动,直至完全扫描堆料才能获得堆料表面所有点的信息,对电机等配套驱动设施有较高要求,系统操作复杂并且成本较高[5-6]。目前,也有不借助结构光的双目视觉测体积文献[7],该文献采用特征匹配的方法完成立体匹配,接着对堆积体进行三维重建,最后利用基于角点的方法进行堆积体的体积计算,该方法在三维重建的基础上计算堆积体的体积,算法实现难度较大。为了降低算法难度,本文采用半全局块匹配的算法对堆料图像进行立体匹配求出视差图,并采用中值滤波和最邻近插值法对视差图中的空洞进行填充;在计算出堆料表面点的深度信息及三维坐标信息后,采用改进的OTSU阈值分割算法提取目标区域,接着计算出堆体的底面积、平均高度,最后求出堆体的体积。本文提出的方案硬件方面只需要在堆料上方架设两个摄像头,尽可能保证摄像头垂直地面拍摄即可,软件方面无需对堆体进行三维重建,直接通过对相机采集到的堆料图像进行处理即可得出堆料的体积,本方案具有成本低、编程简单,操作方便的优点。

1 方案流程

双目视觉测距原理如图1所示,两个相机从不同方向同时获取物体的图像,提取物点在两幅图像上的像素坐标,找到两幅图像上的对应点,计算出对应点之间的视差。只要得到了对应像素点之间的视差d(d=xl-xr,其中xl、xr是两个成像点在左右两个像面上距离图像左边缘的距离)就可以根据相似三角形定理求出物点在实际世界坐标系下的坐标[8]。当获取物体表面点的三维坐标以后,可以通过数据处理计算出物体的体积。

图1 双目视觉测量原理

本文提出的基于双目视觉的不规则堆料体积测量方案的流程如图2所示。在开始测量前要先对两个相机进行双目标定,获取相机的内外参数便于后续的图像处理。将两个CCD相机垂直置于待测物料的正上方,保证堆料全部置于两个相机的公共视场中。启动相机采集堆料的俯视图像,并将采集到的左右图像对发送到计算机上,进行后续的处理。首先,采用opencv中的半全局块匹配算法(SGBM算法)对校正后的图像对进行立体匹配计算出视差图,并对视差图进行空洞填充;接着根据视差信息计算出物体表面三维点云坐标;然后采用改进的OTSU阈值分割算法提取目标区域;最后结合三维点云信息和堆料区域信息计算出堆料的平均高度和面积,进而计算出堆料的体积。

图2 系统流程图

2 视差图和三维点云坐标的获取

2.1 视差图的获取

本文先对两个CCD相机进行双目标定,以建立图像像素坐标系和世界坐标系之间的关系,这是三维信息获取的一个重要环节[9]。本文采用7*8(30 mm*30 mm)的标定板,从不同的角度拍摄标定板得到30对标定板图像。接着采用张正友标定法[10]对采集到的标定板图像进行双目标定,获取相机的内外参数。其中,内参数包括4个内参数、5个畸变系数(3个径向畸变和2个切向畸变),外参数包括1个旋转矩阵和1个平移向量。由于实际操作中两个相机的放置无法达到绝对平行,导致偏离理想的双目系统。因此本文采用Bouguet算法对采集到的图像进行立体校正,建立理想双目系统,即两个摄像机图像平面平行,光轴和图像平面平行。同时,对相机的径向畸变和切向畸变进行修正。完成立体匹配和畸变修正后得到的堆料图像就是标准双目测距系统中的图像。对立体校正后的图像进行立体匹配就可以计算出左右两幅图像中堆料表面点对应的视差值。

视差是指左右双目图像中,两个匹配块中心像素的水平距离,而视差图是以左图像为基准,储存左右图像对视差值的图像。对立体校正后的图像对进行立体匹配求取视差图像。本文采用opencv库中改进的半全局匹配算法semi-global block matching(SGBM)算法计算堆料图像的视差图。SGBM算法是在经典的半全局匹配算法semi-global block matching (SGM)算法的基础上改进而来的。SGBM算法将SGM算法中每一个代价值进行块运算后用于SGM算法进行视差优化,接着进行后处理。该算法通过选取每个像素点的视差disparity,组成一个disparity map,设置一个和disparity map相关的全局能量函数,使这个能量函数最小化,以达到求解每个像素最优disparity的目的。SGBM算法主要分为4个步骤:预处理、代价计算、动态规划和后处理,调整这4个步骤的相关参数以获得较好的视差图。本文计算出的视差图如图3所示,其中图3(c)为原始视差图转换为CV_8UC1格式的图像。

图3 计算视差图

2.2 视差图空洞填充

采用SGBM算法进行立体匹配后计算出的视差图中不可避免地会存在很多空洞,即误匹配的点,如图3(c)所示。因此需要用合适的视差值将视差图中的空洞填充上。本文预先设定了一个最小视差阈值minDisparity,将所有值小于最小视差阈值的像素点视为空洞点。为了填充视差图中的空洞点,本文先对视差图进行一次中值滤波,将小连通域的空洞用邻域窗内所有像素值的灰度值的中值填充上,过滤掉视差图中的离散点,也增强视差图深度信息的连续性。采用小窗口的中值滤波不仅可以将小邻域的空洞填充上,而且还可以保证图像不会被过度平滑。接着采用最邻近插值算法将剩余的较大邻域的空洞填充上,用空洞点的周围像素点的值来近似填充该空洞点。最邻近插值算法空洞填充的核心思想是将空洞点的值与其附近的4个邻近点的值进行比较,用距离空洞点最近的点的像素灰度值填充空洞点的像素值。本文的视差图中,堆料表面的点视差变化较缓,可以用空洞点周围的像素点对空洞点进行近似填充。同时,中值滤波算法和最邻近插值算法运算量小,实现速度快。空洞填充后的视差图如图4所示。

图4 空洞填充后的视差图

2.3 三维点云坐标的获取

在获得物体表面点的视差信息之后就可利用视差和深度之间的数学关系求出物体表面点在世界坐标系下的三维坐标值,完成空间定位。由双目相机的测量原理可知,视差d和物点的深度Z存在如下关系:

(1)

其中:B相机的基线距离,f为相机焦距。

根据视差与物点深度之间存在的反比例关系,得到了Z轴坐标信息之后,由此可以推导出X和Y的坐标:

(2)

其中:fx=f/dx、fy=f/dy,1/dx和1/dy分别表示x方向和y方向上1毫米长度代表的像素值,(u0,v0)为左相机光轴与图像平面的交点Ol在像素坐标系下的坐标,(u,v)表示像素坐标系中的坐标。

本文采用重投影映射的方法实现像素坐标系与世界坐标系之间的转换,计算出物体表面点在世界坐标系下的三维坐标。将所有三维点云数据的Z轴的数据提取出来映射成图像即为深度图像。本系统中的Z轴坐标为摄像头距离物体表面物点的垂直距离,单位是毫米(mm),表1为根据系统三维坐标求出来的X,Y,Z轴三个方向的距离和实际距离之间的比较。

表1 3个坐标轴方向上的测量距离与实际距离比较 mm

3 目标提取

3.1 视差图像预处理

由于本文得到的视差图灰度变化较缓,灰度值较为集中,为了方便后续的图像处理,本文先对视差图像和深度图像进行相同的裁剪去除黑边,接着找出视差图的最大灰度值和最小灰度值,将灰度值的变化范围扩大的0~255的范围中,便于更直观地观察图像处理的中间结果。

3.2 基于传统OTSU算法的阈值分割

OTSU阈值分割算法(又称为大津阈值分割法)是一种使用最大类间方差的自动确定阈值的方法,是一种基于全局的二值化算法[11]。OTSU阈值分割算法根据图像的灰度特性,将图像分为前景和背景两个部分。当选取最佳阈值时,前景部分和背景部分之间的差别应该是最大的,即类间方差最大。相应地,前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大,如果部分目标被错分为背景或部分背景被错分为目标,都会导致两部分类间方差变小。所以,当所取阈值的分割使类间方差最大时就意味着错分概率最小。

3.3 基于改进的OTSU算法提取目标区域

采用传统的OTSU分割算法对本文的视差图进行阈值分割,得到的结果都不够理想,接近背景的目标区域总是无法被正确地提取出来。因为传统的OTSU算法对于灰度直方图具有明显的双峰特点的图像分割的效果比较好,但是本文中的堆料的视差图像的灰度直方图只有一个明显的峰值,背景部分同一灰度级的像素点占比较大因而具有明显的峰值,而对于目标部分只有若干个小的波峰。为了将接近背景区域的颗粒有效地提取出来,本文对OTSU算法进行了改进。

对于像素点数为N的灰度图像,其存在L种灰度,灰度值为i(0≤i≤L)的像素点占整幅图的比例为pi。设t(0≤t≤L)为前景和背景之间的分割阈值,则灰度值为[0,t]范围内的点为背景部分,背景像素点占整幅图像的比例为p0, 其平均灰度值为μ0;灰度值为[t+1,L]范围内的点为前景部分,前景像素点占整幅图像的比例为p1,其平均灰度值为μ1;记整幅图像的平均灰度值为μ,背景和前景的类间方差为g,则有:

μ=p0×μ0+p1×μ1

(3)

g=p0×(μ0-μ)2+p1×(μ1-μ)2=

p0×p1×(μ0-μ1)2

(4)

传统的OTSU阈值分割的方法为找到一个t使得类间方差g最大,即:

(5)

本文在传统的OTSU算法的基础上,将灰度直方图中分割阈值附近的灰度值考虑进来,突出背景与目标之间较小差异。具体做法是:计算出灰度直方图中分割阈值邻域内所有像素点的概率总和Pt作为类间方差的权重,构建新的目标函数g′,那么新的分割阈值t′使得g′最大。

(6)

g′=Pt×g=

Pt[p0×(u0-u)2+p1×(u1-u)2]

(7)

(8)

这样强化了波谷处的邻域信息,加重了波谷处的阈值的类间方差的结果,将与背景相近的目标区域区分出来。分别采用传统的OTSU算法和改进后的OTSU算法对视差图像进行二值化阈值分割,分割的结果如图5(b)和图5(c)所示,分割图中白色部分为目标区域,黑色部分为背景区域。从结果图中可以很直观地看出,改进的OTSU阈值分割算法可以将接近背景的目标区域有效地提取出来。

图5 分割结果示意图

4 体积测量

4.1 堆料体积计算原理

本文的体积测量目标是堆状物料,由于此类堆体的俯视图可以完整地表述堆体的信息,所以由堆料俯视图求出的深度图可以较为全面地反应出堆料表面点的深度信息。图6为堆体体积测量的示意图,堆料深度图中的点均匀分布,基于每个像素点求出的平均深度即可近似等价于整个堆体的平均深度,这样就可以将堆体的体积计算转换为底面积相同的柱状物体来计算。

图6 堆料体积测量示意图

如公式(9)所示,不规则堆料的体积为3个方向上的三重积分来求解,可以将整个堆体用若干个底面积相同的立方体来近似求解,其中每个立方体的底面积Δs为图像中每个像素点对应的实际面积,高度为该像素点对应的物点距离背景平面的距离。可以先求出这些高度不等的小立方体的平均高度,那么堆体的体积就可以转换为这些小立方体的平均高度、立方体的个数和立方体的底面积的乘积,继而转换为堆料的平均高度和堆料底面积的乘积,如公式(10)所示:

(9)

(10)

4.2 堆料平均高度计算

如果把堆料表面点当作离散的采样点,而每个物点距离地面的高度为采样点的值,那么这些采样点的平均值就是堆料的区域的平均高度。根据目标提取阶段阈值分割的结果,将前景区域和背景区域的深度信息分别保存下来,并结合两个区域的像素点的个数分别求出两个区域点的平均深度值Z0和Z1。由于深度图像中储存的像素值为物点到摄像头的距离,所以堆料区域的平均高度为背景区域的平均深度值与前景区域平均深度值之差,即堆料的平均高度近似为h=Z0-Z1。

4.3 面积计算

由于堆料区域形状不规则,直接求取面积很困难,但是在深度图像对应的实际区域为较标准的矩形,而且这个矩形各个顶点在世界坐标系下的X坐标和Y坐标很容易获取。同时由于本文拍摄的堆料图像为堆料的俯视图像,所以深度图像对应的实际矩形区域的面积可直接用矩形的长度与宽度的乘积来表示。接着计算出堆料区域占整个矩形区域的比例,就可以很容易地计算出堆料区域的实际面积。要计算深度图像对应的矩形区域的面积,先分别提取出深度图像的左上角和右下角顶点的三维坐标A(XA,YA,ZA)、B(XB,YB,ZB),则整幅图像对应的实际平面面积S为A、B两点之间的实际X方向距离和Y方向距离的乘积。

S=ΔX*ΔY=(XBXA)*(YBYA)

(11)

堆料区域的面积为堆料区域的像素点在整幅深度图中的占比与整幅深度图对应的实际面积的乘积。在目标提取的过程中已经计算出目标区域像素点占整幅深度图像像素点的比值p0。所以直接用p0乘以深度图像对应的实际面积S就可以求出目标区域的实际面积S0,即:

S0=S×p0

(12)

4.4 堆料体积计算及实验结果

通过上文求出的堆料面积和平均高度,可以直接利用体积计算公式V=h*S0求出被测堆料的体积。

本文以沙堆为例进行堆料体积测量实验,采用双目相机对体积形状不同的沙堆进行体积测量实验。实验中,两个CCD相机尽可能地垂直地面架设,目的是尽可能获得沙堆的标准俯视图,但是即便有所误差也不会影响最终的结果。在采集沙堆原始图像之前先对双目相机进行双目标定,获取双目相机的内外参数。采集沙堆图像的过程中要保证沙堆放置在两个相机的共同视场中,采集的原始堆料的图像直接送到计算机中进行后续的处理,包括立体校正、立体匹配、视差图处理、目标提取和体积计算,输出体积计算的最终结果。表2中的6组数据为形状大小不同的6个沙堆的实际体积和测量体积,实验结果显示这6个沙堆的体积测量误差均低于5%,可以满足实际工业需求。

表2 体积测量结果及误差分析

5 结论

本文基于VS2017+Opencv3.4.1环境和两个分辨率为1280*720的CCD相机提出一个基于双目视差图的不规则堆料体积测量系统,实验证明本文提出的堆料体积测量方案可以较为准确地计算出不规则堆料的体积,并保证误差低于5%。本文采用双目视觉立体匹配获得视差图,对视差图进行处理,测量出堆料的体积,算法实现简单。本方案实现非接触式测量,无需增加其他的硬件设施操作简单,经济实用。

猜你喜欢
视差双目像素点
采用双目视觉和自适应Kalman滤波的作物行识别与跟踪
霜 降 苏美玲
基于双目视觉的机器人定位与导航算法
基于归一化互相关的半透明遮挡视差估计
基于自适应窗的立体相机视差图优化方法研究
基于局部相似性的特征匹配筛选算法
视差边缘优化的SGM 密集深度估计算法∗
机械手的双目视觉定位抓取研究
一种X射线图像白点噪声去除算法
基于canvas的前端数据加密