iOS锦囊程序员

关于iOS原生条形码扫描问题,以及条形码和二维码的区别

2018-07-10  本文已影响4人  片片碎

本文记录的问题是:

    当AVFoundation使用多译码器扫描的时候。不管有没有设置扫描区域(setRectOfInterest:),二维码可以在扫描区域的任意位置响应扫描成功,但是条形码却不行,只能在扫码区域的中间位置响应。

如图:四个绿色脚框起来的矩形为设置的扫描区域;

图一:条形码在扫描区域的中间,扫描成功。

图二:条形码在扫描区域的上方,扫描失败。

测试部提出的bug是,为什么微信的这两种都可以扫描成功,而我们的不可以。

开始怀疑是我自己设置扫描区域的时候没有设置好,所以先不调用setRectOfInterest设置扫描区域,使用默认的扫描与去,这样一试,结果还是一样的。后来看到官网文档,才知道原来就是这样的。详细如下:

按照ISO标准解碼,实际上是,按照1:1:3:1:1去寻找那三个寻像图形,就是标志性的大方块。然后圈出二维码大小再去解碼的。也就是说,再没设定边界的情况下全屏都可以。

而条形码完全不同,他是在Detect Center那个点,画一个无限延伸的米字型,然后去判断每一条在线能否解析出条形码所需要的0101010序列。而iOS默认的Center是 Layer 的 Center。所以条形码扫描仪上往往会有一条红线,这并不是为了拟物化,而是告诉用户一定要用这条线对准条形码,否则会有扫不上的可能性

查阅官方文档Technical Note TN2325解释请点击


查看这个问题的时候,还发现几个有趣的知识点:

1.AVCaptureMetadataOutput不可以一次返回多个条形码数据,但是可以一次返回多个二维码,但是最多四个。AVCaptureMetadataOutput的打印如下:

条形码,最多返回一条数据,返回 center-most decodable barcode in the rectOfInterest

二维码码,可以返回多条数据,但最多四条数据the center-most codes in the rectOfInterest

2.有时候会遇到,当AVFoundation使用多译码器扫描的时候。二维码是秒杀,但是条形码却经常扫不上。如果去掉二维码的话,条形码扫描又秒杀的问题。

可以回头查看上面table1,如果是二维码和条形码一起,条形码扫描中心线就只有center。但是如果只有条形码,扫描中心线是center+additional。additional的存在的意义是用更加优秀且稍微耗时的算法去优化扫描精准度,也就是牺牲效率换精确度。


记录:

另外记录一下扫描区域的设置详解:

rectOfInterest官方定义:

The value of this property is a CGRect that determines the receiver's rectangle of interest for each frame of video. The rectangle's origin is top left and is relative to the coordinate space of the device providing the metadata. Specifying a rectOfInterest may improve detection performance for certain types of metadata. The default value of this property is the value CGRectMake(0, 0, 1, 1). Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.

大致意思是设置每一帧画面感兴趣的区域     也就是扫描范围的设置  默认为左上角  (0,0,1,1)这是默认值  全屏的 最大为1

经实践发现  (0,0,,1,1)这个写法有点坑   实际为(y,x,h,w)  即坐标y,x  尺寸高,宽(h,w)

下面代码是我设置的扫描区域

size是我的扫描区域  也就是那个扫描框框  再进行 rectOfInterest   那么能够进行识别 码 的区域也局限于框框内部   

CGSize size = self.view.bounds.size;

CGRect cropRect = CGRectMake(SCREEN_WIDTH/2-110,100,220,220);//扫描框

output.rectOfInterest =  CGRectMake(cropRect.origin.y/SCREEN_HEIGHT,

                                        cropRect.origin.x/size.width,

                                        cropRect.size.height/size.height,

                                        cropRect.size.width/size.width);


备注:

苹果开发,遇到问题时候,不光要记得看苹果的 guide 和 reference,还可以看看看以下 sample code,tech note, FAQ。

上一篇下一篇

猜你喜欢

热点阅读