二维码识别.docx
- 文档编号:4715964
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:10
- 大小:158.48KB
二维码识别.docx
《二维码识别.docx》由会员分享,可在线阅读,更多相关《二维码识别.docx(10页珍藏版)》请在冰豆网上搜索。
二维码识别
二维码的识别
一、目的与要求
本课题主要研究二维条码的识别程序及译码方法,使用C语言来开发二维码的识别程序。
查找并阅读相关资料,了解基本的内容,利用需求分析文档,对整个系统有个初步的架构。
搜寻实验用的文件文档集和研究过程中用到的各种工具软件。
根据已有的资料并借助面向对象的程序设计思想对系统各模块进行分析、建模、设计。
使用C语言来开发二维码识别程序。
二、设计的内容
本文主要来完成二维码识别和译码程序,运用图像校正、二值化、边缘检测等各种图像处理方法实现条码的预处理,并进行二维码码的解码,结合图像处理技术,完成了基于图像处理的二维码快速识别的解码系统。
三、总体方案设计
本设计的主要任务是在研究二维条码的码制标准的基础上实现对二维码的告诉采集与识别,详细分析二维码的基本特点、符号结构;在条码图像识别方面,研究了对采集的条码图像进行预处理的方法,即:
对图像进行整形。
运用图像校正、二值化、去噪、边缘检测、Hough变换、图像旋转等多种图像处理方法实现条码图像的预处理、条码定位、条码分割和数据提取。
对预处理后的条码图像进行译码。
四、各个功能模块的主要实现程序
(一)二维码的识别流程
首先,对采集的彩色图像进行灰度化,以提高后继的运行速度。
其次,去除噪声。
采用十字形中值滤波去除噪音对二码图像的干扰主要是盐粒噪声。
再次,利用灰度直方图工具,使用迭代法选取适当的阈值,对二维码进行二值化处理,使其变为白底黑色条码。
最后,确定二维码的位置探测图形,对条码进行定位,旋转至水平后,获得条码数据,以便下一步进行解码。
(二)图像的灰度化
灰度化的常用方法有两种:
1.Gray(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.114*B(i,j)
2.Gray(i,j)=[30*R(i,j)+59*G(i,j)+11*B(i,j)]/100
本设计进行灰度化的实现函数如下:
internalvirtualvoidimageToGrayScale(int[][]image)
{
for(inty=0;y { for(intx=0;x { intr=image[x][y]>>16&0xFF; intg=image[x][y]>>8&0xFF; intb=image[x][y]&0xFF; intm=(r*30+g*59+b*11)/100; image[x][y]=m; } } (三)图像的降噪处理 降噪的方法很多,选用的是中值滤波法,因为中值滤波是一种非线性平滑滤波器。 中值滤波在降低噪声的同时,又可以保持图像的细节,使用中值滤波时能较好保护图像的边缘。 中值滤波的滤波窗口的形状和尺寸对滤波效果有一定的影响。 常用的中值滤波窗口形状一般为正方形、十字形等。 就一般经验而言,对于有缓慢变化的较长轮廓线物体的图像,适合使用正方形窗口;对于包含尖角物体的图像,适合使用十字形窗口。 窗口大小一般小于图像中最小有效物尺寸为宜。 中值滤波的函数实现如下: internalvirtualbool[][]applyMedianFilter(bool[][]image,intthreshold) { bool[][]filteredMatrix=newbool[image.Length][]; for(inti=0;i { filteredMatrix[i]=newbool[image[0].Length]; } //filteringnoiseinimagewithmedianfilterintnumPointDark; for(inty=1;y { for(intx=1;x { //if(image[x][y]==true){ numPointDark=0; for(intfy=-1;fy<2;fy++) { for(intfx=-1;fx<2;fx++) { if(image[x+fx][y+fy]==true) { numPointDark++; } } } if(numPointDark>threshold) filteredMatrix[x][y]=POINT_DARK; } } returnfilteredMatrix; } (四)图像的二值化处理 二值化就是将图像转换成只有黑或白两种颜色,二值的方法也有很多,一种较为常用的是阈值法,取一个合适的阈值,使图像中每一个像素点应该属于目标还是背景区域,从而产生相应的二值图像。 设原始图像为f(x,y),按照一定的准则在该图像中找到特征阈值T,将图像分割为两部分,分割后的图像为: (2-1) 其中,b0为黑,b1为白。 在QR码的图像二值化中,一般取b0=1,b1=0,也就是: (2-2) 根据确定阈值的取样范围来分,二值化的方法可以分为全局阈值法与局部阈值法。 全局阈值法对整幅图像的所有像素点进行取样,通过相关算法计算出一个阈值,进行二值化。 而局部阈值法(又称为自适应阈值法)是将整幅图像划分成若干区域(通常是均匀划分),对每块区域中的像素点进行阈值计算,每块区域得出一个阈值,然后分块进行二值化[9,10,11]。 使用局部阈值法时,每一块区域的二值化过程是独立进行的。 本文使用的是中间值法,先对区域中所有像素点进行遍历,找出最大的灰度值Graymax和最小的灰度值Graymin,然后求出最大灰度值与最小灰度值的中间值Graymid,将该灰度值作为区域的阈值,即T=Graymid=(Graymax+Graymin)/2。 (五)图形的定位 QR码有三个形状相同的位置探测图形,在没有旋转的情况下,这三个位置探测图形分别位于QR码符号的左上角、右上角和左下角。 三个位置探测图形共同组成图像图形。 QR码的位置探测图形 每个位置探测图形可以看作是由3个重叠的同心的正方形组成,它们分别为7*7个深色模块、5*5个浅模块和3*3个深色模块。 位置探测图形的模块宽度比为1: 1: 3: 1: 1。 位置探测图形 这种1: 1: 3: 1: 1的宽度比例特征在图像的其他位置出现的可能性很小,故可以将此作为位置探测图形的扫描特征。 基于此特征,当一条直线上(称为扫描线)被黑白相间地截为1: 1: 3: 1: 1时,可以认为该直线穿过了位置探测图形。 另外,该扫描特征不受图像倾斜的影响。 对比中的两个QR码符号可以发现,无论QR码符号是否倾斜,都符合1: 1: 3: 1: 1的扫描特征。 (六)常规扫描方法 GB/T18284-2000中推荐的扫描方法如下: 1.在X方向进行依次扫描。 (1)固定Y坐标的取值,在X方向上画一条水平直线(称为扫描线)进行扫描。 当扫描线被黑白相间地截为1: 1: 3: 1: 1时,可以认为该直线穿过了位置探测图形。 在实际判定时,比例系数允许0.5的误差,即比例系数为1的,允许范围为0.5~1.5,比例系数为3的,允许范围为2.5~3.5。 (2)当寻找到有直线穿过位置探测图形时,记录下位置探测图形的外边缘相遇的第一点和最后一点A和B。 由A、B两点为端点的线段称为扫描线段。 将扫描线段保存下来。 扫描线段 用相同的方法,完成图像中所有水平方向的扫描。 2.在Y方向,使用相同的方法,进行垂直扫描,同样保存扫描得到的扫描线段。 扫描线段分类 扫描步骤获得的扫描线段是没有经过分类的,也就是对于特定的一条扫描线段,无法获知其具体对应于三个位置探测图形中的哪一个。 在计算位置探测图形中心坐标之前,要将所有的扫描线段按照位置进行归类。 一般采用距离邻域法进行扫描线段的分类。 距离邻域法的思想是: 给定一个距离阈值dT。 ,当两条扫描线段的中点的距离小于dT。 时,认为两条扫描线段在同一个邻域内,将它们分为一类,反之则归为不同的类别。 距离邻域法的具体步骤如下: (1)给定一个距离阈值dT。 ,dT。 要求满足以下条件: 位于同一个位置探测图形之中的任意两点之间的距离小于dT。 ,位于不同位置探测图形中的任意两点之间的距离大于dT (2)新建一个类别,将第1条扫描线段归入其中。 (3)对于第i条扫描线段li(2≤i≤n),做以下操作: a)求出li的中点Ci。 b)分别计算Ci与在已存在的每一个类别中的第一条扫描线段的中点的距离d,若d<dT,则直接将li加入相应类别中。 c)若无法找到li可以加入的类别,则新建一个类别,将li加入其中。 (4)将所有类别按照包含扫描线段的数目进行从大到小排序,保存前3个类别(即包含扫描线段数目最多的3个类别),其余的视为误判得到的扫描线段(在位置探测图形以外的位置得到的符合扫描特征的扫描线段),直接舍去。 距离邻域法结束后得到的分好3个类别的扫描线段就分别对应了3个位置探测图形。 距离邻域法的关键就是距离阈值的选取。 一般对于不同大小的QR码图像,要使用不同的距离阈值。 其中GB/T18284-2000中推荐的位置探测图形中心坐标的计算方法如下: (1)在X方向的扫描线段中找出最外侧的两条,分别取中点,记为A、B。 由A、B两点连一条直线。 对X方向扫描线段的处理 (2)在Y方向的扫描线段中找出最外侧的两条,分别取中点,记为C、D。 由C、D两点连一条直线。 对Y方向扫描线段的处理 (3)计算直线AB与直线CD的交点O,即为位置探测图形中心点。 将QR码符号的左上、右上位置探测图形的中心分别记为A、B。 连接A、B。 直线AB与水平线的夹角α即为QR码符号的旋转角度。 对于该旋转角度α,求出其正弦值sinα与余弦值cosα即可。 具体计算公式如下: (2-3) (2-4) 其中, (2-5) 在GB/T18284-2000中定义的位置探测图形边长的计算是基于无旋转图像的,在无旋转图像中,水平扫描线段的长度即为位置探测图形的边长。 水平扫描线段AB的长度即为位置探测图形的边长X。 位置探测图形的边长 对于经过旋转的QR码图像,先通过插值算法生成旋正的QR码图像,然后按照如上所述的方法进行位置探测图形边长的计算 五、测试和调试 为了便于调试,本文设计了一个QR编码的方法,用于生成QR图像,再把生成的图像用识别器进行识别。 界面如下: 其中实现QR编译的类为QRCodeEncoder,主要的属性有: QRCodeEncodeMode、QRCodeScale、QRCodeVersion、QRCodeErrorCorrect,编译方法声明为BitmapEncode(String,Encoding),设置好QRCodeEncoder的属性后,再调用QRCodeEncoder.Encode(需编码的字符串,字符串的字符集)就可以得到字符串对应的QR码,结果是一个Bitmap类,可以保存为图片。 : QR码的识别处理,封装在QRCodeDecoder类中,该类有一个解码方法声明为Stringdecode(QRCodeImage),其中QRCodeImage为需要识别的图片,返值为识别后的字符串,要使用QRCodeImage,可以在生成QRCodeImage对象的时候,传一个Bitmap对象。 译码界面如下: 六、课程设计总结与体会 本文已详细分析了图像的识别技术,在此基础上,根据新的应用需求也可以进行其它条码的识别。 研究二维码图像的识别技术。 运用图像校正、二值化、去噪、边缘检测、Hough变换、图像旋转等多种图像处理方法实现条码图像的预处理、条码定位、条码分割和数据提取。 但由于各方面的原因,仍然存在着许多问题有待于进一步研究,比如识别算法的单一性问题以及纠错问题等,在稳定性和高效性也有进一步改进的可能。 希望在后续工作中进一步改进和完善系统的功能。 二维码由于具有高密度、大容量、纠错能力强、可表示文字图像等信息、可加密等优点,己广泛应用于传统的工业自动化生产线、医疗服务、收费系统、商品管理系统及信息查询系统等各个领域。 而且随着当今信息技术的发展和网络的普及,二维条码将有更大的商机和更广阔的发展前景。 七、参考文献 [1]李弼程,彭天强,彭波.智能图像处理技术[M].北京: 电子工业出版社,2004 [2]于殿涨.图像检测与处理技术[M].西安: 西安电子科技大学出版社,2006 [3]杨淑莹.VC+十图像处理程序设计[M].北京: 北方交通大学出版社,2003 [4]孙家广.计算机图形学[M].北京: 清华大学出版社,2002 [5]何斌,马天予,王运坚.VisualC++数字图象处理[M].北京: 人民邮电出版社,2002 [6]中国物品编码中心.条码技术与应用[M].北京: 清华大学出版社,2004 [7]张成海,郭卫华.QRCode一种新型的矩阵符号[M].北京: 中国标准出版社,2000。 [8]中国物品编码中心.QRCode二维码技术与应用[M].北京: 中国标准出版社,2002。 [9]王新梅.纠错码与差错控制.北京: 人民邮电出版社[M],1989. [10]朱诗兵,刘作学,李迎春.信息论与编码理论[M].北京: 科学出版社,2005 [11]刘宏伟,严妍.快速响应码的识别和解码[M].北京: 计算机工程与设计,2005.6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二维码 识别
![提示](https://static.bdocx.com/images/bang_tan.gif)