基于OpenCV的餐厅自动化结算研究 [PDF全文]
(浙江科技学院 自动化与电气工程学院,杭州 310023)

为实现餐厅结算的自动化,研究了基于OpenCV的图像处理技术。简要介绍餐厅自动结算系统的硬件构成和工作原理:由计算机、工业摄像头及底层交互单元组成; 摄像头获取图像并经软件处理后识别为相应的价格,从而实现自动化结算。进而详细分析图像处理的过程,包括图像采集、预处理、特征提取及模式识别等主要步骤; 阐述OpenCV函数在各步骤中的具体应用,并给出相应的实验结果。实验结果表明,将基于OpenCV的图像处理技术应用于餐厅自动化结算是完全可行的,这为餐厅自动化结算提供了一种新方法。

Research on application of the OpenCV-based image processing technology to the canteen automated clearing system
ZHANG Zhenyu, WANG Yang, ZHANG Jialong
(School of Automation and Electrical Engineering, Zhejiang University of Science and Technology, Hangzhou 310023, Zhejiang, China)

In order to realize automation for the canteen clearing system, application of the OpenCV-based image processing technology is researched. Firstly, the hardware constitution and the working principle of the canteen automated clearing system are briefly introduced, with the system composed of a computer, an industrial camera and an interactive unit. The image acquired by the camera is processed through software and then recognized at a corresponding price, thus achieving the automatic clearing function. Secondly, the process of image processing is analyzed in detail, including image acquisition, preprocessing, feature extraction and pattern recognition, etc. Afterwards, the specific application of OpenCV functions to the system is expounded, with the corresponding experimental results specified. Finally, the experimental results show that it is completely feasible to apply the OpenCV-based image processing technology, which offers a new method for the canteen automated clearing system.

引言

近年来出现了大量的自助式餐厅,特别是在学校和医院等就餐人数较多的单位。因其方便、灵活等优点,自助式取餐越来越受人欢迎。自助式餐厅的结算系统至关重要,其性能、效率等将直接影响顾客的满意度[1-2]。现有的自助式餐厅结算系统主要有以下3种:一是传统的人工结算方式。通过采用不同颜色、不同形状的餐盘来表示不同的菜价,以方便人工快速结算。这种方式的缺点是结算速度慢、出错率高,已不能适应当今社会发展的需要。二是基于条码识别的结算方式。每个餐盘都贴上1个条码标签,使每个菜品的价格与相应的条码关联,使用条码扫描器对餐盘的条码进行非接触式读取,从而实现自动结算。这种方式的缺点是结算时的效率偏低(需对餐盘逐个扫描识别),纸质条码标签易损坏,因而给实际推广使用带来不便。三是基于射频识别RFID(radio frequency identification)的结算方式。在每个餐盘内部放置1个无源RFID标签,并使用无源RFID读写器将每个菜品对应的价格信息写入标签[3],使每个菜品的价格与相应的RFID标签关联,使用无源RFID读写器对餐盘的RFID标签进行非接触式读取,从而实现自动结算。这种方式的缺点是所用的餐盘必须定制,成本较高。

OpenCV是1999年由英特尔(Intel)公司建立的一个基于开源发行的跨平台计算机视觉库[4],可以在Linux、Windows等多种操作系统上运行。OpenCV是图像处理、计算机视觉、模式识别和计算机图形学等相关领域的优秀工具,因其资源丰富、使用方便等优点,深受广大从业人员的欢迎[5]。针对现有的餐厅自动结算系统性能上存在的不足,笔者应用基于OpenCV的图像处理技术,研究了一种全新的餐饮自动结算系统。该系统无需对传统餐盘进行任何定制或改造,能根据餐盘特定的颜色和形状,识别出菜品的价格,尤其适合于那些希望采用传统餐盘实现自动化结算的自助式餐厅,具有一定的实用价值。

1 硬件构成及工作原理

