二维条形码的制作方法

文档序号:14033987阅读:508来源:国知局
二维条形码的制作方法
本发明涉及二维条形码和生成二维条形码(通常也称为qr码)的处理。
背景技术
:众所周知,由于打印和扫描条件的原因,2d条形码读取可以具有挑战性。在一些情况下,打印和扫描可以在总体良好的条件下完成,但是当2d条形码被应用于非平面表面时,读取2d条形码的难度增加,并且解码器不能针对这种条件进行优化。qr码上的四个对准图案允许用强透视角对码进行解码。事实上,四个参考点的位置足以从潜在的任何视角变换重建原始图像。图1示出了了用android手机上的标准qr码扫描应用轻松解码的2d条形码扫描的示例。但是,当qr码被放在非平面表面上时,例如在具有相对小半径的圆柱形表面上(如果半径高,那么透视变换对于解码来说可以是足够好的近似值),那么解码一般变得更不可靠。码越来越多地应用在酒瓶或液体瓶的顶部附近,这在大多数情况下是小半径的圆柱形表面。事实上,这种码常常被放在防篡改标签上,以防止瓶子被伪造。由于标签在打开过程中破裂,因此不能在重新填充的瓶子上重复使用。而且,这些码常常被用作市场营销活动的一部分,并且通过放在瓶子的顶部,消费者更容易注意到它们,因此更有可能被扫描。消费者需要能够用他们日常安装在便携式电子设备上(例如在智能电话上)的软件应用扫描2d条形码。例如,微信(在中国被广泛使用的消息传送应用,wechat)配备了qr码扫描仪,并且在中国大部分的2d条形码扫描是通过安装在用户智能电话上的这个应用进行的。但是,这种应用没有被优化,以解码诸如圆柱形之类的非平面表面上的2d条形码。在现有技术中,已经开发了各种技术来优化码的读取。例如,us6814291提出了一种通过使用模板匹配技术来读取容易变形的二维条形码符号的方法。这种技术的缺点是需要修改解码器,这限制了可以被使用的应用。用于使图像符合平面、圆柱形、圆锥形和抛物面的对形变(amorphosis)的应用已得到很好的发展。可以通过应用已知的几何原理来形成这种表面所需的图像的预变形程度。甚至更高级的技术(诸如在us7555157中)对图形图像进行变换,使得它们适于应用于要应用图像的基板的三维拓扑。在将图像应用于基板之后,图像符合基板的拓扑。虽然这种技术非常强大,但是这种技术并不适于2d条形码解码的特性。还已经开发出了通过修改发送到打印机的数字数据以预补偿缺陷来减少可预测的打印机缺陷的技术–参见例如us6005670和us6341020。解决读取圆柱形表面上的条形码的问题的尝试可以在cn102682266和us8292182中找到。在cn102682266中,提出了旋转条形码的连续图像获取。在us8292182中,条形码与读取器的扫描区域中的圆柱形元件一起旋转,以便读取器完整地读取条形码。这些技术用于在制造过程中读取圆柱形表面上的条形码,但是这些技术不能解决由标准图像扫描仪读取圆柱形表面上的条形码的问题。在us4864112中公开了适用于圆柱形表面的一维条形码。其中采用的技术不旨在用于2d条形码,而且,读取方向被假设为处于与条形码表面基本正交的平面中。与读取圆柱形表面上的条形码相关的其它条形码读取技术在us6556690、us5854478、wo2005067533、us7555157中公开。技术实现要素:鉴于上述内容,本发明的目标是提供2d条形码,当该2d条形码被放在诸如圆柱形的非平面表面上时,它可以用标准的便携式图像扫描仪更容易地读取。提供适于放在瓶子(诸如酒瓶)的圆柱形、圆锥形或圆形瓶颈上并用标准或简单便携式扫描仪最佳扫描的2d条形码是有利的。本发明的目标是通过提供如权利要求1所述的2d条形码和如权利要求14所述的生成用于放在弯曲表面(诸如瓶子的颈部的一部分)上的二维条形码的图像的方法来实现的。发明人已经意识到用许多扫描仪和应用解码位于瓶子顶部附近的2d条形码的困难之一源于用户行为。消费者和其他用户倾向于通过将他们的智能电话放在比瓶子更高的位置进行扫描,相对于2d条形码的表面以一定角度面朝下。并且如果智能电话的led灯(其在低光环境下是需要的)处于活动状态,那么,如果在没有角度的情况下进行扫描,则出现的镜面反射可能使得扫描非常困难或不可能。本发明通过优化2d条形码的形状以既考虑非平面表面的特性又考虑扫描发生的条件(特别是典型的用户行为)来改进扫描的可靠性。本文公开了用于放在瓶子的颈部的一部分上的二维条形码,该条形码包括顶部边缘、底部边缘、左边缘、右边缘,以及沿着在左边缘和右边缘之间延伸的水平线布置的码元素。码元素的水平线以及顶部和底部边缘是弯曲的,使得顶部边缘具有凸形形状并且底部边缘是凹形形状,由此顶部边缘被定义为最靠近扫描仪或视点的边缘。因此,如果2d码条被配置为从该码条下方而不是上方读取,那么顶部边缘可以表示下部边缘。因此,术语“顶部”、“底部”和“水平”相对于本描述的2d条形码的含义旨在相对于预期的扫描观看/读取位置而不是实际的绝对位置或方向。在实施例中,码元素的线以及顶部和底部边缘的曲线基本上被成形为椭圆的一部分。在实施例中,底部边缘比顶部边缘更长。在实施例中,码元素的线以及顶部和底部边缘的曲率程度被配置为,对于瓶颈部分的直径,为越小的直径提供越大的曲率。在实施例中,2d条形码包括在其上印有码元素的支撑件。该支撑件可以包括在支撑件的与印有码元素的一侧相对的一侧上的粘合剂层。支撑件可以由纸或柔性聚合物层制成或包括纸或柔性聚合物层。在实施例中,顶部、底部、右边缘和左边缘中的每一个具有小于26mm的长度。在实施例中,二维条形码包括由以下公式描述的全局变形:其中:s是2d条形码的物理打印高度,h是2d条形码的感知高度,d是距预定义的扫描仪视点的距离,以及β=π/2-α,其中α是2d条形码的表面的法线n与所述预定义的扫描仪视点之间的角度。2d条形码的感知高度h可以根据以下公式确定:其中r是2d条形码的物理半尺寸,d是距视点的距离,并且β=π/2-α(α是从表面的法线到视点的角度)。本文还公开了包括如本文所述的二维条形码的瓶子,其中二维条形码接合在瓶子颈部的一部分上。在实施例中,瓶颈的该部分基本上是圆柱形的。在实施例中,瓶颈的该部分基本上是圆锥形的。在实施例中,瓶颈的该部分基本上呈圆锥形和凹形弯曲。在实施例中,二维条形码被放在远离瓶颈的倾倒端的瓶颈的基部上。本文还公开了生成用于放在弯曲表面(诸如瓶颈的一部分)上的二维条形码的图像的方法,包括由计算系统中的算法执行的以下步骤:(s1)-从计算系统中的存储器或者从外部计算系统或者从使数据进入计算系统的手动输入或者其任意组合,接收在变形之前二维条形码的维度参数以及变形之前所述二维条形码的输入图像,(s2)-考虑到弯曲表面的直径,计算码元素的基本单元格尺寸,使得当从预定义视角观看时,码元素在视觉上被感知为方形,(s3)-借助于算法,通过根据与位矩阵中的所述单元格的列位置对应的尺寸水平地伸缩2d条形码的位矩阵的单元格来对输入图像进行水平拉伸,由此位于条形码的水平末端的单元格比条形码中间的单元格大,(s4)-计算与视角处的平面与弯曲表面的交点对应的椭圆变形参数,(s5)-基于计算出的椭圆变形参数来计算图像的像素的垂直位移,(s6)-基于椭圆变形参数和垂直位移使拉伸的输入图像变形,(s7)-输出所述二维条形码的图像,以生成打印文件。在步骤s3中,还可以垂直伸缩每个单元格,优选地以将2d条形码的感知垂直尺寸除以定义码元素的行和列的初始位矩阵的行数所获得的固定因子来进行伸缩。附图说明从权利要求书、具体实施方式和附图中,本发明的其它目标和有利特征将是显而易见的,其中:图1是常规2d条形码的图示;图2a是测试瓶子上根据本发明实施例的2d条形码的测量设置的示意图;图2b是具有根据本发明实施例的2d条形码的瓶子的一部分的侧视图;图2c是用户用便携式智能电话扫描根据本发明实施例的2d条形码的图示;图3是从典型的用户视角看瓶颈上的常规2d条形码的图示;图4a和4b是从零视角(图4a)和典型的用户视角(图4b)看在瓶颈上的根据本发明实施例的2d条形码的图示;图5a-5d是根据本发明实施例的2d条形码的图示,其对于10°(图5a)、20°(图5b)、30°(图5c)、40°(图5d)的视角具有不同程度的椭圆变形;图6是图示生成根据本发明实施例的2d条形码的方法的流程图;图7是图示椭圆变形与视角之间的关系的图形,其中椭圆的半参数取决于以下公式:b=d/2(rsinβ)/(d+rcosβ)其中b是椭圆的垂直参数,r是圆的直径(瓶颈的直径),d是从视点到圆的边界的距离,并且β=π/2-α,α是从表面的法线到视点的角度[注意:在本测试用例中,r=3.85,d=10]。图8a和8b是图示或者当从不同角度观看具有固定打印尺寸的2d条形码时所涉及的变形的量值(感知的尺寸变化,菱形点)或者为了在不同角度下获得具有固定感知尺寸的码所需的变形的量值(物理尺寸改变,三角点)的图形。具体实施方式参考图4a-5d,示意性地图示了根据本发明实施例的示例性实施例。对于放在圆柱形、圆锥形或弯曲瓶颈上的2d条形码,常见的2d条形码尺寸通常在25mm×25mm至10mm×10mm的范围,例如16mm×16mm。在瓶子1的颈部上施用的标准2d条形码4'(在图1和3中示出)的读取受到两种不同类型的变形的影响:由瓶颈的曲率造成的标签/纸张的物理变形以及由视角造成的透视变换(perspectivetransformation)。这两个因素解释了为什么读取在圆形或圆锥形表面上的普通2d条形码会带来额外的挑战。通用的校正变形方法可以允许以更高的角度读取2d条形码,但是这在较低的角度上具有折衷。如将关于本文给出的本发明实施例的示例所看到的,不同的已知扫描图像读取器示出相似的结果,这证明根据本发明的2d条形码的一致和通用的方面。特别地,本发明的2d条形码显著增加了各种通常可用的消费者扫描软件应用的易用性。参考图2b至4b,打印的2d条形码4位于瓶子1的颈部3的一部分上。2d条形码打印在用粘合剂接合到颈部的表面5的标签上。标签可以基本上由纸、聚合物或其它柔性可打印材料制成,所述可打印材料提供有粘合剂层,以接合到瓶子表面。在本发明的范围内,2d条形码也可以直接打印或刻在瓶子的表面5上。瓶子可以由玻璃、陶瓷、聚合物或用于生产容器(特别是用于容纳供人食用的液体的瓶子)的各种其它材料制成。本发明特别适合于接合到酒瓶和液体瓶的颈部的2d条形码标签。瓶子1的颈部3可以具有各种形状,从圆柱形到圆锥形到基本圆锥形,具有凸出或凹入的弯曲部分。将2d条形码放在瓶子的颈部上以改进消费者的可见度并进行扫描是有利的。在一些情况下,制造商倾向于将2d条形码放在颈部的基部7处或颈部的平均略微向上倾斜的弯曲或圆锥形部分上,特别是在表面5的法线n(即,垂直)相对于水平面h处于大于零的角度的位置,例如在10°至35°的范围内。用户可以获得关于产品的信息并且访问由产品的制造商或销售商发放的促销材料。2d条形码也可以用来核实产品的真实性。qr码是2d条形码的常用类型并且通常在条形码的角落处包括定位标记6,该定位标记6形成用于定向读取条形码的参考点。2d条形码包括采用黑色和白色基本方形或矩形元素形式的码元素8,其本身是众所周知的并且不需要进一步描述。如图1所示的常规2d条形码可以具有由顶部边缘10a'、底部边缘10b'、左侧边缘10c'和右侧边缘10d'形成的整体方形或矩形边界10。码元素8沿水平码线和垂直码线布置,由此沿着码线的黑色和白色元素的序列表示要被读取的码的一部分。用户可以用便携式扫描设备11(通常是用户的智能电话11)来扫描2d条形码,由此用户通常从2d条形码上方的位置扫描瓶颈上的2d条形码并将其相机朝向2d条形码向下倾斜,如图2c中最佳示出的。这导致大多数用户将相机的中心轴c相对于瓶颈表面的法线n的视角α定位成非零,通常在10°至40°的范围内。根据本发明的一方面,为了改进被扫描的2d条形码的可读性,2d条形码的水平码线变形,使得顶部边缘10a和底部边缘10b向上弯曲,即,当从顶部边缘10a的上方看时,顶部边缘具有凸形并且底部边缘具有凹形。从相对于2d条形码的表面的法线n的非零视角α的角度看,并考虑到瓶颈的曲率,在左侧边缘10c和右侧边缘10d之间延伸的弯曲水平码线补偿一些或全部变形。图3图示了从相对于2d条形码的表面的法线n的非零视角α的角度来看的常规2d条形码的视图,其中,由于瓶颈的曲率,顶部边缘10a'和底部边缘10b'被看作是弯曲的。图4a图示了直接从2d条形码的表面的法线n的角度观看的根据本发明实施例的2d条形码的视图,其中顶部边缘10a和底部边缘10b被看作是弯曲的,但是,当从如图4b所示的非零视角α的角度观看时,顶部和底部边缘的曲率看起来不太弯曲并且在特殊角度下看起来是直的。在典型扫描角度下减小的曲率改进了被扫描的2d条形码的可读性。2d条形码的水平码线的曲率可以根据要接合的瓶子的颈部的曲率(即,根据瓶子的颈部的直径)而变化。在实施例(未示出)中,水平码线的曲率可以在顶部边缘10a和底部边缘10b之间变化,使得顶部边缘10a的曲率不同于底部边缘10b的曲率,以放在非圆柱形瓶颈部分(例如,圆锥形、凹形或凸形瓶颈部分)上,以考虑2d条形码在顶部和底部边缘之间的位置处的不同直径。因此,顶部边缘的曲率和底部边缘的曲率可以被配置为在预定义的非零视角α处生成相同程度的曲率减小(考虑到在顶部和底部边缘之间瓶颈的变化的直径)。在实施例(未示出)中,顶部边缘10a的长度可以比底部边缘10b的长度短,以放在圆锥形或大致圆锥形(凹形弯曲或凸形弯曲)的瓶颈部分上,以考虑在顶部和底部边缘处2d条形码的位置处的不同直径。因此,顶部边缘和底部边缘的长度可以被配置为在预定义的非零视角α处减小侧边缘10c、10d与平行的偏差角度,从而考虑与顶部边缘相比而言底部边缘处瓶颈的较大直径。非垂直的相机视角的优点是避免了来自被扫描表面的反射。实际上,鼓励用户在相机轴与表面的法线n对准的情况下扫描2d条形码可能会导致由于来自被扫描表面的反射而难以读取码。通过鼓励用户在相机轴相对于法线n处于非零角度的情况下进行扫描,避免了来自被扫描区域的不期望的反射。当被放在平坦的表面上时,扫描应用一般可以检测到距法线多达60°被扫描的2d条形码。但是,当被放在圆柱形或锥形表面上时,2d条形码受到不同类型的变形的影响:基于表面的变形以及透视变形。第一个来源是表面的物理变形。从2d条形码中心处的表面的法线拍摄的正常2d条形码的照片将不具有相同的宽度和高度比例。这种效果是由于2d条形码被放在其上的瓶子的一部分的曲率,并取决于那部分的直径以及码的尺寸。2d条形码的尺寸越接近瓶子部分的直径,变形将越大。当从不同的垂直角度观看时,围绕瓶颈的缠绕(wrapping)产生所打印的直线码线的基本椭圆变形。这些非投影变换是2d条形码的不可检测性的主要原因之一。事实上,2d条形码的检测方法是基于沿着直的码线找到特殊的黑和白序列。而且,在锥形上,支撑件的曲率取决于垂直轴上的位置。因此,码的椭圆变形也将取决于垂直轴上的位置。在圆柱形上,正常的2d条形码将在全局上具有对称的读取角度极限,例如,如果最大读取角度是15°(从表面法线),那么其最小读取角度将是-15°。这是因为椭圆形变形将是对称的。但是,在锥形上,由于曲率差异,这不再适用。最小读取角度将大于最大读取角度,因为在锥形的基部(较小曲率)的变形将较小。这种效果是清晰可见的,例如,应用于第一个测试瓶的1.6×1.6cmqr码平均从-22°到18°读取。校正椭圆变形将影响物理打印的码的对称性,并且影响读取范围的对称性和尺寸。第二种类型的变形来自于由视角造成的透视变换(假设码从前面扫描,因此没有侧向角)。圆柱形或圆锥形支撑件表面上的水平码线的透视变形导致基本上椭圆变形。补偿它意味着对打印前的码添加相当量的变形。因为变形取决于视角,所以对于给定的角度范围,补偿将很好地工作,但会对该角度范围之外的角度添加变形并因此减小了2d条形码可读角度的范围。为了更好地理解所暗示的内容,考虑以下内容。从观看的角度来看,从不同角度观察2d条形码的中心会生成由以下公式描述的(整个2d条形码的)全局y轴变形:其中h是2d条形码的感知高度,r是2d条形码的物理半尺寸,d是距视点的距离,并且β=π/2-α(α是表面的法线与视点的角度)。为了对于某个角度创建具有固定感知尺寸的2d条形码以更好地管理变形,可以应用由以下公式描述的全局变形:其中s是2d条形码的物理打印高度,h是2d条形码的感知高度,d是距视点的距离,并且β=π/2-α(α是表面的法线与视点的角度)。示例和测试让我们假设2d条形码是使用字母数字数据集(45个字符)的版本1(21×21)或版本2(25×25),其错误级别(errorlevel)为q(或m)。我们将进一步考虑两个不同的瓶子,其中颈部具有基本上锥形的部分,2d条形码将被施用在该部分上。第一个被测试的瓶子具有4.14cm直径至3.57cm直径的1.6cm垂直截面。这产生底部直径为4.14cm并高度为11.56cm的锥体,其由以下公式描述:对于0≤z≤h其中r=2.07和h=11.56cm。因此,表面的法线与地面的夹角为tan-1(r/h)=10.15°。第一个测试瓶的锥形截面由基部半径r=2.135cm和高度h=8.87cm定义,因此它与地面的角度为13.53°。测量&设置将变形码的子集(与不同的视角对应)打印并粘贴到标准或通常可用的酒瓶上。使用目前市场上最高效的qr读取器之一(i-nigma),通过一系列扫描来确定那些码的可读角度范围,从而减小了其它读取器的搜索范围。测量是在码中心的周围半径r=10cm的垂直圆弧上进行的。然后通过增加/减小角度来确定读取极限。然后通过在先前发现的极限周围进行搜索来确定对于其它读取器的限制。图8a和8b的两个图比较或者当从不同角度观看具有固定打印尺寸的2d条形码时所涉及的变形的量值(感知的尺寸变化,菱形点)或者为了在不同角度下获得具有固定感知尺寸的码所需的变形的量值(物理尺寸改变,三角点)。(注意:由于特定的设置,在85.42°处有垂直渐近线)。我们看到,对于小角度,维持感知高度所需的变形与固定高度的变形相似,但是对于越大的角度变得大得多。角度对椭圆变形的影响也随着角度的增加而增加,如图7所示。椭圆的半参数取决于这个公式:b=d/2(rsinβ)/(d+rcosβ),其中b是椭圆的垂直参数,r是圆的直径(瓶颈的直径),d是从视点到圆的边界的距离,并且β=π/2-α(α是表面的法线与视点的角度)。在本测试情况下(r=3.85,d=10),根据α的b的变化几乎是线性的。逆变形测试根据完全校正垂直压缩的测试,对于给定角度完全校正变形以便产生完美方形2d条形码不是优选的方法。如前面所解释的,由于对其它角度增加的变形,逆(counter)变形越具体,读取范围将越小。因此,优选实施例是应用校正临界变形的逆变形并提供大的可读性范围。2d条形码读取器通常处理一定量的透视变形,因此主要关注的是最小化椭圆变形的影响,使得被扫描的2d条形码接近经过透视变换的2d条形码。对生成的2d条形码应用第一变换,并处理由圆形支撑件造成的水平压缩效果。这个变换基本上是水平轴上的码的非线性拉伸,并且将使得从0°角度观看时码看起来是直的。在所描述的特定瓶子和给定的2d条形码尺寸的示例中,拉伸是最小的并且表示3-4%的总拉伸(即,宽度变得比高度大4%)。然后,为了处理椭圆变形,进行第一计算,以确定当从某个角度和距离看2d条形码的中心处的圆圈时出现的椭圆的参数。然后使用这个椭圆来确定对于给定的输入视点将产生直线的逆垂直位移。参考图6,图示了描述如何生成根据本发明实施例的预补偿的2d条形码的算法。由计算系统的处理器执行的示例性算法具有以下一般步骤:-步骤s1)获得输入参数并生成2d条形码矩阵生成2d条形码矩阵所必需的参数可以从计算机系统的存储器接收、或者从服务器下载、或者手动输入到计算系统中,或其任意组合。这些参数可以包括:·2d条形码将要放在其上的表面的维度,例如瓶颈的直径,·2d条形码的维度和规格(例如,宽度和高度;码元素的基本单元格的尺寸、每个水平线和每个垂直线的基本单元格的数目)·打印分辨率(例如,每英寸的点数dpi)·相对于2d条形码的表面的法线的预定义扫描视角·预定义的感知2d条形码图像宽度,即,当应用于弯曲表面时2d条形码应当在视觉上具有的宽度·从相机到2d条形码的距离2d条形码的位矩阵可以通过本身已知的标准条形码生成器算法来生成,使用的参数可以包括:·条形码的内容·条形码的版本(也依据基本单元格定义其尺寸)·错误校正级别位矩阵可以包含每个基本单元格一位并且形成在后续步骤中修改的基础。生成水平补偿瓶颈的曲率的2d条形码-步骤s2)水平拉伸图像由算法执行的这个步骤涉及计算水平单元格尺寸。为了获得当被应用于弯曲表面并从表面的法线观看时在视觉上被感知为方形的码元素,条形码的基本单元格的物理尺寸必须考虑表面周围的缠绕。这意味着确定均匀尺寸的感知单元格的实际缠绕尺寸。对于2d条形码的位矩阵的每一列,计算圆柱形上被感知的单元格尺寸的投影的宽度,并且可以将其存储在计算机系统的存储器中的数组中或者直接用于扩展初始位矩阵。用于这个计算的输入可以包括:·依据基本单元格的2d条形码的维度·条形码的期望的感知尺寸·表面的维度,例如瓶颈的直径·打印分辨率-步骤s3)水平拉伸图像由算法执行的这个步骤是使用上面获得的水平单元格尺寸来扩展定义条形码的基本单元格的水平和垂直位置(行和列)的位矩阵。位矩阵单元格根据与其在矩阵中的列位置对应的尺寸被水平伸缩。位于水平末端的单元格(即,条形码的垂直外边缘)将大于条形码中间的单元格。每个单元格也垂直伸缩,优选地按照将2d条形码的感知垂直尺寸除以初始位矩阵的行数所获得的固定因子来伸缩。结果产生当应用到表面并从表面的法线(垂直)观看时被感知为方形的图像。上述步骤s2和s3可以分开执行或者可以同时执行。生成补偿由于给定视角引起的变形的2d条形码-步骤s4)计算椭圆参数通过算法计算与视角处的平面和弯曲表面的圆柱形表面(例如,瓶颈)的交点对应的椭圆的参数(椭圆轴的宽度和高度)。以某个角度和距离观看的圆柱形截面具有椭圆形状。在由算法执行的这个处理步骤中,考虑到存储或输入在计算机系统中的用于表面直径、视角以及从相机到表面的距离的值,计算椭圆的参数(轴的半高和半宽)。-步骤s5)计算垂直位移然后可以对于每个水平像素位置(对于每个x位置)计算基于计算出的椭圆的图像在垂直方向上的像素位移(y位移)。给定感知到的椭圆的参数,可以在这个步骤中为水平轴上的所有位置确定椭圆上的垂直位置。这些垂直位置可以被用于通过将在步骤s2中获得的每个扩展2d条形码列移位一个与其水平位置对应的垂直位移来补偿椭圆效果。这些位移可以被预先计算并保存在计算机系统的存储器中的数组中,或者被直接用于移位扩展的2d条形码。-步骤s6)使图像垂直变形然后图像可以根据像素y位移垂直变形。在由算法执行的这个处理步骤中,由于对于所有其列位置获得的垂直位移,在步骤s2中获得的扩展的2d条形码被变形。每列被垂直移位,这产生具有凸起顶部和匹配的凹入底部的2d条形码。-步骤s7)输出图像文件然后2d条形码图像文件可以由基于步骤s1中定义的打印分辨率参数用于打印或用于生成打印图像的算法来生成。这些步骤在下文中通过以伪代码给出算法来更详细地描述。在附录中,为了示意性目的,以python编程语言为例给出了详细的算法。主要流程cell_widths=get_cell_widths_in_pixels_horizontal_stretch(...)im_stretched=stretch_qr_horizontally(...,cell_widths)ellipse_params=calculate_ellipse_params_center(...)displacements=calculate_dy_displacements(ellipse_params,...)distorted_im=y_distort(displacements,im_stretched)现在让我们看一下主要函数。计算单元格尺寸是用以下函数完成的:_get_cell_widths_in_pixels_horizontal_stretch(qr_size,output_img_width,cylinder_diameter,resolution)::paramqr_size:一个轴上qr的单元格的数目(例如,33):paramoutput_perceived_img_width:当应用于圆柱形时码应当在视觉上具有的宽度:paramcylinder_diameter:圆柱形直径(cm):paramresolution:打印分辨率(dpi):return:其长度匹配qr中单元格的数目的单元格尺寸的列表这个函数对于圆柱形计算以像素为单位的单元格尺寸,使得感知到的码是方形的。对于x轴上的每个单元格,计算它在圆柱形上的投影的宽度,然后将结果存储在数组中,最后返回长度的数组。水平拉伸图像可以用下面的函数完成:stretch_qr_horizontally(qr_size,qr_matrix,pixel_lengths)::paramqr_size:一个轴上qr的单元格的数目(例如,33):paramqr_matrix:尺寸的二进制数组qr_size:parampixel_lengths:与qr宽度相同长度的单元格尺寸(以像素为单位)的列表:return:表示被拉伸的码的数组x轴上的拉伸将根据所提供的长度完成,并且在y轴上的单元格将按照中间长度值进行伸缩。对于x轴上的每个单元格,它按照pixel_lengths的中间值将该列的单元格垂直扩展,它按照与列位置对应的pixel_lengths的值将该列的单元格水平扩展。该函数返回新的扩展后的数组。计算椭圆参数可以用以下函数完成:calculate_ellipse_params_center(cylinder_diameter,capture_angle,distance)::paramcyl_diameter:圆柱形直径(cm):paramcapture_angle:相机的法线与qr的角度(弧度):paramdistance:码与相机之间沿着法线的距离(cm):return:椭圆的参数a和b(对于:(x/a)^2+(y/b)^2=1)这个函数计算当以某个角度和距离看切割的圆柱形时出现的椭圆的参数。计算垂直位移可以用以下函数完成:calculate_dy_displacements(ellipse_params,output_img_width,resolution,cyl_diameter)::paramcyl_diameter:圆柱形直径(cm):paramellipse_params:椭圆的参数(a,b):paramoutput_img_width:图像的宽度:paramresolution:打印分辨率(dpi):return:对于图像的所有列为了匹配椭圆的变形而在y轴的位移的列表这个函数根据给定的椭圆计算图像的像素y位移。使图像垂直变形可以用以下函数完成,该函数使图像在y方向上变形。y_distort(y_displacements,img)::paramy_displacements:y轴位移列表(以像素为单位):paramimg:拉伸的图像:return:变形的图像结果最小角度最大角度范围正常的码-151530预补偿-0-16163210-9253420-233353053732401040305016432760234522该表示出了对于正常的qr码和不同的预补偿qr码的最小读取角度和最大读取角度。使用iphone上的i-nigma扫描应用进行测试。感知到的码尺寸:1.6cm支撑件直径:3.088cm打印分辨率:600dpiqr中心到相机的距离:10cm结果证明,预补偿的码不仅可以增加读取范围,而且更重要的是允许增加最大读取角度。尽管这是以减小的最小读取角度为代价,但是从用户的角度来看,由于上面解释的原因,具有更高的最大读取角度是更加优选的。从结果来看,输入角度为10至40度的预补偿码看起来特别适合于在具有上述参数的标准酒瓶上放置1.6cm的qr码。当然,最佳范围将取决于qr码尺寸、支撑件直径以及其它支持和观看参数。读取器和光学器件差异电话品牌(和型号)也在码的可读性方面发挥作用。其原因是不同相机的规格:传感器的数量、图像压缩的差异、视野、变焦因子、输出尺寸等等。但是,对于全局解决方案,可以通过关注平均读取结果来确定最佳参数。在进一步的实验中,用上述条件(i-nigma,iphone)获得的结果与其它读取条件进行比较。读取范围依赖于智能电话和所使用的扫描软件应用两者而变化。每个扫描应用的读取能力取决于它用于二进制化、检测对准图案和校正不同变形的算法。测试了三个扫描应用:i-nigma、wechat和wochacha。结果的可靠性和再现性受到可能由以下因素造成的轻微变化的影响:精确的相机定位(角度方面、距离方面);瓶子上的码定位,特别是码可能没有被恰当地粘在正确的位置和/或完全垂直的位置;照明条件可能因测试而异;以及相机应用版本的可能变化和更新。但是,可以观察到的是,这不影响预补偿的qr码的选择,其中,出于上述条件,具有10至40度的输入角的预补偿的码运行良好。附录-用于示例性目的的详细算法,使用python编程语言:defgenerate_img(perceived_size,support_diameter,print_res,distance_to_cam,angle_range,qr_content):qr=get_qr_code(qr_content,1,0)angle_rad=alpha*(math.pi/180)im_stretched=stretch_qr_horizontally(qr,get_cell_lengths_in_pixels_horizontal_stretch(qr,perceived_size,support_diameter,print_res))params=calculate_ellipse_params_center(support_diameter,angle_rad,math.cos(angle_rad)*distance_to_cam)dy=calculate_dy_displacements(params,np.shape(im_stretched)[1],print_res,support_diameter)distorted_im=y_distort(dy,im_stretched)defget_cell_lengths_in_pixels_horizontal_stretch(qr_object,output_img_width,cylinder_diameter,resolution):"""计算圆柱形的单元格尺寸(以像素为单位)。:paramqr_object:qrcodeclass实例:paramoutput_img_width:当应用于圆柱形时码应当在视觉上具有的宽度:paramcylinder_diameter:圆柱形直径(cm):paramresolution:打印分辨率(dpi):return:其长度匹配qr中单元格的数目的单元格尺寸的列表拉伸qr码。x轴上的拉伸将根据提供的长度完成并且在y轴上单元格将按中间长度值进行缩放。:paramqr_object:qrcodeclass实例:parampixel_lengths:与qr宽度具有相同长度的单元格尺寸(以像素为单位)的列表:return:表示被拉伸的码的布尔数组计算当以某个角度和距离看切割的圆柱形时出现的椭圆的参数(参见附图):paramcyl_diameter:圆柱形直径(cm):paramcapture_angle:相机的法线与qr的角度(弧度):paramdistance:码与相机之间沿着法线的距离(cm):return:椭圆的参数a和b(对于:(x/a)^2+(y/b)^2=1)"""#相对于给定角度。是从相机到圆柱形上qr的中心的线与穿过相机点的、平行于圆柱形表面的线之间的角度。根据给定的椭圆计算图像的像素y位移:paramcyl_diameter:圆柱形直径(cm):paramellipse_params:椭圆的参数(a,b):paramoutput_img_width:图像的宽度:paramresolution:打印分辨率(dpi):return:为了匹配椭圆的变形而用于图像的所有列的y轴位移的列表使图像在y方向变形:paramy_displ:y轴位移列表(以像素为单位):paramimg:被拉伸的图像:return:变形的图像当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1