餐盘计费系统设计毕业论文
2020-02-19 07:53:54
摘 要
本文基于Visual Studio 2015软件平台中的OpenCV计算机视觉库,主要研究了餐盘在计算机视觉处理中的识别应用,得到一种快速结算的计费系统。系统由计算机、摄像头所构成。在摄像头捕捉到图像之后,经过OpenCV中的图像处理算法,进行一系列图像处理过程,包括灰度处理、平滑处理、阈值化处理、降噪及轮廓提取等,进而识别出餐盘的规格。所得结果证明基于OpenCV的图像处理技术应用到餐盘计费系统中是完全可行的,对于餐厅用较低成本完成餐盘快速识别及收费有重要意义。
研究结果表明:在利用本计费系统的情况下,餐厅能够以更高的效率完成餐盘识别及价格统计。在餐厅的用餐高峰期,减少付费排队时间。此外,系统投入成本也相对更低,减少了餐厅支出。
本文的特色:本文会根据餐盘计费系统搭建的需要,介绍相应图像处理、模式识别的详细原理,并在实际一步步应用结果中具体实现。
关键词:OpenCV视觉库;图像处理;模式识别;自动结算
Abstract
The article bases on OpenCV computer vision library in Visual Studio 2015 software platform. This paper mainly studies the recognition application of dining plates in computer vision, and obtains a faster billing system. The system consists of a computer, a camera and bottom interactive units. After the camera captures the image, a series of image processing processes are carried out through the image processing algorithm in OpenCV. It includes gray processing, smoothing processing, threshold processing, noise reduction and contour extraction, and then recognizes the size of the plates. The results show that the application of image processing technology based on OpenCV to the dish charging system is completely feasible, and it is great significance for restaurants to quickly identify and charge dishes in a lower cost.
The results show that the restaurant can accomplish plate recognition and price statistics with higher efficiency by using this billing system. During the peak period of dining in restaurants, the queuing time is reduced, and the cost of system input is relatively lower, which slows down the restaurant expenditure.
The characteristics of this paper: According to the need of the billing system, this paper introduces the detailed principles of image processing and pattern recognition, and realizes them in the practical application results step by step.
Key Words: OpenCV Vision Library; Image Processing; Pattern Recognition; Automatic Settlement
目录
第一章 绪论 1
第二章 系统总体设计思路 2
第三章 系统设计的平台搭建 4
3.1 系统总体介绍 4
3.2 Visual Studio 2015软件简介 4
3.3 关于OpenCV 5
3.3.1 OpenCV简介 5
3.3.2 OpenCV的配置与安装 5
第四章 餐盘图像处理过程 6
4.1 餐盘图像采集 6
4.1.1 图像采集用到的函数 6
4.1.2 图像采集关键步骤详解 7
4.2 图像预处理 8
4.2.1 灰度处理 8
4.2.2 平滑处理 9
4.2.3 阈值化操作 11
4.2.4 轮廓查找与绘制 13
4.2.5 噪声过滤 14
第五章 餐盘图像识别 16
5.1 餐盘轮廓识别 16
5.2 餐盘颜色识别 18
5.2.1 颜色模型的介绍 18
5.2.2 颜色识别 20
第六章 系统功能验证 25
第七章 总结与展望 27
致谢 28
参考文献 29
附录A 30
附录B 38
第一章 绪论
近几年出现了越来越多的自助餐厅,以及由“旋转寿司”的形式延伸出的各种自取菜品的餐厅也逐渐以新颖实惠的特点而被消费者追捧。这类餐厅菜肴种类丰富,用餐快捷,常常设立在人口流量大的场所附近。此类餐厅的共同点都是顾客在就餐中会用到大量的餐盘,而且许多餐厅的消费是根据消费者所拿餐盘的种类、数量来计算。
现有的自助式餐厅的结算方式主要有三种[1]:一是传统的人工结算方式。通过人工对各种不同餐盘的统计,不同颜色、不同形状的餐盘对应价格不同,最终计算出价格进行收费。这种结算方式费时费力并且出错率较高,不适应现代信息化社会。二是利用条形码识别的结算方式。每个餐盘都需要贴上条形码,在结算时扫码进行识别、统计及结算。这种方式虽然省去了人工的统计,但需要对餐盘逐一扫码,识别效率较低。三是基于射频识别RFID的结算方式[2]——在每个餐盘内放置一个无源RFID标签,并使用无源RFID读写器将每一个菜品对应价格写入标签,这样每个餐盘就与对应菜品价格相关联。用无源RFID读写器对餐盘的RFID标签进行读取,从而实现自动结算。这种结算方式快速高效且出错率低,但所用餐盘必须定制,成本较高。
以RFID射频识别技术为基础的餐厅自动计费结算方式在国内已经有了发明应用并申请了专利。这种方式在自动结算的主要业务基础之上已经延伸出多个其它功能。例如有流水查询功能,这个功能能够让商家查询某个时间段内的流水账单;营养查询功能,这个模块可以设置本菜品的营养成分供消费者查询,这样消费者可以对自己摄入的营养成分有较为清晰的认知,改善之后的饮食情况;商户管理功能,管理员可以对下属商家管理,这里包括下属商家的联系方式、地址信息、查看流水账单等。此外还有菜品管理、餐盘管理等功能[3]。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,该项目由因特尔公司的Gary Bradski于1999年启动。OpenCV是图像处理、计算机视觉、模式识别等相关领域的优秀工具,由于资源丰富、使用方便等特点,深受从业人员的欢迎[4]。针对其他结算方式的不足,笔者基于OpenCV,研究了一种高效、低成本、低出错率的结算系统。该系统在摄像头捕捉图像后,通过OpenCV的图像处理技术,快速识别出图像中的餐盘形状、颜色,进而识别出对应菜品的价格,实现自动结算。该方案无需特定制作餐盘,餐厅在较低经营成本的情况下便可实现自动结算,在这种结算方式下将大大缩短收银时间,降低出错率,同时餐厅也能对餐盘进行更有效地管理,具有一定实用价值。
第二章 系统总体设计思路
普通餐具在形状、颜色等外观方面都有所差异,可以将外观方面的差异利用起来。基于OpenCV视觉库,利用图像处理、模式识别、计算机图形学等相关技术,实现对原有餐盘的图像捕捉、图像识别,再将不同颜色、形状的餐盘与相应菜品价格建档。在接收端的摄像头捕捉到餐盘后,将图像传送给服务器,经过计算机处理,识别出餐盘的规格。
本系统硬件主要由计算机、摄像头等组成。流程图如下:
图2.1 系统总体设计流程图
在点击按钮开始工作后,摄像头捕捉图像,利用OpenCV的图像处理技术,对图像进行识别分析。若无法识别出特定图像,系统输出无法识别的警告,需要重新取样;若识别成功,则会统计出餐盘的规格,进行输出显示。
第三章 系统设计的平台搭建
3.1 系统总体介绍
本系统由摄像头、计算机、显示屏等单元构成。当消费者将餐盘放入摄像头采集区域后,摄像头将采集到的餐盘图像传送到计算机进行图像的处理与识别操作。经过计算机处理之后,如果图像无法识别,将在显示器中输出显示警告;如果图像识别成功,将在显示器中输出显示餐盘的种类数量以及总价。系统的总体架构图如下所示。
图3.1 系统总体架构图
计算机单元包括了主要的系统软件设计部分。系统的软件部分是基于在Visual Studio 2015应用平台上录入的OpenCV视觉库来进行操作设计。接下来对Visual Studio 2015软件应用以及OpenCV视觉库做简要介绍。
3.2 Visual Studio 2015软件简介
Visual Studio(视觉工作室)是一种基于组件的软件开发工具,在此平台上可以构建功能强大、性能卓越的应用程序。Visual Studio 2015的代号简称为VS14,于2014年11月在网络上发布并免费下载。在这个软件开发平台上可以运行种类丰富的单元模块,并且支持跨平台操作,深受软件开发从业者的欢迎。本系统设计所用的资源库OpenCV正是运行于本开发工具。
Visual Studio 2015可以在官网免费下载到,这里不再一一赘述。
3.3 关于OpenCV
3.3.1 OpenCV简介
OpenCV是一个开源的计算机视觉库,可以免费在官网http://opencv.org下载获取。第一代OpenCV由当时供职于因特尔的Gary Bradskji启动研发,并于1999年成功发布。OpenCV是计算机视觉领域优秀的设计工具,其支持Python、C 、Java等多种语言。本系统使用基于Visual Studio 2015平台的OpenCV3.1.0来进行设计。
3.3.2 OpenCV的配置与安装
OpenCV的配置与安装工作[5]较为复杂,已将此部分内容放至于附录A中供参阅。
第四章 餐盘图像处理过程
本系统的图像处理是针对餐盘的规格,包括餐盘的形状、颜色、大小。每一种餐盘都对应一个菜品价格,所以最终消费的结果包含于餐盘的外观信息中。
图像处理过程主要包括图像采集、图像预处理、特征提取、形状颜色识别等过程[6]。摄像头安装于放置餐盘的托盘正上方,以完整捕捉到餐盘的外形轮廓,同时捕捉餐盘颜色。
4.1 餐盘图像采集
在计算机视觉领域,一段程序的开头大都是图片的载入或者视频的载入,之后所有的处理过程都是在载入对象上进行算法操作。有些时候需要从磁盘中读取图像或者视频,而计算机视觉更多时候是需要从摄像头中捕获静止的图像或者视频的。在本系统设计中,需要从摄像头中读取实时视频图像数据并进行交互。
OpenCV的HighGUI模块提供十分简便的摄像头读取操作。
4.1.1 图像采集用到的函数
图像采集操作用到的核心函数为cv:: VideoCapture ( )函数。此函数常用语从磁盘读取视频,但也能用于摄像头的读取操作,且这两种操作方式类似。cv:: VideoCapture ( )函数对于磁盘上的文件与摄像头是有一致接口的。对于前者来说,需要在括号内给出待读取文件的路径;对于后者而言,需要给出摄像头的具体ID号(如果只有一个摄像头,那这个摄像头的ID默认为0),默认ID为-1,这表示随意选择一个摄像头。
cv:: namedWindow ( )函数是将一个名称赋给一个窗口,之后的函数操作都会用这个名称与这个窗口作交互。此外,操作人员也可以自己编辑这个窗口的大小,在本系统设计中所有的窗口都会设置成cv:: WINDOW _ AUTOSIZE参数,这表示窗口的大小将会与载入图像的大小一致,图像也会被缩放以适应窗口的大小。
cv:: imshow ( )函数在很多时候都是与cv:: namedWindow ( )函数成对出现,这个函数用来显示函数中出现的任何图像结构。当然,cv:: imshow ( )函数也能够设置为cv:: WINDOW _ AUTOSIZE参数将窗口自动调节大小。
cv:: imwrite ( )函数用来将捕获到的图像保存至与该工程相同的文件夹路径,并对该图像命名,这个图像就是接下来要进行的图像处理过程的操作对象。
cv:: waitkey ( )函数告诉系统暂停并且等待键盘输入。如果给函数设置一个大于0的参数,其将会等待同该参数的毫秒(单位)时间,然后再执行程序;如果参数设置为0或者一个负数,程序将会无限等待直到有按键按下。
4.1.2 图像采集关键步骤详解
cv:: VideoCapture cap(0);
if ( !cap. isOpened ( )) {
printf ("无法打开摄像头");
return -1;
cv:: waitKey (30);
}
cv:: Mat frame;
cv:: namedWindow ("捕获图像", cv:: WINDOW_ AUTOSIZE );
while ( 1 )
{
for ( ; ; ) {
cap gt;gt; frame;
if (frame. empty()) break;
cv:: imshow("捕获图像", frame);
if (cv:: waitKey(33)gt;=0){
cv:: imwrite ( "捕获的图片. png", frame);
return 0;
}
}
开头先设置视频读取的结构体cap,用来存放从摄像头读取到的图像。之后判断用来检测摄像头是否成功开启,当开启失败时会得到输出警告提示。cv:: Mat frame声明了一个用来保存视频帧的结构。摄像头成功开启后返回参数1,进入while循环。在while语句中内嵌一个for语句,将视频读取结构体中的数据循环传入frame视频存储结构体中(只要有一帧没有成功传入,函数将跳出循环)。同时cv:: imshow ( )函数也将同步显示传入frame结构体中的图像。
当键盘输入回车键后,cv:: imwrite ( )函数会把回车键输入时刻的一帧图像保存至项目工程同路径的文件夹,同时摄像头关闭。捕获的图像如图4.1所示,这一帧捕获的图像就是待识别主体,接下来要进行的图像处理过程都会对它进行图像处理算法操作。
图4.1 摄像头捕获的图像
4.2 图像预处理
图像预处理过程主要包括图像的灰度处理、平滑处理、阈值化处理、轮廓提取(寻找轮廓、绘制轮廓)、噪声过滤[7]。
4.2.1 灰度处理
摄像机捕捉的图片是基于RGB模型的24位深度的三通道彩色图(RGB模型会在之后章节的叙述中详细解释),这种图片的每个像素点的像素值都是由三个颜色分量组成(红,绿,蓝),每个颜色分量也有256种变化。灰度图是只有8位的单通道灰色图,其每个像素点的像素值只有一个分量。从图像的整体和局部的亮度、边缘、纹理等特征来看,灰度图与彩色图是完全一致的。由此可得出结论是灰度处理之后的图像可以降低后续图像处理的难度,并且并没有改变图像信息的完整性[8]。所以为了后续的图像操作,将图片进行灰度化不妨是一种更加便利的操作。
人们通常用r、g、b来表示3通道红、绿、蓝的色彩分量值。将R、G、B分量映射到R、G、B立方体对角线上,得到公式[9]
(4.1)
是输出图像的灰度值。
在OpenCV中,可以通过调用函数cv ::Cvtcolor (src ,dst ,code ,dstCn )来实现。其中src为输入矩阵即输入图像;输出矩阵dst需要与输入矩阵有相同的尺寸和深度,可通过cv:: Mat dst = src. clone ( )语句来完成设置;code是函数的指令转换码,此处是将三通道彩色图转为单通道灰度图的操作,所以选取转换码为CV_RGB2GRAY;dstCn是目标图像中所需的通道数,此处笔者默认设为0,则通道数由src的通道数和转换码来决定。
最终指令为cv:: cvtColor (src , dst , CV_BGR2GRAY)。处理后的灰度图像如下图4.2所示。
图4.2 灰度图
灰度处理后的图像由三维图像降为一维,使后续的图像处理操作更方便。
4.2.2 平滑处理
平滑又称“模糊”,是一种简单常用的图像处理操作。平滑处理的目的通常上都是为了减少噪声和伪影,此外也可以用来降低图像的分辨率[10]。OpenCV提供5种不同的平滑操作,分别是简单模糊、方框型滤波器、中值滤波器、高斯滤波器、双边滤波器。这些操作可通过不同的函数实现,其对应结果也有细微差别。常用的滤波器一般有线性和非线性。
线性滤波器是一种平均的思想,即输出的图像像素值是输入图像像素的一个领域内的所有像素灰度值的线性组合,较典型的有均值滤波。均值滤波是将邻域内所有像素灰度值的平均值赋给输出图像的相应像素点的灰度值。这种处理方式会对图像的边缘产生模糊,并且选的邻域越大,模糊程度也会更高。少量具有较大偏差的点也会严重影响到均值滤波。
以上是毕业论文大纲或资料介绍,该课题完整毕业论文、开题报告、任务书、程序设计、图纸设计等资料请添加微信获取,微信号:bysjorg。
相关图片展示: