第十二讲:条形码识别.pdfVIP

  • 6
  • 0
  • 约3.67万字
  • 约 29页
  • 2017-06-07 发布于湖北
  • 举报
第⼗⼆章:条形码识别 本章我们将⽤第⼗章开发的图像分析库来制作⼀个条形码识别应⽤。只要⽤⼿ 的摄 像头拍下书的封底,我们就能⽤这个程序来提取这本书的ISBN编号。 条形码简介¶ 市售绝⼤多数带有外包装的量产消费品上都有⼀个条形码。尽管有很多种不同的条形 码系统在多个专业领域中被使⽤,但是在消费品中最典型的条形码系统还是UPC-A和 EAN-13两种。UPC-A 由美国开发,⽽EAN-13最初由欧洲开发。 EAN-13发表于UPC-A之后,它是UPC-A的超集。 (事实上,尽管UPC-A现在在美国 依然被⼴泛使⽤,但该标准早在在2005年已经被官⽅宣布作废了。)任何可以识别 EAN-13条形码的硬件都可以兼容UPC-A条形码。这样我们只介绍EAN-13⼀种标准就 可以了。 正如其名字所暗⽰的,EAN-13描述了⼀个由13个数字组成的序列,该序列可以分为 四组: 最前的两个数字描述了条形码采⽤的 码制 。这两位数字可以标识⽣产商所在国 家, 或者描述该条码的类别,⽐⽅说ISBN(国际标准书号) 。 [译注1 :确切的讲,此处的“⽣产商所在国”实际上是指“为该⽣产商分配⽣产商代码的 编码管理局所属国家”] [译注2 :事实上,码制的长度可能为两位甚⾄更多位,但⽬前GS1 General Spec f cat ons中给出的最长的码制也只有3位。例如某条形码的类别是ISBN码的话, 那么它的码制部分应该为978(后⽂中给出的实际图中也可以看到) ;如果类别是 ISSN(Internat onal Standard Ser al Number ,国际标准连续出版物号) ,则码制为977 。其 他部分的长度也⽐本章介绍的要更有弹性,但这些差异并不会影响对本章内容的理 解。事实上,这⼀部分的内容在本章后⾯的内容中也完全⽤不到,因为我们在从条码 的图形中提取出数字序列后,并没有进⼀步分离出各个分组乃⾄查询每个分组表⽰的 具体信息。] 接下来的五个数字为⼚商代码,由各国的编码规范 构分配。 再接下来的5个数字是产品代码,由⽣产⼚商决定。(规模较⼩的⽣产商可能会 使⽤较长的⽣产商ID和较短的产品ID ,但是两个ID加起总是10个数字。) 最后⼀个数字为 校验码(check digit) ,扫描设备可以通过它来校验扫描到的数 字串。 EAN-13条形码与UPC-A条形码的唯⼀不同在于后者只⽤⼀位数字表⽰码制。EAN-13 条形码通过将码制的第⼀位数字置零实现对UPC-A的兼容。 EAN-13编码¶ 在考虑怎样解码EAN-13条形码之前,我们还是得先了解它是怎样被编码出来的。 EAN-13的编码规则有⼀点复杂。我们先从计算校验码——即数字串的最后⼀位开 始。 -- file: ch12/Barcode.hs checkDigit :: (Integral a) = [a] - a checkDigit ds = roductSum `mod` 10 `mod` 10 where roductSum = sum roducts (ma EveryOther (*3) (reverse ma EveryOther :: (a - a) - [a] - [a] ma EveryOther f = zi With ($) (cycle [f,id]) [译注1 :原⽂对checkD g t函数的实现有问题,翻译时⽤了⽐较直接的⽅法修正了代 码,并相应的修改了下⾯⼀段正⽂中对代码的描述] [译注2 :你可能觉得如果把 ma EveryOther 中的 f 和 id 两个列表元素的位置对调 的话,就可以省略掉 checkDigit 的where块中的 reverse 过程。事实上这个 reverse过程是必须的,⽽且 f 和 id 也不能对调。因为EAN-13的标准规定,“将序列 中的最右侧的数字规定为 奇数位,从最右侧开始,其余数字被交替记为 偶数位 和 奇 数位,⽽只有奇数位的数字会被乘以3 。如果采取最开始说的⽅法,那么假如输⼊的 序列包含偶数个元素的话,那么整个计算过程就是错误的。这⼀点的重要性在后⽂会 有体现。] 直接看代码应该⽐⽂字描述更有助于理解校验码的计算⽅法。函数从数字串的最右⼀ 位数字开始,每隔⼀位就将该数字乘以3 ,其余保持原状。接下来对处理后的列表求 和,校验码就是将这个列表的和对10取模两次得到的结果。 条形码是⼀系列定宽的条纹,其中⿊⾊的条纹表⽰⼆进制的“ 1”

文档评论(0)

1亿VIP精品文档

相关文档