本系统硬件主要由计算机、工业摄像头及底层交互单元(包括托盘检测电路、人机对话电路、IC卡读写器和微型热敏打印机等)构成,如图1所示。其中,人机对话电路与计算机通过串口1连接,微型热敏打印机与计算机通过串口2连接,工业摄像头、IC卡读写器与计算机分别通过USB1、USB2接口连接,系统使用的IC卡规格为13.56 MHz的M1 S50卡。在实际使用中,当托盘检测电路检测到托盘摆放到位后,发出到位信号给人机对话电路,人机对话电路再告知给计算机,于是计算机令摄像头获取餐盘图像,并对所获的餐盘图像采用基于OpenCV的图像处理技术进行处理,识别出每个餐盘对应的价格并作出汇总后,再将相关数据信息发送给人机对话电路。人机对话电路以液晶显示和语音播报为提示方式,告知顾客消费情况,然后系统等待顾客刷卡。当顾客刷卡时,系统令IC卡读写器写入顾客的IC卡,收取本次消费金额,同时也写入网络数据库。结算完毕后,人机对话电路给出相应的提示信息,计算机令微型热敏打印机打印出消费小票。

图1 系统整体硬件构成示意图<br/>Fig.1 Schematic diagram of the whole hardware system

图1 系统整体硬件构成示意图
Fig.1 Schematic diagram of the whole hardware system

2 餐盘图像处理过程

餐盘图像处理过程主要包括图像采集、图像预处理、特征提取和形状与颜色识别等步骤[6],系统采用的USB摄像头支持静态和动态图像捕捉,计算机软件按特定的算法对采集到的图像进行处理,即可识别出餐盘的不同形状、颜色,进而实现自动结算。摄像头使用时应安装于托盘的正上方,使其能很好地俯视托盘全景,以便完整地采集到餐盘的图像信息。

2.1 图像采集

OpenCV中的HighGUI模块提供了标准USB数字摄像头接口,需要采集图像时,只需调用cvCreateCameraCaptur()函数来打开摄像头即可。实验中采集到的餐盘原始图像如图2所示。

2.2 图像预处理

图像预处理主要包括图像的平滑处理、灰度处理、二值化处理、轮廓提取和噪声过滤5个步骤[7]

2.2.1 平滑处理

采用中值滤波器来对图像进行平滑处理[8],其公式为:

h(x,y)=med{f(x-k,y-l),(k,l)∈W},(1)

式(1)中:f(x,y)、h(x,y)分别为原始图像和中值滤波处理后的图像; W为二维模板,通常为2×2、3×3区域。在OpenCV中可通过调用函数cvSmooth(img_in, img_out,CV_MEDIAN)来进行处理,其中img_in为输入图像的指针,img_out为输出图像的指针。处理后图像如图3所示。

图2 采集到的原始图像<br/>Fig.2 The original image acquired by the camera

图2 采集到的原始图像
Fig.2 The original image acquired by the camera

图3 平滑处理后的图像<br/>Fig.3 The image produced by smoothing processing

图3 平滑处理后的图像
Fig.3 The image produced by smoothing processing

图3可明显看出,平滑处理后原始图像的众多细节信息被过滤,只剩下主体轮廓图像,这样便于开展后续的图像处理与识别。

2.2.2 灰度处理

将R、G、B分量映射到R、G、B立方体的对角线上[9],由此可得出公式:

SGray=0.299×r+0.587×g+0.114×b,(2)

式(2)中:r、g、b分别为3通道图像的红、绿、蓝色彩分量值; SGray是输出的灰度值。在OpenCV中可通过调用函数cvCvtColor(color_img,bin_img,CV_BGR2GRAY)来将r、g、b分量转换为灰度图像。处理后图像如图4所示。

图4 灰度处理后的图像<br/>Fig.4 The image produced by gray processing

图4 灰度处理后的图像
Fig.4 The image produced by gray processing

