任志敏,宋 源,张 良
(1.常州纺织服装职业技术学院机电学院,江苏 常州 213164; 2,苏州大学,江苏 苏州 215006)
随着劳动力成本的不断提高,农业果实采摘也面临着逐步实现机械化和自动化[1]。其中首要解决的是视觉难题。果实成熟时,表皮颜色一般会发生变化。比如,即将成熟的苹果果皮会变红,柚子果皮会变黄……。一般情况下,人们基于传统经验判断水果的成熟期和挂果情况进行人工采摘,效率相对低下。因此,如何通过信息化技术手段,方便、快捷、准确地判断水果的成熟期及挂果数量是本文研究的重点,为实现机械化采摘提供成熟果实的精确的定位提供支持。通过对现有技术的研究,借助摄像头对果树进行拍照,对生成的视频或图片进行分析和处理,一方面,得益于近年来计算机视觉研究的飞速发展,使得建立一个成本可承受,速度识别快、判断精度高的视觉系统成为可能。另一方面,使用摄像头进行拍照与人眼观察非常贴合,可以快速、准确找到成熟果实的位置,为机械手采摘提供精确坐标[2]。
视觉系统的核心是实现颜色的学习和跟踪,由硬件和软件两部分组成。颜色学习和跟踪系统硬件部分主要由微控制器和图像感光元件组成。硬件设计框架如图1所示。
图1 硬件设计框图
硬件电路由主要基于Cortex-M4微处理器STM32F429IGT6和CMOS图像感光元件OV7725组成。STM32F429IGT6最高主频为180MHz,集成Camera接口。OV7725是美国Omni Vision公司生产的高灵敏、低功耗图像传感元件。其支持自动曝光控制,自动增益控制,自动白平衡;支持逐行扫描raw RGB数据输出;最大像素输出为640x480,支持设置不同像素窗口,通过标准串行摄像头控制总线SCCB配置其寄存器。
STM32F429IGT6从OV7725采集一帧图像,图像数据通过Camera接口、DMA通道、FMC接口送入SDRAM存储器。数据经过STM32F429IGT6端程序处理后的结果通过串口发送给机器人控制板。
为了获取成熟果实的精确位置,即为机械手提供成熟果实位于图片中的坐标。本文设计了如图2所示的总体流程[3]。
图2 颜色学习和跟踪总体流程
首先采集OV7725图像感光单元输出的一帧RGB Bayer格式的源数据[4],获取待跟踪颜色的RGB值,如图3所示的黑框部分内某一点的像素RGB值为237,80,99,获取三个分量的上下限阈值为Rmin,Rmax,Gmin,Gmax,Bmin,Bmax,在颜色跟踪过程中,只要遍历的像素点落入以上六个阈值组成的区域内[5],即可认为是一致颜色。
图3 颜色学习区域
由于受到光线等诸多因素影响,在RGB空间通过手工输入的方式获得的红色苹果的阈值并不准确。HSV是另一种颜色表示空间,HSV最主要的优势是它与人类描述颜色的方式类似。与RGB颜色空间不同的是,HSV非常适合用于颜色分割,能够非常直观地表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。因此,本文把RGB值转换成HSV值[6]。RGB三分量的取值范围为0~255,经转换后,S的取值范围为0~1,V的取值范围为0~255,H的取值范围为0~360。为了便于后续数据处理,本文把HSV三分量的取值范围均规范化为0~255[7]。因此本文修改后的转换公式为:
(1)
(2)
V=max.
(3)
其中max取某个像素点R、G、B值的最大值,min取某个像素点R、G、B值的最小值。
本文先研究表达式比较法实现颜色跟踪,这种方法相对比较简单,在此基础上,进一步研究并实现了快速高效的数组查表法实现颜色跟踪。
2.3.1 条件表达式比较法
本文首先研究一种简单的场景,跟踪一种颜色,即一帧图像中只有一个区域与样本颜色一致,这一过程实现比较容易,程序流程如图4所示。
图4 跟踪单个样本区域流程图
遍历顺序为一帧图像数据从左上到右下的顺序,pix表示从坐标(0,0)到(639,399)每个像素点的分量值。pix插值并转化为HSV后,H值与样本的Hmax,Hmin比较,S值与样本的Smax,Smin比较,V值与样本的Vmax,Vmin比较[8],如果if( (H>=Hmin)AND(H<=Hmax)AND (S>=Smin)AND (S<=Smax)AND (V>=Vmin)AND (V<=Vmax))这个表达式为真,表明三个值都落入样本值范围内,该像素点才标记为与样本相匹配,并更新count_pixels值加1,x0,y0,x1,y1与该像素点的坐标x,y相比较,更新x0为匹配区域最左位置横坐标,y0为最上位置纵坐标,x1为最右位置横坐标,y1位最下位置纵坐标,centroid_x值不断累加匹配像素点的横坐标x,centroid_y值不断累加匹配像素点的纵坐标。等到一帧图像所有像素点都遍历完,通过x1-x0差值获得匹配区域宽度,y1-y0差值获得匹配区域高度,centroid_x/count_pixels商值获得匹配区域中心横坐标,centroid_y/count_pixels商值获得匹配区域中心纵坐标。这就是条件表达式比较法。
需要说明的是不管是跟踪单一区域还是多区域,在识别颜色时都需要进行6个表达式的比较和判断,而且至少在跟踪一种颜色的前提下,如果要跟踪两种颜色的话,至少需要2×6=12个表达式比较。随着跟踪颜色的增加,比较的表达式数量也会随之增加。
2.3.2 数组查表法
通过条件表达式可以判断遍历像素值与样本颜色是否匹配,但是这种方法会占用大量微控制器CPU资源,特别是对于Cortex-M这类支持多级流水的CPU,会影响实时颜色跟踪的效率。在研究过程中,本文设计了空间换时间的数组查表法进行颜色匹配[9]。算法描述如下:
建立样本颜色表。若通过颜色学习获得某颜色区域a的阈值Hmin=67,Hmax=79,Smin=123,Smax=140,Vmin=98,Vmax=112。前文所述本文HSV三个值的范围是0~255,因此分别为HSV建立大小为256个元素的三个分量数组,Hclassa[256],Sclassa[256],Vclassa[256],并对数组元素进行赋值,每个分量离散成256级,在阈值上下限内的值对应的离散级赋值为1,其他的赋值为0,即二值化赋值,如图5所示。
图5 样本颜色二值化数组表
每个数组都是256个元素,以样本阈值上下限范围内数为索引的元素值赋值为1,其余均赋值为0。通过研究发现,基于样本颜色二值化数组表,对遍历的像素点是否与样本匹配可以通过计算公式(4)获得结果。
IsPixelInClass = Hclass[H] AND
Sclsss[S] AND Vclass[V]
(4)
AND表示布尔位与(AND)运算,H,S,V表示当前遍历的像素点值,把H,S,V作为数组索引,查询如图5所示的样本颜色二值化表,获得数组元素值Hclass[H],Sclass[S],Vclass[V]表示,三值进行位与运算,IsPixelInClass表示位与运算的结果,结果为1,表示遍历像素点与样本匹配,反之表示不匹配。比如检查像素点值HSV(69,130,100)是否与样本匹配,只需要计算Hclass[69] AND Sclass[130] AND Vclass[100],其结果是1,表示匹配;用同样的方法检查像素点值HSV(69,130,120),计算结果为0,则不匹配。
显然数组查表法用空间换时间的方法比起6个条件表达式判断来说速率快得多。特别是在同时跟踪红色、黄色等多种颜色的果实时,采用条件表达式比较法一共需要进行多次运算,而数组查表法只要利用公式(4)一次运算即可。数组查表法节省了时间,提高了效率。