2.2.3 二值化处理

典型的二值阈值化公式[10]

k(x,y)={A, SGray(x,y)≥Threshold,

0, SGray(x,y)<Threshold,(3)

式(3)中:SGray(x,y)为输入像素点灰度值; k(x,y)为输出像素点二值量。本研究采用变阈值式二值阈值化,Threshold是从0到255之间的N个值(其中N取11),将不同阈值下二值化后的图像分别做轮廓和特征提取等处理[11],以适应在不同环境下对餐盘的精确识别。采用OpenCV提供的cvThreshold()函数可实现上述功能。处理后图像如图5所示。

图5 Threshold为30时二值阈值化处理后的图像<br/>Fig.5 The image produced by two values threshold processing(Threshold=30)

图5 Threshold为30时二值阈值化处理后的图像
Fig.5 The image produced by two values threshold processing(Threshold=30)

2.2.4 轮廓提取

调用OpenCV的寻找轮廓函数cvFindContours,令contours_num=cvFindContours(bin_img, storage, &contour, size, mode, method),其中参数取值[12]说明见表1~2。

表1 参数mode取值表<br/>Table 1 The value table of parameter mode

表1 参数mode取值表
Table 1 The value table of parameter mode

表2 参数method取值表<br/>Table 2 The value table of parameter method

表2 参数method取值表
Table 2 The value table of parameter method

采用CV_RETR_LIST检索模式和CV_CHAIN_APPROX_NONE边缘近似方法来提取边缘信息,提取后再通过cvStartReadSeq读取轮廓信息,通过CV_READ_SEQ_ELEM读取轮廓中点信息,并用cvCircle(pContourImg, pt1,1, color[0])画出所提取的轮廓。处理后图像如图6所示。

2.2.5 噪声过滤

轮廓提取后,可明显地发现有很多背景或反光等造成的干扰信息,由于餐盘的面积和摄像头安装的位置都相对固定,因此所采集到的餐盘图像的面积可限定于一定的范围内,故本研究采用面积过滤的方法,快速去除图像中面积不符合的干扰部分,其中关键是通过已知的点集来获取轮廓面积[13]。在OpenCV中提供了轮廓面积函数cvContourArea(contour,CV_WHOLE_SEQ))来获取指定轮廓的面积,如果面积小于5 000或大于20 000像素的就不予保留。处理后的轮廓图像如图7所示。

3 餐盘特征提取

图像预处理后获得了比较清晰的餐盘轮廓信息,接下来就是根据获得的轮廓信息来提取关键特征[14],以识别出不同形状和颜色的餐盘,从而实现自动结算。

实验中所用的餐盘一共有4种形状和4种颜色,其中形状分别为矩形、方形、圆形和壳形,颜色分别为绿色、蓝色、粉红色和白色。另外,承载餐盘所用的托盘为橘黄色。餐盘的基本特征有轮廓的面积、周长、最小外接圆的面积、最小外接矩形的面积及色调直方图等。

图6 轮廓提取处理后的图像<br/>Fig.6 The image produced by contour extraction

图6 轮廓提取处理后的图像
Fig.6 The image produced by contour extraction

图7 噪声过滤处理后的图像<br/>Fig.7 The image produced by noise filtering

图7 噪声过滤处理后的图像
Fig.7 The image produced by noise filtering

采用函数cvContourArea(contour,CV_WHOLE_SEQ)来获取轮廓的面积,其中参数contour为轮廓的指针,参数CV_WHOLE_SEQ表示针对轮廓中所有的点序列; 采用函数cvMinEnclosingCircle(contour, &center, &radius)来获取轮廓的最小外接圆,参数center、radius分别是所得最小外接圆的圆心和半径; 采用函数cvMinAreaRect2(contour)获取轮廓的最小外接矩形,函数返回一个CvBox2D类型的指针,进而通过rect.size.height、rect.size.width、rect.center和rect.angle来分别获取最小外接矩形的高度、宽度、中心点坐标、与水平线的角度。

为获取轮廓色调信息,首先要进行图像RGB模型到HSV模型的转换工作[15]。从RGB模型到HSV模型的参数H(即色调)的转换公式为:

H={arccos((r-g)+(r-b))/(2((r-g)2+(r-b)(g-b))1/2),(b≤g),

2π-arccos((r-g)+(r-b))/(2((r-g)2+(r-b)(g-b))1/2),(b>g)。

4 餐盘形状和颜色识别

首先采用外接标准图形的方法来区分圆形(包括壳形)和矩形(包括方形)。在得到的每个轮廓中进行最小外接圆操作,然后计算此外接圆与此轮廓的面积比值,所得的值越接近于1,则轮廓图形越接近于圆形; 同理,在得到的每个轮廓中进行最小外接矩形操作,然后计算此外接矩形与此轮廓的面积比值,所得的值越接近于1,则轮廓图形越接近于矩形。为了划定圆形和矩形的界限,规定与最小外接圆比值大于0.7的,判定为圆形,与最小外接矩形的比值大于0.85的,则判定为矩形。这一步完成后,实现了对餐盘形状的初步区分,分别记图7中左上角、左下角、右上角及右下角的餐盘为1 ~ 4号,实验中得到的相关数据及初步判断结果如表3所示。在识别出图形是圆形或是矩形后,还需从圆形中区分出壳形,从矩形中区分出方形。显然,在面积相等时,标准圆形外轮廓周长必然小于壳形外轮廓周长; 同理,在面积相等时,方形外轮廓周长必然小于普通矩形外轮廓周长。借助于这2个特性,即可识别出圆形、壳形、矩形和方形这4种图形,最终形状识别得出的结论如表4所示。

表3 餐盘形状初步判断实验数据<br/>Table 3 Experiment data table of preliminary shape recognition for the plates

表3 餐盘形状初步判断实验数据
Table 3 Experiment data table of preliminary shape recognition for the plates

最后还要判断出餐盘的颜色,由于餐盘中间部分往往会有食物盛放,因此只有通过提取餐盘轮廓上的色调(用参数ImageH表示)来识别出不同的颜色。本研究实验中餐盘颜色种类有4种,颜色识别色调范围如表5所示。完成了餐盘的形状和颜色识别后得到的实验效果如图8所示,1号餐盘被识别为圆形、绿色,2号餐盘被识别为圆形、蓝色,3号餐盘被识别为粉红色、矩形,4号餐盘被识别为白色、方形,实验结果与实际情况相符。

表4 餐盘形状最终识别实验数据<br/>Table 4 Experiment data table of ultimate shape recognition for the plates

表4 餐盘形状最终识别实验数据
Table 4 Experiment data table of ultimate shape recognition for the plates

表5 色调范围及相应颜色识别实验数据<br/>Table 5 Experiment data table of hues and corresponding color recognition

表5 色调范围及相应颜色识别实验数据
Table 5 Experiment data table of hues and corresponding color recognition

图8 图像识别成功后的果图<br/>Fig.8 The image produced by successful recognition

图8 图像识别成功后的果图
Fig.8 The image produced by successful recognition

5 结 论

根据上述图像处理过程给出的实验结果可知,该系统方案是完全可行的。与现有的餐厅自动结算系统相比,该系统在性价比上具有一定的优势,这为实现餐厅自动化结算提供了一种实用价值较高的方法。但目前此系统只能针对矩形、方形、圆形和壳形等外部特征简单且种类已知的餐盘进行识别; 同时在实验中还发现,当餐盘中装满食物,特别是食物较多地遮挡了餐盘的外围轮廓线时,实验结果不很理想。在后续研究中将采用优化的轮廓检测算法来提升该系统的性能,以达到在复杂情况下也能准确识别的目的。

参考文献